@fleetbase/fleetops-engine
Version:
Fleet & Transport Management Extension for Fleetbase
390 lines (372 loc) • 14.1 kB
JavaScript
import Controller from '@ember/controller';
import { inject as service } from '@ember/service';
import { tracked } from '@glimmer/tracking';
import { action, get } from '@ember/object';
export default class ManagementDriversIndexController extends Controller {
driverActions;
issueActions;
fleetActions;
vendorActions;
vehicleActions;
notifications;
tableContext;
intl;
/** query params */
queryParams = [
'page',
'limit',
'sort',
'query',
'name',
'drivers_license_number',
'vehicle',
'fleet',
'vendor',
'phone',
'country',
'public_id',
'internal_id',
'created_at',
'updated_at',
'status',
];
page = 1;
limit;
sort = '-created_at';
public_id;
internal_id;
name;
vehicle;
fleet;
drivers_license_number;
phone;
status;
created_at;
updated_at;
layout = 'table';
table;
hasAssignedVehicle(driver) {
return Boolean(driver?.vehicle_uuid || driver?.vehicle?.id || driver?.vehicle?.uuid || driver?.vehicle_name);
}
async resolveAssignedVehicle(vehicle) {
if (!vehicle) {
return null;
}
if (typeof vehicle.then === 'function') {
return await vehicle;
}
if (typeof vehicle.loadResource === 'function') {
return (await vehicle.loadResource()) ?? vehicle;
}
return vehicle;
}
/** action buttons */
get actionButtons() {
return [
{
icon: 'refresh',
onClick: this.driverActions.refresh,
helpText: this.intl.t('common.refresh'),
},
{
text: this.intl.t('common.new'),
type: 'primary',
icon: 'plus',
onClick: this.driverActions.transition.create,
},
{
text: this.intl.t('common.import'),
type: 'magic',
icon: 'upload',
onClick: this.driverActions.import,
},
{
text: this.intl.t('common.export'),
icon: 'long-arrow-up',
iconClass: 'rotate-icon-45',
wrapperClass: 'hidden md:flex',
onClick: this.driverActions.export,
},
];
}
/** bulk actions */
get bulkActions() {
const selected = this.tableContext.getSelectedRows();
return [
{
label: this.intl.t('common.delete-selected-count', { count: selected.length }),
class: 'text-red-500',
fn: this.driverActions.bulkDelete,
},
];
}
/** columns */
get columns() {
return [
{
sticky: true,
label: this.intl.t('column.name'),
valuePath: 'name',
cellComponent: 'cell/driver-identity',
compact: true,
permission: 'fleet-ops view driver',
action: this.driverActions.transition.view,
resizable: true,
sortable: true,
filterable: true,
filterComponent: 'filter/string',
},
{
label: this.intl.t('column.id'),
valuePath: 'public_id',
cellComponent: 'click-to-copy',
resizable: true,
sortable: true,
filterable: true,
hidden: false,
filterComponent: 'filter/string',
},
{
label: this.intl.t('column.phone'),
valuePath: 'phone',
cellComponent: 'table/cell/base',
resizable: true,
sortable: true,
filterable: true,
filterParam: 'phone',
filterComponent: 'filter/string',
},
{
label: this.intl.t('column.license'),
valuePath: 'drivers_license_number',
cellComponent: 'table/cell/base',
resizable: true,
sortable: true,
filterable: true,
filterComponent: 'filter/string',
},
{
label: this.intl.t('column.vehicle'),
cellComponent: 'cell/vehicle-identity',
compact: true,
permission: 'fleet-ops view vehicle',
action: async (vehicle) => {
try {
const resolvedVehicle = await this.resolveAssignedVehicle(vehicle);
if (resolvedVehicle) this.vehicleActions.panel.view(resolvedVehicle);
} catch (err) {
this.notifications.serverError(err);
}
},
valuePath: 'vehicle.display_name',
emptyText: '-',
showStatusBadge: true,
resourcePath: (driver) => {
const vehicle = get(driver, 'vehicle_assigned') ?? get(driver, 'vehicle');
if (vehicle) {
return vehicle;
}
const vehicleName = get(driver, 'vehicle_name');
if (vehicleName) {
return {
display_name: vehicleName,
name: vehicleName,
status: 'assigned',
loadResource: () => driver.loadVehicle?.(),
};
}
return null;
},
modelNamePath: 'display_name',
resizable: true,
filterable: true,
filterComponent: 'filter/model',
filterComponentPlaceholder: 'Select vehicle to filter by',
filterParam: 'vehicle',
model: 'vehicle',
},
{
label: this.intl.t('column.internal-id'),
valuePath: 'internal_id',
cellComponent: 'click-to-copy',
resizable: true,
sortable: true,
filterable: true,
filterComponent: 'filter/string',
},
{
label: this.intl.t('column.vendor'),
cellComponent: 'table/cell/anchor',
permission: 'fleet-ops view vendor',
onClick: async (driver) => {
try {
const vendor = await driver.loadVendor();
if (vendor) this.vendorActions.panel.view(vendor);
} catch (err) {
this.notifications.serverError(err);
}
},
valuePath: 'vendor.name',
modelNamePath: 'name',
resizable: true,
filterable: true,
filterComponent: 'filter/model',
filterComponentPlaceholder: 'Select vendor to filter by',
filterParam: 'vendor',
model: 'vendor',
},
{
label: this.intl.t('column.fleet'),
cellComponent: 'table/cell/link-list',
cellComponentLabelPath: 'name',
action: this.fleetActions.panel.view,
valuePath: 'fleets',
resizable: true,
hidden: true,
filterable: true,
filterComponent: 'filter/model',
filterComponentPlaceholder: 'Select fleet to filter by',
filterParam: 'fleet',
model: 'fleet',
},
{
label: this.intl.t('column.country'),
valuePath: 'country',
cellComponent: 'table/cell/country',
cellClassNames: 'uppercase',
resizable: true,
hidden: true,
sortable: true,
filterable: true,
filterParam: 'country',
filterComponent: 'filter/multi-option',
filterFetchOptions: 'lookup/countries',
filterOptionLabel: 'name',
filterOptionValue: 'cca2',
multiOptionSearchEnabled: true,
multiOptionSearchPlaceholder: this.intl.t('common.search-countries'),
},
{
label: this.intl.t('column.status'),
valuePath: 'status',
cellComponent: 'table/cell/status',
resizable: true,
sortable: true,
filterable: true,
filterComponent: 'filter/multi-option',
filterFetchOptions: 'drivers/statuses',
},
{
label: this.intl.t('column.created-at'),
valuePath: 'createdAt',
sortParam: 'created_at',
filterParam: 'created_at',
resizable: true,
sortable: true,
filterable: true,
filterComponent: 'filter/date',
},
{
label: this.intl.t('column.updated-at'),
valuePath: 'updatedAt',
sortParam: 'updated_at',
filterParam: 'updated_at',
resizable: true,
sortable: true,
hidden: true,
filterable: true,
filterComponent: 'filter/date',
},
{
label: '',
cellComponent: 'table/cell/dropdown',
ddButtonText: false,
ddButtonIcon: 'ellipsis-h',
ddButtonIconPrefix: 'fas',
ddMenuLabel: this.intl.t('common.resource-actions', { resource: this.intl.t('resource.driver') }),
cellClassNames: 'overflow-visible',
wrapperClass: 'flex items-center justify-end mx-2',
sticky: 'right',
width: 60,
actions: [
{
label: this.intl.t('common.view-resource', { resource: this.intl.t('resource.driver') }),
icon: 'eye',
fn: this.driverActions.transition.view,
permission: 'fleet-ops view driver',
},
{
label: this.intl.t('common.edit-resource', { resource: this.intl.t('resource.driver') }),
icon: 'pencil',
fn: this.driverActions.transition.edit,
permission: 'fleet-ops update driver',
},
{
separator: true,
},
{
label: this.intl.t('driver.actions.assign-order'),
icon: 'clipboard-list',
fn: this.driverActions.assignOrder,
permission: 'fleet-ops assign-order-for driver',
},
{
label: this.intl.t('driver.actions.assign-vehicle'),
icon: 'car',
fn: this.driverActions.assignVehicle,
permission: 'fleet-ops assign-vehicle-for driver',
},
{
label: this.intl.t('driver.actions.unassign-orders'),
icon: 'user-minus',
fn: this.driverActions.unassignOrders,
permission: 'fleet-ops assign-order-for driver',
isVisible: (driver) => Number(driver.assigned_orders_count) > 0,
},
{
label: this.intl.t('driver.actions.unassign-vehicle'),
icon: 'link-slash',
fn: this.driverActions.unassignVehicle,
permission: 'fleet-ops assign-vehicle-for driver',
isVisible: (driver) => this.hasAssignedVehicle(driver),
},
{
label: this.intl.t('driver.actions.locate-driver'),
icon: 'location-dot',
fn: this.driverActions.locate,
permission: 'fleet-ops view driver',
},
{
label: this.intl.t('driver.actions.create-issue'),
icon: 'triangle-exclamation',
fn: this.createIssue,
permission: 'fleet-ops create issue',
},
{
separator: true,
},
{
label: this.intl.t('common.delete-resource', { resource: this.intl.t('resource.driver') }),
icon: 'trash',
fn: this.driverActions.delete,
permission: 'fleet-ops delete driver',
},
],
sortable: false,
filterable: false,
resizable: false,
searchable: false,
},
];
}
changeLayout(layout) {
this.layout = layout;
}
createIssue(driver) {
this.issueActions.modal.create({
driver,
driver_uuid: driver.id,
title: `Issue reported for ${driver.name}`,
});
}
}