@fleetbase/fleetops-engine 0.6.48 → 0.6.49

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.
Files changed (151) hide show
  1. package/addon/components/driver/details.hbs +5 -1
  2. package/addon/components/driver/form.hbs +11 -1
  3. package/addon/components/fleet-listing-panel.hbs +2 -2
  4. package/addon/components/fleet-listing-panel.js +10 -0
  5. package/addon/components/map/google-live-map.js +12 -73
  6. package/addon/components/map/leaflet-live-map.hbs +149 -33
  7. package/addon/components/orchestrator/phase-builder.hbs +21 -0
  8. package/addon/components/orchestrator/phase-builder.js +13 -0
  9. package/addon/components/orchestrator-workbench.js +1 -0
  10. package/addon/components/order/form.hbs +2 -2
  11. package/addon/components/widget/fleet-ops-key-metrics.hbs +19 -17
  12. package/addon/components/widget/fleet-ops-key-metrics.js +26 -0
  13. package/addon/components/widget/fuel-efficiency.hbs +26 -0
  14. package/addon/components/widget/fuel-efficiency.js +43 -0
  15. package/addon/components/widget/geofence-violations.hbs +44 -0
  16. package/addon/components/widget/geofence-violations.js +55 -0
  17. package/addon/components/widget/issues-insights.hbs +43 -0
  18. package/addon/components/widget/issues-insights.js +62 -0
  19. package/addon/components/widget/kpi-active-orders.hbs +10 -0
  20. package/addon/components/widget/kpi-active-orders.js +5 -0
  21. package/addon/components/widget/kpi-aov.hbs +10 -0
  22. package/addon/components/widget/kpi-aov.js +5 -0
  23. package/addon/components/widget/kpi-distance.hbs +10 -0
  24. package/addon/components/widget/kpi-distance.js +5 -0
  25. package/addon/components/widget/kpi-drivers-online.hbs +10 -0
  26. package/addon/components/widget/kpi-drivers-online.js +5 -0
  27. package/addon/components/widget/kpi-earnings.hbs +10 -0
  28. package/addon/components/widget/kpi-earnings.js +5 -0
  29. package/addon/components/widget/kpi-open-issues.hbs +11 -0
  30. package/addon/components/widget/kpi-open-issues.js +5 -0
  31. package/addon/components/widget/kpi-tile.hbs +59 -0
  32. package/addon/components/widget/kpi-tile.js +168 -0
  33. package/addon/components/widget/live-fleet.hbs +122 -0
  34. package/addon/components/widget/live-fleet.js +365 -0
  35. package/addon/components/widget/maintenance-overview.hbs +45 -0
  36. package/addon/components/widget/maintenance-overview.js +40 -0
  37. package/addon/components/widget/on-time-delivery.hbs +27 -0
  38. package/addon/components/widget/on-time-delivery.js +73 -0
  39. package/addon/components/widget/operations-pulse.hbs +51 -0
  40. package/addon/components/widget/operations-pulse.js +173 -0
  41. package/addon/components/widget/orders-by-status.hbs +26 -0
  42. package/addon/components/widget/orders-by-status.js +54 -0
  43. package/addon/components/widget/revenue-trend.hbs +34 -0
  44. package/addon/components/widget/revenue-trend.js +67 -0
  45. package/addon/components/widget/top-drivers.hbs +44 -0
  46. package/addon/components/widget/top-drivers.js +54 -0
  47. package/addon/controllers/settings/routing.js +26 -0
  48. package/addon/extension.js +172 -3
  49. package/addon/services/map-adapter/google.js +13 -2
  50. package/addon/styles/fleetops-engine.css +114 -87
  51. package/addon/templates/maintenance/equipment/index.hbs +1 -1
  52. package/addon/templates/maintenance/parts/index.hbs +1 -1
  53. package/addon/templates/maintenance/schedules/index.hbs +1 -1
  54. package/addon/templates/management/vehicles/index.hbs +1 -1
  55. package/addon/templates/settings/avatars.hbs +1 -1
  56. package/addon/templates/settings/custom-fields.hbs +1 -1
  57. package/addon/templates/settings/map.hbs +1 -1
  58. package/addon/templates/settings/navigator-app.hbs +1 -1
  59. package/addon/templates/settings/notifications.hbs +1 -1
  60. package/addon/templates/settings/orchestrator.hbs +1 -1
  61. package/addon/templates/settings/payments/index.hbs +1 -1
  62. package/addon/templates/settings/payments/onboard.hbs +1 -1
  63. package/addon/templates/settings/routing.hbs +22 -2
  64. package/addon/templates/settings/scheduling.hbs +1 -1
  65. package/addon/utils/live-map-card-content.js +171 -0
  66. package/app/components/widget/fuel-efficiency.js +1 -0
  67. package/app/components/widget/geofence-violations.js +1 -0
  68. package/app/components/widget/issues-insights.js +1 -0
  69. package/app/components/widget/kpi-active-orders.js +1 -0
  70. package/app/components/widget/kpi-aov.js +1 -0
  71. package/app/components/widget/kpi-distance.js +1 -0
  72. package/app/components/widget/kpi-drivers-online.js +1 -0
  73. package/app/components/widget/kpi-earnings.js +1 -0
  74. package/app/components/widget/kpi-open-issues.js +1 -0
  75. package/app/components/widget/kpi-tile.js +1 -0
  76. package/app/components/widget/live-fleet.js +1 -0
  77. package/app/components/widget/maintenance-overview.js +1 -0
  78. package/app/components/widget/on-time-delivery.js +1 -0
  79. package/app/components/widget/operations-pulse.js +1 -0
  80. package/app/components/widget/orders-by-status.js +1 -0
  81. package/app/components/widget/revenue-trend.js +1 -0
  82. package/app/components/widget/top-drivers.js +1 -0
  83. package/app/utils/live-map-card-content.js +1 -0
  84. package/composer.json +1 -1
  85. package/extension.json +1 -1
  86. package/package.json +3 -3
  87. package/pnpm-workspace.yaml +1 -0
  88. package/server/config/telematics.php +111 -1
  89. package/server/migrations/2026_05_18_000001_add_license_expiry_to_drivers_table.php +25 -0
  90. package/server/seeders/Testing/Concerns/SeedsTestingData.php +183 -0
  91. package/server/seeders/Testing/ConnectivitySeeder.php +212 -0
  92. package/server/seeders/Testing/FleetSeeder.php +341 -0
  93. package/server/seeders/Testing/MaintenanceSeeder.php +238 -0
  94. package/server/seeders/Testing/NetworkSeeder.php +250 -0
  95. package/server/seeders/Testing/OrdersSeeder.php +214 -0
  96. package/server/seeders/Testing/TestingSeeder.php +40 -0
  97. package/server/seeders/{VroomOrchestrationSeeder.php → Testing/VroomOrchestrationSeeder.php} +8 -1
  98. package/server/src/Console/Commands/ProcessOperationalAlerts.php +279 -0
  99. package/server/src/Http/Controllers/Internal/v1/AnalyticsController.php +119 -0
  100. package/server/src/Http/Controllers/Internal/v1/MetricsController.php +82 -3
  101. package/server/src/Http/Controllers/Internal/v1/OrderController.php +12 -6
  102. package/server/src/Http/Controllers/Internal/v1/SettingController.php +46 -1
  103. package/server/src/Http/Resources/v1/Driver.php +2 -0
  104. package/server/src/Http/Resources/v1/Fleet.php +4 -0
  105. package/server/src/Http/Resources/v1/Index/Driver.php +48 -0
  106. package/server/src/Http/Resources/v1/Index/Vehicle.php +74 -1
  107. package/server/src/Models/Driver.php +2 -0
  108. package/server/src/Models/OrderConfig.php +14 -11
  109. package/server/src/Notifications/LateDeparture.php +48 -0
  110. package/server/src/Notifications/ProlongedStoppage.php +48 -0
  111. package/server/src/Notifications/RouteDeviation.php +48 -0
  112. package/server/src/Orchestration/Engines/VroomOrchestrationEngine.php +28 -1
  113. package/server/src/Providers/FleetOpsServiceProvider.php +5 -0
  114. package/server/src/Providers/NotificationServiceProvider.php +3 -0
  115. package/server/src/Support/Analytics/AbstractAnalytics.php +77 -0
  116. package/server/src/Support/Analytics/FuelEfficiency.php +83 -0
  117. package/server/src/Support/Analytics/GeofenceViolations.php +63 -0
  118. package/server/src/Support/Analytics/IssuesInsights.php +67 -0
  119. package/server/src/Support/Analytics/LiveFleet.php +127 -0
  120. package/server/src/Support/Analytics/MaintenanceOverview.php +70 -0
  121. package/server/src/Support/Analytics/OnTimeDelivery.php +75 -0
  122. package/server/src/Support/Analytics/OperationsPulse.php +86 -0
  123. package/server/src/Support/Analytics/OrdersByStatus.php +64 -0
  124. package/server/src/Support/Analytics/RevenueTrend.php +79 -0
  125. package/server/src/Support/Analytics/TopDrivers.php +92 -0
  126. package/server/src/Support/Metrics/AbstractMetric.php +170 -0
  127. package/server/src/Support/Metrics/ActiveLiveOrdersMetric.php +28 -0
  128. package/server/src/Support/Metrics/AvgOrderValueMetric.php +53 -0
  129. package/server/src/Support/Metrics/DriversOnlineMetric.php +30 -0
  130. package/server/src/Support/Metrics/EarningsMetric.php +30 -0
  131. package/server/src/Support/Metrics/FuelCostsMetric.php +30 -0
  132. package/server/src/Support/Metrics/MoneyMetric.php +30 -0
  133. package/server/src/Support/Metrics/OpenIssuesMetric.php +35 -0
  134. package/server/src/Support/Metrics/OrdersCanceledMetric.php +35 -0
  135. package/server/src/Support/Metrics/OrdersCompletedMetric.php +35 -0
  136. package/server/src/Support/Metrics/OrdersInProgressMetric.php +51 -0
  137. package/server/src/Support/Metrics/OrdersScheduledMetric.php +37 -0
  138. package/server/src/Support/Metrics/Registry.php +46 -0
  139. package/server/src/Support/Metrics/ResolvedIssuesMetric.php +35 -0
  140. package/server/src/Support/Metrics/TotalCustomersMetric.php +29 -0
  141. package/server/src/Support/Metrics/TotalDistanceTraveledMetric.php +35 -0
  142. package/server/src/Support/Metrics/TotalDriversMetric.php +28 -0
  143. package/server/src/Support/Metrics/TotalTimeTraveledMetric.php +35 -0
  144. package/server/src/Support/Metrics.php +46 -249
  145. package/server/src/Support/Telematics/Providers/AfaqyProvider.php +290 -0
  146. package/server/src/Support/Telematics/Providers/SafeeProvider.php +333 -0
  147. package/server/src/routes.php +16 -0
  148. package/server/tests/AnalyticsRoutesTest.php +41 -0
  149. package/server/tests/MetricsRegistryTest.php +88 -0
  150. package/server/tests/VroomOrchestrationEngineTest.php +91 -0
  151. package/translations/en-us.yaml +37 -0
