@fleetbase/fleetops-engine 0.3.4 → 0.3.6

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 (166) hide show
  1. package/README.md +4 -4
  2. package/addon/components/admin/navigator-app.hbs +5 -0
  3. package/addon/components/admin/navigator-app.js +27 -0
  4. package/addon/components/driver-form-panel.js +13 -19
  5. package/addon/components/fleet-listing-panel.hbs +2 -2
  6. package/addon/components/layout/fleet-ops-sidebar/fleet-listing.hbs +1 -0
  7. package/addon/components/layout/fleet-ops-sidebar/fleet-listing.js +3 -0
  8. package/addon/components/layout/fleet-ops-sidebar.hbs +4 -4
  9. package/addon/components/layout/fleet-ops-sidebar.js +2 -0
  10. package/addon/components/leaflet-draw-control.js +2 -3
  11. package/addon/components/live-map.js +7 -4
  12. package/addon/components/modals/driver-assign-order.hbs +2 -2
  13. package/addon/components/modals/order-import.hbs +5 -5
  14. package/addon/components/modals/order-new-activity.hbs +1 -1
  15. package/addon/components/order-config/entities-editor.js +3 -5
  16. package/addon/components/route-list.hbs +2 -2
  17. package/addon/components/vendor-form-panel.js +1 -1
  18. package/addon/controllers/application.js +2 -2
  19. package/addon/controllers/base-controller.js +31 -0
  20. package/addon/controllers/management/contacts/index/details.js +2 -2
  21. package/addon/controllers/management/contacts/index/edit.js +2 -2
  22. package/addon/controllers/management/contacts/index/new.js +2 -2
  23. package/addon/controllers/management/contacts/index.js +9 -2
  24. package/addon/controllers/management/drivers/index/details.js +2 -2
  25. package/addon/controllers/management/drivers/index/edit.js +28 -2
  26. package/addon/controllers/management/drivers/index/new.js +2 -2
  27. package/addon/controllers/management/drivers/index.js +18 -24
  28. package/addon/controllers/management/fleets/index/details.js +2 -2
  29. package/addon/controllers/management/fleets/index/edit.js +2 -2
  30. package/addon/controllers/management/fleets/index/new.js +2 -2
  31. package/addon/controllers/management/fleets/index.js +16 -9
  32. package/addon/controllers/management/fuel-reports/index/details.js +2 -2
  33. package/addon/controllers/management/fuel-reports/index/edit.js +2 -2
  34. package/addon/controllers/management/fuel-reports/index/new.js +2 -2
  35. package/addon/controllers/management/fuel-reports/index.js +9 -2
  36. package/addon/controllers/management/issues/index/details.js +2 -2
  37. package/addon/controllers/management/issues/index/edit.js +2 -2
  38. package/addon/controllers/management/issues/index/new.js +2 -2
  39. package/addon/controllers/management/issues/index.js +9 -9
  40. package/addon/controllers/management/places/index/details.js +2 -2
  41. package/addon/controllers/management/places/index/edit.js +2 -2
  42. package/addon/controllers/management/places/index/new.js +2 -2
  43. package/addon/controllers/management/places/index.js +8 -2
  44. package/addon/controllers/management/vehicles/index/details.js +2 -2
  45. package/addon/controllers/management/vehicles/index/edit.js +2 -2
  46. package/addon/controllers/management/vehicles/index/new.js +2 -2
  47. package/addon/controllers/management/vehicles/index.js +24 -32
  48. package/addon/controllers/management/vendors/index/details.js +2 -2
  49. package/addon/controllers/management/vendors/index/edit.js +2 -2
  50. package/addon/controllers/management/vendors/index/new.js +2 -2
  51. package/addon/controllers/management/vendors/index.js +9 -8
  52. package/addon/controllers/management.js +2 -2
  53. package/addon/controllers/operations/orders/index/config/types.js +2 -2
  54. package/addon/controllers/operations/orders/index/config.js +2 -2
  55. package/addon/controllers/operations/orders/index/new.js +64 -44
  56. package/addon/controllers/operations/orders/index/view.js +11 -4
  57. package/addon/controllers/operations/orders/index.js +2 -2
  58. package/addon/controllers/operations/scheduler/index.js +2 -2
  59. package/addon/controllers/operations/service-rates/index/edit.js +12 -18
  60. package/addon/controllers/operations/service-rates/index/new.js +16 -22
  61. package/addon/controllers/operations/service-rates/index.js +9 -2
  62. package/addon/engine.js +6 -0
  63. package/addon/helpers/waypoint-label.js +6 -1
  64. package/addon/routes/application.js +4 -15
  65. package/addon/routes/management/contacts/index.js +9 -5
  66. package/addon/routes/management/drivers/index.js +7 -3
  67. package/addon/routes/management/fleets/index.js +9 -5
  68. package/addon/routes/management/fuel-reports/index.js +9 -5
  69. package/addon/routes/management/issues/index.js +9 -5
  70. package/addon/routes/management/places/index.js +9 -5
  71. package/addon/routes/management/vehicles/index/details.js +2 -2
  72. package/addon/routes/management/vehicles/index.js +11 -2
  73. package/addon/routes/management/vendors/index.js +9 -6
  74. package/addon/routes/operations/orders/index/view.js +6 -2
  75. package/addon/routes/operations/orders/index.js +7 -1
  76. package/addon/routes/operations/orders.js +0 -1
  77. package/addon/routes/operations/service-rates/index.js +9 -27
  78. package/addon/routes/operations/service-rates.js +1 -8
  79. package/addon/styles/fleetops-engine.css +14 -7
  80. package/addon/templates/management/contacts/index.hbs +1 -0
  81. package/addon/templates/management/drivers/index.hbs +2 -1
  82. package/addon/templates/management/fleets/index.hbs +23 -3
  83. package/addon/templates/management/fuel-reports/index.hbs +1 -0
  84. package/addon/templates/management/issues/index.hbs +22 -2
  85. package/addon/templates/management/places/index.hbs +9 -1
  86. package/addon/templates/management/vehicles/index.hbs +22 -2
  87. package/addon/templates/management/vendors/index.hbs +22 -2
  88. package/addon/templates/operations/orders/index/new.hbs +7 -7
  89. package/addon/templates/operations/orders/index/view.hbs +17 -16
  90. package/addon/templates/operations/service-rates/index.hbs +11 -3
  91. package/addon/utils/waypoint-label.js +3 -0
  92. package/app/components/layout/fleet-ops-sidebar/fleet-listing.js +1 -0
  93. package/app/controllers/{operations/zones/index.js → base-controller.js} +1 -1
  94. package/app/utils/waypoint-label.js +1 -0
  95. package/composer.json +1 -1
  96. package/config/environment.js +11 -1
  97. package/extension.json +1 -1
  98. package/index.js +1 -0
  99. package/package.json +47 -41
  100. package/server/migrations/2023_04_27_053456_create_contacts_table.php +2 -2
  101. package/server/migrations/2023_04_27_053456_create_drivers_table.php +5 -5
  102. package/server/migrations/2023_04_27_053456_create_entities_table.php +5 -5
  103. package/server/migrations/2023_04_27_053456_create_fleet_drivers_table.php +2 -2
  104. package/server/migrations/2023_04_27_053456_create_fleets_table.php +3 -3
  105. package/server/migrations/2023_04_27_053456_create_fuel_reports_table.php +3 -3
  106. package/server/migrations/2023_04_27_053456_create_issues_table.php +4 -4
  107. package/server/migrations/2023_04_27_053456_create_orders_table.php +8 -8
  108. package/server/migrations/2023_04_27_053456_create_payloads_table.php +5 -5
  109. package/server/migrations/2023_04_27_053456_create_places_table.php +1 -1
  110. package/server/migrations/2023_04_27_053456_create_purchase_rates_table.php +4 -4
  111. package/server/migrations/2023_04_27_053456_create_service_areas_table.php +2 -2
  112. package/server/migrations/2023_04_27_053456_create_service_quote_items_table.php +1 -1
  113. package/server/migrations/2023_04_27_053456_create_service_quotes_table.php +3 -3
  114. package/server/migrations/2023_04_27_053456_create_service_rate_fees_table.php +1 -1
  115. package/server/migrations/2023_04_27_053456_create_service_rate_parcel_fees_table.php +1 -1
  116. package/server/migrations/2023_04_27_053456_create_service_rates_table.php +3 -3
  117. package/server/migrations/2023_04_27_053456_create_tracking_numbers_table.php +3 -3
  118. package/server/migrations/2023_04_27_053456_create_tracking_statuses_table.php +2 -2
  119. package/server/migrations/2023_04_27_053456_create_vehicles_table.php +3 -3
  120. package/server/migrations/2023_04_27_053456_create_vendors_table.php +5 -5
  121. package/server/migrations/2023_04_27_053456_create_waypoints_table.php +4 -4
  122. package/server/migrations/2023_04_27_053456_create_zones_table.php +2 -2
  123. package/server/migrations/2023_11_17_053001_add_category_uuid_to_entities_table.php +33 -0
  124. package/server/migrations/2023_11_28_074244_add_supplier_uuid_column_to_entities_table.php +33 -0
  125. package/server/migrations/2023_12_14_100209_add_meta_column_on_driver_table.php +30 -0
  126. package/server/src/Http/Controllers/Api/v1/DriverController.php +7 -4
  127. package/server/src/Http/Controllers/Api/v1/EntityController.php +2 -0
  128. package/server/src/Http/Controllers/Api/v1/OrderController.php +118 -42
  129. package/server/src/Http/Controllers/Api/v1/PayloadController.php +41 -43
  130. package/server/src/Http/Controllers/Api/v1/TrackingStatusController.php +43 -2
  131. package/server/src/Http/Controllers/Internal/v1/DriverController.php +0 -1
  132. package/server/src/Http/Controllers/Internal/v1/MorphController.php +48 -16
  133. package/server/src/Http/Controllers/Internal/v1/NavigatorController.php +41 -0
  134. package/server/src/Http/Controllers/Internal/v1/OrderController.php +3 -2
  135. package/server/src/Http/Controllers/Internal/v1/PlaceController.php +2 -2
  136. package/server/src/Http/Requests/CreateDriverRequest.php +2 -0
  137. package/server/src/Http/Requests/CreateOrderRequest.php +18 -4
  138. package/server/src/Http/Requests/CreatePayloadRequest.php +23 -7
  139. package/server/src/Http/Requests/CreatePlaceRequest.php +9 -5
  140. package/server/src/Http/Requests/CreateTrackingStatusRequest.php +69 -12
  141. package/server/src/Http/Requests/CreateVehicleRequest.php +5 -3
  142. package/server/src/Http/Resources/v1/Entity.php +3 -0
  143. package/server/src/Http/Resources/v1/Fleet.php +19 -17
  144. package/server/src/Http/Resources/v1/Order.php +3 -2
  145. package/server/src/Models/Driver.php +21 -2
  146. package/server/src/Models/Entity.php +18 -23
  147. package/server/src/Models/Order.php +2 -2
  148. package/server/src/Models/Payload.php +27 -9
  149. package/server/src/Models/Place.php +28 -5
  150. package/server/src/Models/TrackingStatus.php +9 -3
  151. package/server/src/Models/Vehicle.php +4 -2
  152. package/server/src/Models/VehicleDevice.php +28 -0
  153. package/server/src/Models/VehicleDeviceEvent.php +1 -1
  154. package/server/src/Models/Vendor.php +16 -0
  155. package/server/src/Observers/DriverObserver.php +1 -1
  156. package/server/src/routes.php +8 -0
  157. package/tsconfig.declarations.json +10 -0
  158. package/addon/components/file-icon.js +0 -1
  159. package/addon/controllers/operations/zones/index.js +0 -475
  160. package/addon/routes/operations/dispatch.js +0 -3
  161. package/addon/routes/operations/zones/index.js +0 -25
  162. package/addon/routes/operations/zones.js +0 -7
  163. package/addon/templates/operations/dispatch.hbs +0 -1
  164. package/addon/templates/operations/zones/index.hbs +0 -72
  165. package/addon/templates/operations/zones.hbs +0 -1
  166. package/app/components/file-icon.js +0 -1
