@fleetbase/fleetops-engine
Version:
Fleet & Transport Management Extension for Fleetbase
247 lines (224 loc) • 8.31 kB
JavaScript
import Controller from '@ember/controller';
import { action } from '@ember/object';
import { inject as service } from '@ember/service';
import { tracked } from '@glimmer/tracking';
import { task, timeout } from 'ember-concurrency';
const severityOptions = [
{ label: 'Info', value: 'info' },
{ label: 'Warning', value: 'warning' },
{ label: 'Error', value: 'error' },
{ label: 'Critical', value: 'critical' },
{ label: 'High', value: 'high' },
];
const warningSeverities = ['warning', 'error', 'critical', 'high'];
export default class ConnectivityDevicesIndexDetailsEventsController extends Controller {
deviceEventActions;
hostRouter;
intl;
queryParams = [
'events_page',
'events_limit',
'events_sort',
'events_query',
'events_event_type',
'events_severity',
'events_processed',
'events_occurred_at',
'events_created_at',
];
device;
events_page = 1;
events_limit;
events_sort = '-created_at';
events_query;
events_event_type;
events_severity;
events_processed;
events_occurred_at;
events_created_at;
bulkActions = [];
get events() {
return Array.from(this.model ?? []);
}
get totalEvents() {
return this.model?.meta?.total ?? this.events.length;
}
get warningEventsCount() {
return this.events.filter((event) => warningSeverities.includes(String(event.severity ?? '').toLowerCase())).length;
}
get unprocessedEventsCount() {
return this.events.filter((event) => !event.processed_at).length;
}
get processedEventsCount() {
return Math.max(this.events.length - this.unprocessedEventsCount, 0);
}
get hasHealthyEventState() {
return this.events.length > 0 && this.warningEventsCount === 0 && this.unprocessedEventsCount === 0 && !this.hasActiveFilters;
}
get hasActiveFilters() {
return Boolean(this.events_query || this.events_event_type || this.events_severity || this.events_processed || this.events_occurred_at || this.events_created_at);
}
get metrics() {
return [
{ label: 'Recent events', value: this.totalEvents, icon: 'list', accentClass: 'fleetops-connectivity-kpi-accent-blue' },
{
label: 'Warnings',
value: this.warningEventsCount,
icon: 'triangle-exclamation',
accentClass: this.warningEventsCount ? 'fleetops-connectivity-kpi-accent-amber' : 'fleetops-connectivity-kpi-accent-green',
},
{
label: 'Unprocessed',
value: this.unprocessedEventsCount,
icon: 'clock',
accentClass: this.unprocessedEventsCount ? 'fleetops-connectivity-kpi-accent-rose' : 'fleetops-connectivity-kpi-accent-green',
},
{ label: 'Processed', value: this.processedEventsCount, icon: 'check', accentClass: 'fleetops-connectivity-kpi-accent-green' },
];
}
get actionButtons() {
return [
{
icon: 'refresh',
size: 'sm',
onClick: this.refresh,
helpText: this.intl.t('common.refresh'),
wrapperClass: 'fleetops-telematics-action-button',
isLoading: this.refreshTask.isRunning,
disabled: this.refreshTask.isRunning,
},
];
}
get columns() {
return [
{
sticky: true,
label: 'Event',
valuePath: 'event_type',
cellComponent: 'table/cell/anchor',
action: this.deviceEventActions.transition.view,
permission: 'fleet-ops view device-event',
resizable: true,
sortable: true,
filterable: true,
filterParam: 'events_event_type',
filterComponent: 'filter/string',
},
{
label: 'Severity',
valuePath: 'severity',
cellComponent: 'table/cell/status',
resizable: true,
sortable: true,
filterable: true,
filterParam: 'events_severity',
filterComponent: 'filter/multi-option',
filterOptions: severityOptions,
filterOptionLabel: 'label',
filterOptionValue: 'value',
},
{
label: 'Message',
valuePath: 'message',
resizable: true,
sortable: false,
},
{
label: 'Code',
valuePath: 'code',
resizable: true,
sortable: true,
},
{
label: 'Processed',
valuePath: 'processedAt',
sortParam: 'processed_at',
resizable: true,
sortable: true,
filterable: true,
filterParam: 'events_processed',
filterComponent: 'filter/multi-option',
filterOptions: [
{ label: 'Processed', value: 'processed' },
{ label: 'Unprocessed', value: 'unprocessed' },
],
filterOptionLabel: 'label',
filterOptionValue: 'value',
},
{
label: 'Occurred',
valuePath: 'occurredAt',
sortParam: 'occurred_at',
resizable: true,
sortable: true,
filterable: true,
filterParam: 'events_occurred_at',
filterComponent: 'filter/date',
},
{
label: this.intl.t('column.created-at'),
valuePath: 'createdAt',
sortParam: 'created_at',
resizable: true,
sortable: true,
filterable: true,
filterParam: 'events_created_at',
filterComponent: 'filter/date',
hidden: true,
},
{
label: '',
cellComponent: 'table/cell/dropdown',
ddButtonText: false,
ddButtonIcon: 'ellipsis-h',
ddButtonIconPrefix: 'fas',
ddMenuLabel: this.intl.t('common.resource-actions', { resource: this.intl.t('resource.device-event') }),
cellClassNames: 'overflow-visible align-middle',
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.device-event') }),
fn: this.deviceEventActions.transition.view,
permission: 'fleet-ops view device-event',
},
{
label: 'Mark processed',
fn: this.markProcessed,
permission: 'fleet-ops update device-event',
},
],
sortable: false,
filterable: false,
resizable: false,
searchable: false,
},
];
}
refresh() {
if (this.refreshTask.isRunning) {
return;
}
return this.refreshTask.perform();
}
async markProcessed(deviceEvent) {
await this.deviceEventActions.markProcessed(deviceEvent);
await this.hostRouter.refresh();
}
*refreshTask() {
yield this.hostRouter.refresh();
}
*searchTask(event) {
const {
target: { value },
} = event;
if (!value) {
this.events_query = null;
return;
}
yield timeout(250);
if (this.events_page > 1) this.events_page = 1;
this.events_query = value;
}
}