@@ -1,3 +1,4 @@
1
+ /* stylelint-disable alpha-value-notation -- FleetOps lazy engine production CSS is minified by legacy clean-css, which corrupts comma-form rgba() percent alpha values. */
1
2
  .scheduler-left-sidebar {
2
3
  border-right: 1px rgb(229 231 235 / 100%) solid;
3
4
  height: 100vh;
@@ -425,7 +426,7 @@ body[data-theme='light'] .fleetops-pill-tabs > nav > a.ui-tab.active {
425
426
 
426
427
  body[data-theme='light'] .flow-activity {
427
428
  stroke: #e5e7eb;
428
- fill: rgba(249, 250, 251, 50%);
429
+ fill: rgba(249, 250, 251, 0.5);
429
430
  }
430
431
 
431
432
  body[data-theme='light'] .flow-activity:hover,
@@ -856,7 +857,7 @@ body[data-theme='dark'] .order-progress-bar > .order-progress-bar-marker-wrapper
856
857
  }
857
858
 
858
859
  .order-progress-bar.has-progress > .order-progress-bar-wrapper > .order-progress-bar-track {
859
- border-top: 4px dashed rgba(209, 213, 219, 50%);
860
+ border-top: 4px dashed rgba(209, 213, 219, 0.5);
860
861
  }
861
862
 
862
863
  .order-progress-bar > .order-progress-bar-wrapper > .order-progress-bar-track {
@@ -1872,21 +1873,21 @@ main.console-fleet-ops-operations-orders-index-index section.next-view-section >
1872
1873
  .positions-replay-component .metric-card {
1873
1874
  padding: 0.75rem;
1874
1875
  border-radius: 0.5rem;
1875
- background-color: rgba(0, 0, 0, 2%);
1876
+ background-color: rgba(0, 0, 0, 0.02);
1876
1877
  transition: all 0.2s ease-in-out;
1877
1878
  }
1878
1879
 
1879
1880
  .positions-replay-component .metric-card:hover {
1880
- background-color: rgba(0, 0, 0, 4%);
1881
- box-shadow: 0 4px 6px rgba(0, 0, 0, 10%);
1881
+ background-color: rgba(0, 0, 0, 0.04);
1882
+ box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
1882
1883
  }
1883
1884
 
1884
1885
  body[data-theme='dark'] .positions-replay-component .metric-card {
1885
- background-color: rgba(255, 255, 255, 5%);
1886
+ background-color: rgba(255, 255, 255, 0.05);
1886
1887
  }
1887
1888
 
1888
1889
  body[data-theme='dark'] .positions-replay-component .metric-card:hover {
1889
- background-color: rgba(255, 255, 255, 8%);
1890
+ background-color: rgba(255, 255, 255, 0.08);
1890
1891
  }
1891
1892
 
1892
1893
  .positions-replay-component .metric-label {
@@ -2221,7 +2222,7 @@ body[data-theme='dark'] #fleet-ops-fleet-schedule-container .fc-timeline-slot.fc
2221
2222
  font-weight: 500;
2222
2223
  padding: 0.1rem 0.35rem;
2223
2224
  cursor: pointer;
2224
- box-shadow: 0 1px 2px rgba(0, 0, 0, 8%);
2225
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.08);
2225
2226
  }
2226
2227
 
2227
2228
  #fleet-ops-fleet-schedule-container .fc-event:hover {
@@ -2390,7 +2391,7 @@ body[data-theme='dark'] #fleet-ops-scheduler-timeline .ec-day {
2390
2391
  font-weight: 500;
2391
2392
  padding: 0.25rem 0.5rem;
2392
2393
  cursor: pointer;
2393
- box-shadow: 0 1px 2px rgba(0, 0, 0, 8%);
2394
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.08);
2394
2395
  border: none;
