UNPKG

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.

139 lines (119 loc) 3.69 kB
import Family from './Family'; var maximum = 100; function testOptimizedItems(sourceItems, family) { var result = true; for (var key in sourceItems) { var sourceChildren = sourceItems[key]; var resultChildren = []; family.loopChildren(this, key, function (itemid, item, levelIndex) { if (!item.isBundle) { resultChildren.push(itemid); } }); sourceChildren.sort(); resultChildren.sort(); if (sourceChildren.join(',') != resultChildren.join(',')) { var result = false; break; } } return result; }; function getOptimizedFamily(sourceItems) { var family = Family(); var children = {}; for (var parent in sourceItems) { var items = sourceItems[parent]; for (var index = 0; index < items.length; index += 1) { if (!children.hasOwnProperty(items[index])) { children[items[index]] = []; } children[items[index]].push(parent); } } for (var child in children) { family.add(children[child], child, {}); } for (var parent in sourceItems) { if (children[parent] == null) family.add(null, parent, {}); } family.eliminateManyToMany(function () { maximum += 1; return { id: maximum, isBundle: true }; }); return family; } function getLevels(family) { var levels = []; family.loopLevels(this, true, function (itemid, item, level) { var newItem = { id: itemid }; var children = []; family.loopChildren(this, itemid, function (itemid, item, levelIndex) { if (levelIndex > 0) { return family.BREAK; } children.push(itemid); }); if (children.length > 0) { newItem.children = children; } levels.push(newItem); }); return levels; } function validate(family) { var result = true; family.loop(this, function (itemid, item) { item.childrenLength = 0; family.loopChildren(this, itemid, function (childid, child, levelIndex) { if (levelIndex > 0) { return family.BREAK; } child.childrenLength += 1; }); item.parentsLength = 0; family.loopParents(this, itemid, function (parentid, parent, levelIndex) { parent.parentsLength += 1; return family.SKIP; }); }); family.loop(this, function (itemid, item) { if (item.childrenLength > 1) { family.loopChildren(this, itemid, function (childid, child, levelIndex) { if (levelIndex > 0) { return family.BREAK; } if (child.parentsLength > 1) { result = false; } }); } }); return result; } test('eliminateManyToMany - Eliminate many to many relations from family', () => { var sourceItems = { A: [1, 2, 3], B: [2, 4], C: [3, 5], D: [6] }; var family = getOptimizedFamily(sourceItems); var levels = getLevels(family); var expectedResults = [{ "id": "A", "children": ["1", "101", "102"] }, { "id": "B", "children": ["4", "103"] }, { "id": "C", "children": ["5", "104"] }, { "id": "D", "children": ["6"] }, { "id": "1" }, { "id": "101", "children": ["2"] }, { "id": "102", "children": ["3"] }, { "id": "103", "children": ["2"] }, { "id": "4" }, { "id": "104", "children": ["3"] }, { "id": "5" }, { "id": "6" }, { "id": "2" }, { "id": "3" } ]; expect(family.validate() && validate(family)).toBe(true); expect(testOptimizedItems(sourceItems, family)).toBe(true); expect(levels).toEqual(expectedResults); });