@fleetbase/fleetops-engine 0.6.44 → 0.6.46

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 (172) hide show
  1. package/addon/components/admin/map-settings.hbs +26 -0
  2. package/addon/components/admin/map-settings.js +46 -0
  3. package/addon/components/admin/routing-settings.hbs +11 -0
  4. package/addon/components/cell/order-route-type.hbs +46 -0
  5. package/addon/components/cell/order-route-type.js +90 -0
  6. package/addon/components/cell/place-address.hbs +1 -0
  7. package/addon/components/display-place.hbs +45 -56
  8. package/addon/components/display-place.js +21 -0
  9. package/addon/components/entity/form.hbs +24 -0
  10. package/addon/components/entity/form.js +30 -0
  11. package/addon/components/layout/fleet-ops-sidebar/driver-listing.js +5 -5
  12. package/addon/components/layout/fleet-ops-sidebar/fleet-listing.js +5 -5
  13. package/addon/components/layout/fleet-ops-sidebar.js +8 -0
  14. package/addon/components/leaflet-draw-control.js +1 -1
  15. package/addon/components/maintenance-schedule/form.js +2 -1
  16. package/addon/components/map/drawer/driver-listing.js +5 -5
  17. package/addon/components/map/drawer/geofence-event-listing.js +5 -2
  18. package/addon/components/map/drawer/place-listing.js +5 -5
  19. package/addon/components/map/drawer/position-listing.js +102 -21
  20. package/addon/components/map/drawer/vehicle-listing.js +5 -5
  21. package/addon/components/map/google-live-map.hbs +9 -0
  22. package/addon/components/map/google-live-map.js +445 -0
  23. package/addon/components/map/leaflet-live-map.hbs +186 -142
  24. package/addon/components/map/leaflet-live-map.js +121 -41
  25. package/addon/components/map/toolbar/visibility-control-panel.js +2 -2
  26. package/addon/components/map/toolbar/zones-panel.hbs +9 -9
  27. package/addon/components/map/toolbar.hbs +3 -3
  28. package/addon/components/map/toolbar.js +9 -1
  29. package/addon/components/modals/map-layer-form.hbs +132 -63
  30. package/addon/components/modals/orchestrator-import.hbs +4 -11
  31. package/addon/components/modals/orchestrator-import.js +17 -1
  32. package/addon/components/modals/update-order-activity.hbs +1 -1
  33. package/addon/components/orchestrator/order-pool.js +3 -2
  34. package/addon/components/orchestrator-workbench.js +29 -41
  35. package/addon/components/order/details/detail.js +2 -2
  36. package/addon/components/order/details/payload.hbs +5 -5
  37. package/addon/components/order/details/payload.js +18 -1
  38. package/addon/components/order/details/route.hbs +2 -2
  39. package/addon/components/order/details/route.js +76 -3
  40. package/addon/components/order/form/payload.hbs +33 -0
  41. package/addon/components/order/form/payload.js +1 -0
  42. package/addon/components/order/form/route.hbs +8 -8
  43. package/addon/components/order/form/route.js +78 -18
  44. package/addon/components/order/form/service-rate.hbs +1 -1
  45. package/addon/components/order/form.js +2 -2
  46. package/addon/components/order/route-editor.hbs +209 -147
  47. package/addon/components/order/route-editor.js +143 -102
  48. package/addon/components/place/address.hbs +1 -0
  49. package/addon/components/place/address.js +12 -0
  50. package/addon/components/route-list.hbs +43 -55
  51. package/addon/components/route-list.js +47 -0
  52. package/addon/components/route-optimization-wizard-panel.js +3 -4
  53. package/addon/components/service-rate/details.hbs +6 -6
  54. package/addon/components/service-rate/form.hbs +28 -15
  55. package/addon/components/vehicle/card.hbs +4 -4
  56. package/addon/controllers/maintenance/schedules/index.js +2 -1
  57. package/addon/controllers/operations/orders/index/details/virtual.js +5 -0
  58. package/addon/controllers/operations/orders/index/details.js +113 -15
  59. package/addon/controllers/operations/orders/index/new.js +1 -1
  60. package/addon/controllers/operations/orders/index.js +8 -1
  61. package/addon/controllers/operations/service-rates/index/edit.js +1 -0
  62. package/addon/controllers/operations/service-rates/index/new.js +1 -0
  63. package/addon/controllers/settings/map.js +97 -0
  64. package/addon/controllers/settings/routing.js +47 -12
  65. package/addon/extension.js +11 -0
  66. package/addon/helpers/f-to-int.js +6 -0
  67. package/addon/helpers/place-address-html.js +6 -0
  68. package/addon/instance-initializers/register-google-routes.js +17 -0
  69. package/addon/instance-initializers/register-osrm.js +5 -0
  70. package/addon/routes/application.js +9 -3
  71. package/addon/routes/operations/orchestrator.js +13 -0
  72. package/addon/routes/operations/orders/index/details/virtual.js +1 -0
  73. package/addon/routes/operations/orders/index/details.js +47 -24
  74. package/addon/routes/operations/orders/index/new.js +9 -0
  75. package/addon/routes/operations/orders/index.js +0 -1
  76. package/addon/routes/settings/map.js +3 -0
  77. package/addon/routes.js +1 -0
  78. package/addon/services/entity-actions.js +1 -1
  79. package/addon/services/equipment-actions.js +4 -6
  80. package/addon/services/geofence-event-bus.js +2 -1
  81. package/addon/services/geofence.js +204 -168
  82. package/addon/services/google-routes.js +300 -0
  83. package/addon/services/leaflet-draw-restriction.js +2 -1
  84. package/addon/services/leaflet-map-manager.js +21 -0
  85. package/addon/services/maintenance-actions.js +4 -6
  86. package/addon/services/map-adapter/google.js +2205 -0
  87. package/addon/services/map-adapter/leaflet.js +1042 -0
  88. package/addon/services/map-adapter-interface.js +551 -0
  89. package/addon/services/map-manager.js +768 -0
  90. package/addon/services/map-settings.js +75 -0
  91. package/addon/services/movement-tracker.js +83 -32
  92. package/addon/services/order-actions.js +11 -1
  93. package/addon/services/osrm.js +79 -6
  94. package/addon/services/part-actions.js +4 -6
  95. package/addon/services/position-playback.js +135 -62
  96. package/addon/services/route-engine.js +83 -0
  97. package/addon/services/service-areas.js +8 -1
  98. package/addon/services/service-rate-actions.js +8 -3
  99. package/addon/styles/fleetops-engine.css +555 -0
  100. package/addon/templates/management/vehicles/index.hbs +0 -1
  101. package/addon/templates/operations/orders/index/details/virtual.hbs +7 -1
  102. package/addon/templates/operations/orders/index/details.hbs +0 -1
  103. package/addon/templates/settings/map.hbs +53 -0
  104. package/addon/templates/settings/routing.hbs +15 -4
  105. package/addon/utils/fleet-ops-options.js +34 -0
  106. package/addon/utils/has-valid-coordinates.js +6 -0
  107. package/addon/utils/map-provider-options.js +6 -0
  108. package/addon/utils/order-route-editing.js +86 -0
  109. package/addon/utils/order-route-summary.js +20 -0
  110. package/addon/utils/place-address-html.js +41 -0
  111. package/addon/utils/route-colors.js +43 -12
  112. package/addon/utils/route-visualization.js +93 -0
  113. package/addon/utils/serialize-payload.js +1 -1
  114. package/addon/utils/vendor-integration.js +2 -1
  115. package/app/components/admin/map-settings.js +1 -0
  116. package/app/components/admin/routing-settings.js +1 -0
  117. package/app/components/cell/order-route-type.js +1 -0
  118. package/app/components/cell/place-address.js +1 -0
  119. package/app/components/map/google-live-map.js +1 -0
  120. package/app/components/place/address.js +1 -0
  121. package/app/controllers/operations/orders/index/details/virtual.js +1 -0
  122. package/app/controllers/settings/map.js +1 -0
  123. package/app/helpers/f-to-int.js +1 -0
  124. package/app/helpers/place-address-html.js +1 -0
  125. package/app/routes/settings/map.js +1 -0
  126. package/app/services/map-adapter/google.js +1 -0
  127. package/app/services/map-adapter/leaflet.js +1 -0
  128. package/app/services/map-adapter-interface.js +1 -0
  129. package/app/services/map-manager.js +1 -0
  130. package/app/services/map-settings.js +1 -0
  131. package/app/templates/settings/map.js +1 -0
  132. package/app/utils/has-valid-coordinates.js +1 -0
  133. package/app/utils/order-route-editing.js +2 -0
  134. package/app/utils/order-route-summary.js +1 -0
  135. package/app/utils/place-address-html.js +1 -0
  136. package/app/utils/route-colors.js +1 -1
  137. package/app/utils/route-visualization.js +1 -0
  138. package/assets/images/drawing-controls-spritesheet.svg +156 -0
  139. package/composer.json +1 -1
  140. package/extension.json +1 -1
  141. package/package.json +3 -3
  142. package/server/src/Auth/Schemas/FleetOps.php +5 -0
  143. package/server/src/Http/Controllers/Api/v1/OrderController.php +36 -8
  144. package/server/src/Http/Controllers/Api/v1/PayloadController.php +14 -1
  145. package/server/src/Http/Controllers/Api/v1/PurchaseRateController.php +11 -3
  146. package/server/src/Http/Controllers/Api/v1/ServiceAreaController.php +2 -0
  147. package/server/src/Http/Controllers/Api/v1/ServiceQuoteController.php +7 -2
  148. package/server/src/Http/Controllers/Api/v1/ServiceRateController.php +6 -1
  149. package/server/src/Http/Controllers/Api/v1/ZoneController.php +2 -0
  150. package/server/src/Http/Controllers/Internal/v1/LiveController.php +2 -1
  151. package/server/src/Http/Controllers/Internal/v1/OrchestrationController.php +7 -4
  152. package/server/src/Http/Controllers/Internal/v1/OrderController.php +61 -34
  153. package/server/src/Http/Controllers/Internal/v1/ServiceQuoteController.php +3 -2
  154. package/server/src/Http/Controllers/Internal/v1/SettingController.php +106 -3
  155. package/server/src/Http/Filter/OrderFilter.php +2 -1
  156. package/server/src/Http/Requests/CreateServiceRateRequest.php +2 -2
  157. package/server/src/Http/Resources/v1/Index/Payload.php +9 -7
  158. package/server/src/Http/Resources/v1/Order.php +20 -2
  159. package/server/src/Http/Resources/v1/ServiceQuote.php +2 -2
  160. package/server/src/Models/Entity.php +7 -0
  161. package/server/src/Models/Order.php +81 -8
  162. package/server/src/Models/OrderConfig.php +15 -0
  163. package/server/src/Models/Payload.php +131 -27
  164. package/server/src/Models/Place.php +182 -48
  165. package/server/src/Models/ServiceRate.php +125 -32
  166. package/server/src/Observers/PurchaseRateObserver.php +3 -5
  167. package/server/src/Orchestration/Engines/VroomOrchestrationEngine.php +59 -23
  168. package/server/src/Rules/ComputableAlgo.php +1 -3
  169. package/server/src/Support/Algo.php +87 -1
  170. package/server/src/Support/Utils.php +69 -0
  171. package/server/src/routes.php +4 -0
  172. package/translations/en-us.yaml +1937 -1916