2395
2396
  min-height: 3.25rem;
2396
2397
  overflow: hidden;
@@ -2412,11 +2413,11 @@ body[data-theme='dark'] #fleet-ops-scheduler-timeline .ec-day {
2412
2413
 
2413
2414
  /* Drag-over hover state */
2414
2415
  #fleet-ops-scheduler-timeline[data-dragging-over='true'] .ec-main {
2415
- background-color: rgba(99, 102, 241, 4%);
2416
+ background-color: rgba(99, 102, 241, 0.04);
2416
2417
  }
2417
2418
 
2418
2419
  body[data-theme='dark'] #fleet-ops-scheduler-timeline[data-dragging-over='true'] .ec-main {
2419
- background-color: rgba(129, 140, 248, 6%);
2420
+ background-color: rgba(129, 140, 248, 0.06);
2420
2421
  }
2421
2422
 
2422
2423
  /* Per-column drop cursor indicator */
@@ -2429,13 +2430,13 @@ body[data-theme='dark'] #fleet-ops-scheduler-timeline[data-dragging-over='true']
2429
2430
  pointer-events: none;
2430
2431
  z-index: 10;
2431
2432
  border-radius: 1px;
2432
- box-shadow: 0 0 6px rgba(99, 102, 241, 70%);
2433
+ box-shadow: 0 0 6px rgba(99, 102, 241, 0.7);
2433
2434
  transition: left 0.04s linear;
2434
2435
  }
2435
2436
 
2436
2437
  body[data-theme='dark'] #fleet-ops-scheduler-timeline .ec-drop-cursor {
2437
2438
  background-color: #818cf8;
2438
- box-shadow: 0 0 6px rgba(129, 140, 248, 70%);
2439
+ box-shadow: 0 0 6px rgba(129, 140, 248, 0.7);
2439
2440
  }
2440
2441
 
2441
2442
  /* Full-height timeline */
@@ -2726,7 +2727,7 @@ body[data-theme='dark'] .order-pool-card.selected,
2726
2727
  }
2727
2728
 
2728
2729
  .vehicle-drop-zone.drag-over {
2729
- background: rgba(59, 130, 246, 10%);
2730
+ background: rgba(59, 130, 246, 0.1);
2730
2731
  outline: 1px dashed #3b82f6;
2731
2732
  border-radius: 4px;
2732
2733
  }
@@ -2832,7 +2833,7 @@ body[data-theme='dark'] .import-dropzone.dragging,
2832
2833
  border-radius: 50%;
2833
2834
  background: #3b82f6;
2834
2835
  border: 2px solid #fff;
2835
- box-shadow: 0 1px 3px rgba(0, 0, 0, 50%);
2836
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.5);
2836
2837
  transition: transform 0.1s;
2837
2838
  }
2838
2839
 
@@ -2848,7 +2849,7 @@ body[data-theme='dark'] .import-dropzone.dragging,
2848
2849
  height: 16px;
2849
2850
  border-radius: 50%;
2850
2851
  border: 2px solid #fff;
