@fleetbase/fleetops-engine 0.3.1 → 0.3.3

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 (264) hide show
  1. package/addon/components/admin/visibility-controls.js +1 -0
  2. package/addon/components/contact-form-panel.hbs +82 -0
  3. package/addon/components/contact-form-panel.js +195 -0
  4. package/addon/components/contact-panel/details.hbs +36 -0
  5. package/addon/components/contact-panel/details.js +3 -0
  6. package/addon/components/contact-panel.hbs +52 -0
  7. package/addon/components/contact-panel.js +161 -0
  8. package/addon/components/driver-form-panel.hbs +39 -55
  9. package/addon/components/driver-form-panel.js +41 -0
  10. package/addon/components/driver-panel/details.hbs +2 -2
  11. package/addon/components/driver-panel.hbs +12 -10
  12. package/addon/components/driver-panel.js +13 -0
  13. package/addon/components/fleet-form-panel.hbs +28 -28
  14. package/addon/components/fleet-form-panel.js +150 -1
  15. package/addon/components/fleet-listing-panel.hbs +8 -0
  16. package/addon/components/fleet-listing-panel.js +34 -0
  17. package/addon/components/fleet-panel/details.hbs +30 -0
  18. package/addon/components/fleet-panel/driver-listing.hbs +72 -0
  19. package/addon/components/fleet-panel/driver-listing.js +149 -0
  20. package/addon/components/fleet-panel/vehicle-listing.hbs +72 -0
  21. package/addon/components/fleet-panel/vehicle-listing.js +149 -0
  22. package/addon/components/fleet-panel.hbs +12 -58
  23. package/addon/components/fleet-panel.js +148 -26
  24. package/addon/components/fleet-vehicle-listing.hbs +0 -1
  25. package/addon/components/fuel-report-form-panel.hbs +41 -0
  26. package/addon/components/fuel-report-form-panel.js +122 -0
  27. package/addon/components/fuel-report-panel/details.hbs +38 -0
  28. package/addon/components/fuel-report-panel.hbs +30 -0
  29. package/addon/components/fuel-report-panel.js +161 -0
  30. package/addon/components/issue-form-panel.hbs +85 -0
  31. package/addon/components/issue-form-panel.js +211 -0
  32. package/addon/components/issue-panel/details.hbs +48 -0
  33. package/addon/components/issue-panel.hbs +30 -0
  34. package/addon/components/issue-panel.js +160 -0
  35. package/addon/components/layout/fleet-ops-sidebar.hbs +2 -2
  36. package/addon/components/layout/fleet-ops-sidebar.js +2 -1
  37. package/addon/components/live-map-drawer/driver-listing.hbs +6 -0
  38. package/addon/components/live-map-drawer/driver-listing.js +240 -0
  39. package/addon/components/live-map-drawer/place-listing.hbs +6 -0
  40. package/addon/components/live-map-drawer/place-listing.js +204 -0
  41. package/addon/components/live-map-drawer/vehicle-listing.hbs +6 -0
  42. package/addon/components/live-map-drawer/vehicle-listing.js +216 -0
  43. package/addon/components/live-map-drawer.hbs +17 -0
  44. package/addon/components/live-map-drawer.js +104 -0
  45. package/addon/components/live-map.hbs +5 -1
  46. package/addon/components/live-map.js +109 -15
  47. package/addon/components/map-container/toolbar.hbs +15 -9
  48. package/addon/components/map-container/topbar.hbs +1 -1
  49. package/addon/components/modals/issue-details.hbs +38 -0
  50. package/addon/components/modals/issue-from.hbs +138 -0
  51. package/addon/components/modals/order-event.hbs +1 -1
  52. package/addon/components/order/schedule-card.hbs +4 -4
  53. package/addon/components/order/schedule-card.js +13 -6
  54. package/addon/components/place-form-panel.hbs +50 -0
  55. package/addon/components/place-form-panel.js +134 -0
  56. package/addon/components/place-panel/details.hbs +95 -0
  57. package/addon/components/place-panel.hbs +30 -0
  58. package/addon/components/place-panel.js +161 -0
  59. package/addon/components/vehicle-form-panel.hbs +35 -44
  60. package/addon/components/vehicle-form-panel.js +41 -0
  61. package/addon/components/vehicle-panel/details.hbs +8 -2
  62. package/addon/components/vehicle-panel.hbs +8 -6
  63. package/addon/components/vendor-form-panel/create-form.hbs +114 -0
  64. package/addon/components/vendor-form-panel/create-form.js +158 -0
  65. package/addon/components/vendor-form-panel/edit-form.hbs +98 -0
  66. package/addon/components/vendor-form-panel/edit-form.js +51 -0
  67. package/addon/components/vendor-form-panel.hbs +48 -0
  68. package/addon/components/vendor-form-panel.js +226 -0
  69. package/addon/components/vendor-panel/details.hbs +77 -0
  70. package/addon/components/vendor-panel/details.js +12 -0
  71. package/addon/components/vendor-panel.hbs +58 -0
  72. package/addon/components/vendor-panel.js +161 -0
  73. package/addon/controllers/management/contacts/index/details.js +55 -0
  74. package/addon/controllers/management/contacts/index/edit.js +111 -0
  75. package/addon/controllers/management/contacts/index/new.js +88 -0
  76. package/addon/controllers/management/contacts/index.js +23 -128
  77. package/addon/controllers/management/drivers/index/new.js +2 -2
  78. package/addon/controllers/management/drivers/index.js +18 -32
  79. package/addon/controllers/management/fleets/index/details.js +53 -0
  80. package/addon/controllers/management/fleets/index/edit.js +75 -41
  81. package/addon/controllers/management/fleets/index/new.js +42 -57
  82. package/addon/controllers/management/fleets/index.js +0 -1
  83. package/addon/controllers/management/fuel-reports/index/details.js +63 -0
  84. package/addon/controllers/management/fuel-reports/index/edit.js +111 -0
  85. package/addon/controllers/management/fuel-reports/index/new.js +95 -0
  86. package/addon/controllers/management/fuel-reports/index.js +57 -127
  87. package/addon/controllers/management/issues/index/details.js +54 -0
  88. package/addon/controllers/management/issues/index/edit.js +111 -0
  89. package/addon/controllers/management/issues/index/new.js +94 -0
  90. package/addon/controllers/management/issues/index.js +131 -26
  91. package/addon/controllers/management/places/index/details.js +55 -0
  92. package/addon/controllers/management/places/index/edit.js +111 -0
  93. package/addon/controllers/management/places/index/new.js +88 -0
  94. package/addon/controllers/management/places/index.js +21 -182
  95. package/addon/controllers/management/vehicles/index/new.js +2 -6
  96. package/addon/controllers/management/vendors/index/details.js +55 -0
  97. package/addon/controllers/management/vendors/index/edit.js +111 -0
  98. package/addon/controllers/management/vendors/index/new.js +88 -0
  99. package/addon/controllers/management/vendors/index.js +43 -247
  100. package/addon/controllers/operations/orders/index.js +29 -15
  101. package/addon/controllers/operations/scheduler/index.js +45 -30
  102. package/addon/routes/management/contacts/index/details.js +14 -0
  103. package/addon/routes/management/contacts/index/edit.js +10 -0
  104. package/addon/routes/management/contacts/index/new.js +3 -0
  105. package/addon/routes/management/contacts/index.js +1 -1
  106. package/addon/routes/management/fleets/index/details.js +1 -1
  107. package/addon/routes/management/fleets/index/edit.js +1 -1
  108. package/addon/routes/management/fleets/index.js +1 -1
  109. package/addon/routes/management/fuel-reports/index/details.js +14 -0
  110. package/addon/routes/management/fuel-reports/index/edit.js +10 -0
  111. package/addon/routes/management/fuel-reports/index/new.js +3 -0
  112. package/addon/routes/management/fuel-reports/index.js +3 -1
  113. package/addon/routes/management/issues/index/details.js +14 -0
  114. package/addon/routes/management/issues/index/edit.js +10 -0
  115. package/addon/routes/management/issues/index/new.js +3 -0
  116. package/addon/routes/management/issues/index.js +1 -1
  117. package/addon/routes/management/places/index/details.js +14 -0
  118. package/addon/routes/management/places/index/edit.js +10 -0
  119. package/addon/routes/management/places/index/new.js +3 -0
  120. package/addon/routes/management/places/index.js +6 -1
  121. package/addon/routes/management/vendors/index/details.js +15 -0
  122. package/addon/routes/management/vendors/index/edit.js +11 -0
  123. package/addon/routes/management/vendors/index/new.js +3 -0
  124. package/addon/routes/management/vendors/index.js +1 -0
  125. package/addon/routes/operations/scheduler/index.js +25 -0
  126. package/addon/routes.js +27 -7
  127. package/addon/services/context-panel.js +60 -0
  128. package/addon/styles/fleetops-engine.css +28 -0
  129. package/addon/templates/management/contacts/index/details.hbs +1 -0
  130. package/addon/templates/management/contacts/index/edit.hbs +1 -0
  131. package/addon/templates/management/contacts/index/new.hbs +1 -0
  132. package/addon/templates/management/contacts/index.hbs +22 -3
  133. package/addon/templates/management/drivers/index.hbs +29 -5
  134. package/addon/templates/management/fleets/index/details.hbs +1 -1
  135. package/addon/templates/management/fleets/index/edit.hbs +1 -1
  136. package/addon/templates/management/fleets/index/new.hbs +1 -1
  137. package/addon/templates/management/fuel-reports/index/details.hbs +1 -0
  138. package/addon/templates/management/fuel-reports/index/edit.hbs +1 -0
  139. package/addon/templates/management/fuel-reports/index/new.hbs +1 -0
  140. package/addon/templates/management/fuel-reports/index.hbs +25 -4
  141. package/addon/templates/management/issues/index/details.hbs +1 -0
  142. package/addon/templates/management/issues/index/edit.hbs +1 -0
  143. package/addon/templates/management/issues/index/new.hbs +1 -0
  144. package/addon/templates/management/issues/index.hbs +5 -3
  145. package/addon/templates/management/places/index/details.hbs +1 -0
  146. package/addon/templates/management/places/index/edit.hbs +1 -0
  147. package/addon/templates/management/places/index/new.hbs +1 -0
  148. package/addon/templates/management/vendors/index/details.hbs +1 -0
  149. package/addon/templates/management/vendors/index/edit.hbs +1 -0
  150. package/addon/templates/management/vendors/index/new.hbs +1 -0
  151. package/addon/templates/operations/orders/index.hbs +5 -5
  152. package/addon/templates/operations/scheduler/index.hbs +33 -9
  153. package/addon/utils/create-full-calendar-event-from-order.js +8 -0
  154. package/app/components/contact-form-panel.js +1 -0
  155. package/app/components/contact-panel/details.js +1 -0
  156. package/app/components/contact-panel.js +1 -0
  157. package/app/components/{full-calendar/draggable.js → fleet-listing-panel.js} +1 -1
  158. package/app/components/fleet-panel/details.js +1 -0
  159. package/app/components/fleet-panel/driver-listing.js +1 -0
  160. package/app/components/fleet-panel/vehicle-listing.js +1 -0
  161. package/app/components/fuel-report-form-panel.js +1 -0
  162. package/app/components/{full-calendar.js → fuel-report-panel.js} +1 -1
  163. package/app/components/issue-form-panel.js +1 -0
  164. package/app/components/issue-panel.js +1 -0
  165. package/app/components/live-map-drawer/driver-listing.js +1 -0
  166. package/app/components/live-map-drawer/place-listing.js +1 -0
  167. package/app/components/live-map-drawer/vehicle-listing.js +1 -0
  168. package/app/components/live-map-drawer.js +1 -0
  169. package/app/components/place-form-panel.js +1 -0
  170. package/app/components/place-panel.js +1 -0
  171. package/app/components/vendor-form-panel/create-form.js +1 -0
  172. package/app/components/vendor-form-panel/edit-form.js +1 -0
  173. package/app/components/vendor-form-panel.js +1 -0
  174. package/app/components/vendor-panel/details.js +1 -0
  175. package/app/components/vendor-panel.js +1 -0
  176. package/app/controllers/management/contacts/index/details.js +1 -0
  177. package/app/controllers/management/contacts/index/edit.js +1 -0
  178. package/app/controllers/management/contacts/index/new.js +1 -0
  179. package/app/controllers/management/fuel-reports/index/details.js +1 -0
  180. package/app/controllers/management/fuel-reports/index/edit.js +1 -0
  181. package/app/controllers/management/fuel-reports/index/new.js +1 -0
  182. package/app/controllers/management/issues/index/details.js +1 -0
  183. package/app/controllers/management/issues/index/edit.js +1 -0
  184. package/app/controllers/management/issues/index/new.js +1 -0
  185. package/app/controllers/management/places/index/details.js +1 -0
  186. package/app/controllers/management/places/index/edit.js +1 -0
  187. package/app/controllers/management/places/index/new.js +1 -0
  188. package/app/controllers/management/vendors/index/edit.js +1 -0
  189. package/app/controllers/management/vendors/index/new.js +1 -0
  190. package/app/routes/addon/routes/management/places/index/new.js +1 -0
  191. package/app/routes/management/contacts/index/details.js +1 -0
  192. package/app/routes/management/contacts/index/edit.js +1 -0
  193. package/app/routes/management/contacts/index/new.js +1 -0
  194. package/app/routes/management/fuel-reports/index/details.js +1 -0
  195. package/app/routes/management/fuel-reports/index/edit.js +1 -0
  196. package/app/routes/management/fuel-reports/index/new.js +1 -0
  197. package/app/routes/management/issues/index/details.js +1 -0
  198. package/app/routes/management/issues/index/edit.js +1 -0
  199. package/app/routes/management/issues/index/new.js +1 -0
  200. package/app/routes/management/places/index/details.js +1 -0
  201. package/app/routes/management/places/index/edit.js +1 -0
  202. package/app/routes/management/places/index/new.js +1 -0
  203. package/app/routes/management/vendors/index/details.js +1 -0
  204. package/app/routes/management/vendors/index/edit.js +1 -0
  205. package/app/routes/management/vendors/index/new.js +1 -0
  206. package/app/templates/addon/routes/management/places/index/new.js +1 -0
  207. package/app/templates/management/contacts/index/details.js +1 -0
  208. package/app/templates/management/contacts/index/edit.js +1 -0
  209. package/app/templates/management/contacts/index/new.js +1 -0
  210. package/app/templates/management/fuel-reports/index/details.js +1 -0
  211. package/app/templates/management/fuel-reports/index/edit.js +1 -0
  212. package/app/templates/management/fuel-reports/index/new.js +1 -0
  213. package/app/templates/management/issues/index/details.js +1 -0
  214. package/app/templates/management/issues/index/edit.js +1 -0
  215. package/app/templates/management/issues/index/new.js +1 -0
  216. package/app/templates/management/places/index/details.js +1 -0
  217. package/app/templates/management/places/index/edit.js +1 -0
  218. package/app/templates/management/places/index/new.js +1 -0
  219. package/app/templates/management/vendors/index/details.js +1 -0
  220. package/app/templates/management/vendors/index/edit.js +1 -0
  221. package/app/templates/management/vendors/index/new.js +1 -0
  222. package/app/utils/create-full-calendar-event-from-order.js +1 -0
  223. package/composer.json +1 -1
  224. package/config/environment.js +2 -1
  225. package/extension.json +1 -1
  226. package/package.json +5 -4
  227. package/server/migrations/2023_11_03_072503_refactor_issues_table_columns.php +42 -0
  228. package/server/migrations/2023_11_06_040645_refactor_fuel_reports_table.php +38 -0
  229. package/server/src/Casts/Point.php +15 -1
  230. package/server/src/Http/Controllers/Internal/v1/DriverController.php +33 -15
  231. package/server/src/Http/Filter/FleetFilter.php +7 -0
  232. package/server/src/Http/Filter/FuelReportFilter.php +58 -0
  233. package/server/src/Http/Filter/IssueFilter.php +69 -0
  234. package/server/src/Http/Filter/VehicleFilter.php +10 -0
  235. package/server/src/Http/Middleware/TransformLocationMiddleware.php +48 -0
  236. package/server/src/Http/Resources/v1/Driver.php +1 -0
  237. package/server/src/Http/Resources/v1/Fleet.php +20 -21
  238. package/server/src/Http/Resources/v1/FuelReport.php +37 -35
  239. package/server/src/Http/Resources/v1/Issue.php +77 -0
  240. package/server/src/Http/Resources/v1/ParentFleet.php +60 -0
  241. package/server/src/Http/Resources/v1/SubFleet.php +60 -0
  242. package/server/src/Http/Resources/v1/Vehicle.php +4 -2
  243. package/server/src/Integrations/Lalamove/Lalamove.php +6 -6
  244. package/server/src/Models/Contact.php +7 -0
  245. package/server/src/Models/Driver.php +1 -1
  246. package/server/src/Models/Fleet.php +35 -4
  247. package/server/src/Models/FuelReport.php +53 -3
  248. package/server/src/Models/Issue.php +106 -7
  249. package/server/src/Models/Order.php +22 -0
  250. package/server/src/Models/Vehicle.php +1 -1
  251. package/server/src/Models/VehicleDevice.php +4 -2
  252. package/server/src/Models/VehicleDeviceEvent.php +8 -4
  253. package/server/src/Notifications/OrderAssigned.php +0 -6
  254. package/server/src/Notifications/OrderCanceled.php +0 -6
  255. package/server/src/Notifications/OrderDispatchFailed.php +0 -6
  256. package/server/src/Notifications/OrderDispatched.php +0 -6
  257. package/server/src/Notifications/OrderPing.php +0 -6
  258. package/server/src/Notifications/OrderSplit.php +0 -6
  259. package/server/src/Observers/FleetObserver.php +19 -0
  260. package/server/src/Providers/FleetOpsServiceProvider.php +1 -0
  261. package/server/src/Providers/NotificationServiceProvider.php +1 -1
  262. package/server/src/routes.php +2 -2
  263. package/addon/components/full-calendar/draggable.js +0 -1
  264. package/addon/components/full-calendar.js +0 -1
