@fleetbase/fleetops-engine 0.3.3 → 0.3.4

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 (110) hide show
  1. package/addon/components/contact-form-panel.hbs +28 -6
  2. package/addon/components/driver-form-panel.hbs +10 -0
  3. package/addon/components/driver-form-panel.js +51 -0
  4. package/addon/components/driver-panel/details.hbs +1 -5
  5. package/addon/components/driver-panel.hbs +21 -3
  6. package/addon/components/fleet-form-panel.hbs +60 -6
  7. package/addon/components/fleet-panel/details.hbs +1 -1
  8. package/addon/components/fuel-report-form-panel.hbs +84 -8
  9. package/addon/components/fuel-report-form-panel.js +6 -0
  10. package/addon/components/fuel-report-panel/details.hbs +4 -0
  11. package/addon/components/issue-form-panel.hbs +99 -11
  12. package/addon/components/issue-form-panel.js +5 -13
  13. package/addon/components/layout/fleet-ops-sidebar.js +8 -0
  14. package/addon/components/live-map-drawer.hbs +1 -1
  15. package/addon/components/live-map.hbs +1 -1
  16. package/addon/components/modals/driver-assign-vehicle.hbs +2 -11
  17. package/addon/components/modals/driver-assign-vendor.hbs +1 -9
  18. package/addon/components/modals/fuel-report-details.hbs +4 -0
  19. package/addon/components/order/schedule-card.hbs +32 -4
  20. package/addon/components/order/schedule-card.js +155 -5
  21. package/addon/components/place-form-panel.hbs +14 -7
  22. package/addon/components/place-form-panel.js +71 -0
  23. package/addon/components/place-panel/details.hbs +9 -19
  24. package/addon/components/vehicle-form-panel.hbs +67 -7
  25. package/addon/components/vehicle-form-panel.js +37 -0
  26. package/addon/components/vehicle-panel/details.hbs +9 -5
  27. package/addon/components/vehicle-panel.hbs +18 -4
  28. package/addon/components/vendor-form-panel/create-form.hbs +72 -11
  29. package/addon/components/vendor-form-panel/edit-form.hbs +1 -1
  30. package/addon/components/vendor-form-panel.hbs +70 -30
  31. package/addon/components/vendor-form-panel.js +4 -40
  32. package/addon/components/vendor-panel/details.hbs +2 -2
  33. package/addon/components/vendor-panel.hbs +16 -2
  34. package/addon/controllers/management/contacts/index.js +42 -3
  35. package/addon/controllers/management/fleets/index.js +12 -23
  36. package/addon/controllers/management/fuel-reports/index/new.js +1 -1
  37. package/addon/controllers/management/fuel-reports/index.js +73 -20
  38. package/addon/controllers/management/issues/index/new.js +2 -2
  39. package/addon/controllers/management/issues/index.js +65 -45
  40. package/addon/controllers/management/places/index.js +59 -18
  41. package/addon/controllers/management/vehicles/index.js +67 -8
  42. package/addon/controllers/management/vendors/index.js +63 -8
  43. package/addon/controllers/operations/orders/index.js +42 -1
  44. package/addon/routes/management/contacts/index.js +8 -0
  45. package/addon/routes/management/fleets/index.js +8 -2
  46. package/addon/routes/management/fuel-reports/index.js +6 -0
  47. package/addon/routes/management/issues/index.js +9 -1
  48. package/addon/routes/management/places/index.js +11 -1
  49. package/addon/routes/management/vehicles/index.js +3 -3
  50. package/addon/routes/management/vendors/index.js +8 -0
  51. package/addon/routes/operations/scheduler/index.js +1 -1
  52. package/addon/templates/operations/orders/index.hbs +1 -1
  53. package/addon/utils/get-issue-categories.js +30 -0
  54. package/addon/utils/get-issue-types.js +3 -0
  55. package/addon/utils/get-vendor-status-options.js +3 -0
  56. package/addon/utils/get-vendor-type-options.js +41 -0
  57. package/app/utils/get-issue-categories.js +1 -0
  58. package/app/utils/get-issue-types.js +1 -0
  59. package/app/utils/get-vendor-categories.js +1 -0
  60. package/app/utils/get-vendor-status-options.js +1 -0
  61. package/app/utils/get-vendor-type-options.js +1 -0
  62. package/app/utils/get-vendor-types.js +1 -0
  63. package/composer.json +1 -1
  64. package/extension.json +1 -1
  65. package/package.json +4 -4
  66. package/server/migrations/2023_11_09_041807_add_status_column_to_fuel_reports_table.php +32 -0
  67. package/server/migrations/2023_11_15_062814_add_comments_column_and_resolved_at_column_to_vehicle_device_events_table.php +33 -0
  68. package/server/src/Http/Controllers/Api/v1/DriverController.php +2 -2
  69. package/server/src/Http/Controllers/Api/v1/VehicleController.php +2 -2
  70. package/server/src/Http/Controllers/Internal/v1/DriverController.php +5 -13
  71. package/server/src/Http/Controllers/Internal/v1/OrderController.php +1 -3
  72. package/server/src/Http/Filter/ContactFilter.php +10 -0
  73. package/server/src/Http/Filter/FleetFilter.php +8 -6
  74. package/server/src/Http/Filter/FuelReportFilter.php +51 -0
  75. package/server/src/Http/Filter/IssueFilter.php +61 -5
  76. package/server/src/Http/Filter/PlaceFilter.php +48 -6
  77. package/server/src/Http/Filter/VehicleFilter.php +21 -6
  78. package/server/src/Http/Filter/VendorFilter.php +11 -8
  79. package/server/src/Http/Middleware/TransformLocationMiddleware.php +1 -1
  80. package/server/src/Http/Resources/Internal/v1/IntegratedVendorFacilitator.php +17 -18
  81. package/server/src/Http/Resources/v1/Contact.php +16 -19
  82. package/server/src/Http/Resources/v1/CurrentJob.php +13 -16
  83. package/server/src/Http/Resources/v1/Driver.php +59 -57
  84. package/server/src/Http/Resources/v1/Entity.php +30 -33
  85. package/server/src/Http/Resources/v1/FuelReport.php +16 -14
  86. package/server/src/Http/Resources/v1/Order.php +1 -1
  87. package/server/src/Http/Resources/v1/Payload.php +21 -24
  88. package/server/src/Http/Resources/v1/Place.php +27 -30
  89. package/server/src/Http/Resources/v1/Proof.php +13 -16
  90. package/server/src/Http/Resources/v1/PurchaseRate.php +14 -17
  91. package/server/src/Http/Resources/v1/ServiceArea.php +13 -16
  92. package/server/src/Http/Resources/v1/ServiceQuote.php +15 -18
  93. package/server/src/Http/Resources/v1/ServiceRate.php +33 -36
  94. package/server/src/Http/Resources/v1/ServiceRateFee.php +14 -17
  95. package/server/src/Http/Resources/v1/ServiceRateParcelFee.php +9 -12
  96. package/server/src/Http/Resources/v1/TrackingNumber.php +18 -21
  97. package/server/src/Http/Resources/v1/TrackingStatus.php +18 -21
  98. package/server/src/Http/Resources/v1/Vehicle.php +31 -34
  99. package/server/src/Http/Resources/v1/VehicleDevice.php +23 -25
  100. package/server/src/Http/Resources/v1/VehicleWithoutDriver.php +38 -32
  101. package/server/src/Http/Resources/v1/Vendor.php +31 -26
  102. package/server/src/Http/Resources/v1/Zone.php +14 -17
  103. package/server/src/Models/Driver.php +7 -1
  104. package/server/src/Models/FuelReport.php +1 -0
  105. package/server/src/Models/IntegratedVendor.php +6 -1
  106. package/server/src/Models/Order.php +2 -2
  107. package/server/src/Models/Place.php +2 -2
  108. package/server/src/Models/VehicleDeviceEvent.php +1 -0
  109. package/server/src/Models/Vendor.php +1 -1
  110. package/server/src/Observers/DriverObserver.php +15 -0
