@lipagas/storefront-engine
Version:
Headless Commerce & Marketplace Extension for Fleetbase
543 lines (496 loc) • 13.1 kB
JavaScript
import BaseController from '@fleetbase/fleetops-engine/controllers/base-controller';
import { inject as service } from '@ember/service';
import { tracked } from '@glimmer/tracking';
import { action } from '@ember/object';
import { isBlank } from '@ember/utils';
import { timeout } from 'ember-concurrency';
import { task } from 'ember-concurrency-decorators';
export default class ManagementVehiclesIndexController extends BaseController {
/**
* Inject the `contextPanel` service
*
* @var {Service}
*/
contextPanel;
/**
* Inject the `notifications` service
*
* @var {Service}
*/
notifications;
/**
* Inject the `vehicleActions` service
*
* @var {Service}
*/
vehicleActions;
/**
* Inject the `intl` service
*
* @var {Service}
*/
intl;
/**
* Inject the `store` service
*
* @var {Service}
*/
store;
/**
* Inject the `fetch` service
*
* @var {Service}
*/
fetch;
/**
* Inject the `crud` service
*
* @var {Service}
*/
crud;
/**
* Inject the `filters` service
*
* @var {Service}
*/
filters;
/**
* Inject the `currentUser` service
*
* @var {Service}
*/
currentUser;
/**
* Inject the `hostRouter` service
*
* @var {Service}
*/
hostRouter;
/**
* Default query parameters for management controllers.
*
* @var {Array}
*/
queryParams = [
'page',
'limit',
'sort',
'query',
'public_id',
'status',
'created_at',
'updated_at',
'created_by',
'updated_by',
'name',
'plate_number',
'year',
'vehicle_make',
'vehicle_model',
'display_name',
];
/**
* The search query.
*
* @var {String}
*/
query = null;
/**
* The current page.
*
* @var {Integer}
*/
page = 1;
/**
* The number of results to query.
*
* @var {Integer}
*/
limit;
/**
* The param to sort the data on, the param with prepended `-` is descending.
*
* @var {String}
*/
sort = '-created_at';
/**
* The filterable param `public_id`.
*
* @var {String}
*/
public_id;
/**
* The filterable param `status`.
*
* @var {String|Array}
*/
status;
/**
* The filterable param `make`.
*
* @var {String}
*/
name;
/**
* The filterable param `plate_number`.
*
* @var {String}
*/
plate_number;
/**
* The filterable param `vehicle_make`.
*
* @var {String}
*/
vehicle_make;
/**
* The filterable param `vehicle_model`.
*
* @var {String}
*/
vehicle_model;
/**
* The filterable param `year`.
*
* @var {String}
*/
year;
/**
* The filterable param `country`.
*
* @var {String}
*/
country;
/**
* The filterable param `fleet`.
*
* @var {String}
*/
fleet;
/**
* The filterable param `vendor`.
*
* @var {String}
*/
vendor;
/**
* The filterable param `driver`.
*
* @var {String}
*/
driver;
/**
* The filterable param `display_name`.
*
* @var {String}
*/
display_name;
/**
* TableComponent instance.
*
* @var {TableComponent}
*/
table;
/**
* All possible order status options.
*
* @var {String}
*/
statusOptions = [];
/**
* All columns applicable for orders
*
* @var {Array}
*/
columns = [
{
label: this.intl.t('fleet-ops.common.name'),
valuePath: 'display_name',
photoPath: 'avatar_url',
width: '200px',
cellComponent: 'table/cell/vehicle-name',
action: this.viewVehicle,
resizable: true,
sortable: true,
filterable: true,
filterComponent: 'filter/string',
filterParam: 'display_name',
showOnlineIndicator: true,
},
{
label: this.intl.t('fleet-ops.common.plate-number'),
valuePath: 'plate_number',
cellComponent: 'table/cell/base',
width: '100px',
resizable: true,
sortable: true,
filterable: true,
filterComponent: 'filter/string',
filterParam: 'plate_number',
},
{
label: 'Driver Assigned',
cellComponent: 'table/cell/anchor',
action: async (vehicle) => {
const driver = await vehicle.loadDriver();
return this.contextPanel.focus(driver);
},
valuePath: 'driver_name',
width: '120px',
resizable: true,
filterable: true,
filterComponent: 'filter/model',
filterComponentPlaceholder: 'Select driver to filter by',
filterParam: 'driver',
model: 'driver',
},
{
label: this.intl.t('fleet-ops.common.id'),
valuePath: 'public_id',
cellComponent: 'click-to-copy',
width: '120px',
resizable: true,
sortable: true,
filterable: true,
filterComponent: 'filter/string',
},
{
label: this.intl.t('fleet-ops.common.make'),
valuePath: 'make',
cellComponent: 'table/cell/base',
width: '80px',
resizable: true,
sortable: true,
hidden: true,
filterable: true,
filterParam: 'make',
filterComponent: 'filter/string',
},
{
label: this.intl.t('fleet-ops.common.model'),
valuePath: 'model',
cellComponent: 'table/cell/base',
width: '80px',
resizable: true,
sortable: true,
hidden: true,
filterable: true,
filterParam: 'model',
filterComponent: 'filter/string',
},
{
label: this.intl.t('fleet-ops.common.year'),
valuePath: 'year',
cellComponent: 'table/cell/base',
width: '80px',
resizable: true,
sortable: true,
hidden: true,
filterable: true,
filterComponent: 'filter/string',
},
{
label: this.intl.t('fleet-ops.common.vendor'),
cellComponent: 'table/cell/anchor',
action: async ({ vendor_uuid }) => {
const vendor = await this.store.findRecord('vendor', vendor_uuid);
this.vendors.viewVendor(vendor);
},
valuePath: 'vendor_name',
width: '150px',
hidden: true,
resizable: true,
filterable: true,
filterComponent: 'filter/model',
filterComponentPlaceholder: 'Select vendor to filter by',
filterParam: 'vendor',
model: 'vendor',
},
{
label: this.intl.t('fleet-ops.common.status'),
valuePath: 'status',
cellComponent: 'table/cell/status',
width: '10%',
resizable: true,
sortable: true,
filterable: true,
filterComponent: 'filter/multi-option',
filterFetchOptions: 'vehicles/statuses',
},
{
label: this.intl.t('fleet-ops.common.created-at'),
valuePath: 'createdAt',
sortParam: 'created_at',
width: '120px',
resizable: true,
sortable: true,
filterable: true,
filterParam: 'created_at',
filterLabel: 'Created Between',
filterComponent: 'filter/date',
},
{
label: this.intl.t('fleet-ops.common.updated-at'),
valuePath: 'updatedAt',
sortParam: 'updated_at',
width: '12%',
resizable: true,
sortable: true,
hidden: true,
filterParam: 'updated_at',
filterLabel: 'Last Updated Between',
filterable: true,
filterComponent: 'filter/date',
},
{
label: '',
cellComponent: 'table/cell/dropdown',
ddButtonText: false,
ddButtonIcon: 'ellipsis-h',
ddButtonIconPrefix: 'fas',
ddMenuLabel: 'Vehicle Actions',
cellClassNames: 'overflow-visible',
wrapperClass: 'flex items-center justify-end mx-2',
width: '90px',
actions: [
{
label: this.intl.t('fleet-ops.management.vehicles.index.view-vehicle'),
fn: this.viewVehicle,
},
{
label: this.intl.t('fleet-ops.management.vehicles.index.edit-vehicle'),
fn: this.editVehicle,
},
{
label: this.intl.t('fleet-ops.management.vehicles.index.locate-action-title'),
fn: this.locateVehicle,
},
{
separator: true,
},
{
label: this.intl.t('fleet-ops.management.vehicles.index.delete-vehicle'),
fn: this.deleteVehicle,
},
],
sortable: false,
filterable: false,
resizable: false,
searchable: false,
},
];
/**
* Reload layout view.
*/
reload() {
return this.hostRouter.refresh();
}
/**
* Bulk deletes selected `vehicle` via confirm prompt
*
* @param {Array} selected an array of selected models
* @void
*/
bulkDeleteVehicles() {
const selectedRows = this.table.selectedRows;
this.crud.bulkDelete(selectedRows, {
modelNamePath: `display_name`,
acceptButtonText: this.intl.t('fleet-ops.management.vehicles.index.delete-button'),
onSuccess: () => {
return this.hostRouter.refresh();
},
});
}
/**
* The search task.
*
* @void
*/
*search({ target: { value } }) {
// if no query don't search
if (isBlank(value)) {
this.query = null;
return;
}
// timeout for typing
yield timeout(250);
// reset page for results
if (this.page > 1) {
this.page = 1;
}
// update the query param
this.query = value;
}
/**
* Toggles dialog to export `vehicles`
*
* @void
*/
exportVehicles() {
const selections = this.table.selectedRows.map((_) => _.id);
this.crud.export('vehicle', { params: { selections } });
}
/**
* View a `vehicle` details in modal
*
* @param {VehicleModel} vehicle
* @param {Object} options
* @void
*/
viewVehicle(vehicle) {
return this.transitionToRoute('management.vehicles.index.details', vehicle, { queryParams: { view: 'details' } });
}
/**
* Create a new `vehicle` in modal
*
* @param {Object} options
* @void
*/
createVehicle() {
return this.transitionToRoute('management.vehicles.index.new');
}
/**
* Edit a `vehicle` details
*
* @param {VehicleModel} vehicle
* @param {Object} options
* @void
*/
editVehicle(vehicle) {
return this.transitionToRoute('management.vehicles.index.edit', vehicle);
}
/**
* Delete a `vehicle` via confirm prompt
*
* @param {VehicleModel} vehicle
* @param {Object} options
* @void
*/
deleteVehicle(vehicle, options = {}) {
this.vehicleActions.delete(vehicle, {
onSuccess: () => {
return this.hostRouter.refresh();
},
...options,
});
}
/**
* Allow user to assign driver to a `vehicle` via prompt
*
* @param {VehicleModel} vehicle
* @param {Object} options
* @todo implement
* @void
*/
assignDriver() {}
/**
* View a vehicle location on map
*
* @param {VehicleModel} vehicle
* @param {Object} options
* @void
*/
locateVehicle(vehicle, options = {}) {
this.vehicleActions.locate(vehicle, options);
}
}