@fleetbase/fleetops-engine 0.2.8 → 0.2.9

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 (45) hide show
  1. package/addon/components/context-panel.hbs +5 -0
  2. package/addon/components/context-panel.js +6 -0
  3. package/addon/components/driver-form-panel.hbs +22 -22
  4. package/addon/components/driver-form-panel.js +28 -3
  5. package/addon/components/driver-panel.hbs +8 -8
  6. package/addon/components/driver-panel.js +23 -6
  7. package/addon/components/fleet-vehicle-listing.hbs +1 -1
  8. package/addon/components/live-map.hbs +20 -9
  9. package/addon/components/live-map.js +1045 -354
  10. package/addon/components/settings-window.hbs +1 -1
  11. package/addon/components/vehicle-form-panel.hbs +24 -24
  12. package/addon/components/vehicle-form-panel.js +26 -3
  13. package/addon/components/vehicle-panel.hbs +8 -9
  14. package/addon/components/vehicle-panel.js +21 -4
  15. package/addon/controllers/operations/orders/index/new.js +3 -5
  16. package/addon/controllers/operations/orders/index/view.js +5 -7
  17. package/addon/controllers/operations/orders/index.js +15 -2
  18. package/addon/engine.js +6 -0
  19. package/addon/routes/operations/orders/index/view.js +4 -2
  20. package/addon/routes/operations/orders/index.js +5 -1
  21. package/addon/services/context-panel.js +106 -0
  22. package/addon/services/leaflet-contextmenu-manager.js +311 -0
  23. package/addon/services/leaflet-map-manager.js +61 -0
  24. package/addon/services/service-areas.js +242 -32
  25. package/addon/templates/application.hbs +2 -1
  26. package/addon/utils/find-leaflet-layer.js +13 -0
  27. package/addon/utils/fly-to-leaflet-layer.js +25 -0
  28. package/addon/utils/get-leaflet-layer-by-id.js +12 -0
  29. package/addon/utils/layer-can-bind-contextmenu.js +3 -0
  30. package/app/components/context-panel.js +1 -0
  31. package/app/services/context-panel.js +1 -0
  32. package/app/services/leaflet-contextmenu-manager.js +1 -0
  33. package/app/services/leaflet-map-manager.js +1 -0
  34. package/app/utils/find-leaflet-layer.js +1 -0
  35. package/app/utils/fly-to-leaflet-layer.js +1 -0
  36. package/app/utils/get-leaflet-layer-by-id.js +1 -0
  37. package/app/utils/layer-can-bind-contextmenu.js +1 -0
  38. package/composer.json +11 -1
  39. package/extension.json +1 -1
  40. package/package.json +2 -2
  41. package/server/src/Http/Controllers/Internal/v1/LiveController.php +7 -4
  42. package/server/src/Http/Filter/VehicleFilter.php +7 -0
  43. package/server/src/Http/Resources/v1/Vehicle.php +51 -39
  44. package/addon/services/map-manager.js +0 -3
  45. package/app/services/map-manager.js +0 -1
