@fleetbase/fleetops-engine 0.4.11 → 0.4.13
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/admin/avatar-management.hbs +78 -0
- package/addon/components/admin/avatar-management.js +191 -0
- package/addon/components/avatar-picker.hbs +15 -0
- package/addon/components/avatar-picker.js +57 -0
- package/addon/components/driver-form-panel.hbs +12 -13
- package/addon/components/driver-panel/details.hbs +7 -7
- package/addon/components/edit-order-route-panel.hbs +9 -69
- package/addon/components/edit-order-route-panel.js +78 -27
- package/addon/components/fleet-listing-panel.hbs +1 -1
- package/addon/components/layout/fleet-ops-sidebar/driver-listing.hbs +1 -1
- package/addon/components/layout/fleet-ops-sidebar.hbs +2 -1
- package/addon/components/live-map.js +0 -1
- package/addon/components/order/schedule-card.hbs +29 -17
- package/addon/components/order/schedule-card.js +1 -1
- package/addon/components/place-form-panel.hbs +35 -51
- package/addon/components/place-panel/details.hbs +10 -14
- package/addon/components/place-panel.hbs +2 -12
- package/addon/components/vehicle-form-panel.hbs +11 -80
- package/addon/components/vehicle-form-panel.js +33 -0
- package/addon/controllers/management/places/index.js +29 -21
- package/addon/controllers/operations/orders/index/view.js +10 -10
- package/addon/controllers/operations/scheduler/index.js +7 -4
- package/addon/engine.js +7 -1
- package/addon/styles/fleetops-engine.css +94 -0
- package/addon/templates/management/places/index.hbs +1 -1
- package/addon/templates/operations/scheduler/index.hbs +5 -4
- package/addon/utils/create-full-calendar-event-from-order.js +23 -1
- package/app/components/admin/avatar-management.js +1 -0
- package/app/components/avatar-picker.js +1 -0
- package/composer.json +2 -2
- package/config/environment.js +2 -0
- package/extension.json +1 -1
- package/package.json +3 -3
- package/server/migrations/2023_09_14_074512_update_vehicles_table.php +2 -2
- package/server/migrations/2023_09_14_074619_create_vehicle_devices_table.php +2 -2
- package/server/migrations/2023_09_26_071205_add_online_column_to_vehicles_table.php +2 -2
- package/server/migrations/2023_09_26_083957_create_fleet_vehicles_table.php +2 -2
- package/server/migrations/2023_09_27_023757_add_column_to_fleets_table.php +2 -2
- package/server/migrations/2023_10_05_074811_update_vehicle.php +2 -2
- package/server/migrations/2023_10_25_093014_create_vehicle_device_events_table.php +2 -2
- package/server/migrations/2023_11_03_072503_refactor_issues_table_columns.php +2 -2
- package/server/migrations/2023_11_06_040645_refactor_fuel_reports_table.php +2 -2
- package/server/migrations/2023_11_09_041807_add_status_column_to_fuel_reports_table.php +2 -2
- package/server/migrations/2023_11_15_062814_add_comments_column_and_resolved_at_column_to_vehicle_device_events_table.php +2 -2
- package/server/migrations/2023_11_17_053001_add_category_uuid_to_entities_table.php +2 -2
- package/server/migrations/2023_11_28_074244_add_supplier_uuid_column_to_entities_table.php +2 -2
- package/server/migrations/{2023_12_14_100209_add_meta_column_on_driver_table.php → 2023_12_14_100209_add_meta_column_on_driver_table copy.php } +5 -3
- package/server/migrations/2024_02_18_100209_add_avatar_url_columns_table.php +54 -0
- package/server/src/Expansions/UserExpansion.php +1 -0
- package/server/src/Http/Controllers/Api/v1/DriverController.php +7 -1
- package/server/src/Http/Controllers/Api/v1/PlaceController.php +11 -2
- package/server/src/Http/Controllers/Internal/v1/DriverController.php +15 -8
- package/server/src/Http/Controllers/Internal/v1/OrderController.php +46 -0
- package/server/src/Http/Controllers/Internal/v1/PlaceController.php +12 -0
- package/server/src/Http/Resources/v1/Driver.php +6 -4
- package/server/src/Http/Resources/v1/Order.php +2 -1
- package/server/src/Http/Resources/v1/Payload.php +8 -4
- package/server/src/Http/Resources/v1/Place.php +2 -0
- package/server/src/Http/Resources/v1/Vehicle.php +1 -0
- package/server/src/Models/Driver.php +76 -0
- package/server/src/Models/Payload.php +49 -3
- package/server/src/Models/Place.php +71 -0
- package/server/src/Models/Vehicle.php +44 -20
- package/server/src/Notifications/OrderAssigned.php +23 -0
- package/server/src/Notifications/OrderCanceled.php +21 -0
- package/server/src/Notifications/OrderDispatchFailed.php +21 -0
- package/server/src/Notifications/OrderDispatched.php +23 -1
- package/server/src/Notifications/OrderPing.php +20 -0
- package/server/src/routes.php +3 -0
- package/translations/en-us.yaml +16 -4
|
@@ -6,6 +6,7 @@ use Fleetbase\Casts\Json;
|
|
|
6
6
|
use Fleetbase\FleetOps\Casts\Point;
|
|
7
7
|
use Fleetbase\FleetOps\Support\Utils;
|
|
8
8
|
use Fleetbase\LaravelMysqlSpatial\Eloquent\SpatialTrait;
|
|
9
|
+
use Fleetbase\Models\File;
|
|
9
10
|
use Fleetbase\Models\Model;
|
|
10
11
|
use Fleetbase\Traits\HasApiModelBehavior;
|
|
11
12
|
use Fleetbase\Traits\HasMetaAttributes;
|
|
@@ -165,7 +166,7 @@ class Vehicle extends Model
|
|
|
165
166
|
*/
|
|
166
167
|
public function photo()
|
|
167
168
|
{
|
|
168
|
-
return $this->belongsTo(
|
|
169
|
+
return $this->belongsTo(File::class);
|
|
169
170
|
}
|
|
170
171
|
|
|
171
172
|
/**
|
|
@@ -237,20 +238,6 @@ class Vehicle extends Model
|
|
|
237
238
|
return $displayName;
|
|
238
239
|
}
|
|
239
240
|
|
|
240
|
-
/**
|
|
241
|
-
* Get avatar url.
|
|
242
|
-
*
|
|
243
|
-
* @return string|null
|
|
244
|
-
*/
|
|
245
|
-
public function getAvatarUrlAttribute($value)
|
|
246
|
-
{
|
|
247
|
-
if (!$value) {
|
|
248
|
-
return static::getAvatar();
|
|
249
|
-
}
|
|
250
|
-
|
|
251
|
-
return $value;
|
|
252
|
-
}
|
|
253
|
-
|
|
254
241
|
/**
|
|
255
242
|
* Get the driver's name assigned to vehicle.
|
|
256
243
|
*
|
|
@@ -317,15 +304,40 @@ class Vehicle extends Model
|
|
|
317
304
|
return $modelAttributes;
|
|
318
305
|
}
|
|
319
306
|
|
|
307
|
+
/**
|
|
308
|
+
* Get avatar url.
|
|
309
|
+
*
|
|
310
|
+
* @return string|null
|
|
311
|
+
*/
|
|
312
|
+
public function getAvatarUrlAttribute($value)
|
|
313
|
+
{
|
|
314
|
+
if (!$value) {
|
|
315
|
+
return static::getAvatar();
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
if (Str::isUuid($value)) {
|
|
319
|
+
return static::getAvatar($value);
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
return $value;
|
|
323
|
+
}
|
|
324
|
+
|
|
320
325
|
/**
|
|
321
326
|
* Get an avatar url by key.
|
|
322
327
|
*
|
|
323
328
|
* @param string $key
|
|
324
|
-
*
|
|
325
|
-
* @return string
|
|
326
329
|
*/
|
|
327
|
-
public static function getAvatar($key = 'mini_bus')
|
|
330
|
+
public static function getAvatar($key = 'mini_bus'): ?string
|
|
328
331
|
{
|
|
332
|
+
if (Str::isUuid($key)) {
|
|
333
|
+
$file = File::where('uuid', $key)->first();
|
|
334
|
+
if ($file) {
|
|
335
|
+
return $file->url;
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
return null;
|
|
339
|
+
}
|
|
340
|
+
|
|
329
341
|
return static::getAvatarOptions()->get($key);
|
|
330
342
|
}
|
|
331
343
|
|
|
@@ -367,13 +379,25 @@ class Vehicle extends Model
|
|
|
367
379
|
'taxi.svg',
|
|
368
380
|
];
|
|
369
381
|
|
|
370
|
-
|
|
382
|
+
// Get custom avatars
|
|
383
|
+
$customAvatars = collect(File::where('type', 'vehicle-avatar')->get()->mapWithKeys(
|
|
384
|
+
function ($file) {
|
|
385
|
+
$key = str_replace(['.svg', '.png'], '', 'Custom: ' . $file->original_filename);
|
|
386
|
+
|
|
387
|
+
return [$key => $file->uuid];
|
|
388
|
+
}
|
|
389
|
+
)->toArray());
|
|
390
|
+
|
|
391
|
+
// Create default avatars included from fleetbase
|
|
392
|
+
$avatars = collect($options)->mapWithKeys(
|
|
371
393
|
function ($option) {
|
|
372
|
-
$key = str_replace('.svg', '', $option);
|
|
394
|
+
$key = str_replace(['.svg', '.png'], '', $option);
|
|
373
395
|
|
|
374
396
|
return [$key => Utils::assetFromS3('static/vehicle-icons/' . $option)];
|
|
375
397
|
}
|
|
376
398
|
);
|
|
399
|
+
|
|
400
|
+
return $customAvatars->merge($avatars);
|
|
377
401
|
}
|
|
378
402
|
|
|
379
403
|
/**
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
namespace Fleetbase\FleetOps\Notifications;
|
|
4
4
|
|
|
5
|
+
use Fleetbase\FleetOps\Http\Resources\v1\Order as OrderResource;
|
|
5
6
|
use Fleetbase\FleetOps\Models\Order;
|
|
6
7
|
use Fleetbase\FleetOps\Support\Utils;
|
|
7
8
|
use Illuminate\Broadcasting\Channel;
|
|
@@ -74,6 +75,28 @@ class OrderAssigned extends Notification implements ShouldQueue
|
|
|
74
75
|
new Channel('api.' . session('api_credential')),
|
|
75
76
|
new Channel('order.' . $this->order->uuid),
|
|
76
77
|
new Channel('order.' . $this->order->public_id),
|
|
78
|
+
new Channel('driver.' . data_get($this->order, 'driverAssigned.uuid')),
|
|
79
|
+
new Channel('driver.' . data_get($this->order, 'driverAssigned.public_id')),
|
|
80
|
+
];
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* Get notification as array.
|
|
85
|
+
*
|
|
86
|
+
* @return void
|
|
87
|
+
*/
|
|
88
|
+
public function toArray()
|
|
89
|
+
{
|
|
90
|
+
$order = new OrderResource($this->order);
|
|
91
|
+
|
|
92
|
+
return [
|
|
93
|
+
'title' => 'New order ' . $this->order->public_id . ' assigned!',
|
|
94
|
+
'body' => $this->order->isScheduled ? 'You have a new order scheduled for ' . $this->order->scheduled_at : 'You have a new order assigned, tap for details.',
|
|
95
|
+
'data' => [
|
|
96
|
+
'id' => $this->order->public_id,
|
|
97
|
+
'type' => 'order_assigned',
|
|
98
|
+
'order' => $order->toWebhookPayload(),
|
|
99
|
+
],
|
|
77
100
|
];
|
|
78
101
|
}
|
|
79
102
|
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
namespace Fleetbase\FleetOps\Notifications;
|
|
4
4
|
|
|
5
|
+
use Fleetbase\FleetOps\Http\Resources\v1\Order as OrderResource;
|
|
5
6
|
use Fleetbase\FleetOps\Models\Order;
|
|
6
7
|
use Fleetbase\FleetOps\Support\Utils;
|
|
7
8
|
use Illuminate\Broadcasting\Channel;
|
|
@@ -77,6 +78,26 @@ class OrderCanceled extends Notification implements ShouldQueue
|
|
|
77
78
|
];
|
|
78
79
|
}
|
|
79
80
|
|
|
81
|
+
/**
|
|
82
|
+
* Get notification as array.
|
|
83
|
+
*
|
|
84
|
+
* @return void
|
|
85
|
+
*/
|
|
86
|
+
public function toArray()
|
|
87
|
+
{
|
|
88
|
+
$order = new OrderResource($this->order);
|
|
89
|
+
|
|
90
|
+
return [
|
|
91
|
+
'title' => 'Order ' . $this->order->public_id . ' was canceled',
|
|
92
|
+
'body' => 'Order ' . $this->order->public_id . ' has been canceled.',
|
|
93
|
+
'data' => [
|
|
94
|
+
'id' => $this->order->public_id,
|
|
95
|
+
'type' => 'order_canceled',
|
|
96
|
+
'order' => $order->toWebhookPayload(),
|
|
97
|
+
],
|
|
98
|
+
];
|
|
99
|
+
}
|
|
100
|
+
|
|
80
101
|
/**
|
|
81
102
|
* Get the mail representation of the notification.
|
|
82
103
|
*
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
namespace Fleetbase\FleetOps\Notifications;
|
|
4
4
|
|
|
5
5
|
use Fleetbase\FleetOps\Events\OrderDispatchFailed as OrderDispatchFailedEvent;
|
|
6
|
+
use Fleetbase\FleetOps\Http\Resources\v1\Order as OrderResource;
|
|
6
7
|
use Fleetbase\FleetOps\Models\Order;
|
|
7
8
|
use Fleetbase\FleetOps\Support\Utils;
|
|
8
9
|
use Illuminate\Broadcasting\Channel;
|
|
@@ -81,6 +82,26 @@ class OrderDispatchFailed extends Notification implements ShouldQueue
|
|
|
81
82
|
return ['mail'];
|
|
82
83
|
}
|
|
83
84
|
|
|
85
|
+
/**
|
|
86
|
+
* Get notification as array.
|
|
87
|
+
*
|
|
88
|
+
* @return void
|
|
89
|
+
*/
|
|
90
|
+
public function toArray()
|
|
91
|
+
{
|
|
92
|
+
$order = new OrderResource($this->order);
|
|
93
|
+
|
|
94
|
+
return [
|
|
95
|
+
'title' => 'Order ' . $this->order->public_id . ' has dispatch has failed!',
|
|
96
|
+
'body' => $this->reason,
|
|
97
|
+
'data' => [
|
|
98
|
+
'id' => $this->order->public_id,
|
|
99
|
+
'type' => 'order_dispatch_failed',
|
|
100
|
+
'order' => $order->toWebhookPayload(),
|
|
101
|
+
],
|
|
102
|
+
];
|
|
103
|
+
}
|
|
104
|
+
|
|
84
105
|
/**
|
|
85
106
|
* Get the mail representation of the notification.
|
|
86
107
|
*
|
|
@@ -87,6 +87,28 @@ class OrderDispatched extends Notification implements ShouldQueue
|
|
|
87
87
|
new Channel('api.' . session('api_credential')),
|
|
88
88
|
new Channel('order.' . $this->order->uuid),
|
|
89
89
|
new Channel('order.' . $this->order->public_id),
|
|
90
|
+
new Channel('driver.' . data_get($this->order, 'driverAssigned.uuid')),
|
|
91
|
+
new Channel('driver.' . data_get($this->order, 'driverAssigned.public_id')),
|
|
92
|
+
];
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* Get notification as array.
|
|
97
|
+
*
|
|
98
|
+
* @return void
|
|
99
|
+
*/
|
|
100
|
+
public function toArray()
|
|
101
|
+
{
|
|
102
|
+
$order = new OrderResource($this->order);
|
|
103
|
+
|
|
104
|
+
return [
|
|
105
|
+
'title' => 'Order ' . $this->order->public_id . ' has been dispatched!',
|
|
106
|
+
'body' => 'An order has just been dispatched to you and is ready to be started.',
|
|
107
|
+
'data' => [
|
|
108
|
+
'id' => $this->order->public_id,
|
|
109
|
+
'type' => 'order_dispatched',
|
|
110
|
+
'order' => $order->toWebhookPayload(),
|
|
111
|
+
],
|
|
90
112
|
];
|
|
91
113
|
}
|
|
92
114
|
|
|
@@ -131,7 +153,7 @@ class OrderDispatched extends Notification implements ShouldQueue
|
|
|
131
153
|
{
|
|
132
154
|
$message = (new MailMessage())
|
|
133
155
|
->subject('Order ' . $this->order->public_id . ' has been dispatched!')
|
|
134
|
-
->line('
|
|
156
|
+
->line('An order has just been dispatched to you and is ready to be started.');
|
|
135
157
|
|
|
136
158
|
$message->action('View Details', Utils::consoleUrl('', ['shift' => 'fleet-ops/orders/view/' . $this->order->public_id]));
|
|
137
159
|
|
|
@@ -95,6 +95,26 @@ class OrderPing extends Notification implements ShouldQueue
|
|
|
95
95
|
];
|
|
96
96
|
}
|
|
97
97
|
|
|
98
|
+
/**
|
|
99
|
+
* Get notification as array.
|
|
100
|
+
*
|
|
101
|
+
* @return void
|
|
102
|
+
*/
|
|
103
|
+
public function toArray()
|
|
104
|
+
{
|
|
105
|
+
$order = new OrderResource($this->order);
|
|
106
|
+
|
|
107
|
+
return [
|
|
108
|
+
'title' => 'New incoming order!',
|
|
109
|
+
'body' => $this->distance ? 'New order available for pickup about ' . Utils::formatMeters($this->distance, false) . ' away' : 'New order is available for pickup.',
|
|
110
|
+
'data' => [
|
|
111
|
+
'id' => $this->order->public_id,
|
|
112
|
+
'type' => 'order_ping',
|
|
113
|
+
'order' => $order->toWebhookPayload(),
|
|
114
|
+
],
|
|
115
|
+
];
|
|
116
|
+
}
|
|
117
|
+
|
|
98
118
|
/**
|
|
99
119
|
* Get the broadcastable representation of the notification.
|
|
100
120
|
*
|
package/server/src/routes.php
CHANGED
|
@@ -264,6 +264,7 @@ Route::prefix(config('fleetops.api.routing.prefix', null))->namespace('Fleetbase
|
|
|
264
264
|
'drivers',
|
|
265
265
|
function ($router, $controller) {
|
|
266
266
|
$router->get('statuses', $controller('statuses'));
|
|
267
|
+
$router->get('avatars', $controller('avatars'));
|
|
267
268
|
$router->get('export', $controller('export'));
|
|
268
269
|
$router->delete('bulk-delete', $controller('bulkDelete'));
|
|
269
270
|
}
|
|
@@ -310,6 +311,7 @@ Route::prefix(config('fleetops.api.routing.prefix', null))->namespace('Fleetbase
|
|
|
310
311
|
$router->get('label/{id}', $controller('label'));
|
|
311
312
|
$router->get('next-activity/{id}', $controller('nextActivity'));
|
|
312
313
|
$router->post('process-imports', $controller('importFromFiles'));
|
|
314
|
+
$router->patch('route/{id}', $controller('editOrderRoute'));
|
|
313
315
|
$router->patch('update-activity/{id}', $controller('updateActivity'));
|
|
314
316
|
$router->patch('bulk-cancel', $controller('bulkCancel'));
|
|
315
317
|
$router->patch('cancel', $controller('cancel'));
|
|
@@ -324,6 +326,7 @@ Route::prefix(config('fleetops.api.routing.prefix', null))->namespace('Fleetbase
|
|
|
324
326
|
function ($router, $controller) {
|
|
325
327
|
$router->get('search', $controller('search'))->middleware('cache.headers:private;max_age=3600');
|
|
326
328
|
$router->get('lookup', $controller('geocode'))->middleware('cache.headers:private;max_age=3600');
|
|
329
|
+
$router->get('avatars', $controller('avatars'));
|
|
327
330
|
$router->get('export', $controller('export'));
|
|
328
331
|
$router->delete('bulk-delete', $controller('bulkDelete'));
|
|
329
332
|
}
|
package/translations/en-us.yaml
CHANGED
|
@@ -95,6 +95,11 @@ fleet-ops:
|
|
|
95
95
|
back: Back
|
|
96
96
|
|
|
97
97
|
component:
|
|
98
|
+
avatar-picker:
|
|
99
|
+
avatar: Avatar
|
|
100
|
+
select-map-avatar: Select map avatar
|
|
101
|
+
select-avatar-rendering: Select an avatar to be used for rendering on maps when using geolocation tracking features.
|
|
102
|
+
select-avatar: Select avatar
|
|
98
103
|
admin:
|
|
99
104
|
navigator-app:
|
|
100
105
|
title: Navigator App
|
|
@@ -104,6 +109,12 @@ fleet-ops:
|
|
|
104
109
|
title: Visibility Controls
|
|
105
110
|
message: Visibility controls allow you to disable sections of Fleet-Ops. Toggle the checkbox to enable or disable sections to hide in Fleet-ops.
|
|
106
111
|
checkbox-text: Enable or disable visibility for this section in Fleet-Ops.
|
|
112
|
+
avatar-management:
|
|
113
|
+
upload-avatar: Upload Avatar
|
|
114
|
+
view-avatar: View Avatar
|
|
115
|
+
vehicles : Vehicles
|
|
116
|
+
drivers : Drivers
|
|
117
|
+
places : Places
|
|
107
118
|
cell:
|
|
108
119
|
driver-name:
|
|
109
120
|
not-assigned: No driver assigned
|
|
@@ -524,6 +535,7 @@ fleet-ops:
|
|
|
524
535
|
show-less: Show less details
|
|
525
536
|
show-more: Show more details
|
|
526
537
|
schedule-card:
|
|
538
|
+
destination: Destination
|
|
527
539
|
unassign-driver: Unassign Driver?
|
|
528
540
|
unassign-text: You are about to unassign the driver for Order {orderId}. Click continue to confirm removal of driver.
|
|
529
541
|
unassign-button: Continue and unassign driver
|
|
@@ -531,11 +543,11 @@ fleet-ops:
|
|
|
531
543
|
assign-text: You are about to assign a new driver ({driverName}) to Order {orderId}. Click continue to confirm driver.
|
|
532
544
|
assign-button: Continue and assign driver
|
|
533
545
|
date: Date scheduled
|
|
534
|
-
driver-assigned: Driver
|
|
535
|
-
no-driver: No Driver
|
|
546
|
+
driver-assigned: Driver
|
|
547
|
+
no-driver: No Driver
|
|
536
548
|
select-driver: Select Driver
|
|
537
|
-
vehicle-assigned: Vehicle
|
|
538
|
-
no-vehicle: No Vehicle
|
|
549
|
+
vehicle-assigned: Vehicle
|
|
550
|
+
no-vehicle: No Vehicle
|
|
539
551
|
widget:
|
|
540
552
|
fleet-ops-quickstart:
|
|
541
553
|
message: Let's see what you can do to jumpstart operations...
|