package/README.md CHANGED
@@ -13,10 +13,10 @@ This monorepo contains both the frontend and backend components of the FleetOps
13
13
 
14
14
  ### Requirements
15
15
 
16
- - PHP 7.3.0 or above
17
- - Ember.js v3.24 or above
18
- - Ember CLI v3.24 or above
19
- - Node.js v14 or above
16
+ * PHP 7.3.0 or above
17
+ * Ember.js v4.8 or above
18
+ * Ember CLI v4.8 or above
19
+ * Node.js v18 or above
20
20
 
21
21
  ## Structure
22
22
 
@@ -0,0 +1,5 @@
1
+ <ContentPanel @title="Navigator App" @open={{true}} @pad={{true}} @panelBodyClass="bg-white dark:bg-gray-800">
2
+ <InputGroup @name="URL">
3
+ <ClickToCopy>{{this.url}}</ClickToCopy>
4
+ </InputGroup>
5
+ </ContentPanel>
@@ -0,0 +1,27 @@
1
+ import Component from '@glimmer/component';
2
+ import { inject as service } from '@ember/service';
3
+ import { tracked } from '@glimmer/tracking';
4
+
5
+ export default class NavigatorAppControlsComponent extends Component {
6
+ @service fetch;
7
+ @tracked isLoading = false;
8
+ @tracked url;
9
+
10
+ constructor() {
11
+ super(...arguments);
12
+ this.getAppLinkUrl();
13
+ }
14
+
15
+ getAppLinkUrl() {
16
+ this.isLoading = true;
17
+
18
+ return this.fetch
19
+ .get('fleet-ops/navigator/get-link-app')
20
+ .then(({ linkUrl }) => {
21
+ this.url = linkUrl;
22
+ })
23
+ .finally(() => {
24
+ this.isLoading = false;
25
+ });
26
+ }
27
+ }
@@ -100,25 +100,19 @@ export default class DriverFormPanelComponent extends Component {
100
100
 
101
101
  contextComponentCallback(this, 'onBeforeSave', driver);
102
102
 
103
- try {
104
- return driver
105
- .save()
106
- .then((driver) => {
107
- this.notifications.success(`Driver (${driver.name}) saved successfully.`);
108
- contextComponentCallback(this, 'onAfterSave', driver);
109
- })
110
- .catch((error) => {
111
- this.notifications.serverError(error);
112
- })
113
- .finally(() => {
114
- this.loader.removeLoader('.next-content-overlay-panel-container ');
115
- this.isLoading = false;
116
- });
117
- } catch (error) {
118
- this.notifications.error(error.message);
119
- this.loader.removeLoader('.next-content-overlay-panel-container ');
120
- this.isLoading = false;
121
- }
103
+ return driver
104
+ .save()
105
+ .then((driver) => {
106
+ this.notifications.success(`Driver (${driver.name}) saved successfully.`);
107
+ contextComponentCallback(this, 'onAfterSave', driver);
108
+ })
109
+ .catch((error) => {
110
+ this.notifications.serverError(error);
111
+ })
112
+ .finally(() => {
113
+ this.loader.removeLoader('.next-content-overlay-panel-container ');
114
+ this.isLoading = false;
115
+ });
122
116
  }
