@ducna01120/fleetops-engine
Version:
Fleet & Transport Management Extension for Fleetbase
171 lines (153 loc) • 5.58 kB
JavaScript
import Component from '@glimmer/component';
import { tracked } from '@glimmer/tracking';
import { inject as service } from '@ember/service';
import { action } from '@ember/object';
import { later } from '@ember/runloop';
import { task } from 'ember-concurrency-decorators';
export default class LayoutFleetOpsSidebarDriverListingComponent extends Component {
store;
universe;
contextPanel;
driverActions;
hostRouter;
abilities;
notifications;
drivers = [];
constructor() {
super(...arguments);
this.fetchDrivers.perform();
this.universe.on('fleet-ops.driver.saved', () => {
this.fetchDrivers.perform();
});
}
displayPanelDropdown = true;
panelDropdownButtonActions = [
{
label: 'Create new driver...',
disabled: this.abilities.cannot('fleet-ops create driver'),
onClick: () => {
const driver = this.store.createRecord('driver');
this.contextPanel.focus(driver, 'editing');
},
},
];
dropdownButtonActions = [
{
label: 'View driver details...',
disabled: this.abilities.cannot('fleet-ops view driver'),
onClick: (driver) => {
this.contextPanel.focus(driver);
},
},
{
label: 'Edit driver details...',
disabled: this.abilities.cannot('fleet-ops update driver'),
onClick: (driver) => {
this.contextPanel.focus(driver, 'editing');
},
},
{
separator: true,
},
{
label: 'Assign order to driver...',
disabled: this.abilities.cannot('fleet-ops assign-order-for driver'),
onClick: (driver) => {
this.driverActions.assignOrder(driver);
},
},
{
label: 'Assign vehicle to driver...',
disabled: this.abilities.cannot('fleet-ops assign-vehicle-for driver'),
onClick: (driver) => {
this.driverActions.assignVehicle(driver);
},
},
{
label: 'Locate driver on map...',
disabled: this.abilities.cannot('fleet-ops view driver'),
onClick: (driver) => {
// If currently on the operations dashboard focus driver on the map
if (typeof this.hostRouter.currentRouteName === 'string' && this.hostRouter.currentRouteName.startsWith('console.fleet-ops.operations.orders')) {
return this.onDriverClicked(driver);
}
this.driverActions.locate(driver);
},
},
{
separator: true,
},
{
label: 'Delete driver...',
disabled: this.abilities.cannot('fleet-ops delete driver'),
onClick: (driver) => {
this.driverActions.delete(driver);
},
},
];
calculateDropdownPosition(trigger, content) {
let { top, left, width, height } = trigger.getBoundingClientRect();
let { height: contentHeight } = content.getBoundingClientRect();
let style = {
left: 3 + left + width,
top: 29 + top + window.pageYOffset + height / 2 - contentHeight / 2,
};
return { style };
}
calculateDropdownItemPosition(trigger) {
let { top, left, width } = trigger.getBoundingClientRect();
let style = {
left: 11 + left + width,
top: top + 2,
};
return { style };
}
transitionToRoute(toggleApiContext) {
if (typeof this.args.route === 'string') {
if (typeof this.hostRouter.currentRouteName === 'string' && this.hostRouter.currentRouteName.startsWith('console.fleet-ops.management.fleets.index')) {
if (typeof toggleApiContext.toggle === 'function') {
toggleApiContext.toggle();
}
}
this.hostRouter.transitionTo(this.args.route);
}
}
onDriverClicked(driver) {
// Transition to dashboard/map display
return this.hostRouter.transitionTo('console.fleet-ops.operations.orders.index', { queryParams: { layout: 'map' } }).then(() => {
// Focus vehicle on live map
this.focusDriverOnMap(driver);
// Fire callback
if (typeof this.args.onFocusDriver === 'function') {
this.args.onFocusDriver(driver);
}
});
}
focusDriverOnMap(driver) {
const liveMap = this.universe.get('component:fleet-ops:live-map');
if (liveMap) {
if (liveMap.contextPanel) {
liveMap.contextPanel.clear();
}
liveMap.showAll();
liveMap.focusLayerByRecord(driver, 16, {
onAfterFocusWithRecord: function () {
later(
this,
() => {
liveMap.onDriverClicked(driver);
},
1200
);
},
});
}
}
*fetchDrivers() {
try {
this.drivers = yield this.store.query('driver', { limit: 20, without: ['vendor'] });
} catch (error) {
this.notifications.serverError(error);
}
}
}