|
|
@@ -7,14 +7,18 @@ define([
|
|
|
function ($, _, angular, Drop) {
|
|
|
'use strict';
|
|
|
|
|
|
- function createAnnotationToolip(element, event) {
|
|
|
+ function createAnnotationToolip(element, event, plot) {
|
|
|
var injector = angular.element(document).injector();
|
|
|
var content = document.createElement('div');
|
|
|
- content.innerHTML = '<annotation-tooltip event="event"></annotation-tooltip>';
|
|
|
+ content.innerHTML = '<annotation-tooltip event="event" on-edit="onEdit()"></annotation-tooltip>';
|
|
|
|
|
|
injector.invoke(["$compile", "$rootScope", function($compile, $rootScope) {
|
|
|
+ var eventManager = plot.getOptions().events.manager;
|
|
|
var tmpScope = $rootScope.$new(true);
|
|
|
tmpScope.event = event;
|
|
|
+ tmpScope.onEdit = function() {
|
|
|
+ eventManager.editEvent(event);
|
|
|
+ };
|
|
|
|
|
|
$compile(content)(tmpScope);
|
|
|
tmpScope.$digest();
|
|
|
@@ -42,6 +46,69 @@ function ($, _, angular, Drop) {
|
|
|
}]);
|
|
|
}
|
|
|
|
|
|
+ var markerElementToAttachTo = null;
|
|
|
+
|
|
|
+ function createEditPopover(element, event, plot) {
|
|
|
+ var eventManager = plot.getOptions().events.manager;
|
|
|
+ if (eventManager.editorOpen) {
|
|
|
+ // update marker element to attach to (needed in case of legend on the right
|
|
|
+ // when there is a double render pass and the inital marker element is removed)
|
|
|
+ markerElementToAttachTo = element;
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ // mark as openend
|
|
|
+ eventManager.editorOpened();
|
|
|
+ // set marker elment to attache to
|
|
|
+ markerElementToAttachTo = element;
|
|
|
+
|
|
|
+ // wait for element to be attached and positioned
|
|
|
+ setTimeout(function() {
|
|
|
+
|
|
|
+ var injector = angular.element(document).injector();
|
|
|
+ var content = document.createElement('div');
|
|
|
+ content.innerHTML = '<event-editor panel-ctrl="panelCtrl" event="event" close="close()"></event-editor>';
|
|
|
+
|
|
|
+ injector.invoke(["$compile", "$rootScope", function($compile, $rootScope) {
|
|
|
+ var scope = $rootScope.$new(true);
|
|
|
+ var drop;
|
|
|
+
|
|
|
+ scope.event = event;
|
|
|
+ scope.panelCtrl = eventManager.panelCtrl;
|
|
|
+ scope.close = function() {
|
|
|
+ drop.close();
|
|
|
+ };
|
|
|
+
|
|
|
+ $compile(content)(scope);
|
|
|
+ scope.$digest();
|
|
|
+
|
|
|
+ drop = new Drop({
|
|
|
+ target: markerElementToAttachTo[0],
|
|
|
+ content: content,
|
|
|
+ position: "bottom center",
|
|
|
+ classes: 'drop-popover drop-popover--form',
|
|
|
+ openOn: 'click',
|
|
|
+ tetherOptions: {
|
|
|
+ constraints: [{to: 'window', pin: true, attachment: "both"}]
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ drop.open();
|
|
|
+ eventManager.editorOpened();
|
|
|
+
|
|
|
+ drop.on('close', function() {
|
|
|
+ // need timeout here in order call drop.destroy
|
|
|
+ setTimeout(function() {
|
|
|
+ eventManager.editorClosed();
|
|
|
+ scope.$destroy();
|
|
|
+ drop.destroy();
|
|
|
+ });
|
|
|
+ });
|
|
|
+ }]);
|
|
|
+
|
|
|
+ }, 100);
|
|
|
+ }
|
|
|
+
|
|
|
/*
|
|
|
* jquery.flot.events
|
|
|
*
|
|
|
@@ -121,11 +188,20 @@ function ($, _, angular, Drop) {
|
|
|
*/
|
|
|
this.setupEvents = function(events) {
|
|
|
var that = this;
|
|
|
+ var parts = _.partition(events, 'isRegion');
|
|
|
+ var regions = parts[0];
|
|
|
+ events = parts[1];
|
|
|
+
|
|
|
$.each(events, function(index, event) {
|
|
|
var ve = new VisualEvent(event, that._buildDiv(event));
|
|
|
_events.push(ve);
|
|
|
});
|
|
|
|
|
|
+ $.each(regions, function (index, event) {
|
|
|
+ var vre = new VisualEvent(event, that._buildRegDiv(event));
|
|
|
+ _events.push(vre);
|
|
|
+ });
|
|
|
+
|
|
|
_events.sort(function(a, b) {
|
|
|
var ao = a.getOptions(), bo = b.getOptions();
|
|
|
if (ao.min > bo.min) { return 1; }
|
|
|
@@ -232,7 +308,10 @@ function ($, _, angular, Drop) {
|
|
|
lineWidth = this._types[eventTypeId].lineWidth;
|
|
|
}
|
|
|
|
|
|
- top = o.top + this._plot.height();
|
|
|
+ var topOffset = xaxis.options.eventSectionHeight || 0;
|
|
|
+ topOffset = topOffset / 3;
|
|
|
+
|
|
|
+ top = o.top + this._plot.height() + topOffset;
|
|
|
left = xaxis.p2c(event.min) + o.left;
|
|
|
|
|
|
var line = $('<div class="events_line flot-temp-elem"></div>').css({
|
|
|
@@ -241,25 +320,27 @@ function ($, _, angular, Drop) {
|
|
|
"left": left + 'px',
|
|
|
"top": 8,
|
|
|
"width": lineWidth + "px",
|
|
|
- "height": this._plot.height(),
|
|
|
+ "height": this._plot.height() + topOffset * 0.8,
|
|
|
"border-left-width": lineWidth + "px",
|
|
|
"border-left-style": lineStyle,
|
|
|
- "border-left-color": color
|
|
|
+ "border-left-color": color,
|
|
|
+ "color": color
|
|
|
})
|
|
|
.appendTo(container);
|
|
|
|
|
|
if (markerShow) {
|
|
|
var marker = $('<div class="events_marker"></div>').css({
|
|
|
"position": "absolute",
|
|
|
- "left": (-markerSize-Math.round(lineWidth/2)) + "px",
|
|
|
+ "left": (-markerSize - Math.round(lineWidth / 2)) + "px",
|
|
|
"font-size": 0,
|
|
|
"line-height": 0,
|
|
|
"width": 0,
|
|
|
"height": 0,
|
|
|
"border-left": markerSize+"px solid transparent",
|
|
|
"border-right": markerSize+"px solid transparent"
|
|
|
- })
|
|
|
- .appendTo(line);
|
|
|
+ });
|
|
|
+
|
|
|
+ marker.appendTo(line);
|
|
|
|
|
|
if (this._types[eventTypeId] && this._types[eventTypeId].position && this._types[eventTypeId].position.toUpperCase() === 'BOTTOM') {
|
|
|
marker.css({
|
|
|
@@ -280,9 +361,13 @@ function ($, _, angular, Drop) {
|
|
|
});
|
|
|
|
|
|
var mouseenter = function() {
|
|
|
- createAnnotationToolip(marker, $(this).data("event"));
|
|
|
+ createAnnotationToolip(marker, $(this).data("event"), that._plot);
|
|
|
};
|
|
|
|
|
|
+ if (event.editModel) {
|
|
|
+ createEditPopover(marker, event.editModel, that._plot);
|
|
|
+ }
|
|
|
+
|
|
|
var mouseleave = function() {
|
|
|
that._plot.clearSelection();
|
|
|
};
|
|
|
@@ -312,6 +397,127 @@ function ($, _, angular, Drop) {
|
|
|
return drawableEvent;
|
|
|
};
|
|
|
|
|
|
+ /**
|
|
|
+ * create a DOM element for the given region
|
|
|
+ */
|
|
|
+ this._buildRegDiv = function (event) {
|
|
|
+ var that = this;
|
|
|
+
|
|
|
+ var container = this._plot.getPlaceholder();
|
|
|
+ var o = this._plot.getPlotOffset();
|
|
|
+ var axes = this._plot.getAxes();
|
|
|
+ var xaxis = this._plot.getXAxes()[this._plot.getOptions().events.xaxis - 1];
|
|
|
+ var yaxis, top, left, lineWidth, regionWidth, lineStyle, color, markerTooltip;
|
|
|
+
|
|
|
+ // determine the y axis used
|
|
|
+ if (axes.yaxis && axes.yaxis.used) { yaxis = axes.yaxis; }
|
|
|
+ if (axes.yaxis2 && axes.yaxis2.used) { yaxis = axes.yaxis2; }
|
|
|
+
|
|
|
+ // map the eventType to a types object
|
|
|
+ var eventTypeId = event.eventType;
|
|
|
+
|
|
|
+ if (this._types === null || !this._types[eventTypeId] || !this._types[eventTypeId].color) {
|
|
|
+ color = '#666';
|
|
|
+ } else {
|
|
|
+ color = this._types[eventTypeId].color;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (this._types === null || !this._types[eventTypeId] || this._types[eventTypeId].markerTooltip === undefined) {
|
|
|
+ markerTooltip = true;
|
|
|
+ } else {
|
|
|
+ markerTooltip = this._types[eventTypeId].markerTooltip;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (this._types == null || !this._types[eventTypeId] || this._types[eventTypeId].lineWidth === undefined) {
|
|
|
+ lineWidth = 1; //default line width
|
|
|
+ } else {
|
|
|
+ lineWidth = this._types[eventTypeId].lineWidth;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (this._types == null || !this._types[eventTypeId] || !this._types[eventTypeId].lineStyle) {
|
|
|
+ lineStyle = 'dashed'; //default line style
|
|
|
+ } else {
|
|
|
+ lineStyle = this._types[eventTypeId].lineStyle.toLowerCase();
|
|
|
+ }
|
|
|
+
|
|
|
+ var topOffset = 2;
|
|
|
+ top = o.top + this._plot.height() + topOffset;
|
|
|
+
|
|
|
+ var timeFrom = Math.min(event.min, event.timeEnd);
|
|
|
+ var timeTo = Math.max(event.min, event.timeEnd);
|
|
|
+ left = xaxis.p2c(timeFrom) + o.left;
|
|
|
+ var right = xaxis.p2c(timeTo) + o.left;
|
|
|
+ regionWidth = right - left;
|
|
|
+
|
|
|
+ _.each([left, right], function(position) {
|
|
|
+ var line = $('<div class="events_line flot-temp-elem"></div>').css({
|
|
|
+ "position": "absolute",
|
|
|
+ "opacity": 0.8,
|
|
|
+ "left": position + 'px',
|
|
|
+ "top": 8,
|
|
|
+ "width": lineWidth + "px",
|
|
|
+ "height": that._plot.height() + topOffset,
|
|
|
+ "border-left-width": lineWidth + "px",
|
|
|
+ "border-left-style": lineStyle,
|
|
|
+ "border-left-color": color,
|
|
|
+ "color": color
|
|
|
+ });
|
|
|
+ line.appendTo(container);
|
|
|
+ });
|
|
|
+
|
|
|
+ var region = $('<div class="events_marker region_marker flot-temp-elem"></div>').css({
|
|
|
+ "position": "absolute",
|
|
|
+ "opacity": 0.5,
|
|
|
+ "left": left + 'px',
|
|
|
+ "top": top,
|
|
|
+ "width": Math.round(regionWidth + lineWidth) + "px",
|
|
|
+ "height": "0.5rem",
|
|
|
+ "border-left-color": color,
|
|
|
+ "color": color,
|
|
|
+ "background-color": color
|
|
|
+ });
|
|
|
+ region.appendTo(container);
|
|
|
+
|
|
|
+ region.data({
|
|
|
+ "event": event
|
|
|
+ });
|
|
|
+
|
|
|
+ var mouseenter = function () {
|
|
|
+ createAnnotationToolip(region, $(this).data("event"), that._plot);
|
|
|
+ };
|
|
|
+
|
|
|
+ if (event.editModel) {
|
|
|
+ createEditPopover(region, event.editModel, that._plot);
|
|
|
+ }
|
|
|
+
|
|
|
+ var mouseleave = function () {
|
|
|
+ that._plot.clearSelection();
|
|
|
+ };
|
|
|
+
|
|
|
+ if (markerTooltip) {
|
|
|
+ region.css({ "cursor": "help" });
|
|
|
+ region.hover(mouseenter, mouseleave);
|
|
|
+ }
|
|
|
+
|
|
|
+ var drawableEvent = new DrawableEvent(
|
|
|
+ region,
|
|
|
+ function drawFunc(obj) { obj.show(); },
|
|
|
+ function (obj) { obj.remove(); },
|
|
|
+ function (obj, position) {
|
|
|
+ obj.css({
|
|
|
+ top: position.top,
|
|
|
+ left: position.left
|
|
|
+ });
|
|
|
+ },
|
|
|
+ left,
|
|
|
+ top,
|
|
|
+ region.width(),
|
|
|
+ region.height()
|
|
|
+ );
|
|
|
+
|
|
|
+ return drawableEvent;
|
|
|
+ };
|
|
|
+
|
|
|
/**
|
|
|
* check if the event is inside visible range
|
|
|
*/
|
|
|
@@ -395,5 +601,4 @@ function ($, _, angular, Drop) {
|
|
|
name: "events",
|
|
|
version: "0.2.5"
|
|
|
});
|
|
|
-
|
|
|
});
|