2851
- box-shadow: 0 1px 3px rgba(0, 0, 0, 50%);
2852
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.5);
2852
2853
  background: #ef4444; /* default: offline */
2853
2854
  }
2854
2855
 
@@ -2875,7 +2876,7 @@ body[data-theme='dark'] .import-dropzone.dragging,
2875
2876
  * Minimal padding, small font, semi-transparent dark background.
2876
2877
  */
2877
2878
  .fleetops-waypoint-tooltip {
2878
- background: rgba(15, 23, 42, 88%) !important;
2879
+ background: rgba(15, 23, 42, 0.88) !important;
2879
2880
  border: none !important;
2880
2881
  border-radius: 4px !important;
2881
2882
  color: #f8fafc !important;
@@ -2883,11 +2884,11 @@ body[data-theme='dark'] .import-dropzone.dragging,
2883
2884
  font-weight: 600 !important;
2884
2885
  padding: 3px 7px !important;
2885
2886
  white-space: nowrap;
2886
- box-shadow: 0 2px 6px rgba(0, 0, 0, 35%) !important;
2887
+ box-shadow: 0 2px 6px rgba(0, 0, 0, 0.35) !important;
2887
2888
  }
2888
2889
 
2889
2890
  .fleetops-waypoint-tooltip::before {
2890
- border-top-color: rgba(15, 23, 42, 88%) !important;
2891
+ border-top-color: rgba(15, 23, 42, 0.88) !important;
2891
2892
  }
2892
2893
 
2893
2894
  /* ============================================================
@@ -2899,7 +2900,7 @@ body[data-theme='dark'] .import-dropzone.dragging,
2899
2900
  */
2900
2901
  .fleetops-waypoint-popup-wrapper .leaflet-popup-content-wrapper {
2901
2902
  border-radius: 6px !important;
2902
- box-shadow: 0 4px 16px rgba(0, 0, 0, 20%) !important;
2903
+ box-shadow: 0 4px 16px rgba(0, 0, 0, 0.2) !important;
2903
2904
  padding: 0 !important;
2904
2905
  overflow: hidden;
2905
2906
  }
@@ -2986,10 +2987,10 @@ body[data-theme='dark'] .import-dropzone.dragging,
2986
2987
  }
2987
2988
 
2988
2989
  .fleetops-route-tooltip-wrapper .leaflet-tooltip {
2989
- background: rgba(15, 23, 42, 92%) !important;
2990
+ background: rgba(15, 23, 42, 0.92) !important;
2990
2991
  border: none !important;
2991
2992
  border-radius: 5px !important;
2992
- box-shadow: 0 3px 10px rgba(0, 0, 0, 30%) !important;
2993
+ box-shadow: 0 3px 10px rgba(0, 0, 0, 0.3) !important;
2993
2994
  padding: 6px 10px !important;
2994
2995
  color: #f1f5f9 !important;
2995
2996
  font-size: 11px !important;
@@ -2997,7 +2998,7 @@ body[data-theme='dark'] .import-dropzone.dragging,
2997
2998
  }
2998
2999
 
2999
3000
  .fleetops-route-tooltip-wrapper .leaflet-tooltip::before {
3000
- border-top-color: rgba(15, 23, 42, 92%) !important;
3001
+ border-top-color: rgba(15, 23, 42, 0.92) !important;
3001
3002
  }
3002
3003
 
3003
3004
  .fleetops-route-tooltip {
@@ -3188,7 +3189,7 @@ body[data-theme='dark'] #fleet-ops-orchestrator-plan-timeline .ec-day {
3188
3189
  font-weight: 500;
3189
3190
  padding: 0.25rem 0.5rem;
3190
3191
  cursor: default;
3191
- box-shadow: 0 1px 2px rgba(0, 0, 0, 8%);
3192
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.08);
3192
3193
  border: none;
3193
3194
  min-height: 3.25rem;
3194
3195
  overflow: hidden;
@@ -3393,21 +3394,21 @@ body[data-theme='dark'] .import-mapping-row,
3393
3394
  }
3394
3395
 
3395
3396
  .import-mapping-row:hover {
3396
- background: rgba(0, 0, 0, 2%); /* light mode hover */
3397
+ background: rgba(0, 0, 0, 0.02); /* light mode hover */
3397
3398
  }
3398
3399
 
3399
3400
  body[data-theme='dark'] .import-mapping-row:hover,
3400
3401
  .dark .import-mapping-row:hover {
3401
- background: rgba(255, 255, 255, 2%);
3402
+ background: rgba(255, 255, 255, 0.02);
3402
3403
  }
3403
3404
 
3404
3405
  /* Highlight rows that have a mapping applied */
3405
3406
  .import-mapping-row--mapped {
3406
- background: rgba(16, 185, 129, 5%);
3407
+ background: rgba(16, 185, 129, 0.05);
3407
3408
  }
3408
3409
 
3409
3410
  .import-mapping-row--mapped:hover {
3410
- background: rgba(16, 185, 129, 9%);
3411
+ background: rgba(16, 185, 129, 0.09);
3411
3412
  }
3412
3413
 
3413
3414
  /* Column sizing helpers */
@@ -3618,15 +3619,15 @@ body[data-theme='light'] .import-preview-table td {
3618
3619
  }
3619
3620
 
3620
3621
  .import-preview-table tbody tr:hover td {
3621
- background: rgba(255, 255, 255, 2%);
3622
+ background: rgba(255, 255, 255, 0.02);
3622
3623
  }
3623
3624
 
3624
3625
  body[data-theme='light'] .import-preview-table tbody tr:hover td {
3625
- background: rgba(0, 0, 0, 2%);
3626
+ background: rgba(0, 0, 0, 0.02);
3626
3627
  }
3627
3628
 
3628
3629
  .import-preview-row--error td {
3629
- background: rgba(239, 68, 68, 6%) !important;
3630
+ background: rgba(239, 68, 68, 0.06) !important;
3630
3631
  }
3631
3632
 
3632
3633
  /* Address cell — allow wrapping for long addresses */