@@ -1,4 +1,11 @@
1
- <Overlay @onLoad={{this.setOverlayContext}} @position="right" @noBackdrop={{true}} @fullHeight={{true}} @isResizeble={{or this.isResizable @isResizable}} @width={{or this.width @width "600px"}}>
1
+ <Overlay
2
+ @onLoad={{this.setOverlayContext}}
3
+ @position="right"
4
+ @noBackdrop={{true}}
5
+ @fullHeight={{true}}
6
+ @isResizeble={{or this.isResizable @isResizable}}
7
+ @width={{or this.width @width "600px"}}
8
+ >
2
9
  <Overlay::Header @hideLeftSection={{true}} @actionsWrapperClass="flex-1 flex-col py-3" class="h-auto-i min-h-[127px]">
3
10
  <div class="flex flex-row items-center justify-between w-full mb-4">
4
11
  <div class="flex flex-1 space-x-2">
@@ -17,13 +24,21 @@
17
24
  <div class="flex flex-col flex-1 w-3/4">
18
25
  <div class="flex flex-row">
19
26
  <div class="w-14">
20
- <div class="w-12 h-12 flex items-center justify-start relative hover:bg-gray-100 transition-all rounded-lg overflow-hidden">
21
- <img src={{this.contact.photo_url}} alt={{this.contact.name}} height="48" width="48" class="h-12 w-12 rounded-lg shadow-sm" />
27
+ <div class="upload-avatar-overlay w-12 h-12 flex items-center justify-start rounded-lg">
28
+ <img src={{this.contact.photo_url}} alt={{this.contact.name}} height="48" width="48" class="h-12 w-12 rounded-lg shadow-sm" />
22
29
  <Attach::Tooltip @class="clean" @animation="scale" @placement="top">
23
30
  <InputInfo @text={{this.contact.public_id}} />
24
31
  </Attach::Tooltip>
25
- <div class="absolute inset-0 flex items-center justify-center opacity-0 hover:opacity-100 transition-opacity bg-gray-600 bg-opacity-50 rounded-lg">
26
- <UploadButton @name="photos" @accept="image/*" @onFileAdded={{this.onUploadNewPhoto}} @icon="upload" @hideButtonText={{true}} @labelClass="upload-avatar-label-overlay" class="w-12 btn-reset" />
32
+ <div class="upload-avatar-button-wrapper rounded-lg">
33
+ <UploadButton
34
+ @name="photos"
35
+ @accept="image/*"
36
+ @onFileAdded={{this.onUploadNewPhoto}}
37
+ @icon="upload"
38
+ @hideButtonText={{true}}
39
+ @labelClass="upload-avatar-label-overlay"
40
+ class="w-12 btn-reset"
41
+ />
27
42
  </div>
28
43
  </div>
29
44
  </div>
@@ -72,7 +87,14 @@
72
87
  </InputGroup>
73
88
  <InputGroup @name="Type">
74
89
  <div class="fleetbase-model-select fleetbase-power-select ember-model-select">