123
117
 
124
118
  /**
@@ -1,8 +1,8 @@
1
- <Layout::Sidebar::Panel @open={{or @open true}} @title={{this.fleet.name}} @wrapperClass="next-fleet-summary-fleet fleet-depth-{{@depth}}">
1
+ <Layout::Sidebar::Panel @open={{or @open true}} @title={{this.fleet.name}} @titleStatusRightText={{concat this.fleet.vehicles_online_count "/" this.fleet.vehicles_count}} @titleStatusRight="info" @hideRightTitleStatusDot={{true}} @titleStatusRightContainerClass="-mr-2" @wrapperClass="next-fleet-summary-fleet fleet-depth-{{@depth}}">
2
2
  {{#each this.fleet.subfleets as |subFleet|}}
3
3
  <FleetListingPanel @fleet={{subFleet}} @onVehicleClicked={{this.onVehicleClicked}} @depth={{add @depth 1}} />
4
4
  {{/each}}
5
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>
6
+ <Layout::Sidebar::Item @icon="circle" @iconSize="2xs" @iconClass={{if vehicle.online "text-green-500" "text-yellow-200"}} @onClick={{fn this.onVehicleClicked vehicle}} @rightSideComponent={{@itemRightSideComponent}} @rightSideComponentContext={{@itemRightSideComponentContext}} @rightSideStatus={{@itemRightSideStatus}} @rightSideStatusText={{@itemRightSideStatusText}} @hideRightSideStatusDot={{@itemHideRightSideStatusDot}} @rightSideStatusClass={{@itemRightSideStatusClass}} @disableRightSideStatusHumanize={{@itemDisableRightSideStatusHumanize}} @dropdownButton={{@itemDropdownButton}} @dropdownButtonActions={{@itemDropdownButtonActions}} @dropdownButtonIcon={{@itemDropdownButtonIcon}} @dropdownButtonIconPrefix={{@itemDropdownButtonIconPrefix}} @dropdownButtonText={{@itemDropdownButtonText}} @dropdownButtonCalculatePosition={{@itemDropdownButtonCalculatePosition}} @dropdownButtonRenderInPlace={{@itemDropdownButtonRenderInPlace}} @dropdownButtonMenuLabel={{@itemDropdownButtonMenuLabel}} @dropdownButtonWrapperClass={{@itemDropdownButtonWrapperClass}} @dropdownButtonTriggerClass={{@itemDropdownButtonTriggerClass}} @registerDropdownButtonAPI={{@itemRegisterDropdownButtonAPI}}>{{vehicle.displayName}}</Layout::Sidebar::Item>
7
7
  {{/each}}
8
8
  </Layout::Sidebar::Panel>
@@ -0,0 +1 @@
1
+ <FleetListingPanel ...attributes />
@@ -0,0 +1,3 @@
1
+ import Component from '@glimmer/component';
2
+
3
+ export default class LayoutFleetOpsSidebarFleetListingComponent extends Component {}
@@ -5,20 +5,20 @@
5
5
  {{#if menuItem.renderComponentInPlace}}
6
6
  {{component menuItem.component}}
7
7
  {{else}}
8
- <Layout::Sidebar::Item @onClick={{fn this.universe.transitionMenuItem (concat this.routePrefix "virtual") menuItem}} @item={{menuItem}} @icon={{menuItem.icon}}>{{menuItem.title}}</Layout::Sidebar::Item>
8
+ <Layout::Sidebar::Item @onClick={{fn this.universe.transitionMenuItem (concat this.routePrefix "virtual") menuItem}} @menuItem={{menuItem}} @icon={{menuItem.icon}} @rightSideComponent={{menuItem.rightSideComponent}} @rightSideComponentContext={{menuItem.rightSideComponentContext}} @rightSideStatus={{menuItem.rightSideStatus}} @rightSideStatusText={{menuItem.rightSideStatusText}} @hideRightSideStatusDot={{menuItem.hideRightSideStatusDot}} @rightSideStatusClass={{menuItem.rightSideStatusClass}} @disableRightSideStatusHumanize={{menuItem.disableRightSideStatusHumanize}} @dropdownButton={{menuItem.dropdownButton}} @dropdownButtonActions={{menuItem.dropdownButtonActions}} @dropdownButtonIcon={{menuItem.dropdownButtonIcon}} @dropdownButtonIconPrefix={{menuItem.dropdownButtonIconPrefix}} @dropdownButtonText={{menuItem.dropdownButtonText}} @dropdownButtonCalculatePosition={{menuItem.dropdownButtonCalculatePosition}} @dropdownButtonRenderInPlace={{menuItem.dropdownButtonRenderInPlace}} @dropdownButtonMenuLabel={{menuItem.dropdownButtonMenuLabel}} @dropdownButtonWrapperClass={{menuItem.dropdownButtonWrapperClass}} @dropdownButtonTriggerClass={{menuItem.dropdownButtonTriggerClass}} @registerDropdownButtonAPI={{menuItem.registerDropdownButtonAPI}}>{{menuItem.title}}</Layout::Sidebar::Item>
9
9
  {{/if}}
10
10
  {{/each}}
11
11
  {{#each this.menuPanels as |menuPanel|}}
12
12
  <Layout::Sidebar::Panel @open={{menuPanel.open}} @title={{menuPanel.title}}>
13
- {{#each menuPanel.items as |item|}}
14
- <Layout::Sidebar::Item @route={{concat this.routePrefix item.route}} @icon={{item.icon}}>{{item.title}}</Layout::Sidebar::Item>
13
+ {{#each menuPanel.items as |menuItem|}}
14
+ <Layout::Sidebar::Item @route={{concat this.routePrefix menuItem.route}} @icon={{menuItem.icon}} @rightSideComponent={{menuItem.rightSideComponent}} @rightSideComponentContext={{menuItem.rightSideComponentContext}} @rightSideStatus={{menuItem.rightSideStatus}} @rightSideStatusText={{menuItem.rightSideStatusText}} @hideRightSideStatusDot={{menuItem.hideRightSideStatusDot}} @rightSideStatusClass={{menuItem.rightSideStatusClass}} @disableRightSideStatusHumanize={{menuItem.disableRightSideStatusHumanize}} @dropdownButton={{menuItem.dropdownButton}} @dropdownButtonActions={{menuItem.dropdownButtonActions}} @dropdownButtonIcon={{menuItem.dropdownButtonIcon}} @dropdownButtonIconPrefix={{menuItem.dropdownButtonIconPrefix}} @dropdownButtonText={{menuItem.dropdownButtonText}} @dropdownButtonCalculatePosition={{menuItem.dropdownButtonCalculatePosition}} @dropdownButtonRenderInPlace={{menuItem.dropdownButtonRenderInPlace}} @dropdownButtonMenuLabel={{menuItem.dropdownButtonMenuLabel}} @dropdownButtonWrapperClass={{menuItem.dropdownButtonWrapperClass}} @dropdownButtonTriggerClass={{menuItem.dropdownButtonTriggerClass}} @registerDropdownButtonAPI={{menuItem.registerDropdownButtonAPI}}>{{menuItem.title}}</Layout::Sidebar::Item>
15
15
  {{/each}}
16
16
  </Layout::Sidebar::Panel>
17
17
  {{/each}}
18
18
  {{#each this.universeMenuPanels as |menuPanel|}}
19
19
  <Layout::Sidebar::Panel @open={{menuPanel.open}} @title={{menuPanel.title}}>
20
20
  {{#each menuPanel.items as |menuItem|}}
21
- <Layout::Sidebar::Item @onClick={{fn this.universe.transitionMenuItem (concat this.routePrefix "virtual") menuItem}} @item={{menuItem}} @icon={{menuItem.icon}}>{{menuItem.title}}</Layout::Sidebar::Item>
21
+ <Layout::Sidebar::Item @onClick={{fn this.universe.transitionMenuItem (concat this.routePrefix "virtual") menuItem}} @menuItem={{menuItem}} @icon={{menuItem.icon}} @rightSideComponent={{menuItem.rightSideComponent}} @rightSideComponentContext={{menuItem.rightSideComponentContext}} @rightSideStatus={{menuItem.rightSideStatus}} @rightSideStatusText={{menuItem.rightSideStatusText}} @hideRightSideStatusDot={{menuItem.hideRightSideStatusDot}} @rightSideStatusClass={{menuItem.rightSideStatusClass}} @disableRightSideStatusHumanize={{menuItem.disableRightSideStatusHumanize}} @dropdownButton={{menuItem.dropdownButton}} @dropdownButtonActions={{menuItem.dropdownButtonActions}} @dropdownButtonIcon={{menuItem.dropdownButtonIcon}} @dropdownButtonIconPrefix={{menuItem.dropdownButtonIconPrefix}} @dropdownButtonText={{menuItem.dropdownButtonText}} @dropdownButtonCalculatePosition={{menuItem.dropdownButtonCalculatePosition}} @dropdownButtonRenderInPlace={{menuItem.dropdownButtonRenderInPlace}} @dropdownButtonMenuLabel={{menuItem.dropdownButtonMenuLabel}} @dropdownButtonWrapperClass={{menuItem.dropdownButtonWrapperClass}} @dropdownButtonTriggerClass={{menuItem.dropdownButtonTriggerClass}} @registerDropdownButtonAPI={{menuItem.registerDropdownButtonAPI}}>{{menuItem.title}}</Layout::Sidebar::Item>
22
22
  {{/each}}
23
23
  </Layout::Sidebar::Panel>
24
24
  {{/each}}
@@ -11,6 +11,8 @@ import { isArray } from '@ember/array';
11
11
  */
