blob: 10d64479f53f8c8d9c638867c6d17d462a863b8a [file] [log] [blame]
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import Ember from 'ember';
import Processor from '../utils/processor';
import Process from '../utils/process';
export default Ember.Component.extend({
classNames: ["em-swimlane"],
processes: [],
processor: Processor.create(),
nameComponent: "em-swimlane-process-name",
visualComponent: "em-swimlane-process-visual",
tooltipContents: null,
focusedProcess: null,
scroll: 0,
consolidate: false,
zoom: 100,
startTime: Ember.computed("processes.@each.startEvent", function () {
var startTime = this.get("processes.0.startEvent.time");
this.get("processes").forEach(function (process) {
var time = process.get("startEvent.time");
if(startTime > time){
startTime = time;
}
});
return startTime;
}),
endTime: Ember.computed("processes.@each.endEvent", function () {
var endTime = this.get("processes.0.endEvent.time");
this.get("processes").forEach(function (process) {
var time = process.get("endEvent.time");
if(endTime < time){
endTime = time;
}
});
return endTime;
}),
processorSetup: Ember.on("init", Ember.observer("startTime", "endTime", "processes.length", function () {
this.get("processor").setProperties({
startTime: this.get("startTime"),
endTime: this.get("endTime"),
processCount: this.get("processes.length")
});
})),
didInsertElement: function () {
Ember.run.scheduleOnce('afterRender', this, function() {
this.onZoom();
this.listenScroll();
});
},
onZoom: Ember.observer("zoom", function () {
var zoom = this.get("zoom");
this.$(".zoom-panel").css("width", `${zoom}%`);
}),
listenScroll: function () {
var that = this;
this.$(".process-visuals").scroll(function () {
that.set("scroll", Ember.$(this).scrollLeft());
});
},
willDestroy: function () {
// Release listeners
},
normalizedProcesses: Ember.computed("processes.@each.blockers", function () {
var processes = this.get("processes"),
normalizedProcesses,
idHash = {},
containsBlockers = false,
processor = this.get("processor");
// Validate and reset blocking
processes.forEach(function (process) {
if(!(process instanceof Process)) {
Ember.Logger.error("em-swimlane : Unknown type, must be of type Process");
}
if(process.get("blockers.length")) {
containsBlockers = true;
}
process.set("blocking", Ember.A());
});
if(containsBlockers) {
normalizedProcesses = [];
// Recreate blocking list
processes.forEach(function (process) {
var blockers = process.get("blockers");
if(blockers) {
blockers.forEach(function (blocker) {
blocker.get("blocking").push(process);
});
}
});
// Give an array of the processes in blocking order
processes.forEach(function (process) {
if(process.get("blocking.length") === 0) { // The root processes
normalizedProcesses.push(process);
normalizedProcesses.push.apply(normalizedProcesses, process.getAllBlockers());
}
});
normalizedProcesses.reverse();
normalizedProcesses = normalizedProcesses.filter(function (process, index) {
// Filters out the recurring processes in the list (after graph traversal), we just
// need the top processes
var id = process.get("_id");
if(idHash[id] === undefined) {
idHash[id] = index;
}
return idHash[id] === index;
});
}
else {
normalizedProcesses = processes;
}
// Set process colors & index
normalizedProcesses.forEach(function (process, index) {
process.setProperties({
color: processor.createProcessColor(index),
index: index
});
});
return Ember.A(normalizedProcesses);
}),
actions: {
showTooltip: function (type, process, options) {
this.set("tooltipContents", process.getTooltipContents(type, options));
this.set("focusedProcess", process);
},
hideTooltip: function () {
this.set("tooltipContents", null);
this.set("focusedProcess", null);
},
click: function (type, process, options) {
this.sendAction("click", type, process, options);
}
}
});