@fleetbase/fleetops-engine 0.3.1 → 0.3.2
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.
- package/addon/components/contact-form-panel.hbs +82 -0
- package/addon/components/contact-form-panel.js +195 -0
- package/addon/components/contact-panel/details.hbs +36 -0
- package/addon/components/contact-panel/details.js +3 -0
- package/addon/components/contact-panel.hbs +52 -0
- package/addon/components/contact-panel.js +161 -0
- package/addon/components/driver-form-panel.hbs +39 -55
- package/addon/components/driver-form-panel.js +41 -0
- package/addon/components/driver-panel/details.hbs +2 -2
- package/addon/components/driver-panel.hbs +12 -10
- package/addon/components/driver-panel.js +13 -0
- package/addon/components/fleet-form-panel.hbs +28 -28
- package/addon/components/fleet-form-panel.js +150 -1
- package/addon/components/fleet-listing-panel.hbs +8 -0
- package/addon/components/fleet-listing-panel.js +34 -0
- package/addon/components/fleet-panel/details.hbs +30 -0
- package/addon/components/fleet-panel/driver-listing.hbs +72 -0
- package/addon/components/fleet-panel/driver-listing.js +149 -0
- package/addon/components/fleet-panel/vehicle-listing.hbs +72 -0
- package/addon/components/fleet-panel/vehicle-listing.js +149 -0
- package/addon/components/fleet-panel.hbs +12 -58
- package/addon/components/fleet-panel.js +148 -26
- package/addon/components/fleet-vehicle-listing.hbs +0 -1
- package/addon/components/fuel-report-form-panel.hbs +41 -0
- package/addon/components/fuel-report-form-panel.js +122 -0
- package/addon/components/fuel-report-panel/details.hbs +38 -0
- package/addon/components/fuel-report-panel.hbs +30 -0
- package/addon/components/fuel-report-panel.js +161 -0
- package/addon/components/issue-form-panel.hbs +85 -0
- package/addon/components/issue-form-panel.js +211 -0
- package/addon/components/issue-panel/details.hbs +48 -0
- package/addon/components/issue-panel.hbs +30 -0
- package/addon/components/issue-panel.js +160 -0
- package/addon/components/layout/fleet-ops-sidebar.hbs +2 -2
- package/addon/components/live-map.js +2 -0
- package/addon/components/map-container/toolbar.hbs +9 -9
- package/addon/components/map-container/topbar.hbs +1 -1
- package/addon/components/modals/issue-details.hbs +38 -0
- package/addon/components/modals/issue-from.hbs +138 -0
- package/addon/components/place-form-panel.hbs +50 -0
- package/addon/components/place-form-panel.js +134 -0
- package/addon/components/place-panel/details.hbs +95 -0
- package/addon/components/place-panel.hbs +30 -0
- package/addon/components/place-panel.js +161 -0
- package/addon/components/vehicle-form-panel.hbs +35 -44
- package/addon/components/vehicle-form-panel.js +41 -0
- package/addon/components/vehicle-panel/details.hbs +8 -2
- package/addon/components/vehicle-panel.hbs +8 -6
- package/addon/components/vendor-form-panel/create-form.hbs +114 -0
- package/addon/components/vendor-form-panel/create-form.js +158 -0
- package/addon/components/vendor-form-panel/edit-form.hbs +98 -0
- package/addon/components/vendor-form-panel/edit-form.js +51 -0
- package/addon/components/vendor-form-panel.hbs +48 -0
- package/addon/components/vendor-form-panel.js +226 -0
- package/addon/components/vendor-panel/details.hbs +77 -0
- package/addon/components/vendor-panel/details.js +12 -0
- package/addon/components/vendor-panel.hbs +58 -0
- package/addon/components/vendor-panel.js +161 -0
- package/addon/controllers/management/contacts/index/details.js +55 -0
- package/addon/controllers/management/contacts/index/edit.js +111 -0
- package/addon/controllers/management/contacts/index/new.js +88 -0
- package/addon/controllers/management/contacts/index.js +23 -128
- package/addon/controllers/management/drivers/index/new.js +2 -2
- package/addon/controllers/management/drivers/index.js +18 -32
- package/addon/controllers/management/fleets/index/details.js +53 -0
- package/addon/controllers/management/fleets/index/edit.js +75 -41
- package/addon/controllers/management/fleets/index/new.js +42 -57
- package/addon/controllers/management/fleets/index.js +0 -1
- package/addon/controllers/management/fuel-reports/index/details.js +63 -0
- package/addon/controllers/management/fuel-reports/index/edit.js +111 -0
- package/addon/controllers/management/fuel-reports/index/new.js +95 -0
- package/addon/controllers/management/fuel-reports/index.js +57 -127
- package/addon/controllers/management/issues/index/details.js +54 -0
- package/addon/controllers/management/issues/index/edit.js +111 -0
- package/addon/controllers/management/issues/index/new.js +94 -0
- package/addon/controllers/management/issues/index.js +131 -26
- package/addon/controllers/management/places/index/details.js +55 -0
- package/addon/controllers/management/places/index/edit.js +111 -0
- package/addon/controllers/management/places/index/new.js +88 -0
- package/addon/controllers/management/places/index.js +21 -182
- package/addon/controllers/management/vehicles/index/new.js +2 -6
- package/addon/controllers/management/vendors/index/details.js +55 -0
- package/addon/controllers/management/vendors/index/edit.js +111 -0
- package/addon/controllers/management/vendors/index/new.js +88 -0
- package/addon/controllers/management/vendors/index.js +43 -247
- package/addon/routes/management/contacts/index/details.js +14 -0
- package/addon/routes/management/contacts/index/edit.js +10 -0
- package/addon/routes/management/contacts/index/new.js +3 -0
- package/addon/routes/management/contacts/index.js +1 -1
- package/addon/routes/management/fleets/index/details.js +1 -1
- package/addon/routes/management/fleets/index/edit.js +1 -1
- package/addon/routes/management/fleets/index.js +1 -1
- package/addon/routes/management/fuel-reports/index/details.js +14 -0
- package/addon/routes/management/fuel-reports/index/edit.js +10 -0
- package/addon/routes/management/fuel-reports/index/new.js +3 -0
- package/addon/routes/management/fuel-reports/index.js +3 -1
- package/addon/routes/management/issues/index/details.js +14 -0
- package/addon/routes/management/issues/index/edit.js +10 -0
- package/addon/routes/management/issues/index/new.js +3 -0
- package/addon/routes/management/issues/index.js +1 -1
- package/addon/routes/management/places/index/details.js +14 -0
- package/addon/routes/management/places/index/edit.js +10 -0
- package/addon/routes/management/places/index/new.js +3 -0
- package/addon/routes/management/places/index.js +6 -1
- package/addon/routes/management/vendors/index/details.js +15 -0
- package/addon/routes/management/vendors/index/edit.js +11 -0
- package/addon/routes/management/vendors/index/new.js +3 -0
- package/addon/routes/management/vendors/index.js +1 -0
- package/addon/routes.js +27 -7
- package/addon/services/context-panel.js +60 -0
- package/addon/templates/management/contacts/index/details.hbs +1 -0
- package/addon/templates/management/contacts/index/edit.hbs +1 -0
- package/addon/templates/management/contacts/index/new.hbs +1 -0
- package/addon/templates/management/contacts/index.hbs +22 -3
- package/addon/templates/management/drivers/index.hbs +29 -5
- package/addon/templates/management/fleets/index/details.hbs +1 -1
- package/addon/templates/management/fleets/index/edit.hbs +1 -1
- package/addon/templates/management/fleets/index/new.hbs +1 -1
- package/addon/templates/management/fuel-reports/index/details.hbs +1 -0
- package/addon/templates/management/fuel-reports/index/edit.hbs +1 -0
- package/addon/templates/management/fuel-reports/index/new.hbs +1 -0
- package/addon/templates/management/fuel-reports/index.hbs +25 -4
- package/addon/templates/management/issues/index/details.hbs +1 -0
- package/addon/templates/management/issues/index/edit.hbs +1 -0
- package/addon/templates/management/issues/index/new.hbs +1 -0
- package/addon/templates/management/issues/index.hbs +5 -3
- package/addon/templates/management/places/index/details.hbs +1 -0
- package/addon/templates/management/places/index/edit.hbs +1 -0
- package/addon/templates/management/places/index/new.hbs +1 -0
- package/addon/templates/management/vendors/index/details.hbs +1 -0
- package/addon/templates/management/vendors/index/edit.hbs +1 -0
- package/addon/templates/management/vendors/index/new.hbs +1 -0
- package/addon/templates/operations/orders/index.hbs +3 -3
- package/app/components/contact-form-panel.js +1 -0
- package/app/components/contact-panel/details.js +1 -0
- package/app/components/contact-panel.js +1 -0
- package/app/components/fleet-listing-panel.js +1 -0
- package/app/components/fleet-panel/details.js +1 -0
- package/app/components/fleet-panel/driver-listing.js +1 -0
- package/app/components/fleet-panel/vehicle-listing.js +1 -0
- package/app/components/fuel-report-form-panel.js +1 -0
- package/app/components/fuel-report-panel.js +1 -0
- package/app/components/issue-form-panel.js +1 -0
- package/app/components/issue-panel.js +1 -0
- package/app/components/place-form-panel.js +1 -0
- package/app/components/place-panel.js +1 -0
- package/app/components/vendor-form-panel/create-form.js +1 -0
- package/app/components/vendor-form-panel/edit-form.js +1 -0
- package/app/components/vendor-form-panel.js +1 -0
- package/app/components/vendor-panel/details.js +1 -0
- package/app/components/vendor-panel.js +1 -0
- package/app/controllers/management/contacts/index/details.js +1 -0
- package/app/controllers/management/contacts/index/edit.js +1 -0
- package/app/controllers/management/contacts/index/new.js +1 -0
- package/app/controllers/management/fuel-reports/index/details.js +1 -0
- package/app/controllers/management/fuel-reports/index/edit.js +1 -0
- package/app/controllers/management/fuel-reports/index/new.js +1 -0
- package/app/controllers/management/issues/index/details.js +1 -0
- package/app/controllers/management/issues/index/edit.js +1 -0
- package/app/controllers/management/issues/index/new.js +1 -0
- package/app/controllers/management/places/index/details.js +1 -0
- package/app/controllers/management/places/index/edit.js +1 -0
- package/app/controllers/management/places/index/new.js +1 -0
- package/app/controllers/management/vendors/index/edit.js +1 -0
- package/app/controllers/management/vendors/index/new.js +1 -0
- package/app/routes/addon/routes/management/places/index/new.js +1 -0
- package/app/routes/management/contacts/index/details.js +1 -0
- package/app/routes/management/contacts/index/edit.js +1 -0
- package/app/routes/management/contacts/index/new.js +1 -0
- package/app/routes/management/fuel-reports/index/details.js +1 -0
- package/app/routes/management/fuel-reports/index/edit.js +1 -0
- package/app/routes/management/fuel-reports/index/new.js +1 -0
- package/app/routes/management/issues/index/details.js +1 -0
- package/app/routes/management/issues/index/edit.js +1 -0
- package/app/routes/management/issues/index/new.js +1 -0
- package/app/routes/management/places/index/details.js +1 -0
- package/app/routes/management/places/index/edit.js +1 -0
- package/app/routes/management/places/index/new.js +1 -0
- package/app/routes/management/vendors/index/details.js +1 -0
- package/app/routes/management/vendors/index/edit.js +1 -0
- package/app/routes/management/vendors/index/new.js +1 -0
- package/app/templates/addon/routes/management/places/index/new.js +1 -0
- package/app/templates/management/contacts/index/details.js +1 -0
- package/app/templates/management/contacts/index/edit.js +1 -0
- package/app/templates/management/contacts/index/new.js +1 -0
- package/app/templates/management/fuel-reports/index/details.js +1 -0
- package/app/templates/management/fuel-reports/index/edit.js +1 -0
- package/app/templates/management/fuel-reports/index/new.js +1 -0
- package/app/templates/management/issues/index/details.js +1 -0
- package/app/templates/management/issues/index/edit.js +1 -0
- package/app/templates/management/issues/index/new.js +1 -0
- package/app/templates/management/places/index/details.js +1 -0
- package/app/templates/management/places/index/edit.js +1 -0
- package/app/templates/management/places/index/new.js +1 -0
- package/app/templates/management/vendors/index/details.js +1 -0
- package/app/templates/management/vendors/index/edit.js +1 -0
- package/app/templates/management/vendors/index/new.js +1 -0
- package/composer.json +1 -1
- package/config/environment.js +2 -1
- package/extension.json +1 -1
- package/package.json +4 -3
- package/server/migrations/2023_11_03_072503_refactor_issues_table_columns.php +42 -0
- package/server/migrations/2023_11_06_040645_refactor_fuel_reports_table.php +38 -0
- package/server/src/Casts/Point.php +15 -1
- package/server/src/Http/Controllers/Internal/v1/DriverController.php +33 -15
- package/server/src/Http/Filter/FleetFilter.php +7 -0
- package/server/src/Http/Filter/FuelReportFilter.php +58 -0
- package/server/src/Http/Filter/IssueFilter.php +69 -0
- package/server/src/Http/Filter/VehicleFilter.php +10 -0
- package/server/src/Http/Middleware/TransformLocationMiddleware.php +48 -0
- package/server/src/Http/Resources/v1/Driver.php +1 -0
- package/server/src/Http/Resources/v1/Fleet.php +20 -21
- package/server/src/Http/Resources/v1/FuelReport.php +37 -35
- package/server/src/Http/Resources/v1/Issue.php +77 -0
- package/server/src/Http/Resources/v1/ParentFleet.php +60 -0
- package/server/src/Http/Resources/v1/SubFleet.php +60 -0
- package/server/src/Http/Resources/v1/Vehicle.php +4 -2
- package/server/src/Integrations/Lalamove/Lalamove.php +6 -6
- package/server/src/Models/Contact.php +7 -0
- package/server/src/Models/Driver.php +1 -1
- package/server/src/Models/Fleet.php +35 -4
- package/server/src/Models/FuelReport.php +53 -3
- package/server/src/Models/Issue.php +106 -7
- package/server/src/Models/Vehicle.php +1 -1
- package/server/src/Models/VehicleDevice.php +3 -1
- package/server/src/Models/VehicleDeviceEvent.php +7 -3
- package/server/src/Notifications/OrderAssigned.php +0 -6
- package/server/src/Notifications/OrderCanceled.php +0 -6
- package/server/src/Notifications/OrderDispatchFailed.php +0 -6
- package/server/src/Notifications/OrderDispatched.php +0 -6
- package/server/src/Notifications/OrderPing.php +0 -6
- package/server/src/Notifications/OrderSplit.php +0 -6
- package/server/src/Providers/NotificationServiceProvider.php +1 -1
- package/server/src/routes.php +2 -2
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
|
16
|
-
<
|
|
17
|
-
|
|
18
|
-
<
|
|
19
|
-
|
|
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
|
-
<
|
|
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
|
-
{{
|
|
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'
|
|
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
|
|
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="
|
|
2
|
-
<Overlay::Header @title={{if
|
|
3
|
-
|
|
4
|
-
<Button @icon="save" @type="primary" @text="Save Fleet" @onClick={{
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
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="
|
|
13
|
-
<
|
|
14
|
-
|
|
15
|
-
|
|
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
|
-
{{
|
|
22
|
-
<
|
|
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="
|
|
38
|
-
<ModelSelect @modelName="
|
|
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>
|