@@ -1,164 +1,208 @@
1
+ {{!
2
+ live-map component
3
+ ─────────────────────────────────────────────────────────────────────────
4
+ Supports two map providers:
5
+ • "leaflet" (default) — uses ember-leaflet / Leaflet.js
6
+ • "google" — uses ember-google-maps / Google Maps JS API
7
+
8
+ The active provider is read from `this.mapManager.activeProvider`.
9
+ Set `ENV.mapProvider = 'google'` in environment.js to switch globally,
10
+ or pass `@mapProvider="google"` as a component argument to override.
11
+
12
+ Both branches share the same JS component class and all services route
13
+ through the provider-agnostic MapManagerService.
14
+ }}
15
+
1
16
  <div class="live-map-component {{@wrapperClass}}">
2
- <LeafletMap
3
- id={{this.id}}
4
- class="next-leaflet-container-map {{@mapClass}}"
5
- @lat={{this.latitude}}
6
- @lng={{this.longitude}}
7
- @zoom={{this.zoom}}
8
- @zoomControl={{false}}
9
- @contextmenu={{true}}
10
- @contextmenuWidth={{140}}
11
- @onLoad={{this.didLoad}}
12
- {{set-container-dimensions}}
13
- ...attributes
14
- as |layers|
15
- >
16
- <layers.tile @url={{this.tileUrl}} />
17
17
 
