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.
117 lines (103 loc) • 3.66 kB
JavaScript
import { ItemType } from '../../enums';
import getMergedIntervals from '../../algorithms/getMergedIntervals';
import Interval from '../../graphics/structs/Interval';
import { GroupType } from '../transformations/visualTreeBuilder/enums';
export default function OrgLogicalLevelsPlacementTask(orgTreeTask, visualTreeTask, alignDiagramTask) {
var _data = {
positions: []
};
function process() {
_data.positions = null;
return true;
}
function createPositions() {
var intervals = [],
orgTree = orgTreeTask.getOrgTree(),
itemsPositions = alignDiagramTask.getItemsPositions(),
branchAligner = visualTreeTask.getBranchAligner(),
visited = {};
orgTree.loopLevels(this, function(nodeId, node, levelIndex) {
if(node.itemType == ItemType.Regular) {
if(node.isVisible) {
var itemPosition = itemsPositions[nodeId];
if(itemPosition) {
var levelOffset = node.levelOffset;
if(levelOffset === null) {
levelOffset = branchAligner.getGroupSize(node.parent, GroupType.RowChildren);
}
var interval = new Interval(itemPosition.topConnectorShift, itemPosition.bottomConnectorShift - 1, levelIndex + levelOffset)
var key = interval.toString();
if(!visited[key]) {
visited[key] = true;
intervals.push(interval);
}
}
}
return;
}
return orgTree.SKIP;
});
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
};
};