@@ -0,0 +1,5 @@
1
+ {{#if this.contextPanel.currentContextRegistry}}
2
+ {{#let this.contextPanel.currentContext this.contextPanel.currentContextRegistry this.contextPanel.currentContextComponentArguments as |model registry dynamicArgs|}}
3
+ {{component registry.component context=model dynamicArgs=dynamicArgs onPressCancel=this.contextPanel.clear}}
4
+ {{/let}}
5
+ {{/if}}
@@ -0,0 +1,6 @@
1
+ import Component from '@glimmer/component';
2
+ import { inject as service } from '@ember/service';
3
+
4
+ export default class ContextPanelComponent extends Component {
5
+ @service contextPanel;
6
+ }
@@ -1,43 +1,43 @@
1
- <Overlay @position="right" @noBackdrop={{true}} @fullHeight={{true}} @width="700">
1
+ <Overlay @position="right" @noBackdrop={{true}} @fullHeight={{true}} @isResizeble={{or this.isResizable @isResizable}} @width={{or this.width @width "600px"}}>
2
2
  <Overlay::Header @hideLeftSection={{true}} @actionsWrapperClass="flex-1 flex-col py-3" class="h-auto-i min-h-[127px]">
3
3
  <div class="flex flex-row items-center justify-between w-full mb-4">
4
4
  <div class="flex flex-1 space-x-2">
5
- {{#if @driver.id}}
5
+ {{#if this.driver.id}}
6
6
  <Button @type="default" @icon="id-card" @helpText="View driver details" @onClick={{this.viewDetails}} />
7
7
  {{/if}}
8
8
  </div>
9
9
  <div class="flex flex-1 justify-end">
10
10
  <div class="mr-2">
11
- <Button @icon={{if @driver.id "save" "check"}} @type="primary" @text={{if @driver.id "Save Driver" "Create Driver"}} @onClick={{this.save}} />
11
+ <Button @icon={{if this.driver.id "save" "check"}} @type="primary" @text={{if this.driver.id "Save Driver" "Create Driver"}} @onClick={{this.save}} />
12
12
  </div>
13
- <Button @type="default" @icon="times" @helpText={{if @driver.id "Cancel edit driver" "Cancel new driver"}} @onClick={{@onPressCancel}} />
13
+ <Button @type="default" @icon="times" @helpText={{if this.driver.id "Cancel edit driver" "Cancel new driver"}} @onClick={{@onPressCancel}} />
14
14
  </div>
15
15
  </div>
16
16
  <div class="flex flex-row justify-between w-full">
17
17
  <div class="flex flex-col flex-1 w-3/4">
18
18
  <div class="flex flex-row">
19
19
  <div class="w-14 flex items-center justify-start">
20
- <Image src={{@driver.photo_url}} @fallbackSrc={{config "defaultValues.driverImage"}} alt={{@driver.name}} height="48" width="48" class="h-12 w-12 rounded-lg shadow-sm" />
20
+ <Image src={{this.driver.photo_url}} @fallbackSrc={{config "defaultValues.driverImage"}} alt={{this.driver.name}} height="48" width="48" class="h-12 w-12 rounded-lg shadow-sm" />
21
21
  <Attach::Tooltip @class="clean" @animation="scale" @placement={{"top"}}>
22
- <InputInfo @text={{@driver.public_id}} />
22
+ <InputInfo @text={{this.driver.public_id}} />
23
23
  </Attach::Tooltip>
24
24
  </div>
25
25
  <div class="flex flex-col pt-2">
26
26
  <h1 class="text-gray-900 dark:text-white text-2xl">
27
- {{#if @driver.id}}
28
- {{@driver.name}}
27
+ {{#if this.driver.id}}
28
+ {{this.driver.name}}
29
29
  {{else}}
30
- {{#if @driver.name}}
31
- {{@driver.name}}
30
+ {{#if this.driver.name}}
31
+ {{this.driver.name}}
32
32
  {{else}}
33
33
  <span>New Driver</span>
34
34
  {{/if}}
35
35
  {{/if}}
36
36
  </h1>
37
37
  <div class="-mt-1">
38
- {{#if @driver.vehicle}}
38
+ {{#if this.driver.vehicle}}
39
39
  <div class="flex flex-row items-center">
40
- <span class="text-sm dark:text-gray-500 text-gray-700 mr-3">{{@driver.vehicle.displayName}}</span>
40
+ <span class="text-sm dark:text-gray-500 text-gray-700 mr-3">{{this.driver.vehicle.displayName}}</span>
41
41
  </div>
42
42
  {{else}}
43
43
  <div class="flex flex-row items-center">
@@ -49,7 +49,7 @@
49
49
  </div>
50
50
  </div>
51
51
  <div class="flex justify-end w-1/4">
52
- <Badge @status={{@driver.status}} />
52
+ <Badge @status={{this.driver.status}} />
53
53
  </div>
54
54
  </div>
55
55
  </Overlay::Header>
@@ -61,7 +61,7 @@
61
61
  <label>
62
62
  Name
63
63
  </label>
64
- <Input @value={{@driver.name}} @type="text" class="w-full form-input" placeholder="Name" />
64
+ <Input @value={{this.driver.name}} @type="text" class="w-full form-input" placeholder="Name" />
65
65
  </div>
66
66
  </div>
67
67
 
@@ -70,35 +70,35 @@
70
70
  <label>
71
71
  Internal ID
72
72
  </label>
73
- <Input @value={{@driver.internal_id}} @type="text" class="w-full form-input" placeholder="Internal ID" />
73
+ <Input @value={{this.driver.internal_id}} @type="text" class="w-full form-input" placeholder="Internal ID" />
74
74
  </div>
75
75
 
76
76
  <div class="input-group">
77
77
  <label>
78
78
  Drivers License
79
79
  </label>
80
- <Input @value={{@driver.drivers_license_number}} @type="text" class="w-full form-input" placeholder="Drivers License" />
80
+ <Input @value={{this.driver.drivers_license_number}} @type="text" class="w-full form-input" placeholder="Drivers License" />
81
81
  </div>
82
82
 
83
83
  <div class="input-group">
84
84
  <label>
85
85
  Email
86
86
  </label>
87
- <Input @value={{@driver.email}} @type="text" class="w-full form-input" placeholder="Email" />
87
+ <Input @value={{this.driver.email}} @type="text" class="w-full form-input" placeholder="Email" />
88
88
  </div>
89
89
 
90
90
  <div class="input-group">
91
91
  <label>
92
92
  Phone
93
93
  </label>
94
- <PhoneInput @value={{@driver.phone}} @onInput={{fn (mut @driver.phone)}} class="form-input w-full" />
94
+ <PhoneInput @value={{this.driver.phone}} @onInput={{fn (mut this.driver.phone)}} class="form-input w-full" />
95
95
  </div>
96
96
 
97
97
  <div class="input-group">
98
98
  <label>
99
99
  Vendor
100
100
  </label>
101
- <ModelSelect @modelName="vendor" @selectedModel={{@driver.vendor}} @placeholder="Select Vendor" @triggerClass="form-select form-input" @infiniteScroll={{false}} @renderInPlace={{true}} @onChange={{fn (mut @driver.vendor)}} as |model|>
101
+ <ModelSelect @modelName="vendor" @selectedModel={{this.driver.vendor}} @placeholder="Select Vendor" @triggerClass="form-select form-input" @infiniteScroll={{false}} @renderInPlace={{true}} @onChange={{fn (mut this.driver.vendor)}} as |model|>
102
102
  {{model.name}}
103
103
  </ModelSelect>
104
104
  </div>
@@ -107,7 +107,7 @@
107
107
  <label>
108
108
  Vehicle
109
109
  </label>
110
- <ModelSelect @modelName="vehicle" @selectedModel={{@driver.vehicle}} @placeholder="Select Vehicle" @triggerClass="form-select form-input" @infiniteScroll={{false}} @renderInPlace={{true}} @onChange={{fn (mut @driver.vehicle)}} as |model|>
110
+ <ModelSelect @modelName="vehicle" @selectedModel={{this.driver.vehicle}} @placeholder="Select Vehicle" @triggerClass="form-select form-input" @infiniteScroll={{false}} @renderInPlace={{true}} @onChange={{fn (mut this.driver.vehicle)}} as |model|>
111
111
  {{model.display_name}}
112
112
  </ModelSelect>
113
113
  </div>
@@ -116,14 +116,14 @@
116
116
  <label>
117
117
  City
118
118
  </label>
119
- <Input @value={{@driver.city}} @type="text" class="w-full form-input" placeholder="City" />
119
+ <Input @value={{this.driver.city}} @type="text" class="w-full form-input" placeholder="City" />
120
120
  </div>
121
121
 
122
122
  <div class="input-group">
123
123
  <label>
124
124
  Country
125
125
  </label>
126
- <CountrySelect class="w-full form-input form-select form-datalist" @value={{@driver.country}} @onChange={{fn (mut @driver.country)}} placeholder="Country" />
126
+ <CountrySelect class="w-full form-input form-select form-datalist" @value={{this.driver.country}} @onChange={{fn (mut this.driver.country)}} placeholder="Country" />
127
127
  </div>
128
128
  </div>
129
129
  </div>
@@ -1,4 +1,5 @@
1
1
  import Component from '@glimmer/component';
2
+ import { tracked } from '@glimmer/tracking';
2
3
  import { inject as service } from '@ember/service';
3
4
  import { action } from '@ember/object';
4
5
 
@@ -6,10 +7,35 @@ export default class DriverFormPanelComponent extends Component {
6
7
  @service store;
7
8
  @service notifications;
8
9
  @service hostRouter;
10
+ @service contextPanel;
9
11
  @service loader;
12
+ @tracked driver;
13
+
14
+ constructor() {
15
+ super(...arguments);
16
+ this.driver = this.args.driver;
17
+ this.applyDynamicArguments();
18
+ }
19
+
20
+ applyDynamicArguments() {
21
+ // Apply context if available
22
+ if (this.args.context) {
23
+ this.driver = this.args.context;
24
+ }
25
+
26
+ // Apply dynamic arguments if available
27
+ if (this.args.dynamicArgs) {
28
+ const keys = Object.keys(this.args.dynamicArgs);
29
+
30
+ keys.forEach((key) => {
31
+ this[key] = this.args.dynamicArgs[key];
32
+ });
33
+ }
34
+ }
10
35
 
11
36
  @action save() {
12
- const { driver, onAfterSave } = this.args;
37
+ const { driver } = this;
38
+ const { onAfterSave } = this.args;
13
39
 
14
40
  this.loader.showLoader('.overlay-inner-content', 'Saving driver...');
15
41
 
@@ -33,7 +59,6 @@ export default class DriverFormPanelComponent extends Component {
33
59
  }
34
60
 
35
61
  @action viewDetails() {
36
- const { driver } = this.args;
37
- return this.hostRouter.transitionTo('console.fleet-ops.management.drivers.index.details', driver.public_id);
62
+ this.contextPanel.focus(this.driver, 'viewing');
38
63
  }
39
64
  }
@@ -1,4 +1,4 @@
1
- <Overlay @position="right" @noBackdrop={{true}} @fullHeight={{true}} @width="700">
1
+ <Overlay @position="right" @noBackdrop={{true}} @fullHeight={{true}} @isResizeble={{or this.isResizable @isResizable}} @width={{or this.width @width "600px"}}>
2
2
  <Overlay::Header @hideLeftSection={{true}} @actionsWrapperClass="flex-1 flex-col py-3" class="h-auto-i min-h-[127px]">
3
3
  <div class="flex flex-row items-center justify-between w-full mb-4">
4
4
  <div class="flex flex-1 space-x-2">
@@ -13,17 +13,17 @@
13
13
  <div class="flex flex-col flex-1 w-3/4">
14
14
  <div class="flex flex-row">
15
15
  <div class="w-14 flex items-center justify-start">
16
- <Image src={{@driver.photo_url}} @fallbackSrc={{config "defaultValues.driverImage"}} alt={{@driver.name}} height="48" width="48" class="h-12 w-12 rounded-lg shadow-sm" />
16
+ <Image src={{this.driver.photo_url}} @fallbackSrc={{config "defaultValues.driverImage"}} alt={{this.driver.name}} height="48" width="48" class="h-12 w-12 rounded-lg shadow-sm" />
17
17
  <Attach::Tooltip @class="clean" @animation="scale" @placement={{"top"}}>
18
- <InputInfo @text={{@driver.public_id}} />
18
+ <InputInfo @text={{this.driver.public_id}} />
19
19
  </Attach::Tooltip>
20
20
  </div>
21
21
  <div class="flex flex-col">
22
- <h1 class="text-gray-900 dark:text-white text-2xl">{{@driver.name}}</h1>
22
+ <h1 class="text-gray-900 dark:text-white text-2xl">{{this.driver.name}}</h1>
23
23
  <div class="-mt-1">
24
- {{#if @driver.vehicle}}
24
+ {{#if this.driver.vehicle}}
25
25
  <div class="flex flex-row items-center">
26
- <span class="text-sm dark:text-gray-500 text-gray-700 mr-3">{{@driver.vehicle.displayName}}</span>
26
+ <span class="text-sm dark:text-gray-500 text-gray-700 mr-3">{{this.driver.vehicle.displayName}}</span>
27
27
  </div>
28
28
  {{else}}
29
29
  <div class="flex flex-row items-center">
@@ -36,7 +36,7 @@
36
36
  </div>
37
37
  </div>
38
38
  <div class="flex justify-end w-1/4">
39
- <Badge @status={{@driver.status}} />
39
+ <Badge @status={{this.driver.status}} />
40
40
  </div>
41
41
  </div>
42
42
  </Overlay::Header>
@@ -54,7 +54,7 @@
54
54
  </div>
55
55
  </div>
56
56
  <div class="tab-content tab-{{this.currentTab}}">
57
- {{component this.tab.component driver=@driver tabOptions=this.tab params=this.tab.componentParams}}
57
+ {{component this.tab.component driver=this.driver tabOptions=this.tab params=this.tab.componentParams}}
58
58
  </div>
59
59
  </Overlay::Body>
60
60
  </Overlay>
@@ -11,10 +11,11 @@ export default class DriverPanelComponent extends Component {
11
11
  @service universe;
12
12
  @service store;
13
13
  @service hostRouter;
14
+ @service contextPanel;
14
15
  @tracked currentTab;
15
16
  @tracked devices = [];
16
17
  @tracked deviceApi = {};
17
- @tracked vehicle;
18
+ @tracked driver;
18
19
 
19
20
  get tabs() {
20
21
  const registeredTabs = this.universe.getMenuItemsFromRegistry('component:driver-panel');
@@ -38,11 +39,28 @@ export default class DriverPanelComponent extends Component {
38
39
 
39
40
  constructor() {
40
41
  super(...arguments);
41
- this.vehicle = this.args.vehicle;
42
- this.changeTab(this.args.tab || 'details');
42
+ this.driver = this.args.driver;
43
+ this.changeTab(this.args.tab);
44
+ this.applyDynamicArguments();
43
45
  }
44
46
 
45
- @action async changeTab(tab) {
47
+ applyDynamicArguments() {
48
+ // Apply context if available
49
+ if (this.args.context) {
50
+ this.driver = this.args.context;
51
+ }
52
+
53
+ // Apply dynamic arguments if available
54
+ if (this.args.dynamicArgs) {
55
+ const keys = Object.keys(this.args.dynamicArgs);
56
+
57
+ keys.forEach((key) => {
58
+ this[key] = this.args.dynamicArgs[key];
59
+ });
60
+ }
61
+ }
62
+
63
+ @action async changeTab(tab = 'details') {
46
64
  this.currentTab = tab;
47
65
 
48
66
  if (typeof this.args.onTabChanged === 'function') {
@@ -51,7 +69,6 @@ export default class DriverPanelComponent extends Component {
51
69
  }
52
70
 
53
71
  @action editDriver() {
54
- const { driver } = this.args;
55
- return this.hostRouter.transitionTo('console.fleet-ops.management.drivers.index.edit', driver.public_id);
72
+ this.contextPanel.focus(this.driver, 'editing');
56
73
  }
57
74
  }
@@ -13,7 +13,7 @@
13
13
  </div>
14
14
  <div class="w-56">
15
15
  {{#if @onAddVehicle}}
16
- <ModelSelect @modelName="vehicle" @selectedModel={{@options.selectedVehicle}} @placeholder="Add vehicle to fleet" @triggerClass="form-select form-input form-select-sm form-input-sm" @infiniteScroll={{false}} @renderInPlace={{true}} @onChange={{this.onAdd}} as |model|>
16
+ <ModelSelect @modelName="vehicle" @query={{hash assignedFleet=false}} @selectedModel={{@options.selectedVehicle}} @placeholder="Add vehicle to fleet" @triggerClass="form-select form-input form-select-sm form-input-sm" @infiniteScroll={{false}} @renderInPlace={{true}} @onChange={{this.onAdd}} as |model|>
17
17
  {{model.display_name}}
18
18
  </ModelSelect>
19
19
  {{/if}}
@@ -1,10 +1,10 @@
1
- <div class="live-map-component {{@wrapperClass}}" {{did-insert this.setupLiveMap}}>
2
- <LeafletMap id={{this.mapId}} class={{@mapClass}} @lat={{this.latitude}} @lng={{this.longitude}} @zoom={{this.zoom}} @zoomControl={{@zoomControl}} @contextmenu={{true}} @contextmenuWidth={{140}} @contextmenuItems={{this.contextMenuItems}} @onLoad={{this.setMapReference}} {{will-destroy this.closeChannels}} ...attributes as |layers|>
1
+ <div class="live-map-component {{@wrapperClass}}" {{did-insert this.setupComponent}}>
2
+ <LeafletMap id={{this.mapId}} class={{@mapClass}} @lat={{this.latitude}} @lng={{this.longitude}} @zoom={{this.zoom}} @zoomControl={{@zoomControl}} @contextmenu={{true}} @contextmenuWidth={{140}} @contextmenuItems={{this.contextMenuItems}} @onLoad={{this.setupMap}} {{will-destroy this.closeChannels}} ...attributes as |layers|>
3
3
  <layers.tile @url={{this.tileSourceUrl}} />
4
4
 
5
- {{#if this.isDriversVisible}}
5
+ {{#if this.visibilityControls.drivers}}
6
6
  {{#each this.drivers as |driver|}}
7
- <layers.drift-marker @rotationAngle={{driver.heading}} @duration={{300}} @icon={{icon iconUrl=driver.vehicle_avatar iconSize=(array 24 24)}} @location={{point-to-coordinates driver.location}} @publicId={{driver.public_id}} @onAdd={{fn this.onAction "onDriverAdded" driver}} as |marker|>
7
+ <layers.drift-marker @id={{driver.id}} @rotationAngle={{driver.heading}} @duration={{300}} @icon={{icon iconUrl=driver.vehicle_avatar iconSize=(array 24 24)}} @location={{point-to-coordinates driver.location}} @publicId={{driver.public_id}} @onAdd={{fn this.triggerAction "onDriverAdded" driver}} @onClick={{fn this.triggerAction "onDriverClicked" driver}} as |marker|>
8
8
  <marker.popup @maxWidth="500" @minWidth="225">
9
9
  <DriverCard @driver={{driver}} @showCoordinates={{true}} @textClass="text-gray-900 dark:text-gray-100" />
10
10
  </marker.popup>
@@ -13,9 +13,20 @@
13
13
  {{/each}}
14
14
  {{/if}}
15
15
 
16
- {{#if this.isPlacesVisible}}
16
+ {{#if this.visibilityControls.vehicles}}
17
+ {{#each this.vehicles as |vehicle|}}
18
+ <layers.drift-marker @id={{vehicle.id}} @rotationAngle={{vehicle.heading}} @duration={{300}} @icon={{icon iconUrl=vehicle.avatar_url iconSize=(array 24 24)}} @location={{point-to-coordinates vehicle.location}} @publicId={{vehicle.public_id}} @onAdd={{fn this.triggerAction "onVehicleAdded" vehicle}} @onClick={{fn this.triggerAction "onVehicleClicked" vehicle}} as |marker|>
19
+ <marker.tooltip @permanent={{false}} @sticky={{true}}>
20
+ <div>{{vehicle.displayName}}</div>
21
+ <div>{{if vehicle.online "Online" "Offline"}}</div>
22
+ </marker.tooltip>
23
+ </layers.drift-marker>
24
+ {{/each}}
25
+ {{/if}}
26
+
27
+ {{#if this.visibilityControls.places}}
17
28
  {{#each this.places as |place|}}
18
- <layers.marker @icon={{icon iconUrl="/engines-dist/images/building-marker.png" iconSize=(array 16 16)}} @location={{point-to-coordinates place.location}} @riseOnHover={{true}} @title={{place.address}} @alt={{place.address}} as |marker|>
29
+ <layers.marker @id={{place.id}} @icon={{icon iconUrl="/engines-dist/images/building-marker.png" iconSize=(array 16 16)}} @location={{point-to-coordinates place.location}} @riseOnHover={{true}} @title={{place.address}} @alt={{place.address}} @onAdd={{fn this.triggerAction "onPlaceAdded" place}} @onClick={{fn this.triggerAction "onPlaceClicked" place}} as |marker|>
19
30
  <marker.popup>
20
31
  <div>{{place.address}}</div>
21
32
  <div>{{format-point place.location}}</div>
@@ -57,15 +68,15 @@
57
68
  {{/each}}
58
69
  {{/if}} --}}
59
70
 
60
- <layers.draw-control @position="topright" @draw={{hash marker=false circlemarker=false circle=false polyline=false}} @onDrawDrawstop={{fn this.onAction "onDrawDrawstop"}} @onDrawDeleted={{fn this.onAction "onDrawDeleted"}} @onDrawEdited={{fn this.onAction "onDrawEdited"}} @onDrawDeletestart={{fn this.onAction "onDrawDeletestart"}} @onDrawEditstop={{fn this.onAction "onDrawEditstop"}} @onDrawControlCreated={{fn this.onAction "onDrawControlCreated"}} @onDrawFeatureGroupCreated={{fn this.onAction "onDrawFeatureGroupCreated"}} />
71
+ <layers.draw-control @position="topright" @draw={{hash marker=false circlemarker=false circle=false polyline=false}} @onDrawDrawstop={{fn this.triggerAction "onDrawDrawstop"}} @onDrawDeleted={{fn this.triggerAction "onDrawDeleted"}} @onDrawEdited={{fn this.triggerAction "onDrawEdited"}} @onDrawDeletestart={{fn this.triggerAction "onDrawDeletestart"}} @onDrawEditstop={{fn this.triggerAction "onDrawEditstop"}} @onDrawControlCreated={{fn this.triggerAction "onDrawControlCreated"}} @onDrawFeatureGroupCreated={{fn this.triggerAction "onDrawFeatureGroupCreated"}} />
61
72
 
62
73
  {{#each this.activeServiceAreas as |serviceArea|}}
63
- <layers.polygon @id={{serviceArea.id}} @record={{serviceArea}} @locations={{serviceArea.bounds}} @fillColor={{serviceArea.color}} @color={{serviceArea.stroke_color}} @onAdd={{fn this.onAction "onServiceAreaLayerAdded" serviceArea}} as |polygon|>
74
+ <layers.polygon @id={{serviceArea.id}} @record={{serviceArea}} @locations={{serviceArea.bounds}} @fillColor={{serviceArea.color}} @color={{serviceArea.stroke_color}} @onAdd={{fn this.triggerAction "onServiceAreaLayerAdded" serviceArea}} as |polygon|>
64
75
  <polygon.tooltip @permanent={{true}} @sticky={{true}}>{{serviceArea.name}} Service Area</polygon.tooltip>
65
76
  </layers.polygon>
66
77
 
67
78
  {{#each serviceArea.zones as |zone|}}
68
- <layers.polygon @id={{zone.id}} @record={{zone}} @locations={{zone.locations}} @fillColor={{zone.color}} @color={{zone.stroke_color}} @onAdd={{fn this.onAction "onZoneLayerAdd" zone}} as |polygon|>
79
+ <layers.polygon @id={{zone.id}} @record={{zone}} @locations={{zone.locations}} @fillColor={{zone.color}} @color={{zone.stroke_color}} @onAdd={{fn this.triggerAction "onZoneLayerAdd" zone}} as |polygon|>
69
80
  <polygon.tooltip @permanent={{true}} @sticky={{true}}>{{zone.name}} Zone</polygon.tooltip>
70
81
  </layers.polygon>
71
82
  {{/each}}