@@ -3650,17 +3651,17 @@ body[data-theme='light'] .import-preview-table tbody tr:hover td {
3650
3651
  }
3651
3652
 
3652
3653
  .import-preview-badge--blue {
3653
- background: rgba(59, 130, 246, 15%);
3654
+ background: rgba(59, 130, 246, 0.15);
3654
3655
  color: #60a5fa;
3655
3656
  }
3656
3657
 
3657
3658
  .import-preview-badge--gray {
3658
- background: rgba(107, 114, 128, 15%);
3659
+ background: rgba(107, 114, 128, 0.15);
3659
3660
  color: #9ca3af;
3660
3661
  }
3661
3662
 
3662
3663
  .import-preview-badge--green {
3663
- background: rgba(16, 185, 129, 15%);
3664
+ background: rgba(16, 185, 129, 0.15);
3664
3665
  color: #34d399;
3665
3666
  }
3666
3667
 
@@ -3746,7 +3747,7 @@ body[data-theme='light'] .import-preview-table tbody tr:hover td {
3746
3747
  border-top: 1px solid #1f2937;
3747
3748
  font-size: 0.72rem;
3748
3749
  color: #fbbf24;
3749
- background: rgba(251, 191, 36, 6%);
3750
+ background: rgba(251, 191, 36, 0.06);
3750
3751
  }
3751
3752
 