75
- <PowerSelect @options={{this.contactTypeOptions}} @selected={{this.contact.type}} @onChange={{fn (mut this.contact.type)}} @placeholder="Select contact type" @triggerClass="form-select form-input" as |type|>
90
+ <PowerSelect
91
+ @options={{this.contactTypeOptions}}
92
+ @selected={{this.contact.type}}
93
+ @onChange={{fn (mut this.contact.type)}}
94
+ @placeholder="Select contact type"
95
+ @triggerClass="form-select form-input"
96
+ as |type|
97
+ >
76
98
  {{smart-humanize type}}
77
99
  </PowerSelect>
78
100
  </div>
@@ -109,6 +109,16 @@
109
109
  </PowerSelect>
110
110
  </div>
111
111
  </InputGroup>
112
+ <InputGroup @name="Coordinates" @wrapperClass="col-span-2">
113
+ <CoordinatesInput
114
+ @value={{this.driver.location}}
115
+ @onChange={{this.onCoordinatesChanged}}
116
+ @onGeocode={{this.onAutocomplete}}
117
+ @onUpdatedFromMap={{this.onCoordinatesChanged}}
118
+ @onInit={{this.setCoordinatesInput}}
119
+ @renderInPlace={{false}}
120
+ />
121
+ </InputGroup>
112
122
  </div>
113
123
  </div>
114
124
  </Overlay::Body>
@@ -2,6 +2,7 @@ import Component from '@glimmer/component';
2
2
  import { tracked } from '@glimmer/tracking';
3
3
  import { inject as service } from '@ember/service';
4
4
  import { action } from '@ember/object';
5
+ import Point from '@fleetbase/fleetops-data/utils/geojson/point';
5
6
  import contextComponentCallback from '../utils/context-component-callback';
6
7
  import applyContextComponentArguments from '../utils/apply-context-component-arguments';
7
8
 
@@ -59,6 +60,12 @@ export default class DriverFormPanelComponent extends Component {
59
60
  */
60
61
  @tracked isLoading = false;
61
62
 
63
+ /**
64
+ * The coordinates input component instance.
65
+ * @type {CoordinateInputComponent}
66
+ */
67
+ @tracked coordinatesInputComponent;
68
+
62
69
  /**
63
70
  * Constructs the component and applies initial state.
64
71
  */
@@ -108,6 +115,7 @@ export default class DriverFormPanelComponent extends Component {
108
115
  this.isLoading = false;
109
116
  });
110
117
  } catch (error) {
118
+ this.notifications.error(error.message);
111
119
  this.loader.removeLoader('.next-content-overlay-panel-container ');
112
120
  this.isLoading = false;
113
121
  }
@@ -160,4 +168,47 @@ export default class DriverFormPanelComponent extends Component {
160
168
  @action onPressCancel() {
161
169
  return contextComponentCallback(this, 'onPressCancel', this.driver);
162
170
  }
171
+
172
+ /**
173
+ * Handles the selection from an autocomplete. Updates the place properties with the selected data.
174
+ * If a coordinates input component is present, updates its coordinates too.
175
+ *
176
+ * @action
177
+ * @param {Object} selected - The selected item from the autocomplete.
178
+ * @param {Object} selected.location - The location data of the selected item.
179
+ * @memberof DriverFormPanelComponent
180
+ */
181
+ @action onAutocomplete({ location }) {
182
+ if (location) {
183
+ this.driver.set('location', location);
184
+ if (this.coordinatesInputComponent) {
185
+ this.coordinatesInputComponent.updateCoordinates(location);
186
+ }
187
+ }
188
+ }
189
+
190
+ /**
191
+ * Sets the coordinates input component.
192
+ *
193
+ * @action
194
+ * @param {Object} coordinatesInputComponent - The coordinates input component to be set.
195
+ * @memberof DriverFormPanelComponent
196
+ */
197
+ @action setCoordinatesInput(coordinatesInputComponent) {
198
+ this.coordinatesInputComponent = coordinatesInputComponent;
199
+ }
200
+
201
+ /**
202
+ * Updates the place coordinates with the given latitude and longitude.
203
+ *
204
+ * @action
205
+ * @param {Object} coordinates - The latitude and longitude coordinates.
206
+ * @param {number} coordinates.latitude - Latitude value.
207
+ * @param {number} coordinates.longitude - Longitude value.
208
+ * @memberof DriverFormPanelComponent
209
+ */
210
+ @action onCoordinatesChanged({ latitude, longitude }) {
211
+ const location = new Point(longitude, latitude);
212
+ this.driver.setProperties({ location });
213
+ }
163
214
  }
@@ -15,7 +15,7 @@
15
15
  </div>
16
16
  <div class="field-info-container">
17
17
  <div class="field-name">Drivers License</div>
18
- <div class="field-value">{{n-a @driver.drivers_license}}</div>
18
+ <div class="field-value">{{n-a @driver.drivers_license_number}}</div>
19
19
  </div>
20
20
  <div class="field-info-container">
21
21
  <div class="field-name">Email</div>
@@ -25,10 +25,6 @@
25
25
  <div class="field-name">Phone</div>
26
26
  <div class="field-value">{{n-a @driver.phone}}</div>
27
27
  </div>
28
- <div class="field-info-container">
29
- <div class="field-name">Current Job</div>
30
- <div class="field-value">{{n-a @driver.current_job_id}}</div>
31
- </div>
32
28
  <div class="field-info-container">
33
29
  <div class="field-name">City</div>
34
30
  <div class="field-value">{{n-a @driver.city}}</div>
