@ducna01120/fleetops-engine
Version:
Fleet & Transport Management Extension for Fleetbase
210 lines (196 loc) • 9 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 FleetListingComponent from './fleet-ops-sidebar/fleet-listing';
import DriverListingComponent from './fleet-ops-sidebar/driver-listing';
export default class LayoutFleetOpsSidebarComponent extends Component {
universe;
contextPanel;
store;
intl;
abilities;
routePrefix = 'console.fleet-ops.';
menuPanels = [];
universeMenuItems = [];
universeSettingsMenuItems = [];
universeMenuPanels = [];
constructor() {
super(...arguments);
this.createMenuItemsFromUniverseRegistry();
this.createMenuPanels();
}
createMenuItemsFromUniverseRegistry() {
const registeredMenuItems = this.universe.getMenuItemsFromRegistry('engine:fleet-ops');
this.universeMenuPanels = this.universe.getMenuPanelsFromRegistry('engine:fleet-ops');
this.universeMenuItems = registeredMenuItems.filter((menuItem) => menuItem.section === undefined);
this.universeSettingsMenuItems = registeredMenuItems.filter((menuItem) => menuItem.section === 'settings');
}
createMenuPanels() {
const operationsItems = [
{
intl: 'fleet-ops.component.layout.fleet-ops-sidebar.dashboard',
title: this.intl.t('fleet-ops.component.layout.fleet-ops-sidebar.dashboard'),
icon: 'home',
route: 'operations.orders',
permission: 'fleet-ops list order',
visible: this.abilities.can('fleet-ops see order'),
},
{
intl: 'fleet-ops.component.layout.fleet-ops-sidebar.service-rates',
title: this.intl.t('fleet-ops.component.layout.fleet-ops-sidebar.service-rates'),
icon: 'file-invoice-dollar',
route: 'operations.service-rates',
permission: 'fleet-ops list service-rate',
visible: this.abilities.can('fleet-ops see service-rate'),
},
{
intl: 'fleet-ops.component.layout.fleet-ops-sidebar.scheduler',
title: this.intl.t('fleet-ops.component.layout.fleet-ops-sidebar.scheduler'),
icon: 'calendar-day',
route: 'operations.scheduler',
permission: 'fleet-ops list order',
visible: this.abilities.can('fleet-ops see order'),
},
{
intl: 'fleet-ops.component.layout.fleet-ops-sidebar.order-config',
title: this.intl.t('fleet-ops.component.layout.fleet-ops-sidebar.order-config'),
icon: 'diagram-project',
route: 'operations.order-config',
permission: 'fleet-ops list order-config',
visible: this.abilities.can('fleet-ops see order-config'),
},
];
const resourcesItems = [
{
intl: 'fleet-ops.component.layout.fleet-ops-sidebar.drivers',
title: this.intl.t('fleet-ops.component.layout.fleet-ops-sidebar.drivers'),
icon: 'id-card',
route: 'management.drivers',
renderComponentInPlace: true,
component: DriverListingComponent,
permission: 'fleet-ops list driver',
visible: this.abilities.can('fleet-ops see driver'),
},
{
intl: 'fleet-ops.component.layout.fleet-ops-sidebar.vehicles',
title: this.intl.t('fleet-ops.component.layout.fleet-ops-sidebar.vehicles'),
icon: 'truck',
route: 'management.vehicles',
permission: 'fleet-ops list vehicle',
visible: this.abilities.can('fleet-ops see vehicle'),
},
{
intl: 'fleet-ops.component.layout.fleet-ops-sidebar.fleets',
title: this.intl.t('fleet-ops.component.layout.fleet-ops-sidebar.fleets'),
icon: 'user-group',
route: 'management.fleets',
renderComponentInPlace: true,
component: FleetListingComponent,
permission: 'fleet-ops list fleet',
visible: this.abilities.can('fleet-ops see fleet'),
},
{
intl: 'fleet-ops.component.layout.fleet-ops-sidebar.vendors',
title: this.intl.t('fleet-ops.component.layout.fleet-ops-sidebar.vendors'),
icon: 'warehouse',
route: 'management.vendors',
permission: 'fleet-ops list vendor',
visible: this.abilities.can('fleet-ops see vendor'),
},
{
intl: 'fleet-ops.component.layout.fleet-ops-sidebar.contacts',
title: this.intl.t('fleet-ops.component.layout.fleet-ops-sidebar.contacts'),
icon: 'address-book',
route: 'management.contacts',
permission: 'fleet-ops list contact',
visible: this.abilities.can('fleet-ops see contact'),
},
{
intl: 'fleet-ops.component.layout.fleet-ops-sidebar.places',
title: this.intl.t('fleet-ops.component.layout.fleet-ops-sidebar.places'),
icon: 'location-dot',
route: 'management.places',
permission: 'fleet-ops list place',
visible: this.abilities.can('fleet-ops see place'),
},
{
intl: 'fleet-ops.component.layout.fleet-ops-sidebar.fuel-reports',
title: this.intl.t('fleet-ops.component.layout.fleet-ops-sidebar.fuel-reports'),
icon: 'gas-pump',
route: 'management.fuel-reports',
permission: 'fleet-ops list fuel-report',
visible: this.abilities.can('fleet-ops see fuel-report'),
},
{
intl: 'fleet-ops.component.layout.fleet-ops-sidebar.issues',
title: this.intl.t('fleet-ops.component.layout.fleet-ops-sidebar.issues'),
icon: 'triangle-exclamation',
route: 'management.issues',
permission: 'fleet-ops list issue',
visible: this.abilities.can('fleet-ops see issue'),
},
];
const settingsItems = [
{
intl: 'fleet-ops.component.layout.fleet-ops-sidebar.navigator-app',
title: this.intl.t('fleet-ops.component.layout.fleet-ops-sidebar.navigator-app'),
icon: 'location-arrow',
route: 'settings.navigator-app',
permission: 'fleet-ops view navigator-settings',
visible: this.abilities.can('fleet-ops see navigator-settings'),
},
{
intl: 'fleet-ops.component.layout.fleet-ops-sidebar.payments',
title: this.intl.t('fleet-ops.component.layout.fleet-ops-sidebar.payments'),
icon: 'cash-register',
route: 'settings.payments',
permission: 'fleet-ops view payments',
visible: this.abilities.can('fleet-ops see payments'),
},
];
const createPanel = (intl, routePrefix, items = []) => ({
intl,
title: this.intl.t(intl),
routePrefix,
open: true,
items,
});
this.menuPanels = this.removeEmptyMenuPanels([
createPanel('fleet-ops.component.layout.fleet-ops-sidebar.operations', 'operations', operationsItems),
createPanel('fleet-ops.component.layout.fleet-ops-sidebar.resources', 'management', resourcesItems),
createPanel('fleet-ops.component.layout.fleet-ops-sidebar.settings', 'settings', settingsItems),
]);
}
/**
* Action handler for creating an order.
*/
onClickCreateOrder() {
const { onClickCreateOrder } = this.args;
if (typeof onClickCreateOrder === 'function') {
onClickCreateOrder();
}
}
/**
* Action handler for opening settings.
*/
onClickSettings() {
const { onClickSettings } = this.args;
if (typeof onClickSettings === 'function') {
onClickSettings();
}
}
/**
* Filters menuPanels, leaving only menuPanels with visible items
*
* @param {Array} [menuPanels=[]]
* @return {Array}
* @memberof LayoutFleetOpsSidebarComponent
*/
removeEmptyMenuPanels(menuPanels = []) {
return menuPanels.filter((menuPanel) => {
const visibleItems = menuPanel.items.filter((item) => item.visible);
return visibleItems.length > 0;
});
}
}