@@ -11,6 +11,16 @@ export default class DriverFormPanelComponent extends Component {
11
11
  */
12
12
  @service store;
13
13
 
14
+ /**
15
+ * @service fetch
16
+ */
17
+ @service fetch;
18
+
19
+ /**
20
+ * @service currentUser
21
+ */
22
+ @service currentUser;
23
+
14
24
  /**
15
25
  * @service notifications
16
26
  */
@@ -37,6 +47,12 @@ export default class DriverFormPanelComponent extends Component {
37
47
  */
38
48
  @tracked context;
39
49
 
50
+ /**
51
+ * Status options for drivers.
52
+ * @type {Array}
53
+ */
54
+ @tracked driverStatusOptions = ['active', 'pending'];
55
+
40
56
  /**
41
57
  * Indicates whether the component is in a loading state.
42
58
  * @type {boolean}
@@ -97,6 +113,31 @@ export default class DriverFormPanelComponent extends Component {
97
113
  }
98
114
  }
99
115
 
116
+ /**
117
+ * Uploads a new photo for the driver.
118
+ *
119
+ * @param {File} file
120
+ * @memberof DriverFormPanelComponent
121
+ */
122
+ @action onUploadNewPhoto(file) {
123
+ this.fetch.uploadFile.perform(
124
+ file,
125
+ {
126
+ path: `uploads/${this.currentUser.companyId}/drivers/${this.driver.id}`,
127
+ subject_uuid: this.driver.id,
128
+ subject_type: 'driver',
129
+ type: 'driver_photo',
130
+ },
131
+ (uploadedFile) => {
132
+ this.driver.setProperties({
133
+ photo_uuid: uploadedFile.id,
134
+ photo_url: uploadedFile.url,
135
+ photo: uploadedFile,
136
+ });
137
+ }
138
+ );
139
+ }
140
+
100
141
  /**
101
142
  * View the details of the driver.
102
143
  *
@@ -33,12 +33,12 @@
33
33
  <div class="field-name">City</div>
34
34
  <div class="field-value">{{n-a @driver.city}}</div>
35
35
  </div>
36
- {{!-- <div class="field-info-container">
36
+ <div class="field-info-container">
37
37
  <div class="field-name">Country</div>
38
38
  <div class="field-value">
39
39
  <CountryName @country={{@driver.country}} />
40
40
  </div>
41
- </div> --}}
41
+ </div>
42
42
  <div class="field-info-container md:col-span-3">
43
43
  <div class="field-name">Coordinates</div>
44
44
  <div class="field-value">{{point-coordinates @driver.location}}</div>
@@ -1,5 +1,5 @@
1
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 @hideLeftSection={{true}} @actionsWrapperClass="flex-1 flex-col py-3" class="h-auto-i min-h-[127px]">
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
5
  {{!-- <Button @type="default" @icon="location-arrow" @helpText="Locate driver" @onClick={{@onPressCancel}} /> --}}
@@ -12,23 +12,25 @@
12
12
  <div class="flex flex-row justify-between w-full">
13
13
  <div class="flex flex-col flex-1 w-3/4">
14
14
  <div class="flex flex-row">
15
- <div class="w-14 flex items-center justify-start">
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
- <Attach::Tooltip @class="clean" @animation="scale" @placement={{"top"}}>
18
- <InputInfo @text={{this.driver.public_id}} />
19
- </Attach::Tooltip>
15
+ <div class="w-14">
16
+ <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" />
18
+ <Attach::Tooltip @class="clean" @animation="scale" @placement="top">
19
+ <InputInfo @text={{this.driver.name}} />
20
+ </Attach::Tooltip>
21
+ </div>
20
22
  </div>
21
23
  <div class="flex flex-col">
22
24
  <h1 class="text-gray-900 dark:text-white text-2xl">{{this.driver.name}}</h1>
23
25
  <div class="-mt-1">
24
26
  {{#if this.driver.vehicle}}
25
27
  <div class="flex flex-row items-center">
26
- <span class="text-sm dark:text-gray-500 text-gray-700 mr-3">{{this.driver.vehicle.displayName}}</span>
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>
27
29
  </div>
28
30
  {{else}}
29
31
  <div class="flex flex-row items-center">
30
32
  <span class="text-sm dark:text-gray-500 text-gray-700 mr-3">No vehicle assigned</span>
31
- {{!-- <Button @icon="plus" @size="xs" @helpText="Assign a vehicle to driver" /> --}}
33
+ {{! <Button @icon="plus" @size="xs" @helpText="Assign a vehicle to driver" /> }}
32
34
  </div>
33
35
  {{/if}}
34
36
  </div>
@@ -45,7 +47,7 @@
45
47
  <div class="ui-tabs mt-4">
46
48
  <nav>
47
49
  {{#each this.tabs as |tab|}}
48
- <a href="javascript:;" class="ui-tab {{if (eq this.tab.slug tab.slug) 'active' }}" {{on "click" (fn this.onTabChanged tab.slug)}}>
50
+ <a href="javascript:;" class="ui-tab {{if (eq this.tab.slug tab.slug) 'active'}}" {{on "click" (fn this.onTabChanged tab.slug)}}>
49
51
  <FaIcon @icon={{tab.icon}} class="mr-1" />
50
52
  <span>{{tab.title}}</span>
51
53
  </a>
@@ -54,7 +56,7 @@
54
56
  </div>
55
57
  </div>
56
58
  <div class="tab-content tab-{{this.tab.slug}}">
57
- {{component this.tab.component driver=this.driver tabOptions=this.tab params=this.tab.componentParams}}
59
+ {{component this.tab.component driver=this.driver tabOptions=this.tab options=this.tab.componentParams}}
58
60
  </div>
59
61
  </Overlay::Body>
60
62
  </Overlay>
@@ -145,6 +145,19 @@ export default class DriverPanelComponent extends Component {
145
145
  return contextComponentCallback(this, 'onPressCancel', this.driver);
146
146
  }
147
147
 
148
+ /**
149
+ * View the driver's assigned vehicle.
150
+ *
151
+ * @memberof DriverPanelComponent
152
+ */
153
+ @action onClickDriverVehicle() {
154
+ const { vehicle } = this.driver;
155
+
156
+ if (vehicle) {
157
+ this.contextPanel.focus(vehicle);
158
+ }
159
+ }
160
+
148
161
  /**
149
162
  * Finds and returns a tab based on its slug.
150
163
  *
@@ -1,44 +1,44 @@
1
- <Overlay @position="right" @noBackdrop={{true}} @fullHeight={{true}} @width="700">
2
- <Overlay::Header @title={{if @fleet.public_id "Update Fleet" "New Fleet"}} @status={{@fleet.public_id}} @hideStatusDot={{true}} @createdAt={{@fleet.createdAt}} @onPressCancel={{@onPressCancel}}>
3
- {{#if @fleet.id}}
4
- <Button @icon="save" @type="primary" @text="Save Fleet" @onClick={{@onUpdateFleet}} />
5
- {{else}}
6
- <Button @icon="check" @type="primary" @text="Create Fleet" @onClick={{@onCreateFleet}} />
7
- {{/if}}
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">
3
+ <div class="flex flex-1 justify-end">
4
+ <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
+ {{#if this.fleet.id}}
6
+ <Button @type="default" @icon="id-card" @helpText="View fleet details" @onClick={{this.onViewDetails}} @wrapperClass="mr-2" />
7
+ {{/if}}
8
+ <Button @type="default" @icon="times" @helpText={{if this.fleet.id "Cancel edit fleet" "Cancel new fleet"}} @onClick={{this.onPressCancel}} />
9
+ </div>
8
10
  </Overlay::Header>
9
11
 
10
12
  <Overlay::Body @wrapperClass="new-service-rate-overlay-body px-4 space-y-4 pt-4" @increaseInnerBodyHeightBy={{1000}}>
11
13
  <div class="modal-body-container">
12
- <div class="grid grid-cols-2 gap-2 text-xs dark:text-gray-100">
13
- <div class="col-span-2 mb-2">
14
- <InputGroup @name="Fleet Name" @value={{@fleet.name}} />
15
- </div>
16
- <InputGroup @name="Assign to Service Area" @value={{@fleet.service_area}}>
17
- <ModelSelect @modelName="service-area" @selectedModel={{@fleet.service_area}} @placeholder="Select service area to assign fleet to" @triggerClass="form-select form-input" @infiniteScroll={{false}} @renderInPlace={{true}} @onChange={{fn (mut @fleet.service_area)}} as |model|>
14
+ <div class="flex flex-col text-xs dark:text-gray-100">
15
+ <InputGroup @name="Fleet Name" @value={{this.fleet.name}} />
16
+ <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|>
18
18
  {{model.name}}
19
19
  </ModelSelect>
20
20
  </InputGroup>
21
- {{#if @fleet.service_area}}
22
- <InputGroup @name="Assign to Zone" @value={{@fleet.zone}}>
23
- <ModelSelect @modelName="zone" @selectedModel={{@fleet.zone}} @query={{hash service_area_uuid=@fleet.service_area.id}} @placeholder="Select zone to assign fleet to" @triggerClass="form-select form-input" @infiniteScroll={{false}} @renderInPlace={{true}} @onChange={{fn (mut @fleet.zone)}} as |model|>
24
- {{model.name}}
25
- </ModelSelect>
26
- </InputGroup>
27
- {{/if}}
28
- <InputGroup @name="Task/ Mission" @helpText="Give a description of this fleet's primary task or mission if applicable." @value={{@fleet.task}} />
29
- <InputGroup @name="Status" @helpText="Select the status of the fleet.">
30
- <Select this={{@statusOptions}} @value={{@fleet.status}} @onSelect={{fn (mut @fleet.status)}} @placeholder="Select status" class="w-full" />
31
- </InputGroup>
32
- <InputGroup @name="Vendor" @value={{@fleet.vendor}}>
33
- <ModelSelect @modelName="vendor" @selectedModel={{@fleet.vendor}} @placeholder="Select vendor to assign fleet to" @triggerClass="form-select form-input" @infiniteScroll={{false}} @renderInPlace={{true}} @onChange={{fn (mut @fleet.vendor)}} as |model|>
21
+ <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|>
34
23
  {{model.name}}
35
24
  </ModelSelect>
36
25
  </InputGroup>
37
- <InputGroup @name="Fleet" @value={{@fleet.parent_fleet}}>
38
- <ModelSelect @modelName="fleet" @selectedModel={{@fleet.parent_fleet}} @placeholder="Select parent fleet to assign fleet to" @triggerClass="form-select form-input" @infiniteScroll={{false}} @renderInPlace={{true}} @onChange={{fn (mut @fleet.parent_fleet)}} as |model|>
26
+ <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|>
39
28
  {{model.name}}
40
29
  </ModelSelect>
41
30
  </InputGroup>
31
+ {{#if this.fleet.service_area}}
32
+ <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|>
34
+ {{model.name}}
35
+ </ModelSelect>
36
+ </InputGroup>
37
+ {{/if}}
38
+ <InputGroup @name="Status" @helpText="Select the status of the fleet.">
39
+ <Select @options={{this.statusOptions}} @value={{this.fleet.status}} @onSelect={{fn (mut this.fleet.status)}} @placeholder="Select status" class="w-full" />
40
+ </InputGroup>
41
+ <InputGroup @name="Task/ Mission" @helpText="Give a description of this fleet's primary task or mission if applicable." @value={{this.fleet.task}} />
42
42
  </div>
43
43
  </div>
44
44
  {{yield}}
@@ -1,3 +1,152 @@
1
1
  import Component from '@glimmer/component';
2
+ import { tracked } from '@glimmer/tracking';
3
+ import { inject as service } from '@ember/service';
4
+ import { action } from '@ember/object';
5
+ import { underscore } from '@ember/string';
6
+ import contextComponentCallback from '../utils/context-component-callback';
7
+ import applyContextComponentArguments from '../utils/apply-context-component-arguments';
2
8
 
3
- export default class FleetFormPanelComponent extends Component {}
9
+ export default class FleetFormPanelComponent extends Component {
10
+ /**
11
+ * @service store
12
+ */
13
+ @service store;
14
+
15
+ /**
16
+ * @service notifications
17
+ */
18
+ @service notifications;
19
+
20
+ /**
21
+ * @service hostRouter
22
+ */
23
+ @service hostRouter;
24
+
25
+ /**
26
+ * @service loader
27
+ */
28
+ @service loader;
29
+
30
+ /**
31
+ * @service contextPanel
32
+ */
33
+ @service contextPanel;
34
+
35
+ /**
36
+ * Overlay context.
37
+ * @type {any}
38
+ * @memberof FleetFormPanelComponent
39
+ */
40
+ @tracked context;
41
+
42
+ /**
43
+ * Indicates whether the component is in a loading state.
44
+ * @type {boolean}
45
+ * @memberof FleetFormPanelComponent
46
+ */
47
+ @tracked isLoading = false;
48
+
49
+ /**
50
+ * All possible order status options
51
+ *
52
+ * @var {String}
53
+ * @memberof FleetFormPanelComponent
54
+ */
55
+ @tracked statusOptions = ['active', 'disabled', 'decommissioned'];
56
+
57
+ /**
58
+ * Constructs the component and applies initial state.
59
+ */
60
+ constructor() {
61
+ super(...arguments);
62
+ this.fleet = this.args.fleet;
63
+ applyContextComponentArguments(this);
64
+ }
65
+
66
+ /**
67
+ * Sets the overlay context.
68
+ *
69
+ * @action
70
+ * @param {OverlayContextObject} overlayContext
71
+ * @memberof FleetFormPanelComponent
72
+ */
73
+ @action setOverlayContext(overlayContext) {
74
+ this.context = overlayContext;
75
+ contextComponentCallback(this, 'onLoad', ...arguments);
76
+ }
77
+
78
+ /**
79
+ * Saves the fleet changes.
80
+ *
81
+ * @action
82
+ * @returns {Promise<any>}
83
+ * @memberof FleetFormPanelComponent
84
+ */
85
+ @action save() {
86
+ const { fleet } = this;
87
+
88
+ this.loader.showLoader('.next-content-overlay-panel-container', { loadingMessage: 'Saving fleet...', preserveTargetPosition: true });
89
+ this.isLoading = true;
90
+
91
+ contextComponentCallback(this, 'onBeforeSave', fleet);
92
+
93
+ try {
94
+ return fleet
95
+ .save()
96
+ .then((fleet) => {
97
+ this.notifications.success(`Fleet (${fleet.name}) saved successfully.`);
98
+ contextComponentCallback(this, 'onAfterSave', fleet);
99
+ })
100
+ .catch((error) => {
101
+ this.notifications.serverError(error);
102
+ })
103
+ .finally(() => {
104
+ this.loader.removeLoader('.next-content-overlay-panel-container');
105
+ this.isLoading = false;
106
+ });
107
+ } catch (error) {
108
+ this.loader.removeLoader('.next-content-overlay-panel-container');
109
+ this.isLoading = false;
110
+ }
111
+ }
112
+
113
+ /**
114
+ * View the details of the fleet.
115
+ *
116
+ * @action
117
+ * @memberof FleetFormPanelComponent
118
+ */
119
+ @action onViewDetails() {
120
+ const isActionOverrided = contextComponentCallback(this, 'onViewDetails', this.fleet);
121
+
122
+ if (!isActionOverrided) {
123
+ this.contextPanel.focus(this.fleet, 'viewing');
124
+ }
125
+ }
126
+
127
+ /**
128
+ * Handles cancel button press.
129
+ *
130
+ * @action
131
+ * @returns {any}
132
+ * @memberof FleetFormPanelComponent
133
+ */
134
+ @action onPressCancel() {
135
+ return contextComponentCallback(this, 'onPressCancel', this.fleet);
136
+ }
137
+
138
+ /**
139
+ * Update relation on a model.
140
+ *
141
+ * @param {String} relation
142
+ * @param {Model|null} value
143
+ * @memberof FleetFormPanelComponent
144
+ */
145
+ @action updateRelationship(relation, value) {
146
+ this.fleet.set(relation, value);
147
+
148
+ if (!value) {
149
+ this.fleet.set(underscore(relation) + '_uuid', null);
150
+ }
151
+ }
152
+ }
@@ -0,0 +1,8 @@
1
+ <Layout::Sidebar::Panel @open={{or @open true}} @title={{this.fleet.name}} @wrapperClass="next-fleet-summary-fleet fleet-depth-{{@depth}}">
2
+ {{#each this.fleet.subfleets as |subFleet|}}
3
+ <FleetListingPanel @fleet={{subFleet}} @onVehicleClicked={{this.onVehicleClicked}} @depth={{add @depth 1}} />
4
+ {{/each}}
5
+ {{#each this.fleet.vehicles as |vehicle|}}
6
+ <Layout::Sidebar::Item @icon="circle" @iconSize="2xs" @iconClass={{if vehicle.online "text-green-500" "text-yellow-200"}} @onClick={{fn this.onVehicleClicked vehicle}}>{{vehicle.displayName}}</Layout::Sidebar::Item>
7
+ {{/each}}
8
+ </Layout::Sidebar::Panel>
@@ -0,0 +1,34 @@
1
+ import Component from '@glimmer/component';
2
+ import { tracked } from '@glimmer/tracking';
3
+ import { action } from '@ember/object';
4
+
5
+ export default class FleetListingPanelComponent extends Component {
6
+ /**
7
+ * The fleet the listing is for.
8
+ *
9
+ * @type {Fleetmodel}
10
+ * @memberof FleetListingPanelComponent
11
+ */
12
+ @tracked fleet;
13
+
14
+ /**
15
+ * Creates an instance of FleetListingPanelComponent.
16
+ * @memberof FleetListingPanelComponent
17
+ */
18
+ constructor() {
19
+ super(...arguments);
20
+ this.fleet = this.args.fleet;
21
+ }
22
+
23
+ /**
24
+ * Handle when fleet vehicle clicked.
25
+ *
26
+ * @param {VehicleModel} vehicle
27
+ * @memberof FleetListingPanelComponent
28
+ */
29
+ @action onVehicleClicked(vehicle) {
30
+ if (typeof this.args.onVehicleClicked === 'function') {
31
+ this.args.onVehicleClicked(vehicle);
32
+ }
33
+ }
34
+ }
@@ -0,0 +1,30 @@
1
+ <div class="p-4">
2
+ <ContentPanel @title="Details" @open={{true}} @pad={{true}} @panelBodyClass="bg-white dark:bg-gray-900">
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">Name</div>
6
+ <div class="field-value">{{n-a @fleet.name}}</div>
7
+ </div>
8
+ <div class="field-info-container">
9
+ <div class="field-name">Service Area</div>
10
+ <div class="field-value">{{n-a @fleet.serviceArea.name}}</div>
11
+ </div>
12
+ <div class="field-info-container">
13
+ <div class="field-name">Zone</div>
14
+ <div class="field-value">{{n-a @fleet.zone.name}}</div>
15
+ </div>
16
+ <div class="field-info-container">
17
+ <div class="field-name">Task</div>
18
+ <div class="field-value">{{n-a @fleet.task}}</div>
19
+ </div>
20
+ <div class="field-info-container">
21
+ <div class="field-name">Active Manpower</div>
22
+ <div class="field-value">{{@fleet.drivers_online_count}} of {{@fleet.drivers_count}} Online</div>
23
+ </div>
24
+ <div class="field-info-container">
25
+ <div class="field-name">Date Created</div>
26
+ <div class="field-value">{{@fleet.createdAtShort}}</div>
27
+ </div>
28
+ </div>
29
+ </ContentPanel>
30
+ </div>
@@ -0,0 +1,72 @@
1
+ <div class={{or @wrapperClass @options.wrapperClass}}>
2
+ <div class="fleet-driver-listing" ...attributes>
3
+ <div class="mb-3 flex items-center justify-between">
4
+ <div class="flex items-center">
5
+ <div class="fleet-driver-listing-search">
6
+ <Input @type="text" {{on "input" this.onInput}} placeholder="Search drivers in fleet" class="w-64 form-input form-input-sm" />
7
+ </div>
8
+ {{#if this.search.isRunning}}
9
+ <div class="mx-2">
10
+ <Spinner @iconClass="text-sky-500 fa-spin-800ms" />
11
+ </div>
12
+ {{/if}}
13
+ </div>
14
+ <div class="w-56">
15
+ <ModelSelect @modelName="driver" @selectedModel={{this.selectedDriver}} @placeholder="Add driver to fleet" @triggerClass="form-select form-input form-select-sm form-input-sm" @infiniteScroll={{false}} @renderInPlace={{true}} @onChange={{this.onAddDriver}} as |model|>
16
+ {{model.name}}
17
+ </ModelSelect>
18
+ </div>
19
+ </div>
20
+ <div class="bg-white border border-gray-200 rounded shadow-sm dark:bg-gray-800 dark:border-gray-900 text-xs">
21
+ <div class="w-full">
22
+ <div class="grid grid-cols-12 text-xs p-3 font-bold text-gray-800 dark:text-gray-100 border-b border-gray-900 shadow">
23
+ {{#if this.selectable}}
24
+ <div></div>
25
+ {{/if}}
26
+ <div class="col-span-4 flex items-center">Driver</div>
27
+ <div class="col-span-7 flex items-center"></div>
28
+ </div>
29
+ </div>
30
+ <div class="h-48 overflow-y-scroll">
31
+ {{#if this.search.isRunning}}
32
+ <div class="flex items-center justify-center p-4 dark:text-gray-100">
33
+ <div class="mr-2">
34
+ <Spinner @iconClass="text-sky-500" />
35
+ </div>
36
+ <span>Loading fleet drivers...</span>
37
+ </div>
38
+ {{/if}}
39
+ {{#each this.drivers as |driver|}}
40
+ <div class="flex flex-row items-center justify-between text-xs py-2 px-3 text-gray-800 border-b border-gray-200 dark:border-gray-900 dark:text-gray-100">
41
+ <div class="flex flex-row items-center">
42
+ {{#if this.selectable}}
43
+ <div class="flex items-center mr-2">
44
+ <Checkbox @value={{includes driver this.selected}} @onToggle={{fn this.onSelect driver}} />
45
+ </div>
46
+ {{/if}}
47
+ <div class="flex items-center">
48
+ <div class="flex flex-row items-start">
49
+ <div class="mr-2">
50
+ <div class="relative">
51
+ <Image src={{driver.photo_url}} alt={{driver.name}} class="w-5 h-5 rounded-md" @fallbackSrc={{config "defaultValues.driverImage"}} />
52
+ <FaIcon @icon="circle" class="absolute right-0 top-0 -mr-1 -mt-1 {{if driver.online "text-green-500" "text-yellow-200"}}" />
53
+ </div>
54
+ </div>
55
+ <div>
56
+ <div class="font-semibold">{{driver.name}}</div>
57
+ </div>
58
+ </div>
59
+ </div>
60
+ </div>
61
+ <div class="flex items-center justify-end">
62
+ <a href="javascript:;" class="text-danger text-opacity-75" {{on "click" (fn this.onRemoveDriver driver)}}>
63
+ <FaIcon @icon="times" @prefix="fas" class="mr-1" />
64
+ <span>Remove</span>
65
+ </a>
66
+ </div>
67
+ </div>
68
+ {{/each}}
69
+ </div>
70
+ </div>
71
+ </div>
72
+ </div>