2017-12-20 12:33:33 +01:00
|
|
|
import _ from 'lodash';
|
2017-10-23 16:46:36 +03:00
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* This function converts annotation events into set
|
|
|
|
|
* of single events and regions (event consist of two)
|
|
|
|
|
* @param annotations
|
|
|
|
|
* @param options
|
|
|
|
|
*/
|
|
|
|
|
export function makeRegions(annotations, options) {
|
2018-08-26 17:14:40 +02:00
|
|
|
const [regionEvents, singleEvents] = _.partition(annotations, 'regionId');
|
|
|
|
|
const regions = getRegions(regionEvents, options.range);
|
2017-10-23 16:46:36 +03:00
|
|
|
annotations = _.concat(regions, singleEvents);
|
|
|
|
|
return annotations;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function getRegions(events, range) {
|
2018-09-03 11:00:46 +02:00
|
|
|
const regionEvents = _.filter(events, event => {
|
2017-10-23 16:46:36 +03:00
|
|
|
return event.regionId;
|
|
|
|
|
});
|
2019-04-15 12:11:52 +02:00
|
|
|
let regions: any = _.groupBy(regionEvents, 'regionId');
|
2017-10-23 16:46:36 +03:00
|
|
|
regions = _.compact(
|
2018-09-03 11:00:46 +02:00
|
|
|
_.map(regions, regionEvents => {
|
2019-04-15 12:11:52 +02:00
|
|
|
const regionObj: any = _.head(regionEvents);
|
2018-09-03 11:00:46 +02:00
|
|
|
if (regionEvents && regionEvents.length > 1) {
|
|
|
|
|
regionObj.timeEnd = regionEvents[1].time;
|
|
|
|
|
regionObj.isRegion = true;
|
|
|
|
|
return regionObj;
|
2017-10-23 16:46:36 +03:00
|
|
|
} else {
|
2018-09-03 11:00:46 +02:00
|
|
|
if (regionEvents && regionEvents.length) {
|
2017-10-23 16:46:36 +03:00
|
|
|
// Don't change proper region object
|
2018-09-03 11:00:46 +02:00
|
|
|
if (!regionObj.time || !regionObj.timeEnd) {
|
2017-10-23 16:46:36 +03:00
|
|
|
// This is cut region
|
2018-09-03 11:00:46 +02:00
|
|
|
if (isStartOfRegion(regionObj)) {
|
|
|
|
|
regionObj.timeEnd = range.to.valueOf() - 1;
|
2017-10-23 16:46:36 +03:00
|
|
|
} else {
|
|
|
|
|
// Start time = null
|
2018-09-03 11:00:46 +02:00
|
|
|
regionObj.timeEnd = regionObj.time;
|
|
|
|
|
regionObj.time = range.from.valueOf() + 1;
|
2017-10-23 16:46:36 +03:00
|
|
|
}
|
2018-09-03 11:00:46 +02:00
|
|
|
regionObj.isRegion = true;
|
2017-10-23 16:46:36 +03:00
|
|
|
}
|
|
|
|
|
|
2018-09-03 11:00:46 +02:00
|
|
|
return regionObj;
|
2017-10-23 16:46:36 +03:00
|
|
|
}
|
|
|
|
|
}
|
2017-12-19 16:06:54 +01:00
|
|
|
})
|
2017-10-23 16:46:36 +03:00
|
|
|
);
|
|
|
|
|
|
|
|
|
|
return regions;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function isStartOfRegion(event): boolean {
|
|
|
|
|
return event.id && event.id === event.regionId;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export function dedupAnnotations(annotations) {
|
|
|
|
|
let dedup = [];
|
|
|
|
|
|
2018-04-13 19:48:37 +02:00
|
|
|
// Split events by annotationId property existence
|
2018-08-26 17:14:40 +02:00
|
|
|
const events = _.partition(annotations, 'id');
|
2017-10-23 16:46:36 +03:00
|
|
|
|
2018-08-26 17:14:40 +02:00
|
|
|
const eventsById = _.groupBy(events[0], 'id');
|
2017-10-23 16:46:36 +03:00
|
|
|
dedup = _.map(eventsById, eventGroup => {
|
|
|
|
|
if (eventGroup.length > 1 && !_.every(eventGroup, isPanelAlert)) {
|
|
|
|
|
// Get first non-panel alert
|
|
|
|
|
return _.find(eventGroup, event => {
|
2017-12-20 12:33:33 +01:00
|
|
|
return event.eventType !== 'panel-alert';
|
2017-10-23 16:46:36 +03:00
|
|
|
});
|
|
|
|
|
} else {
|
|
|
|
|
return _.head(eventGroup);
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
dedup = _.concat(dedup, events[1]);
|
|
|
|
|
return dedup;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function isPanelAlert(event) {
|
2017-12-20 12:33:33 +01:00
|
|
|
return event.eventType === 'panel-alert';
|
2017-10-23 16:46:36 +03:00
|
|
|
}
|