12
12
  export default class LayoutFleetOpsSidebarComponent extends Component {
13
13
  @service universe;
14
+ @service contextPanel;
15
+ @service store;
14
16
  @tracked routePrefix = 'console.fleet-ops.';
15
17
  @tracked menuPanels = [];
16
18
  @tracked universeMenuItems = [];
@@ -1,6 +1,5 @@
1
1
  import BaseLayer from 'ember-leaflet/components/base-layer';
2
2
  import { computed } from '@ember/object';
3
- import { assign } from '@ember/polyfills';
4
3
  import { scheduleOnce } from '@ember/runloop';
5
4
  import { classify, camelize } from '@ember/string';
6
5
  import getWithDefault from '@fleetbase/ember-core/utils/get-with-default';
@@ -75,8 +74,8 @@ export default class LeafletDrawControl extends BaseLayer {
75
74
  const showDrawingLayer = getWithDefault(this.args, 'showDrawingLayer', true);
76
75
 
77
76
  if (this.map && this._layer && this.L.drawLocal) {
78
- this.options.edit = assign({ featureGroup: this._layer }, this.options.edit);
79
- this.options.draw = assign({}, this.L.drawLocal.draw, this.options.draw);
77
+ this.options.edit = Object.assign({ featureGroup: this._layer }, this.options.edit);
78
+ this.options.draw = Object.assign({}, this.L.drawLocal.draw, this.options.draw);
80
79
 
81
80
  // create draw control
82
81
  const drawControl = new this.L.Control.Draw(this.options);
@@ -1911,7 +1911,8 @@ export default class LiveMapComponent extends Component {
1911
1911
 
1912
1912
  // from the `get-active-order-coordinates` the responded coordinates will always be [longitude, latitude]
1913
1913
  // const [latitude, longitude] = extractCoordinates(coordinates.firstObject.coordinates);
1914
- const [longitude, latitude] = coordinates.filter((point) => point.cordinates[0] !== 0).firstObject?.coordinates;
1914
+ const validCoordinates = coordinates.filter((point) => point.cordinates[0] !== 0);
1915
+ const [longitude, latitude] = getWithDefault(validCoordinates, '0.coordiantes', [0, 0]);
1915
1916
 
1916
1917
  initialCoordinates.latitude = latitude;
1917
1918
  initialCoordinates.longitude = longitude;
@@ -1934,10 +1935,12 @@ export default class LiveMapComponent extends Component {
1934
1935
  this.isLoading = true;
1935
1936
 
1936
1937
  return new Promise((resolve) => {
1937
- const cachedRecords = this.serviceAreas?.getFromCache('serviceAreas', 'service-area');
1938
+ if (this.serviceAreas && typeof this.serviceAreas.getFromCache === 'function') {
1939
+ const cachedRecords = this.serviceAreas.getFromCache('serviceAreas', 'service-area');
1938
1940
 
1939
- if (cachedRecords) {
1940
- resolve(cachedRecords);
1941
+ if (cachedRecords) {
1942
+ resolve(cachedRecords);
1943
+ }
1941
1944
  }
1942
1945
 
1943
1946
  return this.store
@@ -17,8 +17,8 @@
17
17
  </div>
18
18
  </div>
19
19
  <div class="order-route-location dark:text-gray-100">
20
- <div>{{or order.payload.waypoints.firstObject.name order.payload.waypoints.firstObject.street1}}</div>
21
- <div>{{or order.payload.waypoints.firstObject.city order.payload.waypoints.firstObject.postal_code}}</div>
20
+ <div>{{or (get order.payload.waypoints "0.name") (get order.payload.waypoints "0.street1")}}</div>
21
+ <div>{{or (get order.payload.waypoints "0.city") (get order.payload.waypoints "0.postal_code")}}</div>
22
22
  </div>
23
23
  </div>
24
24
  <div class="order-route-stop">
@@ -3,7 +3,7 @@
3
3
  {{#if @options.isProcessing}}
4
4
  <div class="min-h-56 dropzone w-full rounded px-4 py-8 min-h text-gray-900 dark:text-white text-center flex flex-col items-center justify-center border-2 border-dashed border-gray-200 dark:border-indigo-500">
5
5
  <div class="flex items-center justify-center py-5">
6
- <PageLoader class="text-sm dar:text-gray-100" @loadingMessage="Processing import..." />
6
+ <Spinner class="text-sm dark:text-gray-100" @loadingMessage="Processing import..." />
7
7
  </div>
8
8
  </div>
9
9
  {{else}}
@@ -17,20 +17,20 @@
17
17
  {{/if}}
18
18
  {{else if queue.files.length}}
19
19
  <div class="my-2">
20
- <FaIcon @icon="file-spreadsheet" class="text-indigo-500 mr-2" />
20
+ <FaIcon @icon="file-import" class="text-indigo-500 mr-2" />
21
21
  {{pluralize queue.files.length "spreadsheet"}} ready for upload.
22
22
  </div>
23
23
  <div class="my-2">({{queue.progress}}%)</div>
24
24
  {{else}}
25
25
  <h4 class="font-semibold mb-8">
26
- <FaIcon @icon="file-spreadsheet" class="text-indigo-500 mr-2" /> Upload Spreadsheets
26
+ <FaIcon @icon="file-import" class="text-indigo-500 mr-2" /> Upload Spreadsheets
27
27
  </h4>
28
28
  <div>
29
29
  {{#if dropzone.supported}}
30
30
  <p class="text-base font-semibold my-5">Drag and drop spreadsheet files onto this dropzone</p>
31
31
  {{/if}}
32
32
 
33
- <UploadButton @buttonText="or select spreadsheets to upload" @type="magic" @name="spreadsheets" @for="spreadsheets" @accept={{join "," @options.acceptedFileTypes}} @multiple={{true}} @onFileAdded={{@options.queueFile}} class="w-72" />
33
+ <UploadButton @buttonText="or select spreadsheets to upload" @type="magic" @icon="file-import" @name="spreadsheets" @for="spreadsheets" @accept={{join "," @options.acceptedFileTypes}} @multiple={{true}} @onFileAdded={{@options.queueFile}} class="w-72 justify-center" />
34
34
  </div>
35
35
  {{/if}}
36
36
  </FileDropzone>
@@ -67,7 +67,7 @@
67
67
  {{else if (eq column.key "uploadDate")}}
68
68
  {{format-date (get file column.valuePath) "d MMM yyyy"}}
69
69
  {{else}}
70
- <div class="w-44 truncate">{{get file column.valuePath}}</div>
70
+ <div class="min-w-225px max-w-225px truncate">{{get file column.valuePath}}</div>
71
71
  {{/if}}
72
72
  </td>
73
73
  {{/each}}
@@ -33,7 +33,7 @@
33
33
  </span>
34
34
  </label>
35
35
  <div>
36
- <Badge @status="default" class="uppercase">{{activity.code}}</Badge>
36
+ <Badge @status={{dasherize activity.code}} class="uppercase">{{activity.code}}</Badge>
37
37
  </div>
38
38
  </div>
39
39
  {{/each}}
@@ -1,7 +1,7 @@
1
1
  import Component from '@glimmer/component';
2
2
  import { tracked } from '@glimmer/tracking';
3
3
  import { inject as service } from '@ember/service';
4
- import { action, computed, set, get } from '@ember/object';
4
+ import { action, computed, set } from '@ember/object';
5
5
  import { isArray } from '@ember/array';
6
6
  import { underscore } from '@ember/string';
7
7
  import generateUuid from '@fleetbase/ember-core/utils/generate-uuid';
@@ -96,13 +96,11 @@ export default class OrderConfigEntitiesEditorComponent extends Component {
96
96
  }
97
97
 
98
98
  @action setMetaKeyValue(index, key, { target }) {
99
- console.log('setMetaKeyValue()', ...arguments);
100
99
  const { orderConfig } = this;
101
100
  const { value } = target;
102
101
 
103
- console.log(value, get(orderConfig, `meta.entities.${index}.meta.${key}`));
104
-
105
- // set(orderConfig, `meta.entities.${index}.meta.${key}`, value);
102
+ // console.log(value, get(orderConfig, `meta.entities.${index}.meta.${key}`));
103
+ set(orderConfig, `meta.entities.${index}.meta.${key}`, value);
106
104
 
107
105
  if (typeof this.args.onEntitiesChanged === 'function') {
108
106
  this.args.onEntitiesChanged(orderConfig.meta.entities);
@@ -11,8 +11,8 @@
11
11
  {{/if}}
12
12
 
13
13
  {{#if (gt @order.payload.waypoints.length 2)}}
14
- <Button class="border-0 m-0 p-0 shadow-none w-full mb-3" @wrapperClass="w-full" @onClick={{this.toggleWaypointsCollapse}}>
15
- <div class="px-3 py-2 w-full bg-yellow-200 text-yellow-900 rounded shadow-sm flex flex-col justify-center items-start">
14
+ <Button class="btn-reset w-full" @wrapperClass="w-full" @onClick={{this.toggleWaypointsCollapse}}>
15
+ <div class="px-3 py-2 w-full bg-yellow-200 text-yellow-900 rounded shadow-sm flex flex-col justify-center items-start mb-3">
16
16
  <div class="flex flex-row items-center">
17
17
  <FaIcon @icon="eye" class="mr-2 text-yellow-900" />
18
18
  <span class="font-bold">{{if this.isWaypointsCollapsed "Tap to expand" "Tap to collapse"}}</span>
@@ -81,8 +81,8 @@ export default class VendorFormPanelComponent extends Component {
81
81
  constructor() {
82
82
  super(...arguments);
83
83
  this.vendor = this.args.vendor;
84
- this.isEditing = typeof this.vendor.id === 'string';
85
84
  applyContextComponentArguments(this);
85
+ this.isEditing = this.vendor && typeof this.vendor.id === 'string';
86
86
  }
87
87
 
88
88
  /**
@@ -1,9 +1,9 @@
1
- import Controller from '@ember/controller';
1
+ import BaseController from '@fleetbase/fleetops-engine/controllers/base-controller';
2
2
  import { tracked } from '@glimmer/tracking';
3
3
  import { inject as service } from '@ember/service';
4
4
  import { computed, action } from '@ember/object';
5
5
 
6
- export default class ApplicationController extends Controller {
6
+ export default class ApplicationController extends BaseController {
7
7
  @service hostRouter;
8
8
 
9
9
  @tracked routes = ['console.fleet-ops.operations', 'console.fleet-ops.management', 'console.fleet-ops.comms'];
@@ -0,0 +1,31 @@
1
+ import Controller from '@ember/controller';
2
+ import { inject as service } from '@ember/service';
3
+ import { action } from '@ember/object';
4
+
5
+ export default class BaseController extends Controller {
6
+ /**
7
+ * Inject the `universe` service
8
+ *
9
+ * @var {Service}
10
+ */
11
+ @service universe;
12
+
13
+ /**
14
+ * Transitions to a specified route within the '@fleetbase/fleetops-engine' engine.
15
+ *
16
+ * This action is a wrapper around the `transitionToEngineRoute` method of the `universe` service (or object),
17
+ * specifically targeting the '@fleetbase/fleetops-engine'. It allows for easy transitioning to routes
18
+ * within this engine, abstracting away the need to repeatedly specify the engine name.
19
+ *
20
+ * @param {string} route - The route within the '@fleetbase/fleetops-engine' to transition to.
21
+ * @param {...any} args - Additional arguments to pass to the transitionToEngineRoute method.
22
+ * @returns {Promise} A Promise that resolves with the result of the transitionToEngineRoute method.
23
+ *
24
+ * @example
25
+ * // To transition to the 'management.fleets.index.new' route within the '@fleetbase/fleetops-engine'
26
+ * this.transitionToRoute('management.fleets.index.new');
27
+ */
28
+ @action transitionToRoute(route, ...args) {
29
+ return this.universe.transitionToEngineRoute('@fleetbase/fleetops-engine', route, ...args);
30
+ }
31
+ }
@@ -1,8 +1,8 @@
1
- import Controller from '@ember/controller';
1
+ import BaseController from '@fleetbase/fleetops-engine/controllers/base-controller';
2
2
  import { tracked } from '@glimmer/tracking';
3
3
  import { action } from '@ember/object';
4
4
 
5
- export default class ManagementContactsIndexDetailsController extends Controller {
5
+ export default class ManagementContactsIndexDetailsController extends BaseController {
6
6
  /**
7
7
  * The currently active view tab ('details' by default).
8
8
  *
@@ -1,9 +1,9 @@
1
- import Controller from '@ember/controller';
1
+ import BaseController from '@fleetbase/fleetops-engine/controllers/base-controller';
2
2
  import { inject as service } from '@ember/service';
3
3
  import { tracked } from '@glimmer/tracking';
4
4
  import { action } from '@ember/object';
5
5
 
6
- export default class ManagementContactsIndexEditController extends Controller {
6
+ export default class ManagementContactsIndexEditController extends BaseController {
7
7
  /**
8
8
  * Inject the `hostRouter` service
9
9
  *
@@ -1,9 +1,9 @@
1
- import Controller from '@ember/controller';
1
+ import BaseController from '@fleetbase/fleetops-engine/controllers/base-controller';
2
2
  import { tracked } from '@glimmer/tracking';
3
3
  import { inject as service } from '@ember/service';
4
4
  import { action } from '@ember/object';
5
5
 
6
- export default class ManagementContactsIndexNewController extends Controller {
6
+ export default class ManagementContactsIndexNewController extends BaseController {
7
7
  /**
8
8
  * Inject the `store` service
9
9
  *
@@ -1,4 +1,4 @@
1
- import Controller from '@ember/controller';
1
+ import BaseController from '@fleetbase/fleetops-engine/controllers/base-controller';
2
2
  import { inject as service } from '@ember/service';
3
3
  import { tracked } from '@glimmer/tracking';
4
4
  import { action } from '@ember/object';
@@ -6,7 +6,7 @@ import { isBlank } from '@ember/utils';
6
6
  import { timeout } from 'ember-concurrency';
7
7
  import { task } from 'ember-concurrency-decorators';
8
8
 
9
- export default class ManagementContactsIndexController extends Controller {
9
+ export default class ManagementContactsIndexController extends BaseController {
10
10
  /**
11
11
  * Inject the `currentUser` service
12
12
  *
@@ -297,6 +297,13 @@ export default class ManagementContactsIndexController extends Controller {
297
297
  this.query = value;
298
298
  }
299
299
 
300
+ /**
301
+ * Reload layout view.
302
+ */
303
+ @action reload() {
304
+ return this.hostRouter.refresh();
305
+ }
306
+
300
307
  /**
301
308
  * Toggles dialog to export `contact`
302
309
  *
@@ -1,4 +1,4 @@
1
- import Controller from '@ember/controller';
1
+ import BaseController from '@fleetbase/fleetops-engine/controllers/base-controller';
2
2
  import { tracked } from '@glimmer/tracking';
3
3
  import { action } from '@ember/object';
4
4
 
@@ -8,7 +8,7 @@ import { action } from '@ember/object';
8
8
  * @class ManagementDriversIndexDetailsController
9
9
  * @extends Controller
10
10
  */
11
- export default class ManagementDriverIndexDetailsController extends Controller {
11
+ export default class ManagementDriverIndexDetailsController extends BaseController {
12
12
  /**
13
13
  * The currently active view tab ('details' by default).
14
14
  *
@@ -1,9 +1,9 @@
1
- import Controller from '@ember/controller';
1
+ import BaseController from '@fleetbase/fleetops-engine/controllers/base-controller';
2
2
  import { inject as service } from '@ember/service';
3
3
  import { tracked } from '@glimmer/tracking';
4
4
  import { action } from '@ember/object';
5
5
 
6
- export default class ManagementDriversIndexEditController extends Controller {
6
+ export default class ManagementDriversIndexEditController extends BaseController {
7
7
  /**
8
8
  * Inject the `hostRouter` service
9
9
  *
@@ -25,6 +25,13 @@ export default class ManagementDriversIndexEditController extends Controller {
25
25
  */
26
26
  @tracked overlay;
27
27
 
28
+ /**
29
+ * The universe service.
30
+ *
31
+ * @memberof ManagementDriversIndexEditController
32
+ */
33
+ @tracked universe;
34
+
28
35
  /**
29
36
  * When exiting the overlay.
30
37
  *
@@ -108,4 +115,23 @@ export default class ManagementDriversIndexEditController extends Controller {
108
115
  ...options,
109
116
  });
110
117
  }
118
+
119
+ /**
120
+ * Transitions to a specified route within the '@fleetbase/fleetops-engine' engine.
121
+ *
122
+ * This action is a wrapper around the `transitionToEngineRoute` method of the `universe` service (or object),
123
+ * specifically targeting the '@fleetbase/fleetops-engine'. It allows for easy transitioning to routes
124
+ * within this engine, abstracting away the need to repeatedly specify the engine name.
125
+ *
126
+ * @param {string} route - The route within the '@fleetbase/fleetops-engine' to transition to.
127
+ * @param {...any} args - Additional arguments to pass to the transitionToEngineRoute method.
128
+ * @returns {Promise} A Promise that resolves with the result of the transitionToEngineRoute method.
129
+ *
130
+ * @example
131
+ * // To transition to the 'management.fleets.index.new' route within the '@fleetbase/fleetops-engine'
132
+ * this.transitionToRoute('management.fleets.index.new');
133
+ */
134
+ @action _transitionToRoute(route, ...args) {
135
+ return this.universe.transitionToEngineRoute('@fleetbase/fleetops-engine', route, ...args);
136
+ }
111
137
  }
@@ -1,9 +1,9 @@
1
- import Controller from '@ember/controller';
1
+ import BaseController from '@fleetbase/fleetops-engine/controllers/base-controller';
2
2
  import { tracked } from '@glimmer/tracking';
3
3
  import { inject as service } from '@ember/service';
4
4
  import { action } from '@ember/object';
5
5
 
6
- export default class ManagementDriversIndexNewController extends Controller {
6
+ export default class ManagementDriversIndexNewController extends BaseController {
7
7
  /**
8
8
  * Inject the `store` service
9
9
  *
@@ -1,4 +1,4 @@
1
- import Controller from '@ember/controller';
1
+ import BaseController from '@fleetbase/fleetops-engine/controllers/base-controller';
2
2
  import { inject as service } from '@ember/service';
3
3
  import { tracked } from '@glimmer/tracking';
4
4
  import { action } from '@ember/object';
@@ -9,7 +9,7 @@ import { task } from 'ember-concurrency-decorators';
9
9
  import extractCoordinates from '@fleetbase/ember-core/utils/extract-coordinates';
10
10
  import leafletIcon from '@fleetbase/ember-core/utils/leaflet-icon';
11
11
 
12
- export default class ManagementDriversIndexController extends Controller {
12
+ export default class ManagementDriversIndexController extends BaseController {
13
13
  /**
14
14
  * Inject the `notifications` service
15
15
  *
@@ -132,13 +132,6 @@ export default class ManagementDriversIndexController extends Controller {
132
132
  */
133
133
  @tracked internal_id;
134
134
 
135
- /**
136
- * The filterable param `drivers_license_number`
137
- *
138
- * @var {String}
139
- */
140
- @tracked drivers_license_number;
141
-
142
135
  /**
143
136
  * The filterable param `name`
144
137
  *
@@ -257,7 +250,13 @@ export default class ManagementDriversIndexController extends Controller {
257
250
  {
258
251
  label: 'Vendor',
259
252
  cellComponent: 'table/cell/anchor',
260
- action: this.viewDriverVendor,
253
+ onClick: async (driver) => {
254
+ const vendor = await driver.loadVendor();
255
+
256
+ if (vendor) {
257
+ this.contextPanel.focus(vendor);
258
+ }
259
+ },
261
260
  valuePath: 'vendor.name',
262
261
  modelNamePath: 'name',
263
262
  width: '180px',
@@ -464,6 +463,13 @@ export default class ManagementDriversIndexController extends Controller {
464
463
  this.layout = layout;
465
464
  }
466
465
 
466
+ /**
467
+ * Reload layout view.
468
+ */
469
+ @action reload() {
470
+ return this.hostRouter.refresh();
471
+ }
472
+
467
473
  /**
468
474
  * Bulk deletes selected `driver` via confirm prompt
469
475
  *
@@ -503,6 +509,7 @@ export default class ManagementDriversIndexController extends Controller {
503
509
  @action viewDriver(driver) {
504
510
  return this.transitionToRoute('management.drivers.index.details', driver);
505
511
  }
512
+
506
513
  /**
507
514
  * Create a new `driver` in modal
508
515
  *
@@ -523,6 +530,7 @@ export default class ManagementDriversIndexController extends Controller {
523
530
  @action editDriver(driver) {
524
531
  return this.transitionToRoute('management.drivers.index.edit', driver);
525
532
  }
533
+
526
534
  /**
527
535
  * Delete a `driver` via confirm prompt
528
536
  *
@@ -648,18 +656,4 @@ export default class ManagementDriversIndexController extends Controller {
648
656
  ...options,
649
657
  });
650
658
  }
651
-
652
- /**
653
- * View information about the driver vendor
654
- *
655
- * @param {DriverModel} driver
656
- * @void
657
- */
658
- @action async viewDriverVendor(driver) {
659
- const vendor = await driver.loadVendor();
660
-
661
- if (vendor) {
662
- this.contextPanel.focus(vendor);
663
- }
664
- }
665
659
  }
@@ -1,4 +1,4 @@
1
- import Controller from '@ember/controller';
1
+ import BaseController from '@fleetbase/fleetops-engine/controllers/base-controller';
2
2
  import { tracked } from '@glimmer/tracking';
3
3
  import { action } from '@ember/object';
4
4
 
@@ -8,7 +8,7 @@ import { action } from '@ember/object';
8
8
  * @class ManagementFleetsIndexDetailsController
9
9
  * @extends Controller
10
10
  */
11
- export default class ManagementFleetsIndexDetailsController extends Controller {
11
+ export default class ManagementFleetsIndexDetailsController extends BaseController {
12
12
  /**
13
13
  * The currently active view tab ('details' by default).
14
14
  *
@@ -1,9 +1,9 @@
1
- import Controller from '@ember/controller';
1
+ import BaseController from '@fleetbase/fleetops-engine/controllers/base-controller';
2
2
  import { inject as service } from '@ember/service';
3
3
  import { tracked } from '@glimmer/tracking';
4
4
  import { action } from '@ember/object';
5
5
 
6
- export default class ManagementFleetsIndexEditController extends Controller {
6
+ export default class ManagementFleetsIndexEditController extends BaseController {
7
7
  /**
8
8
  * Inject the `hostRouter` service
9
9
  *