3752
3753
  .fleetops-google-contextmenu {
@@ -3754,7 +3755,7 @@ body[data-theme='light'] .import-preview-table tbody tr:hover td {
3754
3755
  background: #1f2937;
3755
3756
  color: #f9fafb;
3756
3757
  border-radius: 0.375rem;
3757
- box-shadow: 0 10px 30px rgba(15, 23, 42, 28%);
3758
+ box-shadow: 0 10px 30px rgba(15, 23, 42, 0.28);
3758
3759
  border: 0;
3759
3760
  padding: 0;
3760
3761
  overflow: hidden;
@@ -3808,7 +3809,7 @@ body[data-theme='light'] .import-preview-table tbody tr:hover td {
3808
3809
  padding: 0.313rem;
3809
3810
  border-radius: 9999px;
3810
3811
  background: #fff;
3811
- box-shadow: 0 10px 30px rgba(15, 23, 42, 18%);
3812
+ box-shadow: 0 10px 30px rgba(15, 23, 42, 0.18);
3812
3813
  border: 0;
3813
3814
  pointer-events: auto;
3814
3815
  }
@@ -3899,7 +3900,7 @@ body[data-theme='light'] .import-preview-table tbody tr:hover td {
3899
3900
  body[data-theme='light'] .fleetops-google-contextmenu {
3900
3901
  background: #fff;
3901
3902
  color: #111827;
3902
- box-shadow: 0 10px 30px rgba(15, 23, 42, 18%);
3903
+ box-shadow: 0 10px 30px rgba(15, 23, 42, 0.18);
3903
3904
  }
3904
3905
 
3905
3906
  body[data-theme='light'] .fleetops-google-contextmenu > .fleetops-google-contextmenu-separator {
@@ -3945,7 +3946,7 @@ body[data-theme='dark'] .next-google-container-map .fleetops-google-draw-actions
3945
3946
  max-width: 180px;
3946
3947
  padding: 2px 8px;
3947
3948
  border-radius: 9999px;
3948
- background: rgba(17, 24, 39, 88%);
3949
+ background: rgba(17, 24, 39, 0.88);
3949
3950
  color: #f9fafb;
3950
3951
  font-size: 11px;
3951
3952
  font-weight: 600;
@@ -3953,22 +3954,22 @@ body[data-theme='dark'] .next-google-container-map .fleetops-google-draw-actions
3953
3954
  white-space: nowrap;
3954
3955
  text-overflow: ellipsis;
3955
3956
  overflow: hidden;
3956
- box-shadow: 0 6px 16px rgba(15, 23, 42, 22%);
3957
+ box-shadow: 0 6px 16px rgba(15, 23, 42, 0.22);
3957
3958
  }
3958
3959
 
3959
3960
  .fleetops-google-hover-tooltip {
3960
3961
  position: absolute;
3961
3962
  z-index: 99999;
3962
3963
  display: none;
3963
- max-width: 240px;
3964
+ max-width: none;
3964
3965
  padding: 0.45rem 0.65rem;
3965
3966
  border-radius: 0.625rem;
3966
- background: rgba(17, 24, 39, 94%);
3967
+ background: rgba(17, 24, 39, 0.94);
3967
3968
  color: #f9fafb;
3968
3969
  font-size: 0.75rem;
3969
3970
  line-height: 1.25;
3970
3971
  pointer-events: none;
3971
- box-shadow: 0 10px 30px rgba(15, 23, 42, 22%);
3972
+ box-shadow: 0 10px 30px rgba(15, 23, 42, 0.22);
3972
3973
  transform: translateY(-50%);
3973
3974
  }
3974
3975
 
@@ -3988,8 +3989,8 @@ body[data-theme='dark'] .next-google-container-map .fleetops-google-draw-actions
3988
3989
  height: 8px;
3989
3990
  border-radius: 9999px;
3990
3991
  background: #3b82f6;
3991
- border: 1px solid rgba(255, 255, 255, 95%);
3992
- box-shadow: 0 0 0 1px rgba(59, 130, 246, 25%);
3992
+ border: 1px solid rgba(255, 255, 255, 0.95);
3993
+ box-shadow: 0 0 0 1px rgba(59, 130, 246, 0.25);
3993
3994
  }
3994
3995
 
3995
3996
  .fleetops-google-popover {
@@ -3999,7 +4000,7 @@ body[data-theme='dark'] .next-google-container-map .fleetops-google-draw-actions
3999
4000
  border-radius: 1rem;
4000
4001
  background: #111827;
4001
4002
  color: #f9fafb;
4002
- box-shadow: 0 16px 40px rgba(15, 23, 42, 28%);
4003
+ box-shadow: 0 16px 40px rgba(15, 23, 42, 0.28);
4003
4004
  }
4004
4005
 
4005
4006
  .fleetops-google-popover--compact {
@@ -4065,6 +4066,28 @@ body[data-theme='dark'] .next-google-container-map .fleetops-google-draw-actions
4065
4066
  background: #111827 !important;
4066
4067
  }
4067
4068
 
4069
+ .fleetops-google-popover__close {
4070
+ position: absolute;
4071
+ top: 0.25rem;
4072
+ right: 0.35rem;
4073
+ z-index: 1;
4074
+ width: 1rem;
4075
+ height: 1rem;
4076
+ border: 0;
4077
+ border-radius: 9999px;
4078
+ background: rgba(31, 41, 55, 0.8);
4079
+ color: #d1d5db;
4080
+ font-size: 0.8rem;
4081
+ line-height: 1rem;
4082
+ text-align: center;
4083
+ cursor: pointer;
4084
+ }
4085
+
4086
+ .fleetops-google-popover__close:hover {
4087
+ background: rgba(55, 65, 81, 0.95);
4088
+ color: #fff;
4089
+ }
4090
+
4068
4091
  /* Tracking intelligence panel */
4069
4092
  .tracking-intelligence {
4070
4093
  display: flex;
@@ -4112,48 +4135,48 @@ body[data-theme='dark'] .next-google-container-map .fleetops-google-draw-actions
4112
4135
 
4113
4136
  .tracking-intelligence-pill--good {
4114
4137
  color: #16a34a;
4115
- background: rgba(34, 197, 94, 10%);
4116
- border-color: rgba(34, 197, 94, 24%);
4138
+ background: rgba(34, 197, 94, 0.1);
4139
+ border-color: rgba(34, 197, 94, 0.24);
4117
4140
  }
4118
4141
 
4119
4142
  .tracking-intelligence-pill--warn {
4120
4143
  color: #d97706;
4121
- background: rgba(245, 158, 11, 12%);
4122
- border-color: rgba(245, 158, 11, 28%);
4144
+ background: rgba(245, 158, 11, 0.12);
4145
+ border-color: rgba(245, 158, 11, 0.28);
4123
4146
  }
4124
4147
 
4125
4148
  .tracking-intelligence-pill--bad {
4126
4149
  color: #dc2626;
4127
- background: rgba(239, 68, 68, 11%);
4128
- border-color: rgba(239, 68, 68, 28%);
4150
+ background: rgba(239, 68, 68, 0.11);
4151
+ border-color: rgba(239, 68, 68, 0.28);
4129
4152
  }
4130
4153
 
4131
4154
  .tracking-intelligence-pill--muted {
4132
4155
  color: #6b7280;
4133
- background: rgba(107, 114, 128, 10%);
4134
- border-color: rgba(107, 114, 128, 22%);
4156
+ background: rgba(107, 114, 128, 0.1);
4157
+ border-color: rgba(107, 114, 128, 0.22);
4135
4158
  }
4136
4159
 
4137
4160
  [data-theme='dark'] .tracking-intelligence-pill--good {
4138
4161
  color: #5bc796;
4139
- background: rgba(91, 199, 150, 12%);
4162
+ background: rgba(91, 199, 150, 0.12);
4140
4163
  }
4141
4164
 
4142
4165
  [data-theme='dark'] .tracking-intelligence-pill--warn {
4143
4166
  color: #e5a14b;
4144
- background: rgba(229, 161, 75, 12%);
4145
- border-color: rgba(229, 161, 75, 32%);
4167
+ background: rgba(229, 161, 75, 0.12);
4168
+ border-color: rgba(229, 161, 75, 0.32);
4146
4169
  }
4147
4170
 
4148
4171
  [data-theme='dark'] .tracking-intelligence-pill--bad {
4149
4172
  color: #e26b6b;
4150
- background: rgba(226, 107, 107, 13%);
4151
- border-color: rgba(226, 107, 107, 32%);
4173
+ background: rgba(226, 107, 107, 0.13);
4174
+ border-color: rgba(226, 107, 107, 0.32);
4152
4175
  }
4153
4176
 
4154
4177
  [data-theme='dark'] .tracking-intelligence-pill--muted {
4155
4178
  color: #7c8896;
4156
- background: rgba(255, 255, 255, 4%);
4179
+ background: rgba(255, 255, 255, 0.04);
4157
4180
  border-color: #232c38;
4158
4181
  }
4159
4182
 
@@ -4163,16 +4186,16 @@ body[data-theme='dark'] .next-google-container-map .fleetops-google-draw-actions
4163
4186
  gap: 0.625rem;
4164
4187
  align-items: flex-start;
4165
4188
  padding: 0.625rem 0.7rem;
4166
- border: 1px solid rgba(245, 158, 11, 28%);
4189
+ border: 1px solid rgba(245, 158, 11, 0.28);
4167
4190
  border-radius: 0.5rem;
4168
- background: rgba(245, 158, 11, 10%);
4191
+ background: rgba(245, 158, 11, 0.1);
4169
4192
  color: #92400e;
4170
4193
  font-size: 0.75rem;
4171
4194
  }
4172
4195
 
4173
4196
  .tracking-intelligence-alert--critical {
4174
- border-color: rgba(239, 68, 68, 28%);
4175
- background: rgba(239, 68, 68, 10%);
4197
+ border-color: rgba(239, 68, 68, 0.28);
4198
+ background: rgba(239, 68, 68, 0.1);
4176
4199
  color: #991b1b;
4177
4200
  }
4178
4201
 
@@ -4183,7 +4206,7 @@ body[data-theme='dark'] .next-google-container-map .fleetops-google-draw-actions
4183
4206
  align-items: center;
4184
4207
  justify-content: center;
4185
4208
  border-radius: 0.3125rem;
4186
- background: rgba(0, 0, 0, 10%);
4209
+ background: rgba(0, 0, 0, 0.1);
4187
4210
  }
4188
4211
 
4189
4212
  .tracking-intelligence-alert__title {
@@ -4198,14 +4221,14 @@ body[data-theme='dark'] .next-google-container-map .fleetops-google-draw-actions
4198
4221
  }
4199
4222
 
4200
4223
  [data-theme='dark'] .tracking-intelligence-alert {
4201
- border-color: rgba(229, 161, 75, 32%);
4202
- background: rgba(229, 161, 75, 12%);
4224
+ border-color: rgba(229, 161, 75, 0.32);
4225
+ background: rgba(229, 161, 75, 0.12);
4203
4226
  color: #e5a14b;
4204
4227
  }
4205
4228
 
4206
4229
  [data-theme='dark'] .tracking-intelligence-alert--critical {
4207
- border-color: rgba(226, 107, 107, 32%);
4208
- background: rgba(226, 107, 107, 13%);
4230
+ border-color: rgba(226, 107, 107, 0.32);
4231
+ background: rgba(226, 107, 107, 0.13);
4209
4232
  color: #e26b6b;
4210
4233
  }
4211
4234
 
@@ -4218,14 +4241,14 @@ body[data-theme='dark'] .next-google-container-map .fleetops-google-draw-actions
4218
4241
  }