@@ -1,4 +1,11 @@
1
- <Overlay @onLoad={{this.setOverlayContext}} @position="right" @noBackdrop={{true}} @fullHeight={{true}} @isResizeble={{or this.isResizable @isResizable}} @width={{or this.width @width "600px"}}>
1
+ <Overlay
2
+ @onLoad={{this.setOverlayContext}}
3
+ @position="right"
4
+ @noBackdrop={{true}}
5
+ @fullHeight={{true}}
6
+ @isResizeble={{or this.isResizable @isResizable}}
7
+ @width={{or this.width @width "600px"}}
8
+ >
2
9
  <Overlay::Header @hideLeftSection={{true}} @actionsWrapperClass="flex-1 flex-col py-3" class="h-auto-i min-h-[127px]">
3
10
  <div class="flex flex-row items-center justify-between w-full mb-4">
4
11
  <div class="flex flex-1 space-x-2">
@@ -14,7 +21,14 @@
14
21
  <div class="flex flex-row">
15
22
  <div class="w-14">
16
23
  <div class="w-12 h-12 flex items-center justify-start rounded-lg">
17
- <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" />
24
+ <Image
25
+ src={{this.driver.photo_url}}
26
+ @fallbackSrc={{config "defaultValues.driverImage"}}
27
+ alt={{this.driver.name}}
28
+ height="48"
29
+ width="48"
30
+ class="h-12 w-12 rounded-lg shadow-sm"
31
+ />
18
32
  <Attach::Tooltip @class="clean" @animation="scale" @placement="top">
19
33
  <InputInfo @text={{this.driver.name}} />
20
34
  </Attach::Tooltip>
@@ -25,7 +39,11 @@
25
39
  <div class="-mt-1">
