@fleetbase/fleetops-engine 0.6.70 → 0.6.72
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/RELEASE.md +18 -47
- package/addon/components/admin/tracking-page-settings.hbs +56 -0
- package/addon/components/admin/tracking-page-settings.js +67 -0
- package/addon/components/device/form.hbs +2 -2
- package/addon/components/driver/details.hbs +1 -1
- package/addon/components/driver/form.hbs +1 -1
- package/addon/components/equipment/form.hbs +1 -1
- package/addon/components/layout/fleet-ops-sidebar.js +11 -3
- package/addon/components/maintenance/form.hbs +3 -3
- package/addon/components/map/google-live-map.js +2 -2
- package/addon/components/map/leaflet-live-map.js +45 -32
- package/addon/components/orchestrator/phase-builder.js +2 -1
- package/addon/components/orchestrator-workbench.hbs +7 -1
- package/addon/components/orchestrator-workbench.js +16 -2
- package/addon/components/order/details/activity.hbs +8 -6
- package/addon/components/order/details/activity.js +9 -0
- package/addon/components/order/details.hbs +29 -0
- package/addon/components/order/details.js +26 -0
- package/addon/components/order/form/details.hbs +30 -4
- package/addon/components/order/form/details.js +46 -0
- package/addon/components/order/form/route.hbs +5 -3
- package/addon/components/order/form/route.js +24 -1
- package/addon/components/order/form.hbs +12 -0
- package/addon/components/order/form.js +21 -1
- package/addon/components/order/kanban.js +72 -0
- package/addon/components/order-config-manager/activity-flow.js +45 -10
- package/addon/components/order-config-manager/lifecycle.hbs +250 -0
- package/addon/components/order-config-manager/lifecycle.js +358 -0
- package/addon/components/order-config-manager.js +5 -1
- package/addon/components/service-rate/details.hbs +1 -1
- package/addon/components/service-rate/form.hbs +1 -1
- package/addon/components/tracking-page/full-view.hbs +276 -0
- package/addon/components/tracking-page/full-view.js +474 -0
- package/addon/components/tracking-page/locale-selector.js +30 -0
- package/addon/components/tracking-page/map.hbs +44 -0
- package/addon/components/tracking-page/map.js +328 -0
- package/addon/components/tracking-page/order-list.hbs +35 -0
- package/addon/components/tracking-page/public-view.hbs +60 -0
- package/addon/components/tracking-page/settings-preview.hbs +21 -0
- package/addon/components/tracking-page/settings-preview.js +23 -0
- package/addon/components/tracking-page/verify-panel.hbs +109 -0
- package/addon/components/tracking-page.hbs +142 -0
- package/addon/components/tracking-page.js +564 -0
- package/addon/components/trailer/form.hbs +2 -2
- package/addon/components/vehicle/form.hbs +3 -3
- package/addon/components/warranty/form.hbs +2 -2
- package/addon/components/widget/live-fleet.js +54 -6
- package/addon/components/widget/proof-of-delivery.hbs +49 -0
- package/addon/components/widget/proof-of-delivery.js +62 -0
- package/addon/components/work-order/form.hbs +3 -3
- package/addon/controllers/analytics/reports/index.js +10 -1
- package/addon/controllers/connectivity/devices/index/details.js +1 -0
- package/addon/controllers/connectivity/devices/index.js +8 -2
- package/addon/controllers/connectivity/events/index.js +31 -1
- package/addon/controllers/connectivity/sensors/index/details.js +1 -1
- package/addon/controllers/connectivity/sensors/index.js +37 -1
- package/addon/controllers/maintenance/equipment/index/details.js +2 -2
- package/addon/controllers/maintenance/equipment/index.js +28 -9
- package/addon/controllers/maintenance/inspection-forms/index.js +32 -12
- package/addon/controllers/maintenance/inspection-submissions/index/details.js +2 -1
- package/addon/controllers/maintenance/inspection-submissions/index.js +49 -9
- package/addon/controllers/maintenance/maintenances/index/details.js +2 -0
- package/addon/controllers/maintenance/maintenances/index.js +20 -1
- package/addon/controllers/maintenance/parts/index/details.js +2 -2
- package/addon/controllers/maintenance/parts/index.js +28 -8
- package/addon/controllers/maintenance/schedules/index.js +33 -4
- package/addon/controllers/maintenance/work-orders/index/details.js +3 -3
- package/addon/controllers/maintenance/work-orders/index.js +39 -8
- package/addon/controllers/management/contacts/customers.js +13 -0
- package/addon/controllers/management/contacts/index.js +43 -1
- package/addon/controllers/management/drivers/index/details.js +1 -0
- package/addon/controllers/management/drivers/index.js +32 -2
- package/addon/controllers/management/fleets/index/details.js +1 -0
- package/addon/controllers/management/fleets/index.js +39 -1
- package/addon/controllers/management/fuel-reports/index.js +22 -2
- package/addon/controllers/management/fuel-transactions/index.js +43 -7
- package/addon/controllers/management/issues/index/details.js +1 -0
- package/addon/controllers/management/issues/index.js +22 -2
- package/addon/controllers/management/places/index.js +36 -1
- package/addon/controllers/management/trailers/index/details.js +1 -0
- package/addon/controllers/management/trailers/index.js +50 -2
- package/addon/controllers/management/vehicles/index/details.js +1 -0
- package/addon/controllers/management/vehicles/index.js +33 -2
- package/addon/controllers/management/vendors/index.js +26 -2
- package/addon/controllers/operations/orders/index/details.js +50 -7
- package/addon/controllers/operations/orders/index.js +59 -4
- package/addon/controllers/operations/scheduler/index.js +45 -14
- package/addon/controllers/operations/service-rates/index.js +15 -1
- package/addon/controllers/settings/index.js +6 -0
- package/addon/controllers/settings/map.js +75 -0
- package/addon/controllers/settings/orchestrator.js +8 -6
- package/addon/controllers/settings/tracking-page.js +212 -0
- package/addon/extension.js +97 -1
- package/addon/helpers/parcel-box-image.js +16 -0
- package/addon/routes/operations/orders/index/details.js +1 -0
- package/addon/routes/operations/orders/index/new.js +5 -4
- package/addon/routes/operations/scheduler/index.js +1 -1
- package/addon/routes/settings/tracking-page.js +31 -0
- package/addon/routes.js +1 -0
- package/addon/services/contact-actions.js +1 -0
- package/addon/services/customer-actions.js +2 -1
- package/addon/services/device-actions.js +1 -0
- package/addon/services/device-event-actions.js +1 -0
- package/addon/services/driver-actions.js +4 -13
- package/addon/services/equipment-actions.js +1 -0
- package/addon/services/fleet-actions.js +1 -0
- package/addon/services/fuel-report-actions.js +1 -0
- package/addon/services/inspection-form-actions.js +1 -0
- package/addon/services/inspection-submission-actions.js +1 -0
- package/addon/services/integrated-vendor-actions.js +1 -0
- package/addon/services/issue-actions.js +1 -0
- package/addon/services/location.js +69 -21
- package/addon/services/maintenance-actions.js +1 -0
- package/addon/services/maintenance-schedule-actions.js +2 -1
- package/addon/services/map-settings.js +28 -0
- package/addon/services/order-actions.js +7 -0
- package/addon/services/order-allocation.js +1 -1
- package/addon/services/order-presentation.js +129 -0
- package/addon/services/part-actions.js +1 -0
- package/addon/services/place-actions.js +1 -0
- package/addon/services/sensor-actions.js +1 -0
- package/addon/services/service-area-actions.js +1 -0
- package/addon/services/service-rate-actions.js +1 -0
- package/addon/services/telematic-actions.js +1 -0
- package/addon/services/trailer-actions.js +4 -14
- package/addon/services/vehicle-actions.js +4 -13
- package/addon/services/vendor-actions.js +1 -0
- package/addon/services/work-order-actions.js +1 -0
- package/addon/services/zone-actions.js +1 -0
- package/addon/styles/fleetops-engine.css +1391 -0
- package/addon/templates/analytics/reports/index/details.hbs +1 -0
- package/addon/templates/analytics/reports/index.hbs +1 -0
- package/addon/templates/connectivity/devices/index/details.hbs +1 -0
- package/addon/templates/connectivity/devices/index.hbs +1 -0
- package/addon/templates/connectivity/events/index.hbs +1 -0
- package/addon/templates/connectivity/sensors/index/details.hbs +1 -0
- package/addon/templates/connectivity/sensors/index.hbs +1 -0
- package/addon/templates/maintenance/equipment/index/details.hbs +1 -0
- package/addon/templates/maintenance/equipment/index.hbs +2 -0
- package/addon/templates/maintenance/inspection-forms/index/details.hbs +1 -0
- package/addon/templates/maintenance/inspection-forms/index.hbs +1 -0
- package/addon/templates/maintenance/inspection-submissions/index/details.hbs +1 -0
- package/addon/templates/maintenance/inspection-submissions/index.hbs +1 -0
- package/addon/templates/maintenance/maintenances/index/details.hbs +1 -0
- package/addon/templates/maintenance/maintenances/index.hbs +1 -0
- package/addon/templates/maintenance/parts/index/details.hbs +1 -0
- package/addon/templates/maintenance/parts/index.hbs +2 -0
- package/addon/templates/maintenance/schedules/index/details.hbs +1 -0
- package/addon/templates/maintenance/schedules/index.hbs +2 -0
- package/addon/templates/maintenance/work-orders/index/details.hbs +1 -0
- package/addon/templates/maintenance/work-orders/index.hbs +1 -0
- package/addon/templates/management/contacts/customers/details.hbs +1 -0
- package/addon/templates/management/contacts/customers.hbs +1 -0
- package/addon/templates/management/contacts/index/details.hbs +1 -0
- package/addon/templates/management/contacts/index.hbs +1 -0
- package/addon/templates/management/contacts.hbs +1 -0
- package/addon/templates/management/drivers/index/details.hbs +1 -0
- package/addon/templates/management/drivers/index.hbs +2 -0
- package/addon/templates/management/fleets/index/details.hbs +1 -0
- package/addon/templates/management/fleets/index.hbs +1 -0
- package/addon/templates/management/fuel-reports/index/details.hbs +1 -0
- package/addon/templates/management/fuel-reports/index.hbs +1 -0
- package/addon/templates/management/fuel-transactions/index.hbs +1 -0
- package/addon/templates/management/issues/index/details.hbs +1 -0
- package/addon/templates/management/issues/index.hbs +1 -0
- package/addon/templates/management/places/index/details.hbs +1 -0
- package/addon/templates/management/places/index.hbs +1 -0
- package/addon/templates/management/trailers/index/details.hbs +1 -0
- package/addon/templates/management/trailers/index.hbs +2 -0
- package/addon/templates/management/vehicles/index/details.hbs +1 -0
- package/addon/templates/management/vehicles/index.hbs +2 -0
- package/addon/templates/management/vendors/index/details.hbs +1 -0
- package/addon/templates/management/vendors/index.hbs +2 -0
- package/addon/templates/management/vendors/integrated.hbs +1 -0
- package/addon/templates/operations/orders/index/details.hbs +1 -0
- package/addon/templates/operations/orders/index.hbs +1 -0
- package/addon/templates/operations/service-rates/index/details.hbs +1 -0
- package/addon/templates/operations/service-rates/index.hbs +1 -0
- package/addon/templates/settings/map.hbs +46 -0
- package/addon/templates/settings/tracking-page.hbs +318 -0
- package/addon/utils/identity-cell-resource.js +2 -56
- package/addon/utils/map-default-view.js +132 -0
- package/addon/utils/normalize-order-config-flow.js +6 -1
- package/addon/utils/placeholder-images.js +4 -69
- package/addon/utils/resource-descriptors/assets.js +2 -57
- package/addon/utils/resource-descriptors/helpers.js +23 -122
- package/addon/utils/resource-descriptors/operations.js +2 -61
- package/addon/utils/resource-descriptors/people.js +3 -142
- package/addon/utils/resource-descriptors/shared.js +18 -0
- package/addon/utils/tracking-live-source.js +123 -0
- package/addon/utils/tracking-page-theme.js +123 -0
- package/app/components/admin/tracking-page-settings.js +1 -0
- package/app/components/tracking-page/full-view.js +1 -0
- package/app/components/tracking-page/locale-selector.js +1 -0
- package/app/components/tracking-page/map.js +1 -0
- package/app/components/tracking-page/order-list.js +1 -0
- package/app/components/tracking-page/public-view.js +1 -0
- package/app/components/tracking-page/settings-preview.js +1 -0
- package/app/components/tracking-page/verify-panel.js +1 -0
- package/app/components/tracking-page.js +1 -0
- package/app/components/widget/proof-of-delivery.js +1 -0
- package/app/controllers/settings/tracking-page.js +1 -0
- package/app/helpers/parcel-box-image.js +1 -0
- package/app/routes/settings/tracking-page.js +1 -0
- package/app/services/order-presentation.js +1 -0
- package/app/templates/settings/tracking-page.js +1 -0
- package/app/utils/map-default-view.js +1 -0
- package/app/utils/tracking-live-source.js +1 -0
- package/app/utils/tracking-page-theme.js +1 -0
- package/composer.json +2 -2
- package/extension.json +1 -1
- package/package.json +4 -4
- package/scripts/pest-bootstrap.php +4 -0
- package/server/config/fleetops.php +4 -0
- package/server/migrations/2026_10_08_000001_create_tracking_sessions_tables.php +51 -0
- package/server/migrations/2026_10_10_000001_add_trashed_index_to_device_events.php +40 -0
- package/server/migrations/2026_10_10_000002_add_trashed_index_to_positions.php +40 -0
- package/server/migrations/2026_10_12_000001_add_deleted_at_to_tracking_sessions_tables.php +32 -0
- package/server/resources/views/labels/default.php +2 -2
- package/server/resources/views/labels/entity-label.php +2 -2
- package/server/resources/views/labels/waypoint-label.php +2 -2
- package/server/src/Auth/Schemas/FleetOps.php +5 -0
- package/server/src/Console/Commands/ProcessOperationalAlerts.php +1 -0
- package/server/src/Console/Commands/PruneTelematicsData.php +101 -26
- package/server/src/Events/OrderChanged.php +257 -0
- package/server/src/Events/OrderDriverUnassigned.php +68 -0
- package/server/src/Exceptions/OrderEditLockedException.php +32 -0
- package/server/src/Expansions/CompanyExpansion.php +3 -2
- package/server/src/Expansions/UserExpansion.php +12 -10
- package/server/src/Http/Controllers/Api/v1/CustomerController.php +108 -18
- package/server/src/Http/Controllers/Api/v1/DriverController.php +95 -10
- package/server/src/Http/Controllers/Api/v1/EntityController.php +66 -0
- package/server/src/Http/Controllers/Api/v1/FleetController.php +10 -4
- package/server/src/Http/Controllers/Api/v1/OrderController.php +139 -36
- package/server/src/Http/Controllers/Api/v1/PayloadController.php +76 -8
- package/server/src/Http/Controllers/Api/v1/PlaceController.php +3 -3
- package/server/src/Http/Controllers/Api/v1/TrackingNumberController.php +6 -32
- package/server/src/Http/Controllers/Api/v1/VehicleController.php +5 -0
- package/server/src/Http/Controllers/Internal/v1/ContactController.php +3 -0
- package/server/src/Http/Controllers/Internal/v1/DriverController.php +10 -0
- package/server/src/Http/Controllers/Internal/v1/FleetController.php +16 -2
- package/server/src/Http/Controllers/Internal/v1/InspectionSubmissionController.php +13 -8
- package/server/src/Http/Controllers/Internal/v1/IssueController.php +2 -0
- package/server/src/Http/Controllers/Internal/v1/MaintenanceController.php +4 -2
- package/server/src/Http/Controllers/Internal/v1/OrchestrationController.php +93 -11
- package/server/src/Http/Controllers/Internal/v1/OrderController.php +118 -28
- package/server/src/Http/Controllers/Internal/v1/PositionController.php +22 -0
- package/server/src/Http/Controllers/Internal/v1/ProofController.php +55 -4
- package/server/src/Http/Controllers/Internal/v1/SettingController.php +303 -10
- package/server/src/Http/Controllers/Internal/v1/TrailerController.php +1 -0
- package/server/src/Http/Controllers/Internal/v1/VehicleController.php +1 -0
- package/server/src/Http/Controllers/Public/TrackingController.php +518 -0
- package/server/src/Http/Filter/ContactFilter.php +1 -1
- package/server/src/Http/Filter/InspectionFormFilter.php +23 -0
- package/server/src/Http/Filter/InspectionSubmissionFilter.php +23 -0
- package/server/src/Http/Filter/MaintenanceFilter.php +23 -0
- package/server/src/Http/Filter/OrderFilter.php +39 -4
- package/server/src/Http/Filter/ProofFilter.php +18 -0
- package/server/src/Http/Filter/RouteFilter.php +18 -0
- package/server/src/Http/Filter/TelematicFilter.php +23 -0
- package/server/src/Http/Filter/WarrantyFilter.php +23 -0
- package/server/src/Http/Requests/CancelOrderRequest.php +2 -1
- package/server/src/Http/Resources/v1/Concerns/ResolvesPublicRelationFields.php +14 -1
- package/server/src/Http/Resources/v1/Index/Customer.php +18 -0
- package/server/src/Http/Resources/v1/Index/Order.php +11 -2
- package/server/src/Http/Resources/v1/PublicOrderTracking.php +153 -0
- package/server/src/Http/Resources/v1/TrackingNumber.php +8 -34
- package/server/src/Http/Resources/v1/Zone.php +31 -23
- package/server/src/Jobs/FinalizeApiOrderCreation.php +3 -1
- package/server/src/Jobs/ProcessAllocationJob.php +16 -6
- package/server/src/Jobs/PublishTrackingUpdate.php +50 -0
- package/server/src/Listeners/HandleGeofenceEntered.php +31 -15
- package/server/src/Listeners/HandleOrderCanceled.php +9 -1
- package/server/src/Listeners/HandleUserRemovedFromCompany.php +2 -1
- package/server/src/Listeners/PublishTrackingUpdates.php +27 -0
- package/server/src/Mail/CustomerCredentialsMail.php +4 -2
- package/server/src/Models/AssetConnection.php +3 -0
- package/server/src/Models/Contact.php +3 -0
- package/server/src/Models/Device.php +28 -0
- package/server/src/Models/DeviceEvent.php +7 -0
- package/server/src/Models/Driver.php +20 -7
- package/server/src/Models/Entity.php +12 -4
- package/server/src/Models/Fleet.php +11 -32
- package/server/src/Models/FleetDriver.php +3 -0
- package/server/src/Models/FleetVehicle.php +3 -0
- package/server/src/Models/FuelReport.php +5 -13
- package/server/src/Models/Issue.php +4 -16
- package/server/src/Models/Order.php +234 -11
- package/server/src/Models/OrderConfig.php +129 -0
- package/server/src/Models/Payload.php +227 -35
- package/server/src/Models/Place.php +7 -1
- package/server/src/Models/ServiceArea.php +7 -0
- package/server/src/Models/ServiceRate.php +7 -17
- package/server/src/Models/TrackingNumber.php +109 -6
- package/server/src/Models/TrackingSession.php +33 -0
- package/server/src/Models/TrackingSessionGrant.php +22 -0
- package/server/src/Models/TrackingStatus.php +6 -0
- package/server/src/Models/Vehicle.php +21 -2
- package/server/src/Models/Vendor.php +7 -0
- package/server/src/Models/Waypoint.php +13 -4
- package/server/src/Notifications/OrderAssigned.php +2 -1
- package/server/src/Notifications/OrderCanceled.php +7 -1
- package/server/src/Notifications/OrderChanged.php +87 -0
- package/server/src/Notifications/OrderCompleted.php +2 -1
- package/server/src/Notifications/OrderDispatchFailed.php +2 -1
- package/server/src/Notifications/OrderDispatched.php +2 -1
- package/server/src/Notifications/OrderFailed.php +2 -1
- package/server/src/Notifications/OrderUnassigned.php +66 -0
- package/server/src/Notifications/WaypointCompleted.php +2 -1
- package/server/src/Observers/CompanyUserObserver.php +8 -7
- package/server/src/Observers/DriverObserver.php +6 -1
- package/server/src/Observers/OrderObserver.php +141 -1
- package/server/src/Observers/TrackingNumberObserver.php +18 -6
- package/server/src/Observers/UserObserver.php +2 -1
- package/server/src/Observers/VehicleObserver.php +8 -3
- package/server/src/Orchestration/Engines/RouteSequencingEngine.php +21 -3
- package/server/src/Orchestration/Engines/VroomOrchestrationEngine.php +38 -8
- package/server/src/Orchestration/OrchestrationEngineRegistry.php +61 -1
- package/server/src/Orchestration/Support/OrchestratorSettings.php +61 -0
- package/server/src/Orchestration/Support/RouteMetrics.php +165 -0
- package/server/src/Providers/EventServiceProvider.php +11 -0
- package/server/src/Providers/FleetOpsServiceProvider.php +13 -0
- package/server/src/Support/ApiCacheThrottle.php +76 -0
- package/server/src/Support/LiveOrderQuery.php +3 -1
- package/server/src/Support/OrderEdit.php +365 -0
- package/server/src/Support/OrderEditPolicy.php +292 -0
- package/server/src/Support/ProfileAccountManager.php +54 -1
- package/server/src/Support/ResolvesOrderServiceStops.php +5 -0
- package/server/src/Support/SocketChannels.php +346 -0
- package/server/src/Support/Telematics/TelematicService.php +7 -2
- package/server/src/Support/Telematics/Telemetry/Inbox.php +8 -1
- package/server/src/Support/TrackingChannel.php +55 -0
- package/server/src/Support/TrackingCode.php +242 -0
- package/server/src/Support/TrackingPage/TrackingAccess.php +356 -0
- package/server/src/Support/TrackingPage/TrackingPageConfig.php +264 -0
- package/server/src/Support/TrackingPage/TrackingRecipient.php +111 -0
- package/server/src/Support/TrackingPage/TrackingResolver.php +201 -0
- package/server/src/Support/TrackingPage/TrackingTarget.php +40 -0
- package/server/src/Support/TrackingPage/TrackingView.php +543 -0
- package/server/src/Support/TrackingPublisher.php +261 -0
- package/server/src/Support/TrackingScope.php +182 -0
- package/server/src/Support/TrackingUpdate.php +402 -0
- package/server/src/Support/Utils.php +15 -3
- package/server/src/Traits/HasTrackingNumber.php +2 -0
- package/server/src/routes.php +39 -7
- package/server/tests/ApiCustomerControllerContractsTest.php +54 -7
- package/server/tests/ApiDriverPasswordContractsTest.php +25 -21
- package/server/tests/ApiEntityControllerContractsTest.php +84 -0
- package/server/tests/ApiOrderControllerContractsTest.php +245 -0
- package/server/tests/ApiPayloadControllerContractsTest.php +121 -0
- package/server/tests/ApiPlaceControllerContractsTest.php +1 -1
- package/server/tests/ApiTrackingNumberControllerContractsTest.php +6 -9
- package/server/tests/CompactResourceSerializationTest.php +23 -59
- package/server/tests/ControllerFilterContractsTest.php +1 -1
- package/server/tests/CustomerContactIdentitySafetyTest.php +1 -1
- package/server/tests/EventContractsTest.php +26 -60
- package/server/tests/ExpansionContractsTest.php +15 -2
- package/server/tests/Feature/Http/Api/CustomerControllerHelperSeamsTest.php +29 -3
- package/server/tests/Feature/Http/Api/DriverControllerAuthFlowsTest.php +23 -0
- package/server/tests/Feature/Http/Api/OrderControllerNearbyFiltersTest.php +16 -16
- package/server/tests/Feature/Http/Api/OrderControllerQueryFiltersTest.php +41 -14
- package/server/tests/Feature/Http/Api/TrackingNumberControllerHelpersTest.php +57 -22
- package/server/tests/Feature/Http/Internal/DriverControllerCreateRecordTest.php +23 -9
- package/server/tests/Feature/Http/Internal/OrchestrationControllerContractsTest.php +171 -1
- package/server/tests/Feature/Http/Internal/OrderControllerActivityFlowsTest.php +72 -0
- package/server/tests/Feature/Http/Internal/OrderControllerContractsTest.php +110 -14
- package/server/tests/Feature/Http/Internal/OrderControllerCreateRecordTest.php +26 -0
- package/server/tests/Feature/Http/Internal/OrderControllerHelpersTest.php +7 -5
- package/server/tests/Feature/Http/Internal/PositionControllerReplayChannelTest.php +135 -0
- package/server/tests/Feature/Http/Internal/ProofControllerContractsTest.php +3 -3
- package/server/tests/Feature/Http/Internal/ProofControllerRecentTest.php +170 -0
- package/server/tests/Feature/Http/Public/TrackingControllerTest.php +495 -0
- package/server/tests/IndexCustomerPhotoTest.php +151 -0
- package/server/tests/ModelAccessorContractsTest.php +4 -3
- package/server/tests/NotificationAndMailContractsTest.php +5 -8
- package/server/tests/ObserverContractsTest.php +72 -10
- package/server/tests/OrderActivityFlowRegressionTest.php +3 -2
- package/server/tests/OrderConfigLifecycleTest.php +120 -0
- package/server/tests/OrderFilterExecutionTest.php +167 -2
- package/server/tests/ProcessAllocationJobContractsTest.php +20 -0
- package/server/tests/PublicOrderTrackingResourceTest.php +221 -0
- package/server/tests/QueueJobContractsTest.php +2 -1
- package/server/tests/RequestContractsTest.php +1 -1
- package/server/tests/RouteRegistrationExecutionTest.php +26 -0
- package/server/tests/RouteSequencingEngineTest.php +17 -0
- package/server/tests/SettingControllerContractsTest.php +110 -0
- package/server/tests/Support/TrackingPageDatabase.php +200 -0
- package/server/tests/TenantScopingTest.php +206 -0
- package/server/tests/TrackingPageSettingsTest.php +343 -0
- package/server/tests/Unit/Console/PruneTelematicsDataCommandTest.php +51 -0
- package/server/tests/Unit/Events/OrderDispatchFailedTest.php +2 -1
- package/server/tests/Unit/Http/Filter/ContactFilterAddressTest.php +61 -0
- package/server/tests/Unit/Http/Resources/IndexOrderResourceTest.php +30 -0
- package/server/tests/Unit/Jobs/FinalizeApiOrderCreationDispatchGuardTest.php +266 -0
- package/server/tests/Unit/Listeners/HandleGeofenceEnteredTest.php +182 -22
- package/server/tests/Unit/Listeners/HandleUserRemovedFromCompanyTest.php +5 -0
- package/server/tests/Unit/Models/DriverAssignVehicleTest.php +81 -0
- package/server/tests/Unit/Models/FleetTest.php +4 -3
- package/server/tests/Unit/Models/OrderCancelReasonTest.php +143 -0
- package/server/tests/Unit/Models/OrderPayloadConfigAndDistanceTest.php +60 -0
- package/server/tests/Unit/Models/OrderPayloadRouteTest.php +4 -2
- package/server/tests/Unit/Models/PayloadTest.php +18 -4
- package/server/tests/Unit/Models/ServiceRatePersistenceAndServicabilityTest.php +2 -2
- package/server/tests/Unit/Models/TrackingNumberTest.php +67 -6
- package/server/tests/Unit/Models/VehicleTest.php +16 -2
- package/server/tests/Unit/Models/WaypointTest.php +4 -3
- package/server/tests/Unit/Notifications/OrderChangeNotificationsTest.php +59 -0
- package/server/tests/Unit/Notifications/TerminalOrderNotificationsTest.php +3 -3
- package/server/tests/Unit/Observers/DriverDeletionCleanupTest.php +158 -0
- package/server/tests/Unit/Observers/FleetOpsCompanyUserAndServiceAreaObserversTest.php +20 -0
- package/server/tests/Unit/Observers/ObserverListenerSeamsTest.php +3 -3
- package/server/tests/Unit/Observers/OrderAssignmentObserverTest.php +100 -0
- package/server/tests/Unit/Observers/OrderDeleteCascadeTest.php +213 -0
- package/server/tests/Unit/Observers/VehicleObserverDeleteTest.php +67 -0
- package/server/tests/Unit/Orchestration/EngineSelectionAndRouteMetricsTest.php +336 -0
- package/server/tests/Unit/Orchestration/Engines/VroomOrchestrationEngineLifecycleTest.php +8 -1
- package/server/tests/Unit/Support/ApiCacheDependenciesTest.php +347 -0
- package/server/tests/Unit/Support/OrderEditPolicyTest.php +156 -0
- package/server/tests/Unit/Support/OrderOperationsTest.php +514 -0
- package/server/tests/Unit/Support/OsrmProofAndIssueFilterTest.php +4 -3
- package/server/tests/Unit/Support/ProfileAccountManagerTest.php +141 -0
- package/server/tests/Unit/Support/QuerySeamsTest.php +5 -1
- package/server/tests/Unit/Support/SocketChannelsTest.php +396 -0
- package/server/tests/Unit/Support/TrackingChannelTest.php +232 -0
- package/server/tests/Unit/Support/TrackingCodeTest.php +186 -0
- package/server/tests/Unit/Support/TrackingPage/TrackingAccessTest.php +200 -0
- package/server/tests/Unit/Support/TrackingPage/TrackingRecipientTest.php +51 -0
- package/server/tests/Unit/Support/TrackingPage/TrackingResolverTest.php +181 -0
- package/server/tests/Unit/Support/TrackingPage/TrackingViewTest.php +479 -0
- package/server/tests/Unit/Support/TrackingPublisherTest.php +425 -0
- package/server/tests/Unit/Support/TrackingUpdateTest.php +363 -0
- package/server/tests/Unit/Support/UtilsAdditionalTest.php +9 -0
- package/server/tests/Unit/Support/UtilsGeoMatrixAndVendorTest.php +25 -0
- package/server/tests/VehicleResourceContractsTest.php +46 -0
- package/server/tests/VroomOrchestrationEngineTest.php +34 -1
- package/server/tests/ZoneGeofenceSettingsResourceTest.php +121 -0
- package/translations/ar-ae.yml +274 -0
- package/translations/bg-bg.yaml +274 -0
- package/translations/en-us.yaml +347 -0
- package/translations/es-pa.yaml +274 -0
- package/translations/fr-fr.yaml +274 -0
- package/translations/mn-mn.yaml +274 -0
- package/translations/pt-br.yaml +274 -0
- package/translations/ru-ru.yaml +276 -2
- package/translations/uk-ua.yaml +275 -1
- package/translations/vi-vn.yaml +274 -0
- package/addon/components/cell/contact-identity.hbs +0 -1
- package/addon/components/cell/customer-identity.hbs +0 -1
- package/addon/components/cell/driver-identity.hbs +0 -1
- package/addon/components/cell/fleet-identity.hbs +0 -1
- package/addon/components/cell/order-identity.hbs +0 -1
- package/addon/components/cell/place-identity.hbs +0 -1
- package/addon/components/cell/vehicle-identity.hbs +0 -1
- package/addon/components/cell/vendor-identity.hbs +0 -1
- package/addon/components/contact/pill.hbs +0 -24
- package/addon/components/contact/summary.hbs +0 -1
- package/addon/components/customer/pill.hbs +0 -24
- package/addon/components/customer/summary.hbs +0 -1
- package/addon/components/driver/pill.hbs +0 -24
- package/addon/components/driver/summary.hbs +0 -1
- package/addon/components/fleet/pill.hbs +0 -24
- package/addon/components/fleet/summary.hbs +0 -1
- package/addon/components/order/pill.hbs +0 -24
- package/addon/components/order/summary.hbs +0 -1
- package/addon/components/place/pill.hbs +0 -24
- package/addon/components/place/summary.hbs +0 -1
- package/addon/components/select-option/contact.hbs +0 -12
- package/addon/components/select-option/customer.hbs +0 -12
- package/addon/components/select-option/driver.hbs +0 -12
- package/addon/components/select-option/fleet.hbs +0 -12
- package/addon/components/select-option/order.hbs +0 -12
- package/addon/components/select-option/place.hbs +0 -12
- package/addon/components/select-option/vehicle.hbs +0 -12
- package/addon/components/select-option/vendor.hbs +0 -12
- package/addon/components/vehicle/pill.hbs +0 -24
- package/addon/components/vehicle/summary.hbs +0 -1
- package/addon/components/vendor/pill.hbs +0 -24
- package/addon/components/vendor/summary.hbs +0 -1
- package/app/components/cell/contact-identity.js +0 -1
- package/app/components/cell/customer-identity.js +0 -1
- package/app/components/cell/driver-identity.js +0 -1
- package/app/components/cell/fleet-identity.js +0 -1
- package/app/components/cell/order-identity.js +0 -1
- package/app/components/cell/place-identity.js +0 -1
- package/app/components/cell/vehicle-identity.js +0 -1
- package/app/components/cell/vendor-identity.js +0 -1
- package/app/components/contact/pill.js +0 -1
- package/app/components/contact/summary.js +0 -1
- package/app/components/customer/pill.js +0 -1
- package/app/components/customer/summary.js +0 -1
- package/app/components/driver/pill.js +0 -1
- package/app/components/driver/summary.js +0 -1
- package/app/components/fleet/pill.js +0 -1
- package/app/components/fleet/summary.js +0 -1
- package/app/components/order/pill.js +0 -1
- package/app/components/order/summary.js +0 -1
- package/app/components/place/pill.js +0 -1
- package/app/components/place/summary.js +0 -1
- package/app/components/select-option/contact.js +0 -1
- package/app/components/select-option/customer.js +0 -1
- package/app/components/select-option/driver.js +0 -1
- package/app/components/select-option/fleet.js +0 -1
- package/app/components/select-option/order.js +0 -1
- package/app/components/select-option/place.js +0 -1
- package/app/components/select-option/vehicle.js +0 -1
- package/app/components/select-option/vendor.js +0 -1
- package/app/components/vehicle/pill.js +0 -1
- package/app/components/vehicle/summary.js +0 -1
- package/app/components/vendor/pill.js +0 -1
- package/app/components/vendor/summary.js +0 -1
|
@@ -9,6 +9,7 @@ import { renderCompleted, waitForInsertedAndSized } from '@fleetbase/ember-ui/ut
|
|
|
9
9
|
import LeafletTrackingMarkerComponent from '../leaflet-tracking-marker';
|
|
10
10
|
import ensureLeafletDrawEditNamespace from '../../utils/leaflet-draw-namespace-guard';
|
|
11
11
|
import { DEFAULT_LEAFLET_TILE_ATTRIBUTION } from '../../utils/leaflet-tile-url';
|
|
12
|
+
import { FIT_VEHICLES_MAX_ZOOM, positionedBounds } from '../../utils/map-default-view';
|
|
12
13
|
|
|
13
14
|
const DEFAULT_CENTER = [1.31, 103.85];
|
|
14
15
|
const DEFAULT_ZOOM = 11;
|
|
@@ -56,6 +57,8 @@ export default class WidgetLiveFleetComponent extends Component {
|
|
|
56
57
|
#map = null;
|
|
57
58
|
#mapSetPromise = null;
|
|
58
59
|
#resolveMapSet = null;
|
|
60
|
+
/** Fit to the vehicles only on the first load, never on the periodic reconcile. */
|
|
61
|
+
#fittedToVehicles = false;
|
|
59
62
|
|
|
60
63
|
constructor() {
|
|
61
64
|
super(...arguments);
|
|
@@ -152,15 +155,57 @@ export default class WidgetLiveFleetComponent extends Component {
|
|
|
152
155
|
return this.drivers.length + this.vehicles.length;
|
|
153
156
|
}
|
|
154
157
|
|
|
155
|
-
/**
|
|
156
|
-
|
|
158
|
+
/**
|
|
159
|
+
* Bounds around the positioned vehicles when the company chose "Fit to my
|
|
160
|
+
* vehicles" (Settings > Map), else null.
|
|
161
|
+
*/
|
|
162
|
+
get vehicleBounds() {
|
|
163
|
+
if (!this.mapSettings.fitMapToVehicles) return null;
|
|
164
|
+
return positionedBounds(this.vehicles.map((vehicle) => ({ location: [vehicle.lat, vehicle.lng] })));
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
/**
|
|
168
|
+
* Where the map opens, in order: the positioned vehicles (when fitting is
|
|
169
|
+
* on), the company's default centre, the first positioned marker, the
|
|
170
|
+
* centre of the company's country, the hardcoded default.
|
|
171
|
+
*/
|
|
172
|
+
get initialView() {
|
|
173
|
+
const bounds = this.vehicleBounds;
|
|
174
|
+
if (bounds) {
|
|
175
|
+
const [[south, west], [north, east]] = bounds;
|
|
176
|
+
return { center: [(south + north) / 2, (west + east) / 2], zoom: DEFAULT_ZOOM, bounds };
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
const defaultCenter = this.mapSettings.defaultMapCenter;
|
|
180
|
+
if (defaultCenter) return { center: [defaultCenter.latitude, defaultCenter.longitude], zoom: defaultCenter.zoom };
|
|
181
|
+
|
|
157
182
|
const first = this.drivers[0] ?? this.vehicles[0];
|
|
158
|
-
if (first?.lat && first?.lng) return [first.lat, first.lng];
|
|
159
|
-
|
|
183
|
+
if (first?.lat && first?.lng) return { center: [first.lat, first.lng], zoom: DEFAULT_ZOOM };
|
|
184
|
+
|
|
185
|
+
const countryCenter = this.mapSettings.companyCountryCenter;
|
|
186
|
+
if (countryCenter) return { center: [countryCenter.latitude, countryCenter.longitude], zoom: countryCenter.zoom };
|
|
187
|
+
|
|
188
|
+
return { center: DEFAULT_CENTER, zoom: DEFAULT_ZOOM };
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
get center() {
|
|
192
|
+
return this.initialView.center;
|
|
160
193
|
}
|
|
161
194
|
|
|
162
195
|
get zoom() {
|
|
163
|
-
return
|
|
196
|
+
return this.initialView.zoom;
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
/** Frame the positioned vehicles once, after the first data load. */
|
|
200
|
+
fitToVehicles(map) {
|
|
201
|
+
if (this.#fittedToVehicles) return false;
|
|
202
|
+
|
|
203
|
+
const bounds = this.vehicleBounds;
|
|
204
|
+
if (!bounds || typeof map?.fitBounds !== 'function') return false;
|
|
205
|
+
|
|
206
|
+
map.fitBounds(bounds, { padding: [30, 30], maxZoom: FIT_VEHICLES_MAX_ZOOM });
|
|
207
|
+
this.#fittedToVehicles = true;
|
|
208
|
+
return true;
|
|
164
209
|
}
|
|
165
210
|
|
|
166
211
|
statusColor(status) {
|
|
@@ -182,9 +227,12 @@ export default class WidgetLiveFleetComponent extends Component {
|
|
|
182
227
|
// container before we add markers. Without this, markers added to a
|
|
183
228
|
// not-yet-sized map silently no-op (the data arrives, count chip ticks
|
|
184
229
|
// up, but nothing paints).
|
|
185
|
-
yield this.ensureInteractive();
|
|
230
|
+
const map = yield this.ensureInteractive();
|
|
186
231
|
this.data = yield this.fetch.get('fleet-ops/analytics/live-fleet');
|
|
187
232
|
this.error = null;
|
|
233
|
+
// The fit choice lives in the company's map settings, loaded in the constructor.
|
|
234
|
+
yield this.mapSettings.load();
|
|
235
|
+
this.fitToVehicles(map);
|
|
188
236
|
} catch (e) {
|
|
189
237
|
this.error = e?.message ?? 'Failed to load live fleet';
|
|
190
238
|
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
<div class="fleet-ops-widget fleet-ops-proof-of-delivery flex flex-col h-full {{@class}}" data-test-proof-of-delivery-widget ...attributes>
|
|
2
|
+
<div class="flex items-center justify-between px-3 py-1.5 border dark:border-gray-700 border-gray-200 dark:bg-gray-800 bg-gray-50 rounded-t-md shadow-sm">
|
|
3
|
+
<span class="text-xs font-bold text-black dark:text-gray-100">{{t "widget.proof-of-delivery.title"}}</span>
|
|
4
|
+
<FaIcon @icon="camera" class="text-gray-400" />
|
|
5
|
+
</div>
|
|
6
|
+
|
|
7
|
+
<div class="flex-1 p-2 border border-t-0 dark:border-gray-700 border-gray-200 rounded-b-md bg-white dark:bg-gray-900 overflow-auto min-h-0">
|
|
8
|
+
{{#if this.load.isRunning}}
|
|
9
|
+
<div class="flex items-center justify-center h-full"><Spinner /></div>
|
|
10
|
+
{{else if this.error}}
|
|
11
|
+
<div class="flex items-center justify-center h-full text-xs text-red-500">{{this.error}}</div>
|
|
12
|
+
{{else if this.photos.length}}
|
|
13
|
+
<div class="grid grid-cols-3 gap-2">
|
|
14
|
+
{{#each this.photos as |proof|}}
|
|
15
|
+
<div class="min-w-0" data-test-proof-of-delivery-photo={{proof.id}}>
|
|
16
|
+
<button
|
|
17
|
+
type="button"
|
|
18
|
+
class="block w-full aspect-square rounded-md overflow-hidden border dark:border-gray-700 border-gray-200 bg-gray-100 dark:bg-gray-800 hover:opacity-90"
|
|
19
|
+
title={{or proof.remarks (t "widget.proof-of-delivery.open-photo")}}
|
|
20
|
+
aria-label={{t "widget.proof-of-delivery.open-photo"}}
|
|
21
|
+
{{on "click" (fn this.openPhoto proof)}}
|
|
22
|
+
>
|
|
23
|
+
<img src={{proof.url}} alt={{or proof.remarks (t "widget.proof-of-delivery.title")}} loading="lazy" class="w-full h-full object-cover" />
|
|
24
|
+
</button>
|
|
25
|
+
<div class="mt-0.5 leading-tight">
|
|
26
|
+
{{#if proof.order_id}}
|
|
27
|
+
<LinkTo
|
|
28
|
+
@route={{this.orderRoute}}
|
|
29
|
+
@model={{proof.order_id}}
|
|
30
|
+
class="block text-[10px] font-semibold text-blue-600 hover:text-blue-700 dark:text-blue-300 dark:hover:text-blue-200 truncate"
|
|
31
|
+
title={{proof.customer_name}}
|
|
32
|
+
data-test-proof-of-delivery-order
|
|
33
|
+
>{{proof.order_id}}</LinkTo>
|
|
34
|
+
{{/if}}
|
|
35
|
+
{{#if proof.timeAgo}}
|
|
36
|
+
<div class="text-[9px] text-gray-500 dark:text-gray-400 truncate">{{proof.timeAgo}}</div>
|
|
37
|
+
{{/if}}
|
|
38
|
+
</div>
|
|
39
|
+
</div>
|
|
40
|
+
{{/each}}
|
|
41
|
+
</div>
|
|
42
|
+
{{else}}
|
|
43
|
+
<div class="flex flex-col items-center justify-center h-full text-center text-gray-500 dark:text-gray-400" data-test-proof-of-delivery-empty>
|
|
44
|
+
<FaIcon @icon="camera" class="text-lg mb-1 text-gray-300 dark:text-gray-600" />
|
|
45
|
+
<div class="text-[11px]">{{t "widget.proof-of-delivery.empty"}}</div>
|
|
46
|
+
</div>
|
|
47
|
+
{{/if}}
|
|
48
|
+
</div>
|
|
49
|
+
</div>
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import Component from '@glimmer/component';
|
|
2
|
+
import { tracked } from '@glimmer/tracking';
|
|
3
|
+
import { action } from '@ember/object';
|
|
4
|
+
import { inject as service } from '@ember/service';
|
|
5
|
+
import { getOwner } from '@ember/application';
|
|
6
|
+
import { task } from 'ember-concurrency';
|
|
7
|
+
import { formatDistanceToNowStrict, isValid } from 'date-fns';
|
|
8
|
+
import config from '../../config/environment';
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* The latest proof of delivery photos across the fleet, each linking to its order.
|
|
12
|
+
*/
|
|
13
|
+
export default class WidgetProofOfDeliveryComponent extends Component {
|
|
14
|
+
static widgetId = 'fleet-ops-proof-of-delivery-widget';
|
|
15
|
+
static limit = 12;
|
|
16
|
+
|
|
17
|
+
@service fetch;
|
|
18
|
+
|
|
19
|
+
@tracked proofs = [];
|
|
20
|
+
@tracked error = null;
|
|
21
|
+
|
|
22
|
+
constructor() {
|
|
23
|
+
super(...arguments);
|
|
24
|
+
this.load.perform();
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
get photos() {
|
|
28
|
+
return (this.proofs ?? [])
|
|
29
|
+
.filter((proof) => proof?.url)
|
|
30
|
+
.map((proof) => ({
|
|
31
|
+
...proof,
|
|
32
|
+
timeAgo: this.timeAgo(proof.captured_at),
|
|
33
|
+
}));
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
get orderRoute() {
|
|
37
|
+
// Dashboard widgets render under the host owner, outside the engine's routing context.
|
|
38
|
+
return getOwner(this).mountPoint ? 'operations.orders.index.details' : `${config.mountedEngineRoutePrefix}.operations.orders.index.details`;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
timeAgo(capturedAt) {
|
|
42
|
+
const date = capturedAt ? new Date(capturedAt) : null;
|
|
43
|
+
|
|
44
|
+
return date && isValid(date) ? formatDistanceToNowStrict(date, { addSuffix: true }) : null;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
@action openPhoto(proof) {
|
|
48
|
+
if (proof?.url) {
|
|
49
|
+
window.open(proof.url, '_blank', 'noopener,noreferrer');
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
@task({ restartable: true }) *load() {
|
|
54
|
+
this.error = null;
|
|
55
|
+
try {
|
|
56
|
+
const response = yield this.fetch.get('fleet-ops/proofs/recent', { limit: WidgetProofOfDeliveryComponent.limit });
|
|
57
|
+
this.proofs = response?.proofs ?? [];
|
|
58
|
+
} catch (err) {
|
|
59
|
+
this.error = err?.message ?? 'Failed to load';
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
@@ -175,7 +175,7 @@
|
|
|
175
175
|
</div>
|
|
176
176
|
<InputGroup @name="Opened At">
|
|
177
177
|
<DatePicker
|
|
178
|
-
@value={{or (format-date-fns @resource.opened_at "
|
|
178
|
+
@value={{or (format-date-fns @resource.opened_at "yyyy-MM-dd") null}}
|
|
179
179
|
@onChange={{fn (mut @resource.opened_at)}}
|
|
180
180
|
@placeholder="DD-MM-YYYY"
|
|
181
181
|
class="filter-date-input w-full flex-1"
|
|
@@ -183,7 +183,7 @@
|
|
|
183
183
|
</InputGroup>
|
|
184
184
|
<InputGroup @name="Due At">
|
|
185
185
|
<DatePicker
|
|
186
|
-
@value={{or (format-date-fns @resource.due_at "
|
|
186
|
+
@value={{or (format-date-fns @resource.due_at "yyyy-MM-dd") null}}
|
|
187
187
|
@onChange={{fn (mut @resource.due_at)}}
|
|
188
188
|
@placeholder="DD-MM-YYYY"
|
|
189
189
|
class="filter-date-input w-full flex-1"
|
|
@@ -191,7 +191,7 @@
|
|
|
191
191
|
</InputGroup>
|
|
192
192
|
<InputGroup @name="Closed At">
|
|
193
193
|
<DatePicker
|
|
194
|
-
@value={{or (format-date-fns @resource.closed_at "
|
|
194
|
+
@value={{or (format-date-fns @resource.closed_at "yyyy-MM-dd") null}}
|
|
195
195
|
@onChange={{fn (mut @resource.closed_at)}}
|
|
196
196
|
@placeholder="DD-MM-YYYY"
|
|
197
197
|
class="filter-date-input w-full flex-1"
|
|
@@ -8,7 +8,7 @@ export default class AnalyticsReportsIndexController extends Controller {
|
|
|
8
8
|
@service intl;
|
|
9
9
|
|
|
10
10
|
/** query params */
|
|
11
|
-
@tracked queryParams = ['page', 'limit', 'sort', 'query', 'public_id', 'name', 'created_at'];
|
|
11
|
+
@tracked queryParams = this.reportActions.queryParamsFor(['page', 'limit', 'sort', 'query', 'public_id', 'name', 'created_at']);
|
|
12
12
|
@tracked page = 1;
|
|
13
13
|
@tracked limit;
|
|
14
14
|
@tracked sort = '-created_at';
|
|
@@ -20,11 +20,13 @@ export default class AnalyticsReportsIndexController extends Controller {
|
|
|
20
20
|
get actionButtons() {
|
|
21
21
|
return [
|
|
22
22
|
{
|
|
23
|
+
id: 'refresh',
|
|
23
24
|
icon: 'refresh',
|
|
24
25
|
onClick: this.reportActions.refresh,
|
|
25
26
|
helpText: this.intl.t('common.refresh'),
|
|
26
27
|
},
|
|
27
28
|
{
|
|
29
|
+
id: 'create',
|
|
28
30
|
text: this.intl.t('common.new'),
|
|
29
31
|
type: 'primary',
|
|
30
32
|
icon: 'plus',
|
|
@@ -37,6 +39,7 @@ export default class AnalyticsReportsIndexController extends Controller {
|
|
|
37
39
|
get bulkActions() {
|
|
38
40
|
return [
|
|
39
41
|
{
|
|
42
|
+
id: 'bulk-delete',
|
|
40
43
|
label: 'Delete selected...',
|
|
41
44
|
class: 'text-red-500',
|
|
42
45
|
fn: this.reportActions.bulkDelete,
|
|
@@ -48,6 +51,7 @@ export default class AnalyticsReportsIndexController extends Controller {
|
|
|
48
51
|
get columns() {
|
|
49
52
|
return [
|
|
50
53
|
{
|
|
54
|
+
id: 'title',
|
|
51
55
|
sticky: true,
|
|
52
56
|
label: 'Title',
|
|
53
57
|
valuePath: 'title',
|
|
@@ -59,6 +63,7 @@ export default class AnalyticsReportsIndexController extends Controller {
|
|
|
59
63
|
filterComponent: 'filter/string',
|
|
60
64
|
},
|
|
61
65
|
{
|
|
66
|
+
id: 'public-id',
|
|
62
67
|
label: 'ID',
|
|
63
68
|
valuePath: 'public_id',
|
|
64
69
|
cellComponent: 'click-to-copy',
|
|
@@ -69,6 +74,7 @@ export default class AnalyticsReportsIndexController extends Controller {
|
|
|
69
74
|
filterComponent: 'filter/string',
|
|
70
75
|
},
|
|
71
76
|
{
|
|
77
|
+
id: 'row-actions',
|
|
72
78
|
label: '',
|
|
73
79
|
cellComponent: 'table/cell/dropdown',
|
|
74
80
|
ddButtonText: false,
|
|
@@ -81,11 +87,13 @@ export default class AnalyticsReportsIndexController extends Controller {
|
|
|
81
87
|
width: 60,
|
|
82
88
|
actions: [
|
|
83
89
|
{
|
|
90
|
+
id: 'view',
|
|
84
91
|
label: 'View report...',
|
|
85
92
|
fn: this.reportActions.transition.view,
|
|
86
93
|
permission: 'iam view report',
|
|
87
94
|
},
|
|
88
95
|
{
|
|
96
|
+
id: 'edit',
|
|
89
97
|
label: 'Edit report...',
|
|
90
98
|
fn: this.reportActions.transition.edit,
|
|
91
99
|
permission: 'iam update report',
|
|
@@ -94,6 +102,7 @@ export default class AnalyticsReportsIndexController extends Controller {
|
|
|
94
102
|
separator: true,
|
|
95
103
|
},
|
|
96
104
|
{
|
|
105
|
+
id: 'delete',
|
|
97
106
|
label: 'Delete report...',
|
|
98
107
|
fn: this.reportActions.delete,
|
|
99
108
|
permission: 'iam delete report',
|
|
@@ -17,7 +17,7 @@ export default class ConnectivityDevicesIndexController extends Controller {
|
|
|
17
17
|
@service trailerActions;
|
|
18
18
|
|
|
19
19
|
/** query params */
|
|
20
|
-
@tracked queryParams = [
|
|
20
|
+
@tracked queryParams = this.deviceActions.queryParamsFor([
|
|
21
21
|
'name',
|
|
22
22
|
'status',
|
|
23
23
|
'attachment_state',
|
|
@@ -36,7 +36,7 @@ export default class ConnectivityDevicesIndexController extends Controller {
|
|
|
36
36
|
'public_id',
|
|
37
37
|
'created_at',
|
|
38
38
|
'updated_at',
|
|
39
|
-
];
|
|
39
|
+
]);
|
|
40
40
|
@tracked page = 1;
|
|
41
41
|
@tracked limit;
|
|
42
42
|
@tracked sort = '-created_at';
|
|
@@ -56,11 +56,13 @@ export default class ConnectivityDevicesIndexController extends Controller {
|
|
|
56
56
|
/** action buttons */
|
|
57
57
|
@tracked actionButtons = [
|
|
58
58
|
{
|
|
59
|
+
id: 'refresh',
|
|
59
60
|
icon: 'refresh',
|
|
60
61
|
onClick: this.deviceActions.refresh,
|
|
61
62
|
helpText: this.intl.t('common.refresh'),
|
|
62
63
|
},
|
|
63
64
|
{
|
|
65
|
+
id: 'create',
|
|
64
66
|
text: this.intl.t('common.new'),
|
|
65
67
|
type: 'primary',
|
|
66
68
|
icon: 'plus',
|
|
@@ -68,6 +70,7 @@ export default class ConnectivityDevicesIndexController extends Controller {
|
|
|
68
70
|
permission: 'fleet-ops create device',
|
|
69
71
|
},
|
|
70
72
|
{
|
|
73
|
+
id: 'import',
|
|
71
74
|
text: this.intl.t('common.import'),
|
|
72
75
|
type: 'magic',
|
|
73
76
|
icon: 'upload',
|
|
@@ -75,6 +78,7 @@ export default class ConnectivityDevicesIndexController extends Controller {
|
|
|
75
78
|
permission: 'fleet-ops import device',
|
|
76
79
|
},
|
|
77
80
|
{
|
|
81
|
+
id: 'export',
|
|
78
82
|
text: this.intl.t('common.export'),
|
|
79
83
|
icon: 'long-arrow-up',
|
|
80
84
|
iconClass: 'rotate-icon-45',
|
|
@@ -87,6 +91,7 @@ export default class ConnectivityDevicesIndexController extends Controller {
|
|
|
87
91
|
/** bulk action buttons */
|
|
88
92
|
@tracked bulkActions = [
|
|
89
93
|
{
|
|
94
|
+
id: 'bulk-delete',
|
|
90
95
|
label: 'Delete selected...',
|
|
91
96
|
class: 'text-red-500',
|
|
92
97
|
fn: this.deviceActions.bulkDelete,
|
|
@@ -111,6 +116,7 @@ export default class ConnectivityDevicesIndexController extends Controller {
|
|
|
111
116
|
separator: true,
|
|
112
117
|
},
|
|
113
118
|
{
|
|
119
|
+
id: 'delete',
|
|
114
120
|
label: this.intl.t('common.delete-resource', { resource: this.intl.t('resource.device') }),
|
|
115
121
|
fn: this.deviceActions.delete,
|
|
116
122
|
permission: 'fleet-ops delete device',
|
|
@@ -78,7 +78,20 @@ export default class ConnectivityEventsIndexController extends Controller {
|
|
|
78
78
|
@service telematicActions;
|
|
79
79
|
|
|
80
80
|
/** query params */
|
|
81
|
-
@tracked queryParams = [
|
|
81
|
+
@tracked queryParams = this.deviceEventActions.queryParamsFor([
|
|
82
|
+
'page',
|
|
83
|
+
'limit',
|
|
84
|
+
'sort',
|
|
85
|
+
'query',
|
|
86
|
+
'telematic',
|
|
87
|
+
'device',
|
|
88
|
+
'event_type',
|
|
89
|
+
'severity',
|
|
90
|
+
'processed',
|
|
91
|
+
'occurred_at',
|
|
92
|
+
'created_at',
|
|
93
|
+
'updated_at',
|
|
94
|
+
]);
|
|
82
95
|
@tracked page = 1;
|
|
83
96
|
@tracked limit;
|
|
84
97
|
@tracked sort = '-created_at';
|
|
@@ -95,6 +108,7 @@ export default class ConnectivityEventsIndexController extends Controller {
|
|
|
95
108
|
/** action buttons */
|
|
96
109
|
@tracked actionButtons = [
|
|
97
110
|
{
|
|
111
|
+
id: 'refresh',
|
|
98
112
|
icon: 'refresh',
|
|
99
113
|
onClick: this.deviceEventActions.refresh,
|
|
100
114
|
helpText: this.intl.t('common.refresh'),
|
|
@@ -107,6 +121,7 @@ export default class ConnectivityEventsIndexController extends Controller {
|
|
|
107
121
|
/** columns */
|
|
108
122
|
@tracked columns = [
|
|
109
123
|
{
|
|
124
|
+
id: 'event-type',
|
|
110
125
|
sticky: true,
|
|
111
126
|
label: 'Event',
|
|
112
127
|
valuePath: 'event_type',
|
|
@@ -121,6 +136,7 @@ export default class ConnectivityEventsIndexController extends Controller {
|
|
|
121
136
|
filterComponent: 'filter/string',
|
|
122
137
|
},
|
|
123
138
|
{
|
|
139
|
+
id: 'device-display-name',
|
|
124
140
|
label: 'Device',
|
|
125
141
|
valuePath: 'device.displayName',
|
|
126
142
|
cellComponent: 'cell/device-identity',
|
|
@@ -137,6 +153,7 @@ export default class ConnectivityEventsIndexController extends Controller {
|
|
|
137
153
|
modelNamePath: 'displayName',
|
|
138
154
|
},
|
|
139
155
|
{
|
|
156
|
+
id: 'provider',
|
|
140
157
|
label: 'Provider',
|
|
141
158
|
valuePath: 'provider',
|
|
142
159
|
cellComponent: 'cell/telematic-identity',
|
|
@@ -152,6 +169,7 @@ export default class ConnectivityEventsIndexController extends Controller {
|
|
|
152
169
|
model: 'telematic',
|
|
153
170
|
},
|
|
154
171
|
{
|
|
172
|
+
id: 'severity',
|
|
155
173
|
label: 'Severity',
|
|
156
174
|
valuePath: 'severity',
|
|
157
175
|
cellComponent: 'table/cell/status',
|
|
@@ -165,12 +183,14 @@ export default class ConnectivityEventsIndexController extends Controller {
|
|
|
165
183
|
filterOptionValue: 'value',
|
|
166
184
|
},
|
|
167
185
|
{
|
|
186
|
+
id: 'message',
|
|
168
187
|
label: 'Message',
|
|
169
188
|
valuePath: 'message',
|
|
170
189
|
resizable: true,
|
|
171
190
|
sortable: false,
|
|
172
191
|
},
|
|
173
192
|
{
|
|
193
|
+
id: 'code',
|
|
174
194
|
label: 'Code',
|
|
175
195
|
valuePath: 'code',
|
|
176
196
|
resizable: true,
|
|
@@ -180,6 +200,7 @@ export default class ConnectivityEventsIndexController extends Controller {
|
|
|
180
200
|
filterComponent: 'filter/string',
|
|
181
201
|
},
|
|
182
202
|
{
|
|
203
|
+
id: 'ident',
|
|
183
204
|
label: 'IDENT',
|
|
184
205
|
valuePath: 'ident',
|
|
185
206
|
hidden: true,
|
|
@@ -187,6 +208,7 @@ export default class ConnectivityEventsIndexController extends Controller {
|
|
|
187
208
|
sortable: true,
|
|
188
209
|
},
|
|
189
210
|
{
|
|
211
|
+
id: 'protocol',
|
|
190
212
|
label: 'Protocol',
|
|
191
213
|
valuePath: 'protocol',
|
|
192
214
|
hidden: true,
|
|
@@ -194,6 +216,7 @@ export default class ConnectivityEventsIndexController extends Controller {
|
|
|
194
216
|
sortable: true,
|
|
195
217
|
},
|
|
196
218
|
{
|
|
219
|
+
id: 'state',
|
|
197
220
|
label: 'State',
|
|
198
221
|
valuePath: 'state',
|
|
199
222
|
hidden: true,
|
|
@@ -201,6 +224,7 @@ export default class ConnectivityEventsIndexController extends Controller {
|
|
|
201
224
|
sortable: true,
|
|
202
225
|
},
|
|
203
226
|
{
|
|
227
|
+
id: 'processed-at',
|
|
204
228
|
label: 'Processed',
|
|
205
229
|
valuePath: 'processedAt',
|
|
206
230
|
sortParam: 'processed_at',
|
|
@@ -214,6 +238,7 @@ export default class ConnectivityEventsIndexController extends Controller {
|
|
|
214
238
|
filterOptionValue: 'value',
|
|
215
239
|
},
|
|
216
240
|
{
|
|
241
|
+
id: 'occurred-at',
|
|
217
242
|
label: 'Occurred',
|
|
218
243
|
valuePath: 'occurredAt',
|
|
219
244
|
sortParam: 'occurred_at',
|
|
@@ -224,6 +249,7 @@ export default class ConnectivityEventsIndexController extends Controller {
|
|
|
224
249
|
filterComponent: 'filter/date',
|
|
225
250
|
},
|
|
226
251
|
{
|
|
252
|
+
id: 'created-at',
|
|
227
253
|
label: this.intl.t('column.created-at'),
|
|
228
254
|
valuePath: 'createdAt',
|
|
229
255
|
sortParam: 'created_at',
|
|
@@ -234,6 +260,7 @@ export default class ConnectivityEventsIndexController extends Controller {
|
|
|
234
260
|
filterComponent: 'filter/date',
|
|
235
261
|
},
|
|
236
262
|
{
|
|
263
|
+
id: 'updated-at',
|
|
237
264
|
label: this.intl.t('column.updated-at'),
|
|
238
265
|
valuePath: 'updatedAt',
|
|
239
266
|
sortParam: 'updated_at',
|
|
@@ -245,6 +272,7 @@ export default class ConnectivityEventsIndexController extends Controller {
|
|
|
245
272
|
hidden: true,
|
|
246
273
|
},
|
|
247
274
|
{
|
|
275
|
+
id: 'row-actions',
|
|
248
276
|
label: '',
|
|
249
277
|
cellComponent: 'table/cell/dropdown',
|
|
250
278
|
ddButtonText: false,
|
|
@@ -257,11 +285,13 @@ export default class ConnectivityEventsIndexController extends Controller {
|
|
|
257
285
|
width: 60,
|
|
258
286
|
actions: [
|
|
259
287
|
{
|
|
288
|
+
id: 'view',
|
|
260
289
|
label: this.intl.t('common.view-resource', { resource: this.intl.t('resource.device-event') }),
|
|
261
290
|
fn: this.deviceEventActions.transition.view,
|
|
262
291
|
permission: 'fleet-ops view device-event',
|
|
263
292
|
},
|
|
264
293
|
{
|
|
294
|
+
id: 'mark-processed',
|
|
265
295
|
label: 'Mark processed',
|
|
266
296
|
fn: this.markProcessed,
|
|
267
297
|
permission: 'fleet-ops update device-event',
|
|
@@ -7,7 +7,7 @@ export default class ConnectivitySensorsIndexDetailsController extends Controlle
|
|
|
7
7
|
@service hostRouter;
|
|
8
8
|
|
|
9
9
|
get tabs() {
|
|
10
|
-
const registeredTabs = this.menuService.getMenuItems('fleet-ops:component:
|
|
10
|
+
const registeredTabs = this.menuService.getMenuItems('fleet-ops:component:sensor:details');
|
|
11
11
|
return [
|
|
12
12
|
{
|
|
13
13
|
route: 'connectivity.sensors.index.details.index',
|