4219
4242
 
4220
4243
  .tracking-intelligence-alert--critical .tracking-intelligence-alert__cta {
4221
- border-color: rgba(239, 68, 68, 30%);
4222
- background: rgba(239, 68, 68, 8%);
4244
+ border-color: rgba(239, 68, 68, 0.3);
4245
+ background: rgba(239, 68, 68, 0.08);
4223
4246
  color: #b91c1c;
4224
4247
  }
4225
4248
 
4226
4249
  [data-theme='dark'] .tracking-intelligence-alert--critical .tracking-intelligence-alert__cta {
4227
- border-color: rgba(226, 107, 107, 32%);
4228
- background: rgba(226, 107, 107, 10%);
4250
+ border-color: rgba(226, 107, 107, 0.32);
4251
+ background: rgba(226, 107, 107, 0.1);
4229
4252
  color: #e26b6b;
4230
4253
  }
4231
4254
 
@@ -4244,7 +4267,7 @@ body[data-theme='dark'] .next-google-container-map .fleetops-google-draw-actions
4244
4267
  border: 1px solid #e5e7eb;
4245
4268
  border-radius: 0.5rem;
4246
4269
  background: #f9fafb;
4247
- box-shadow: 0 1px 2px rgba(15, 23, 42, 8%);
4270
+ box-shadow: 0 1px 2px rgba(15, 23, 42, 0.08);
4248
4271
  }
4249
4272
 
4250
4273
  [data-theme='dark'] .tracking-intelligence-cell,
@@ -4255,7 +4278,7 @@ body[data-theme='dark'] .next-google-container-map .fleetops-google-draw-actions
4255
4278
  [data-theme='dark'] .tracking-stop-progress {
4256
4279
  border-color: #374151;
4257
4280
  background: #1f2937;
4258
- box-shadow: 0 8px 20px rgba(0, 0, 0, 18%);
4281
+ box-shadow: 0 8px 20px rgba(0, 0, 0, 0.18);
4259
4282
  }
4260
4283
 
4261
4284
  .tracking-intelligence-cell {
@@ -4264,13 +4287,13 @@ body[data-theme='dark'] .next-google-container-map .fleetops-google-draw-actions
4264
4287
  }
4265
4288
 
4266
4289
  .tracking-intelligence-cell--accent {
4267
- border-color: rgba(245, 158, 11, 32%);
4268
- background: linear-gradient(180deg, rgba(245, 158, 11, 8%), transparent), #f9fafb;
4290
+ border-color: rgba(245, 158, 11, 0.32);
4291
+ background: linear-gradient(180deg, rgba(245, 158, 11, 0.08), transparent), #f9fafb;
4269
4292
  }
4270
4293
 
4271
4294
  [data-theme='dark'] .tracking-intelligence-cell--accent {
4272
- border-color: rgba(229, 161, 75, 32%);
4273
- background: linear-gradient(180deg, rgba(229, 161, 75, 8%), transparent), #1f2937;
4295
+ border-color: rgba(229, 161, 75, 0.32);
4296
+ background: linear-gradient(180deg, rgba(229, 161, 75, 0.08), transparent), #1f2937;
4274
4297
  }
4275
4298
 