26
40
  {{#if this.driver.vehicle}}
27
41
  <div class="flex flex-row items-center">
28
- <a href="javascript:;" class="text-sm dark:text-blue-400 text-blue-600 hover:opacity-50" {{on "click" this.onClickDriverVehicle}}>{{this.driver.vehicle.displayName}}</a>
42
+ <a
43
+ href="javascript:;"
44
+ class="text-sm dark:text-blue-400 text-blue-600 hover:opacity-50"
45
+ {{on "click" this.onClickDriverVehicle}}
46
+ >{{this.driver.vehicle.displayName}}</a>
29
47
  </div>
30
48
  {{else}}
31
49
  <div class="flex flex-row items-center">
@@ -1,5 +1,18 @@
1
- <Overlay @onLoad={{this.setOverlayContext}} @position="right" @noBackdrop={{true}} @fullHeight={{true}} @isResizeble={{or this.isResizable @isResizable}} @width={{or this.width @width "600px"}}>
2
- <Overlay::Header @title={{if this.fleet.public_id this.fleet.name "New Fleet"}} @status={{this.fleet.public_id}} @hideStatusDot={{true}} @createdAt={{this.fleet.createdAt}} @titleWrapperClass="leading-5">
1
+ <Overlay
2
+ @onLoad={{this.setOverlayContext}}
3
+ @position="right"
4
+ @noBackdrop={{true}}
5
+ @fullHeight={{true}}
6
+ @isResizeble={{or this.isResizable @isResizable}}
7
+ @width={{or this.width @width "600px"}}
8
+ >
9
+ <Overlay::Header
10
+ @title={{if this.fleet.public_id this.fleet.name "New Fleet"}}
11
+ @status={{this.fleet.public_id}}
12
+ @hideStatusDot={{true}}
13
+ @createdAt={{this.fleet.createdAt}}
14
+ @titleWrapperClass="leading-5"
15
+ >
3
16
  <div class="flex flex-1 justify-end">
4
17
  <Button @icon={{if this.fleet.id "save" "check"}} @type="primary" @text={{if this.fleet.id "Save Fleet" "Create Fleet"}} @onClick={{this.save}} @wrapperClass="mr-2" />
5
18
  {{#if this.fleet.id}}
@@ -14,23 +27,64 @@
14
27
  <div class="flex flex-col text-xs dark:text-gray-100">
15
28
  <InputGroup @name="Fleet Name" @value={{this.fleet.name}} />
16
29
  <InputGroup @name="Parent Fleet" @value={{this.fleet.parent_fleet}}>
17
- <ModelSelect @modelName="fleet" @selectedModel={{this.fleet.parent_fleet}} @placeholder="Select parent fleet to assign fleet to" @triggerClass="form-select form-input" @infiniteScroll={{false}} @renderInPlace={{true}} @onChange={{fn this.updateRelationship "parent_fleet"}} @allowClear={{true}} as |model|>
30
+ <ModelSelect
31
+ @modelName="fleet"
32
+ @selectedModel={{this.fleet.parent_fleet}}
33
+ @placeholder="Select parent fleet to assign fleet to"
34
+ @triggerClass="form-select form-input"
35
+ @infiniteScroll={{false}}
36
+ @renderInPlace={{true}}
37
+ @onChange={{fn this.updateRelationship "parent_fleet"}}
38
+ @allowClear={{true}}
39
+ as |model|
40
+ >
18
41
  {{model.name}}
19
42
  </ModelSelect>
20
43
  </InputGroup>
21
44
  <InputGroup @name="Vendor" @value={{this.fleet.vendor}}>
22
- <ModelSelect @modelName="vendor" @selectedModel={{this.fleet.vendor}} @placeholder="Select vendor to assign fleet to" @triggerClass="form-select form-input" @infiniteScroll={{false}} @renderInPlace={{true}} @onChange={{fn this.updateRelationship "vendor"}} @allowClear={{true}} as |model|>
45
+ <ModelSelect
46
+ @modelName="vendor"
47
+ @selectedModel={{this.fleet.vendor}}
48
+ @placeholder="Select vendor to assign fleet to"
49
+ @triggerClass="form-select form-input"
50
+ @infiniteScroll={{false}}
51
+ @renderInPlace={{true}}
52
+ @onChange={{fn this.updateRelationship "vendor"}}
53
+ @allowClear={{true}}
54
+ as |model|
55
+ >
23
56
  {{model.name}}
24
57
  </ModelSelect>
25
58
  </InputGroup>
26
59
  <InputGroup @name="Assign to Service Area" @value={{this.fleet.service_area}}>
27
- <ModelSelect @modelName="service-area" @selectedModel={{this.fleet.service_area}} @placeholder="Select service area to assign fleet to" @triggerClass="form-select form-input" @infiniteScroll={{false}} @renderInPlace={{true}} @onChange={{fn this.updateRelationship "service_area"}} @allowClear={{true}} as |model|>
60
+ <ModelSelect
61
+ @modelName="service-area"
62
+ @selectedModel={{this.fleet.service_area}}
63
+ @placeholder="Select service area to assign fleet to"
64
+ @triggerClass="form-select form-input"
65
+ @infiniteScroll={{false}}
66
+ @renderInPlace={{true}}
67
+ @onChange={{fn this.updateRelationship "service_area"}}
68
+ @allowClear={{true}}
69
+ as |model|
70
+ >
28
71
  {{model.name}}
29
72
  </ModelSelect>
30
73
  </InputGroup>
31
74
  {{#if this.fleet.service_area}}
32
75
  <InputGroup @name="Assign to Zone" @value={{this.fleet.zone}}>
33
- <ModelSelect @modelName="zone" @selectedModel={{this.fleet.zone}} @query={{hash service_area_uuid=this.fleet.service_area.id}} @placeholder="Select zone to assign fleet to" @triggerClass="form-select form-input" @infiniteScroll={{false}} @renderInPlace={{true}} @onChange={{fn this.updateRelationship "zone"}} @allowClear={{true}} as |model|>
76
+ <ModelSelect
77
+ @modelName="zone"
78
+ @selectedModel={{this.fleet.zone}}
79
+ @query={{hash service_area_uuid=this.fleet.service_area.id}}
80
+ @placeholder="Select zone to assign fleet to"
81
+ @triggerClass="form-select form-input"
82
+ @infiniteScroll={{false}}
83
+ @renderInPlace={{true}}
84
+ @onChange={{fn this.updateRelationship "zone"}}
85
+ @allowClear={{true}}
86
+ as |model|
87
+ >
34
88
  {{model.name}}
35
89
  </ModelSelect>
36
90
  </InputGroup>
@@ -7,7 +7,7 @@
7
7
  </div>
8
8
  <div class="field-info-container">
9
9
  <div class="field-name">Service Area</div>
10
- <div class="field-value">{{n-a @fleet.serviceArea.name}}</div>
10
+ <div class="field-value">{{n-a @fleet.service_area.name}}</div>
11
11
  </div>
12
12
  <div class="field-info-container">
13
13
  <div class="field-name">Zone</div>
@@ -1,7 +1,26 @@
1
- <Overlay @onLoad={{this.setOverlayContext}} @position="right" @noBackdrop={{true}} @fullHeight={{true}} @isResizeble={{or this.isResizable @isResizable}} @width={{or this.width @width "600px"}}>
2
- <Overlay::Header @title={{if this.fuelReport.public_id this.fuelReport.name "New Fuel Report"}} @status={{this.fuelReport.public_id}} @hideStatusDot={{true}} @createdAt={{this.fuelReport.createdAt}} @titleWrapperClass="leading-5">
1
+ <Overlay
2
+ @onLoad={{this.setOverlayContext}}
3
+ @position="right"
4
+ @noBackdrop={{true}}
5
+ @fullHeight={{true}}
6
+ @isResizeble={{or this.isResizable @isResizable}}
7
+ @width={{or this.width @width "600px"}}
8
+ >
9
+ <Overlay::Header
10
+ @title={{if this.fuelReport.public_id this.fuelReport.name "New Fuel Report"}}
11
+ @status={{this.fuelReport.public_id}}
12
+ @hideStatusDot={{true}}
13
+ @createdAt={{this.fuelReport.createdAt}}
14
+ @titleWrapperClass="leading-5"
15
+ >
3
16
  <div class="flex flex-1 justify-end">
4
- <Button @icon={{if this.fuelReport.id "save" "check"}} @type="primary" @text={{if this.fuelReport.id "Save Fuel Report" "Create Fuel Report"}} @onClick={{this.save}} @wrapperClass="mr-2" />
17
+ <Button
18
+ @icon={{if this.fuelReport.id "save" "check"}}
19
+ @type="primary"
20
+ @text={{if this.fuelReport.id "Save Fuel Report" "Create Fuel Report"}}
21
+ @onClick={{this.save}}
22
+ @wrapperClass="mr-2"
23
+ />
5
24
  {{#if this.fuelReport.id}}
6
25
  <Button @type="default" @icon="gas-pump" @helpText="View fuel report details" @onClick={{this.onViewDetails}} @wrapperClass="mr-2" />
7
26
  {{/if}}
@@ -12,26 +31,83 @@
12
31
  <Overlay::Body @wrapperClass="new-service-rate-overlay-body px-4 space-y-4 pt-4" @increaseInnerBodyHeightBy={{1000}}>
13
32
  <div class="grid grid-cols-1 text-xs dark:text-gray-100">
14
33
  <InputGroup @name="Reporter">
15
- <ModelSelect @modelName="user" @selectedModel={{this.fuelReport.reporter}} @placeholder="Select Reporter" @triggerClass="form-select form-input" @infiniteScroll={{false}} @renderInPlace={{true}} @onChange={{fn (mut this.fuelReport.reporter)}} @onChangeId={{fn (mut this.fuelReport.reported_by_uuid)}} as |model|>
34
+ <ModelSelect
35
+ @modelName="user"
36
+ @selectedModel={{this.fuelReport.reporter}}
37
+ @placeholder="Select Reporter"
38
+ @triggerClass="form-select form-input"
39
+ @infiniteScroll={{false}}
40
+ @renderInPlace={{true}}
41
+ @onChange={{fn (mut this.fuelReport.reporter)}}
42
+ @onChangeId={{fn (mut this.fuelReport.reported_by_uuid)}}
43
+ as |model|
44
+ >
16
45
  {{model.name}}
17
46
  </ModelSelect>
18
47
  </InputGroup>
19
48
  <InputGroup @name="Driver">
20
- <ModelSelect @modelName="driver" @selectedModel={{this.fuelReport.driver}} @placeholder="Select Driver" @triggerClass="form-select form-input" @infiniteScroll={{false}} @renderInPlace={{true}} @onChange={{fn (mut this.fuelReport.driver)}} @onChangeId={{fn (mut this.fuelReport.driver_uuid)}} as |model|>
49
+ <ModelSelect
50
+ @modelName="driver"
51
+ @selectedModel={{this.fuelReport.driver}}
52
+ @placeholder="Select Driver"
53
+ @triggerClass="form-select form-input"
54
+ @infiniteScroll={{false}}
55
+ @renderInPlace={{true}}
56
+ @onChange={{fn (mut this.fuelReport.driver)}}
57
+ @onChangeId={{fn (mut this.fuelReport.driver_uuid)}}
58
+ as |model|
59
+ >
21
60
  {{model.name}}
22
61
  </ModelSelect>
23
62
  </InputGroup>
24
63
  <InputGroup @name="Vehicle">
25
- <ModelSelect @modelName="vehicle" @selectedModel={{this.fuelReport.vehicle}} @placeholder="Select Vehicle" @triggerClass="form-select form-input" @infiniteScroll={{false}} @renderInPlace={{true}} @onChange={{fn (mut this.fuelReport.vehicle)}} @onChangeId={{fn (mut this.fuelReport.vehicle_uuid)}} as |model|>
64
+ <ModelSelect
65
+ @modelName="vehicle"
66
+ @selectedModel={{this.fuelReport.vehicle}}
67
+ @placeholder="Select Vehicle"
68
+ @triggerClass="form-select form-input"
69
+ @infiniteScroll={{false}}
70
+ @renderInPlace={{true}}
71
+ @onChange={{fn (mut this.fuelReport.vehicle)}}
72
+ @onChangeId={{fn (mut this.fuelReport.vehicle_uuid)}}
73
+ as |model|
74
+ >
26
75
  {{model.display_name}}
27
76
  </ModelSelect>
28
77
  </InputGroup>
78
+ <InputGroup @name="Status">
79
+ <div class="fleetbase-model-select fleetbase-power-select ember-model-select">
80
+ <PowerSelect
81
+ @options={{this.statusOptions}}
82
+ @selected={{this.fuelReport.status}}
83
+ @onChange={{fn (mut this.fuelReport.status)}}
84
+ @placeholder="Select fuel-report status"
85
+ @triggerClass="form-select form-input"
86
+ as |status|
87
+ >
88
+ {{smart-humanize status}}
89
+ </PowerSelect>
90
+ </div>
91
+ </InputGroup>
29
92
  <InputGroup @name="Odometer" @type="number" @value={{this.fuelReport.odometer}} />
30
93
  <InputGroup @name="Cost">
31
- <MoneyInput class="w-full" @value={{this.fuelReport.amount}} @currency={{this.fuelReport.currency}} @canSelectCurrency={{true}} @onCurrencyChange={{fn (mut this.fuelReport.currency)}} />
94
+ <MoneyInput
95
+ class="w-full"
96
+ @value={{this.fuelReport.amount}}
97
+ @currency={{this.fuelReport.currency}}
98
+ @canSelectCurrency={{true}}
99
+ @onCurrencyChange={{fn (mut this.fuelReport.currency)}}
100
+ />
32
101
  </InputGroup>
33
102
  <InputGroup @name="Volume" @helpText="Select the metric unit and volume of fuel to report." @wrapperClass="w-full">
34
- <UnitInput class="w-full" @measurement="volume" @value={{this.fuelReport.volume}} @unit={{this.fuelReport.metric_unit}} @canSelectUnit={{true}} @onUnitChange={{fn (mut this.fuelReport.metric_unit)}} />
103
+ <UnitInput
104
+ class="w-full"
105
+ @measurement="volume"
106
+ @value={{this.fuelReport.volume}}
107
+ @unit={{this.fuelReport.metric_unit}}
108
+ @canSelectUnit={{true}}
109
+ @onUnitChange={{fn (mut this.fuelReport.metric_unit)}}
110
+ />
35
111
  </InputGroup>
36
112
  <InputGroup @name="Coordinates">
37
113
  <CoordinatesInput @value={{this.fuelReport.location}} @onChange={{fn (mut this.fuelReport.location)}} />
@@ -43,6 +43,12 @@ export default class FuelReportFormPanelComponent extends Component {
43
43
  */
44
44
  @tracked isLoading = false;
45
45
 
46
+ /**
47
+ * Fuel Report status
48
+ * @type {Array}
49
+ */
50
+ @tracked statusOptions = ['draft', 'pending-approval', 'approved', 'rejected', 'revised', 'submitted', 'in-review', 'confirmed', 'processed', 'archived', 'cancelled'];
51
+
46
52
  /**
47
53
  * Constructs the component and applies initial state.
48
54
  */
@@ -1,6 +1,10 @@
1
1
  <div class="p-4">
2
2
  <ContentPanel @title="Details" @open={{true}} @pad={{true}} @panelBodyClass="bg-white dark:bg-gray-900">
3
3
  <div class="grid grid-cols-2 gap-2 text-xs md:mb-6 dark:text-gray-100">
4
+ <div class="field-info-container">
5
+ <div class="field-name">ID</div>
6
+ <div class="field-value">{{n-a @fuelReport.public_id}}</div>
7
+ </div>
4
8
  <div class="field-info-container col-span-2">
5
9
  <div class="field-name">Reporter</div>
6
10
  <div class="field-value">{{n-a @fuelReport.reporter_name}}</div>
@@ -1,5 +1,18 @@
1
- <Overlay @onLoad={{this.setOverlayContext}} @position="right" @noBackdrop={{true}} @fullHeight={{true}} @isResizable={{or this.isResizable @isResizable}} @width={{or this.width @width "600px"}}>
2
- <Overlay::Header @title={{if this.issue.public_id this.issue.name "New Issue"}} @status={{this.issue.public_id}} @hideStatusDot={{true}} @createdAt={{this.issue.createdAt}} @titleWrapperClass="leading-5">
1
+ <Overlay
2
+ @onLoad={{this.setOverlayContext}}
3
+ @position="right"
4
+ @noBackdrop={{true}}
5
+ @fullHeight={{true}}
6
+ @isResizable={{or this.isResizable @isResizable}}
7
+ @width={{or this.width @width "600px"}}
8
+ >
9
+ <Overlay::Header
10
+ @title={{if this.issue.public_id this.issue.name "New Issue"}}
11
+ @status={{this.issue.public_id}}
12
+ @hideStatusDot={{true}}
13
+ @createdAt={{this.issue.createdAt}}
14
+ @titleWrapperClass="leading-5"
15
+ >
3
16
  <div class="flex flex-1 justify-end">
4
17
  <Button @icon={{if this.issue.id "save" "check"}} @type="primary" @text={{if this.issue.id "Save Issue" "Create Issue"}} @onClick={{this.save}} @wrapperClass="mr-2" />
5
18
  {{#if this.issue.id}}
@@ -12,32 +25,77 @@
12
25
  <Overlay::Body @wrapperClass="new-service-rate-overlay-body px-4 pt-4" @increaseInnerBodyHeightBy={{1000}}>
13
26
  <div class="grid grid-cols-1 text-xs dark:text-gray-100">
14
27
  <InputGroup @name="Reported By">
15
- <ModelSelect @modelName="user" @selectedModel={{this.issue.reporter}} @placeholder="Select Reporter" @triggerClass="form-select form-input" @infiniteScroll={{false}} @renderInPlace={{true}} @onChange={{fn (mut this.issue.reporter)}} @onChangeId={{fn (mut this.issue.reported_by_uuid)}} as |model|>
28
+ <ModelSelect
29
+ @modelName="user"
30
+ @selectedModel={{this.issue.reporter}}
31
+ @placeholder="Select Reporter"
32
+ @triggerClass="form-select form-input"
33
+ @infiniteScroll={{false}}
34
+ @renderInPlace={{true}}
35
+ @onChange={{fn (mut this.issue.reporter)}}
36
+ @onChangeId={{fn (mut this.issue.reported_by_uuid)}}
37
+ as |model|
38
+ >
16
39
  {{model.name}}
17
40
  </ModelSelect>
18
41
  </InputGroup>
19
42
 
20
43
  <InputGroup @name="Assigned To">
21
- <ModelSelect @modelName="user" @selectedModel={{this.issue.assignee}} @placeholder="Select Assignee" @triggerClass="form-select form-input" @infiniteScroll={{false}} @renderInPlace={{true}} @onChange={{fn (mut this.issue.assignee)}} @onChangeId={{fn (mut this.issue.assigned_to_uuid)}} as |model|>
44
+ <ModelSelect
45
+ @modelName="user"
46
+ @selectedModel={{this.issue.assignee}}
47
+ @placeholder="Select Assignee"
48
+ @triggerClass="form-select form-input"
49
+ @infiniteScroll={{false}}
50
+ @renderInPlace={{true}}
51
+ @onChange={{fn (mut this.issue.assignee)}}
52
+ @onChangeId={{fn (mut this.issue.assigned_to_uuid)}}
53
+ as |model|
54
+ >
22
55
  {{model.name}}
23
56
  </ModelSelect>
24
57
  </InputGroup>
25
58
 
26
59
  <InputGroup @name="Driver">
27
- <ModelSelect @modelName="driver" @selectedModel={{this.issue.driver}} @placeholder="Select Driver" @triggerClass="form-select form-input" @infiniteScroll={{false}} @renderInPlace={{true}} @onChange={{fn (mut this.issue.driver)}} as |model|>
60
+ <ModelSelect
61
+ @modelName="driver"
62
+ @selectedModel={{this.issue.driver}}
63
+ @placeholder="Select Driver"
64
+ @triggerClass="form-select form-input"
65
+ @infiniteScroll={{false}}
66
+ @renderInPlace={{true}}
67
+ @onChange={{fn (mut this.issue.driver)}}
68
+ as |model|
69
+ >
28
70
  {{model.name}}
29
71
  </ModelSelect>
30
72
  </InputGroup>
31
73
 
32
74
  <InputGroup @name="Vehicle">
33
- <ModelSelect @modelName="vehicle" @selectedModel={{this.issue.vehicle}} @placeholder="Select Vehicle" @triggerClass="form-select form-input" @infiniteScroll={{false}} @renderInPlace={{true}} @onChange={{fn (mut this.issue.vehicle)}} as |model|>
75
+ <ModelSelect
76
+ @modelName="vehicle"
77
+ @selectedModel={{this.issue.vehicle}}
78
+ @placeholder="Select Vehicle"
79
+ @triggerClass="form-select form-input"
80
+ @infiniteScroll={{false}}
81
+ @renderInPlace={{true}}
82
+ @onChange={{fn (mut this.issue.vehicle)}}
83
+ as |model|
84
+ >
34
85
  {{model.displayName}}
35
86
  </ModelSelect>
36
87
  </InputGroup>
37
88
 
38
89
  <InputGroup @name="Issue Type">
39
90
  <div class="fleetbase-model-select fleetbase-power-select ember-model-select">
40
- <PowerSelect @options={{this.issueTypes}} @selected={{this.issue.type}} @onChange={{this.onSelectIssueType}} @placeholder="Select issue type" @triggerClass="form-select form-input" as |type|>
91
+ <PowerSelect
92
+ @options={{this.issueTypes}}
93
+ @selected={{this.issue.type}}
94
+ @onChange={{this.onSelectIssueType}}
95
+ @placeholder="Select issue type"
96
+ @triggerClass="form-select form-input"
97
+ as |type|
98
+ >
41
99
  {{smart-humanize type}}
42
100
  </PowerSelect>
43
101
  </div>
@@ -45,7 +103,15 @@
45
103
 
46
104
  <InputGroup @name="Issue Category">
47
105
  <div class="fleetbase-model-select fleetbase-power-select ember-model-select">
48
- <PowerSelect @options={{this.issueCategories}} @selected={{this.issue.category}} @onChange={{fn (mut this.issue.category)}} @placeholder="Select issue category" @triggerClass="form-select form-input" @disabled={{not this.issueCategories}} as |category|>
106
+ <PowerSelect
107
+ @options={{this.issueCategories}}
108
+ @selected={{this.issue.category}}
109
+ @onChange={{fn (mut this.issue.category)}}
110
+ @placeholder="Select issue category"
111
+ @triggerClass="form-select form-input"
112
+ @disabled={{not this.issueCategories}}
113
+ as |category|
114
+ >
49
115
  {{smart-humanize category}}
50
116
  </PowerSelect>
51
117
  </div>
@@ -56,14 +122,29 @@
56
122
  </InputGroup>
57
123
 
58
124
  <InputGroup @name="Issue Tags">
59
- <TagInput class="form-input" @placeholder="Add tags" @allowSpacesInTags={{true}} @tags={{this.issue.tags}} @addTag={{this.addTag}} @removeTagAtIndex={{this.removeTag}} as |tag|>
125
+ <TagInput
126
+ class="form-input"
127
+ @placeholder="Add tags"
128
+ @allowSpacesInTags={{true}}
129
+ @tags={{this.issue.tags}}
130
+ @addTag={{this.addTag}}
131
+ @removeTagAtIndex={{this.removeTag}}
132
+ as |tag|
133
+ >
60
134
  {{tag}}
61
135
  </TagInput>
62
136
  </InputGroup>
63
137
 
64
138
  <InputGroup @name="Issue Priority">
65
139
  <div class="fleetbase-model-select fleetbase-power-select ember-model-select">
66
- <PowerSelect @options={{this.issuePriorityOptions}} @selected={{this.issue.priority}} @onChange={{fn (mut this.issue.priority)}} @placeholder="Select issue priority" @triggerClass="form-select form-input" as |priority|>
140
+ <PowerSelect
141
+ @options={{this.issuePriorityOptions}}
142
+ @selected={{this.issue.priority}}
143
+ @onChange={{fn (mut this.issue.priority)}}
144
+ @placeholder="Select issue priority"
145
+ @triggerClass="form-select form-input"
146
+ as |priority|
147
+ >
67
148
  {{smart-humanize priority}}
68
149
  </PowerSelect>
69
150
  </div>
@@ -71,7 +152,14 @@
71
152
 
72
153
  <InputGroup @name="Status">
73
154
  <div class="fleetbase-model-select fleetbase-power-select ember-model-select">
74
- <PowerSelect @options={{this.issueStatusOptions}} @selected={{this.issue.status}} @onChange={{fn (mut this.issue.status)}} @placeholder="Select issue status" @triggerClass="form-select form-input" as |status|>
155
+ <PowerSelect
156
+ @options={{this.issueStatusOptions}}
157
+ @selected={{this.issue.status}}
158
+ @onChange={{fn (mut this.issue.status)}}
159
+ @placeholder="Select issue status"
160
+ @triggerClass="form-select form-input"
161
+ as |status|
162
+ >
75
163
  {{smart-humanize status}}
76
164
  </PowerSelect>
77
165
  </div>