18
- <layers.draw-control
19
- @position="topright"
20
- @draw={{hash marker=false circlemarker=false polyline=false}}
21
- @onDrawDrawstop={{fn this.trigger "onDrawDrawstop"}}
22
- @onDrawDeleted={{fn this.trigger "onDrawDeleted"}}
23
- @onDrawEdited={{fn this.trigger "onDrawEdited"}}
24
- @onDrawDeletestart={{fn this.trigger "onDrawDeletestart"}}
25
- @onDrawEditstop={{fn this.trigger "onDrawEditstop"}}
26
- @onDrawControlCreated={{this.didCreateDrawControl}}
27
- @onDrawFeatureGroupCreated={{this.didCreateDrawControlFeatureGroup}}
18
+ {{#if this.shouldUseGoogleMaps}}
19
+ {{! ─── Google Maps branch ──────────────────────────────────────────── }}
20
+ <Map::GoogleLiveMap
21
+ @latitude={{this.latitude}}
22
+ @longitude={{this.longitude}}
23
+ @zoom={{this.zoom}}
24
+ @drivers={{this.drivers}}
25
+ @vehicles={{this.vehicles}}
26
+ @places={{this.places}}
27
+ @serviceAreas={{this.serviceAreaActions.serviceAreas}}
28
+ @ready={{this.load.isIdle}}
29
+ @onLoad={{this.didLoadGoogleMap}}
30
+ @onViewportChanged={{perform this.reloadResourcesInViewport}}
31
+ @onDriverAdded={{fn this.trigger "onDriverAdded"}}
32
+ @onDriverClicked={{fn this.trigger "onDriverClicked"}}
33
+ @onVehicleAdded={{fn this.trigger "onVehicleAdded"}}
34
+ @onVehicleClicked={{fn this.trigger "onVehicleClicked"}}
35
+ @onPlaceAdded={{fn this.trigger "onPlaceAdded"}}
36
+ @onPlaceClicked={{fn this.trigger "onPlaceClicked"}}
37
+ @onServiceAreaLayerAdded={{fn this.trigger "onServiceAreaLayerAdded"}}
38
+ @onZoneLayerAdd={{fn this.trigger "onZoneLayerAdd"}}
39
+ @mapClass={{@mapClass}}
40
+ ...attributes
28
41
  />
42
+ {{else}}
43
+ {{! ─── Leaflet branch (default) ────────────────────────────────────── }}
44
+ <LeafletMap
45
+ id={{this.id}}
46
+ class="next-leaflet-container-map {{@mapClass}}"
47
+ @lat={{this.latitude}}
48
+ @lng={{this.longitude}}
49
+ @zoom={{this.zoom}}
50
+ @zoomControl={{false}}
51
+ @contextmenu={{true}}
52
+ @contextmenuWidth={{140}}
53
+ @onLoad={{this.didLoad}}
54
+ {{set-container-dimensions}}
55
+ ...attributes
56
+ as |layers|
57
+ >
58
+ <layers.tile @url={{this.tileUrl}} />
59
+
60
+ <layers.draw-control
61
+ @position="topright"
62
+ @draw={{hash marker=false circlemarker=false polyline=false}}
63
+ @onDrawDrawstop={{fn this.trigger "onDrawDrawstop"}}
64
+ @onDrawDeleted={{fn this.trigger "onDrawDeleted"}}
65
+ @onDrawEdited={{fn this.trigger "onDrawEdited"}}
66
+ @onDrawDeletestart={{fn this.trigger "onDrawDeletestart"}}
67
+ @onDrawEditstop={{fn this.trigger "onDrawEditstop"}}
68
+ @onDrawControlCreated={{this.didCreateDrawControl}}
69
+ @onDrawFeatureGroupCreated={{this.didCreateDrawControlFeatureGroup}}
70
+ />
29
71
 
30
- {{#if this.load.isIdle}}
31
- {{#each this.drivers as |driver|}}
32
- <layers.tracking-marker
33
- @id={{driver.id}}
34
- @publicId={{driver.public_id}}
35
- @location={{point-to-coordinates driver.location}}
36
- @rotationAngle={{driver.heading}}
37
- @icon={{icon iconUrl=driver.vehicle_avatar iconSize=(array 24 24)}}
38
- @onAdd={{fn this.trigger "onDriverAdded" driver}}
39
- @onClick={{fn this.trigger "onDriverClicked" driver}}
40
- @draggable={{false}}
41
- as |marker|
42
- >
43
- <marker.popup @maxWidth="500" @minWidth="225">
44
- <div class="flex flex-row">
45
- <div class="w-14">
46
- <img src={{driver.photoUrl}} alt={{driver.name}} class="rounded-md w-12 h-12 shadow-sm" />
72
+ {{#if this.load.isIdle}}
73
+ {{#each this.drivers as |driver|}}
74
+ <layers.tracking-marker
75
+ @id={{driver.id}}
76
+ @publicId={{driver.public_id}}
77
+ @location={{point-to-coordinates driver.location}}
78
+ @rotationAngle={{driver.heading}}
79
+ @icon={{icon iconUrl=driver.vehicle_avatar iconSize=(array 24 24)}}
80
+ @onAdd={{fn this.trigger "onDriverAdded" driver}}
81
+ @onClick={{fn this.trigger "onDriverClicked" driver}}
82
+ @draggable={{false}}
83
+ as |marker|
84
+ >
85
+ <marker.popup @maxWidth="500" @minWidth="225">
86
+ <div class="flex flex-row">
87
+ <div class="w-14">
88
+ <img src={{driver.photoUrl}} alt={{driver.name}} class="rounded-md w-12 h-12 shadow-sm" />
89
+ </div>
90
+ <div class="flex-1">
91
+ <div class="text-xs font-semibold">{{driver.name}}</div>
92
+ <div class="text-xs">{{t "common.phone"}}: {{n-a driver.phone}}</div>
93
+ <div class="text-xs">{{t "resource.vehicle"}}: {{n-a driver.vehicle_name}}</div>
94
+ <div class="text-xs">{{t "common.status"}}:
95
+ <span class="{{if driver.online 'text-green-500' 'text-red-400'}}">{{if driver.online "Online" "Offline"}}</span></div>
96
+ <div class="text-xs truncate">{{t "common.pos"}}: {{point-coordinates driver.location}}</div>
97
+ </div>
47
98
  </div>
48
- <div class="flex-1">
99
+ </marker.popup>
100
+ <marker.tooltip @permanent={{false}} @sticky={{true}}>
101
+ <div class="flex items-center space-x-1">
49
102
  <div class="text-xs font-semibold">{{driver.name}}</div>
50
- <div class="text-xs">{{t "common.phone"}}: {{n-a driver.phone}}</div>
51
- <div class="text-xs">{{t "resource.vehicle"}}: {{n-a driver.vehicle_name}}</div>
52
- <div class="text-xs">{{t "common.status"}}:
53
- <span class="{{if driver.online 'text-green-500' 'text-red-400'}}">{{if driver.online "Online" "Offline"}}</span></div>
54
- <div class="text-xs truncate">{{t "common.pos"}}: {{point-coordinates driver.location}}</div>
103
+ <div>•</div>
104
+ <div class="text-xs {{if driver.online 'text-green-500' 'text-red-400'}}">{{if driver.online "Online" "Offline"}}</div>
55
105
  </div>
56
- </div>
57
- </marker.popup>
58
- <marker.tooltip @permanent={{false}} @sticky={{true}}>
59
- <div class="flex items-center space-x-1">
60
- <div class="text-xs font-semibold">{{driver.name}}</div>
61
- <div>•</div>
62
- <div class="text-xs {{if driver.online 'text-green-500' 'text-red-400'}}">{{if driver.online "Online" "Offline"}}</div>
63
- </div>
64
- <div class="text-xs truncate"><FaIcon @icon="location-dot" @size="xs" class="mr-0.5" />{{point-coordinates driver.location}}</div>
65
- </marker.tooltip>
66
- </layers.tracking-marker>
67
- {{/each}}
106
+ <div class="text-xs truncate"><FaIcon @icon="location-dot" @size="xs" class="mr-0.5" />{{point-coordinates driver.location}}</div>
107
+ </marker.tooltip>
108
+ </layers.tracking-marker>
109
+ {{/each}}
68
110
 
69
- {{#each this.vehicles as |vehicle|}}
70
- <layers.tracking-marker
71
- @id={{vehicle.id}}
72
- @publicId={{vehicle.public_id}}
73
- @location={{point-to-coordinates vehicle.location}}
74
- @rotationAngle={{vehicle.heading}}
75
- @icon={{icon iconUrl=vehicle.avatar_url iconSize=(array 24 24)}}
76
- @onAdd={{fn this.trigger "onVehicleAdded" vehicle}}
77
- @onClick={{fn this.trigger "onVehicleClicked" vehicle}}
78
- @draggable={{false}}
79
- as |marker|
80
- >
81
- <marker.popup @permanent={{false}} @sticky={{true}}>
82
- <div class="flex flex-row">
83
- <div class="w-14 mr-2">
84
- <img src={{vehicle.photo_url}} alt={{vehicle.display_name}} class="rounded-md w-14 h-12 shadow-sm" />
111
+ {{#each this.vehicles as |vehicle|}}
112
+ <layers.tracking-marker
113
+ @id={{vehicle.id}}
114
+ @publicId={{vehicle.public_id}}
115
+ @location={{point-to-coordinates vehicle.location}}
116
+ @rotationAngle={{vehicle.heading}}
117
+ @icon={{icon iconUrl=vehicle.avatar_url iconSize=(array 24 24)}}
118
+ @onAdd={{fn this.trigger "onVehicleAdded" vehicle}}
119
+ @onClick={{fn this.trigger "onVehicleClicked" vehicle}}
120
+ @draggable={{false}}
121
+ as |marker|
122
+ >
123
+ <marker.popup @permanent={{false}} @sticky={{true}}>
124
+ <div class="flex flex-row">
125
+ <div class="w-14 mr-2">
126
+ <img src={{vehicle.photo_url}} alt={{vehicle.display_name}} class="rounded-md w-14 h-12 shadow-sm" />
127
+ </div>
128
+ <div class="flex-1">
129
+ <div class="text-xs font-semibold">{{vehicle.displayName}}</div>
130
+ <div class="text-xs">ID: {{n-a vehicle.public_id}}</div>
131
+ <div class="text-xs">Serial No: {{n-a vehicle.serial_number vehicle.vin vehicle.internal_id vehicle.id}}</div>
132
+ <div class="text-xs">Driver: {{n-a vehicle.driver_name}}</div>
133
+ <div class="text-xs">Status: <span class="{{if vehicle.online 'text-green-500' 'text-red-400'}}">{{if vehicle.online "Online" "Offline"}}</span></div>
134
+ <div class="text-xs truncate">Pos: {{point-coordinates vehicle.location}}</div>
135
+ </div>
85
136
  </div>
86
- <div class="flex-1">
137
+ </marker.popup>
138
+ <marker.tooltip @permanent={{false}} @sticky={{true}}>
139
+ <div class="flex items-center space-x-1">
87
140
  <div class="text-xs font-semibold">{{vehicle.displayName}}</div>
88
- <div class="text-xs">ID: {{n-a vehicle.public_id}}</div>
89
- <div class="text-xs">Serial No: {{n-a vehicle.serial_number vehicle.vin vehicle.internal_id vehicle.id}}</div>
90
- <div class="text-xs">Driver: {{n-a vehicle.driver_name}}</div>
91
- <div class="text-xs">Status: <span class="{{if vehicle.online 'text-green-500' 'text-red-400'}}">{{if vehicle.online "Online" "Offline"}}</span></div>
92
- <div class="text-xs truncate">Pos: {{point-coordinates vehicle.location}}</div>
141
+ <div>•</div>
142
+ <div class="text-xs {{if vehicle.online 'text-green-500' 'text-red-400'}}">{{if vehicle.online "Online" "Offline"}}</div>
93
143
  </div>
94
- </div>
95
- </marker.popup>
96
- <marker.tooltip @permanent={{false}} @sticky={{true}}>
97
- <div class="flex items-center space-x-1">
98
- <div class="text-xs font-semibold">{{vehicle.displayName}}</div>
99
- <div>•</div>
100
- <div class="text-xs {{if vehicle.online 'text-green-500' 'text-red-400'}}">{{if vehicle.online "Online" "Offline"}}</div>
101
- </div>
102
- <div class="text-xs">ID: {{n-a vehicle.public_id}}</div>
103
- <div class="text-xs">Serial No: {{or vehicle.serial_number vehicle.vin vehicle.internal_id vehicle.id "-"}}</div>
104
- <div class="text-xs truncate"><FaIcon @icon="location-dot" @size="xs" class="mr-0.5" />{{point-coordinates vehicle.location}}</div>
105
- </marker.tooltip>
106
- </layers.tracking-marker>
107
- {{/each}}
108
-
109
- {{#each this.places as |place|}}
110
- <layers.marker
111
- @id={{place.id}}
112
- @publicId={{place.public_id}}
113
- @location={{point-to-coordinates place.location}}
114
- @icon={{icon iconUrl=(or place.avatar_url "/engines-dist/images/building-marker.png") iconSize=(array 16 16)}}
115
- @riseOnHover={{true}}
116
- @title={{place.address}}
117
- @alt={{place.address}}
118
- @onAdd={{fn this.trigger "onPlaceAdded" place}}
119
- @onClick={{fn this.trigger "onPlaceClicked" place}}
120
- @draggable={{false}}
121
- as |marker|
122
- >
123
- <marker.popup>
124
- <div>{{place.address}}</div>
125
- <div>{{format-point place.location}}</div>
126
- </marker.popup>
127
- <marker.tooltip @permanent={{false}} @sticky={{true}} @direction="bottom">{{or place.name place.address}}</marker.tooltip>
128
- </layers.marker>
129
- {{/each}}
144
+ <div class="text-xs">ID: {{n-a vehicle.public_id}}</div>
145
+ <div class="text-xs">Serial No: {{or vehicle.serial_number vehicle.vin vehicle.internal_id vehicle.id "-"}}</div>
146
+ <div class="text-xs truncate"><FaIcon @icon="location-dot" @size="xs" class="mr-0.5" />{{point-coordinates vehicle.location}}</div>
147
+ </marker.tooltip>
148
+ </layers.tracking-marker>
149
+ {{/each}}
130
150
 
131
- {{#each this.serviceAreaActions.serviceAreas as |serviceArea|}}
132
- <layers.polygon
133
- @id={{serviceArea.id}}
134
- @record={{serviceArea}}
135
- @locations={{unwrap-coordinates serviceArea.leafletCoordinates}}
136
- @fillColor={{serviceArea.color}}
137
- @color={{serviceArea.stroke_color}}
138
- @onAdd={{fn this.trigger "onServiceAreaLayerAdded" serviceArea}}
139
- as |polygon|
140
- >
141
- <polygon.tooltip @permanent={{true}} @sticky={{true}}>{{serviceArea.name}} {{t "resource.service-area"}}</polygon.tooltip>
142
- </layers.polygon>
151
+ {{#each this.places as |place|}}
152
+ <layers.marker
153
+ @id={{place.id}}
154
+ @publicId={{place.public_id}}
155
+ @location={{point-to-coordinates place.location}}
156
+ @icon={{icon iconUrl=(or place.avatar_url "/engines-dist/images/building-marker.png") iconSize=(array 16 16)}}
157
+ @riseOnHover={{true}}
158
+ @title={{place.address}}
159
+ @alt={{place.address}}
160
+ @onAdd={{fn this.trigger "onPlaceAdded" place}}
161
+ @onClick={{fn this.trigger "onPlaceClicked" place}}
162
+ @draggable={{false}}
163
+ as |marker|
164
+ >
165
+ <marker.popup>
166
+ <div>{{place.address}}</div>
167
+ <div>{{format-point place.location}}</div>
168
+ </marker.popup>
169
+ <marker.tooltip @permanent={{false}} @sticky={{true}} @direction="bottom">{{or place.name place.address}}</marker.tooltip>
170
+ </layers.marker>
171
+ {{/each}}
143
172
 
144
- {{#each serviceArea.zones as |zone|}}
173
+ {{#each this.serviceAreaActions.serviceAreas as |serviceArea|}}
145
174
  <layers.polygon
146
- @id={{zone.id}}
147
- @record={{zone}}
148
- @locations={{unwrap-coordinates zone.leafletCoordinates}}
149
- @fillColor={{zone.color}}
150
- @color={{zone.stroke_color}}
151
- @onAdd={{fn this.trigger "onZoneLayerAdd" zone}}
175
+ @id={{serviceArea.id}}
176
+ @record={{serviceArea}}
177
+ @locations={{unwrap-coordinates serviceArea.leafletCoordinates}}
178
+ @fillColor={{serviceArea.color}}
179
+ @color={{serviceArea.stroke_color}}
180
+ @onAdd={{fn this.trigger "onServiceAreaLayerAdded" serviceArea}}
152
181
  as |polygon|
153
182
  >
154
- <polygon.tooltip @permanent={{true}} @sticky={{true}}>{{zone.name}} {{t "resource.zone"}}</polygon.tooltip>
183
+ <polygon.tooltip @permanent={{true}} @sticky={{true}}>{{serviceArea.name}} {{t "resource.service-area"}}</polygon.tooltip>
155
184
  </layers.polygon>
185
+
186
+ {{#each serviceArea.zones as |zone|}}
187
+ <layers.polygon
188
+ @id={{zone.id}}
189
+ @record={{zone}}
190
+ @locations={{unwrap-coordinates zone.leafletCoordinates}}
191
+ @fillColor={{zone.color}}
192
+ @color={{zone.stroke_color}}
193
+ @onAdd={{fn this.trigger "onZoneLayerAdd" zone}}
194
+ as |polygon|
195
+ >
196
+ <polygon.tooltip @permanent={{true}} @sticky={{true}}>{{zone.name}} {{t "resource.zone"}}</polygon.tooltip>
197
+ </layers.polygon>
198
+ {{/each}}
156
199
  {{/each}}
157
- {{/each}}
158
- {{/if}}
200
+ {{/if}}
201
+
202
+ {{yield layers}}
203
+ </LeafletMap>
204
+ {{/if}}
159
205
 
160
- {{yield layers}}
161
- </LeafletMap>
162
206
  {{#unless this.ready}}
163
207
  <div class="flex w-full h-full items-center justify-center">
164
208
  <Spinner />