4276
4299
  .tracking-intelligence-cell__label {
@@ -4346,7 +4369,7 @@ body[data-theme='dark'] .next-google-container-map .fleetops-google-draw-actions
4346
4369
  .tracking-intelligence-tag {
4347
4370
  padding: 0.0625rem 0.3rem;
4348
4371
  border-radius: 0.2rem;
4349
- background: rgba(245, 158, 11, 12%);
4372
+ background: rgba(245, 158, 11, 0.12);
4350
4373
  color: #d97706;
4351
4374
  font-size: 0.55rem;
4352
4375
  font-weight: 800;
@@ -4595,9 +4618,9 @@ body[data-theme='dark'] .next-google-container-map .fleetops-google-draw-actions
4595
4618
 
4596
4619
  .tracking-intelligence-diagnostics__warnings span {
4597
4620
  padding: 0.125rem 0.375rem;
4598
- border: 1px solid rgba(245, 158, 11, 25%);
4621
+ border: 1px solid rgba(245, 158, 11, 0.25);
4599
4622
  border-radius: 0.25rem;
4600
- background: rgba(245, 158, 11, 10%);
4623
+ background: rgba(245, 158, 11, 0.1);
4601
4624
  color: #b45309;
4602
4625
  font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
4603
4626
  font-size: 0.62rem;
@@ -4696,7 +4719,7 @@ body[data-theme='dark'] .next-google-container-map .fleetops-google-draw-actions
4696
4719
  border-color: #f59e0b;
4697
4720
  background: #f59e0b;
4698
4721
  color: #1f1300;
4699
- box-shadow: 0 0 0 3px rgba(245, 158, 11, 14%);
4722
+ box-shadow: 0 0 0 3px rgba(245, 158, 11, 0.14);
4700
4723
  }
4701
4724
 
4702
4725
  .tracking-stop-progress__dot--active::before,
@@ -4759,9 +4782,9 @@ body[data-theme='dark'] .next-google-container-map .fleetops-google-draw-actions
4759
4782
  display: inline-flex;
4760
4783
  align-items: center;
4761
4784
  gap: 0.35rem;
4762
- border: 1px solid rgba(245, 158, 11, 32%);
4785
+ border: 1px solid rgba(245, 158, 11, 0.32);
4763
4786
  border-radius: 0.375rem;
4764
- background: rgba(245, 158, 11, 8%);
4787
+ background: rgba(245, 158, 11, 0.08);
4765
4788
  color: #b45309;
4766
4789
  font-size: 0.7rem;
4767
4790
  font-weight: 700;
@@ -4778,8 +4801,8 @@ body[data-theme='dark'] .next-google-container-map .fleetops-google-draw-actions
4778
4801
 
4779
4802
  [data-theme='dark'] .tracking-intelligence-alert__cta,
4780
4803
  [data-theme='dark'] .tracking-intelligence-footer__button {
4781
- border-color: rgba(229, 161, 75, 32%);
4782
- background: rgba(229, 161, 75, 10%);
4804
+ border-color: rgba(229, 161, 75, 0.32);
4805
+ background: rgba(229, 161, 75, 0.1);
4783
4806
  color: #e5a14b;
4784
4807
  }
4785
4808
 
@@ -4797,3 +4820,7 @@ body[data-theme='dark'] .next-google-container-map .fleetops-google-draw-actions
4797
4820
  flex-direction: column;
4798
4821
  padding: 0.75rem;
4799
4822
  }
4823
+
4824
+ .overflow-y-scroll-i {
4825
+ overflow-y: scroll !important;
4826
+ }
@@ -28,7 +28,7 @@
28
28
  @hideColumnsPicker={{true}}
29
29
  />
30
30
  </Layout::Section::Header>
31
- <Layout::Section::Body class="overflow-y-scroll h-full">
31
+ <Layout::Section::Body class="overflow-y-scroll-i h-full">
32
32
  <Layout::Resource::CardsGrid
33
33
  @resource="equipment"
34
34
  @data={{@model}}
@@ -28,7 +28,7 @@
28
28
  @hideColumnsPicker={{true}}
29
29
  />
30
30
  </Layout::Section::Header>
31
- <Layout::Section::Body class="overflow-y-scroll h-full">
31
+ <Layout::Section::Body class="overflow-y-scroll-i h-full">
32
32
  <Layout::Resource::CardsGrid
33
33
  @resource="part"
34
34
  @data={{@model}}
@@ -16,7 +16,7 @@
16
16
  />
17
17
  </Layout::Section::Header>
18
18
 
19
- <Layout::Section::Body class="overflow-y-scroll h-full">
19
+ <Layout::Section::Body class="overflow-y-scroll-i h-full">
20
20
  <div class="p-4">
21
21
  <FullCalendar @events={{this.calendarEventSource}} @onEventClick={{this.onCalendarEventClick}} @onInit={{this.setCalendarApi}} />
22
22
  </div>
@@ -29,7 +29,7 @@
29
29
  />
30
30
  </Layout::Section::Header>
31
31
 
32
- <Layout::Section::Body class="overflow-y-scroll h-full">
32
+ <Layout::Section::Body class="overflow-y-scroll-i h-full">
33
33
  <Layout::Resource::CardsGrid
34
34
  @resource="vehicle"
35
35
  @data={{@model}}
@@ -1,6 +1,6 @@
1
1
  <Layout::Section::Header @title={{t "settings.avatar-management"}} />
2
2
 
3
- <Layout::Section::Body class="overflow-y-scroll h-full">
3
+ <Layout::Section::Body class="overflow-y-scroll-i h-full">
4
4
  <div class="container mx-auto h-screen">
5
5
  <div class="max-w-3xl my-10 mx-auto space-y-6">
6
6
  <AvatarManager />
@@ -1,6 +1,6 @@
1
1
  <Layout::Section::Header @title={{t "settings.custom-fields"}} />
2
2
 
3
- <Layout::Section::Body class="overflow-y-scroll h-full">
3
+ <Layout::Section::Body class="overflow-y-scroll-i h-full">
4
4
  <div class="container mx-auto h-screen">
5
5
  <div class="max-w-3xl my-10 mx-auto space-y-6">
6
6
  <CustomFieldsManager @subjects={{this.subjects}} />
@@ -10,7 +10,7 @@
10
10
  @permission="fleet-ops update map-settings"
11
11
  />
12
12
  </Layout::Section::Header>
13
- <Layout::Section::Body class="overflow-y-scroll h-full">
13
+ <Layout::Section::Body class="overflow-y-scroll-i h-full">
14
14
  <div class="container mx-auto h-screen">
15
15
  <div class="max-w-3xl my-10 mx-auto space-y-6">
16
16
 
@@ -1,6 +1,6 @@
1
1
  <Layout::Section::Header @title={{t "settings.navigator-app.navigator-app-settings"}} />
2
2
 
3
- <Layout::Section::Body class="overflow-y-scroll h-full">
3
+ <Layout::Section::Body class="overflow-y-scroll-i h-full">
4
4
  <div class="container mx-auto h-screen">
5
5
  <div class="max-w-3xl my-10 mx-auto space-y-6">
6
6
  <EntityFieldEditingSettings />
@@ -10,7 +10,7 @@
10
10
  />
11
11
  </Layout::Section::Header>
12
12
 
13
- <Layout::Section::Body class="overflow-y-scroll h-full">
13
+ <Layout::Section::Body class="overflow-y-scroll-i h-full">
14
14
  <div class="container mx-auto h-screen">
15
15
  <div class="max-w-3xl my-10 mx-auto space-y-6">
16
16
  <ContentPanel @title={{t "settings.notifications.configure-notifications"}} @open={{true}} @wrapperClass="bordered-classic">