basicprimitives
Version:
Basic Primitives Diagrams for JavaScript - data visualization components library that implements organizational chart and multi-parent dependency diagrams, contains implementations of JavaScript Controls and PDF rendering plugins.
104 lines (91 loc) • 3.25 kB
JavaScript
import getMergedIntervals from '../../algorithms/getMergedIntervals';
import Interval from '../../graphics/structs/Interval';
export default function FamLogicalLevelsPlacementTask(orderFamilyNodesTask, alignDiagramTask) {
var _data = {
positions: []
};
function process() {
_data.positions = null;
return true;
}
function createPositions() {
var intervals = [],
treeLevels = orderFamilyNodesTask.getTreeLevels(),
itemsPositions = alignDiagramTask.getItemsPositions(),
index = 0;
treeLevels.loopLevels(this, function(levelIndex, level) {
treeLevels.loopLevelItems(this, levelIndex, function(nodeId, node, position) {
if(node.isVisible && node.isActive) {
var itemPosition = itemsPositions[nodeId];
if(itemPosition) {
var interval = new Interval(itemPosition.topConnectorShift || itemPosition.actualPosition.y, itemPosition.bottomConnectorShift - 1, index++)
intervals.push(interval);
}
return true; /* only one item per level is needed */
}
})
});
var mergedIntervals = [];
getMergedIntervals(this, intervals, function(interval) {
mergedIntervals.push(interval);
});
intervals = mergedIntervals;
/* merge intervals having equal logical levels */
mergedIntervals = [];
var currentInterval = null;
for(var index = 0, len = intervals.length; index < len; index+=1) {
var interval = intervals[index];
if(!currentInterval) {
currentInterval = interval;
mergedIntervals.push(interval);
} else {
if(currentInterval.context === interval.context) {
currentInterval.to = interval.to;
} else {
currentInterval = interval;
mergedIntervals.push(interval);
}
}
}
intervals = mergedIntervals;
/* extend first level to the top */
if(intervals.length > 0) {
intervals[0].from = 0;
}
/* fill gaps between levels */
for(var index = 0, len = intervals.length - 1; index < len; index+=1) {
var prev = intervals[index];
var next = intervals[index + 1];
prev.to = next.from;
}
/* find minimal level */
var minLevelIndex = null;
for(var index = 0, len = intervals.length; index < len; index+=1) {
var interval = intervals[index];
minLevelIndex = (minLevelIndex === null) ? interval.context : Math.min(minLevelIndex, interval.context);
}
/* group intervals by logical levels */
var result = {};
for(var index = 0, len = intervals.length; index < len; index+=1) {
var interval = intervals[index];
var levelIndex = interval.context - minLevelIndex;
var logicalLevelPosition = result[levelIndex];
if(!logicalLevelPosition) {
result[levelIndex] = [interval];
} else {
logicalLevelPosition.push(interval);
}
}
return result;
}
function getPositions() {
if(!_data.positions) {
_data.positions = createPositions();
}
return _data.positions;
}
return {
getPositions:getPositions,
process: process
};
};