@ducna01120/fleetops-engine
Version:
Fleet & Transport Management Extension for Fleetbase
218 lines (186 loc) • 6.82 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 { isArray } from '@ember/array';
import { isEmpty } from '@ember/utils';
import { task } from 'ember-concurrency';
import contextComponentCallback from '@fleetbase/ember-core/utils/context-component-callback';
export default class OrderListOverlayComponent extends Component {
store;
fetch;
appCache;
hostRouter;
notifications;
abilities;
urlSearchParams;
contextPanel;
fleets = [];
selectedOrders = [];
overlayContext;
query = null;
isOpen = false;
loaded = false;
orderGroups = {
activeOrders: [],
unassignedOrders: [],
};
constructor(owner, { isOpen = false }) {
super(...arguments);
this.isOpen = isOpen;
}
onLoad(overlayContext) {
this.overlayContext = overlayContext;
if (this.urlSearchParams.get('orderPanelOpen')) {
this.overlayContext.open();
}
if (typeof this.args.onLoad === 'function') {
this.args.onLoad(...arguments);
}
}
onOpen() {
if (!this.loaded) {
this.load.perform();
}
this.urlSearchParams.addParamToCurrentUrl('orderPanelOpen', 1);
}
onClose() {
this.urlSearchParams.removeParamFromCurrentUrl('orderPanelOpen');
}
selectOrder(order) {
if (this.selectedOrders.includes(order)) {
this.selectedOrders.removeObject(order);
} else {
this.selectedOrders.pushObject(order);
}
}
viewOrder(order) {
return this.hostRouter.transitionTo('console.fleet-ops.operations.orders.index.view', order);
}
onAction(actionName, ...params) {
contextComponentCallback(this, actionName, ...params, this);
}
*load() {
yield this.loadFleets.perform();
yield this.loadUnassignedOrders.perform();
yield this.loadActiveOrders.perform();
this.loaded = true;
}
*loadFleets() {
if (this.abilities.cannot('fleet-ops list fleet')) {
return;
}
// Get orders which are already loaded to exclude from reloading
const activeLoadedOrders = this.getLoadedOrders();
try {
let fleets = yield this.store.query('fleet', {
excludeDriverJobs: activeLoadedOrders.map((_) => _.public_id),
with: ['serviceArea', 'drivers.jobs', 'drivers.currentJob'],
without: ['drivers.fleets'],
});
// reset loaded jobs to drivers
if (isArray(fleets)) {
fleets = fleets.map((fleet) => {
fleet.drivers = fleet.drivers.map((driver) => {
driver.set('orderPanelActiveJobs', [...driver.activeJobs, ...this.getLoadedActiveOrderForDriver(driver)]);
return driver;
});
return fleet;
});
this.fleets = fleets;
this.appCache.setEmberData('fleets', fleets);
}
} catch (error) {
this.notifications.serverError(error);
}
}
*loadUnassignedOrders() {
if (this.abilities.cannot('fleet-ops list order')) {
return;
}
// Get orders which are already loaded to exclude from reloading
const activeLoadedOrders = this.getLoadedOrders();
try {
const unassignedOrders = yield this.fetch.get(
'fleet-ops/live/orders',
{
unassigned: 1,
exclude: activeLoadedOrders.map((_) => _.public_id),
},
{
normalizeToEmberData: true,
normalizeModelType: 'order',
expirationInterval: 5,
expirationIntervalUnit: 'minute',
}
);
this.orderGroups = {
...this.orderGroups,
unassignedOrders: [...unassignedOrders, ...this.getLoadedUnassignedOrder()],
};
} catch (error) {
this.notifications.serverError(error);
}
}
*loadActiveOrders() {
if (this.abilities.cannot('fleet-ops list order')) {
return;
}
// Get orders which are already loaded to exclude from reloading
const activeLoadedOrders = this.getLoadedOrders();
// Load live orders
try {
const serverActiveOrders = yield this.fetch.get(
'fleet-ops/live/orders',
{
active: 1,
with_tracker_data: 1,
exclude: activeLoadedOrders.map((_) => _.public_id),
},
{
normalizeToEmberData: true,
normalizeModelType: 'order',
expirationInterval: 5,
expirationIntervalUnit: 'minute',
}
);
const activeOrders = [...serverActiveOrders, ...this.getLoadedActiveOrder()];
for (let order of activeOrders) {
if (!order.get('tracker_data')) {
order.loadTrackerData();
}
}
this.orderGroups = {
...this.orderGroups,
activeOrders,
};
} catch (error) {
this.notifications.serverError(error);
}
}
getLoadedOrders(filter = null) {
filter =
typeof filter === 'function'
? filter
: function () {
return true;
};
const loadedOrders = this.store.peekAll('order');
return loadedOrders.filter(filter);
}
getLoadedUnassignedOrder() {
return this.getLoadedOrders((order) => {
return isEmpty(order.driver_assigned_uuid);
});
}
getLoadedActiveOrder() {
return this.getLoadedOrders((order) => {
return !isEmpty(order.driver_assigned) && !['created', 'completed', 'canceled', 'expired'].includes(order.status);
});
}
getLoadedActiveOrderForDriver(driver) {
return this.getLoadedOrders((order) => {
return !isEmpty(order.driver_assigned) && order.driver_assigned.id === driver.id && !['created', 'completed', 'canceled', 'expired'].includes(order.status);
});
}
}