From 411a43cdc5a4df21dc72045fbb5ca88ee86a1f4f Mon Sep 17 00:00:00 2001 From: yotamberk Date: Thu, 16 Feb 2017 17:42:02 +0200 Subject: [PATCH 01/20] fix(timeline): #2679 TypeError: Cannot read property 'hasOwnProperty' of null (#2735) * Fix redraw order * Fix error when option is not defined * Allow template labels * Add .travis.yml file * Add experiment travis code * Fix react example * Fix bug in item editable --- lib/timeline/component/item/Item.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/timeline/component/item/Item.js b/lib/timeline/component/item/Item.js index e41ef781..b54d9d6d 100644 --- a/lib/timeline/component/item/Item.js +++ b/lib/timeline/component/item/Item.js @@ -41,7 +41,7 @@ function Item (data, conversion, options) { } else if(typeof options.editable === 'object') { this.editable = {}; - util.selectiveExtend(['updateTime', 'updateGroup', 'remove'], this.editable, data.editable); + util.selectiveExtend(['updateTime', 'updateGroup', 'remove'], this.editable, options.editable); }; } } From cd30aa9f139437c9e01a121b274c4d0edade171c Mon Sep 17 00:00:00 2001 From: yotamberk Date: Thu, 16 Feb 2017 17:44:18 +0200 Subject: [PATCH 02/20] feat(timeline): #2647 Dynamic rolling mode option (#2705) * Fix redraw order * Fix error when option is not defined * Allow template labels * Add .travis.yml file * Add experiment travis code * Fix react example * Add toggleRollingMode option * Update docs with toggleRollingMode option --- docs/timeline/index.html | 7 +++++++ .../timeline/interaction/navigationMenu.html | 3 +++ lib/timeline/Timeline.js | 16 ++++++++++++++++ 3 files changed, 26 insertions(+) diff --git a/docs/timeline/index.html b/docs/timeline/index.html index edc0f56f..7ec093ae 100644 --- a/docs/timeline/index.html +++ b/docs/timeline/index.html @@ -1431,6 +1431,13 @@ document.getElementById('myTimeline').onclick = function (event) { + + toggleRollingMode() + none + Toggle rollingMode. + + + zoomIn(percentage) none diff --git a/examples/timeline/interaction/navigationMenu.html b/examples/timeline/interaction/navigationMenu.html index 75a04fdb..9f2dcd68 100755 --- a/examples/timeline/interaction/navigationMenu.html +++ b/examples/timeline/interaction/navigationMenu.html @@ -38,6 +38,7 @@ + @@ -74,6 +75,8 @@ document.getElementById('zoomOut').onclick = function () { timeline.zoomOut( 0.2); }; document.getElementById('moveLeft').onclick = function () { move( 0.2); }; document.getElementById('moveRight').onclick = function () { move(-0.2); }; + document.getElementById('toggleRollingMode').onclick = function () { timeline.toggleRollingMode() }; + diff --git a/lib/timeline/Timeline.js b/lib/timeline/Timeline.js index e27359e3..301beadb 100644 --- a/lib/timeline/Timeline.js +++ b/lib/timeline/Timeline.js @@ -572,4 +572,20 @@ Timeline.prototype.getEventProperties = function (event) { } }; +/** + * Toggle Timeline rolling mode + */ + +Timeline.prototype.toggleRollingMode = function () { + if (this.range.rolling) { + this.range.stopRolling(); + } else { + if (this.options.rollingMode == undefined) { + this.setOptions(options) + } + this.range.startRolling(); + } + +} + module.exports = Timeline; From d59c4a17f069648e0cfe9ebab56b5190ebfc0c9b Mon Sep 17 00:00:00 2001 From: Brad Hards Date: Fri, 17 Feb 2017 18:13:37 +1100 Subject: [PATCH 03/20] Fix eslint problem on Travis. (#2744) --- lib/timeline/Timeline.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/timeline/Timeline.js b/lib/timeline/Timeline.js index 301beadb..6cc4b068 100644 --- a/lib/timeline/Timeline.js +++ b/lib/timeline/Timeline.js @@ -581,7 +581,7 @@ Timeline.prototype.toggleRollingMode = function () { this.range.stopRolling(); } else { if (this.options.rollingMode == undefined) { - this.setOptions(options) + this.setOptions(this.options) } this.range.startRolling(); } From 3a10511c37404e3e6e5babd1fb242827630d3a74 Mon Sep 17 00:00:00 2001 From: Reed Date: Fri, 17 Feb 2017 02:15:42 -0500 Subject: [PATCH 04/20] fixes timestep next issue (#2732) --- lib/timeline/TimeStep.js | 52 +++++++++++++--------------------------- 1 file changed, 16 insertions(+), 36 deletions(-) diff --git a/lib/timeline/TimeStep.js b/lib/timeline/TimeStep.js index 4bb8f3dd..2ea1a4fa 100644 --- a/lib/timeline/TimeStep.js +++ b/lib/timeline/TimeStep.js @@ -193,46 +193,26 @@ TimeStep.prototype.next = function() { // Two cases, needed to prevent issues with switching daylight savings // (end of March and end of October) - if (this.current.month() < 6) { - switch (this.scale) { - case 'millisecond': this.current.add(this.step, 'millisecond'); break; - case 'second': this.current.add(this.step, 'second'); break; - case 'minute': this.current.add(this.step, 'minute'); break; - case 'hour': - this.current.add(this.step, 'hour'); - // in case of skipping an hour for daylight savings, adjust the hour again (else you get: 0h 5h 9h ... instead of 0h 4h 8h ...) - // TODO: is this still needed now we use the function of moment.js? - this.current.subtract(this.current.hours() % this.step, 'hour'); - break; - case 'weekday': // intentional fall through - case 'day': this.current.add(this.step, 'day'); break; - case 'month': this.current.add(this.step, 'month'); break; - case 'year': this.current.add(this.step, 'year'); break; - default: break; - } - } - else { - switch (this.scale) { - case 'millisecond': this.current.add(this.step, 'millisecond'); break; - case 'second': this.current.add(this.step, 'second'); break; - case 'minute': this.current.add(this.step, 'minute'); break; - case 'hour': - this.current.add(this.moment.duration(this.step, 'hour')); + switch (this.scale) { + case 'millisecond': this.current.add(this.step, 'millisecond'); break; + case 'second': this.current.add(this.step, 'second'); break; + case 'minute': this.current.add(this.step, 'minute'); break; + case 'hour': + this.current.add(this.step, 'hour'); - // correct for daylight saving - // FIXME: use this.current.add(moment.duration(this.step, 'hour')) - // see http://momentjs.com/docs/#special-considerations-for-months-and-years + if (this.current.month() < 6) { + this.current.subtract(this.current.hours() % this.step, 'hour'); + } else { if (this.current.hours() % this.step !== 0) { this.current.add(this.step - this.current.hours() % this.step, 'hour'); } - - break; - case 'weekday': // intentional fall through - case 'day': this.current.add(this.step, 'day'); break; - case 'month': this.current.add(this.step, 'month'); break; - case 'year': this.current.add(this.step, 'year'); break; - default: break; - } + } + break; + case 'weekday': // intentional fall through + case 'day': this.current.add(this.step, 'day'); break; + case 'month': this.current.add(this.step, 'month'); break; + case 'year': this.current.add(this.step, 'year'); break; + default: break; } if (this.step != 1) { From e51b996eec723805bec50d26342b3c8ceb541317 Mon Sep 17 00:00:00 2001 From: Alexander Wunschik Date: Fri, 17 Feb 2017 08:19:40 +0100 Subject: [PATCH 05/20] feat(timeline): added new locales for french and espanol (#2723) --- lib/timeline/locales.js | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/lib/timeline/locales.js b/lib/timeline/locales.js index 781deb4a..f5a24515 100644 --- a/lib/timeline/locales.js +++ b/lib/timeline/locales.js @@ -28,3 +28,19 @@ exports['de'] = { time: 'Zeit' }; exports['de_DE'] = exports['de']; + +// French +exports['fr'] = { + current: 'actuel', + time: 'heure' +}; +exports['fr_FR'] = exports['fr']; +exports['fr_CA'] = exports['fr']; +exports['fr_BE'] = exports['fr']; + +// Espanol +exports['es'] = { + current: 'corriente', + time: 'hora' +}; +exports['es_ES'] = exports['es']; From 4dc5082cbdedf26039789bc861b259c639bda253 Mon Sep 17 00:00:00 2001 From: Derek Brans Date: Sat, 18 Feb 2017 11:46:46 -0800 Subject: [PATCH 06/20] fix: Range.js "event" is undeclared (#2749) --- lib/timeline/Range.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/timeline/Range.js b/lib/timeline/Range.js index 8b269d2e..29fadd28 100644 --- a/lib/timeline/Range.js +++ b/lib/timeline/Range.js @@ -843,7 +843,7 @@ Range.prototype.moveTo = function(moveTo) { var newStart = this.start - diff; var newEnd = this.end - diff; - this.setRange(newStart, newEnd, false, true, event); + this.setRange(newStart, newEnd, false, true, null); }; module.exports = Range; From ceb698626acd38f967acfb96886d1e99e571042d Mon Sep 17 00:00:00 2001 From: Brad Hards Date: Wed, 22 Feb 2017 08:52:54 +1100 Subject: [PATCH 07/20] fix(timeline): #2720 Problems with option editable (#2743) Clean up and centralise edit status for Timeline Items. --- lib/timeline/component/item/BoxItem.js | 5 +- lib/timeline/component/item/Item.js | 59 ++++++----- lib/timeline/component/item/PointItem.js | 6 +- lib/timeline/component/item/RangeItem.js | 5 +- test/PointItem.test.js | 121 +++++++++++++++++++++-- test/TestSupport.js | 15 +++ 6 files changed, 162 insertions(+), 49 deletions(-) diff --git a/lib/timeline/component/item/BoxItem.js b/lib/timeline/component/item/BoxItem.js index 25b3e3e4..aa2e1eea 100644 --- a/lib/timeline/component/item/BoxItem.js +++ b/lib/timeline/component/item/BoxItem.js @@ -121,10 +121,7 @@ BoxItem.prototype.redraw = function() { this._updateDataAttributes(this.dom.box); this._updateStyle(this.dom.box); - var editable = (this.options.editable.updateTime || - this.options.editable.updateGroup || - this.editable === true) && - this.editable !== false; + var editable = (this.editable.updateTime || this.editable.updateGroup); // update class var className = (this.data.className? ' ' + this.data.className : '') + diff --git a/lib/timeline/component/item/Item.js b/lib/timeline/component/item/Item.js index b54d9d6d..0671f68f 100644 --- a/lib/timeline/component/item/Item.js +++ b/lib/timeline/component/item/Item.js @@ -31,19 +31,7 @@ function Item (data, conversion, options) { this.height = null; this.editable = null; - if (this.data && this.data.hasOwnProperty('editable')){ - if(typeof this.data.editable === 'boolean') { - this.editable = { - updateTime: this.data.editable, - updateGroup: this.data.editable, - remove: this.data.editable - } - } - else if(typeof options.editable === 'object') { - this.editable = {}; - util.selectiveExtend(['updateTime', 'updateGroup', 'remove'], this.editable, options.editable); - }; - } + this._updateEditStatus(); } Item.prototype.stack = true; @@ -77,21 +65,8 @@ Item.prototype.setData = function(data) { this.parent.itemSet._moveToGroup(this, data.group); } - if (data.hasOwnProperty('editable')){ - if (typeof data.editable === 'boolean') { - this.editable = { - updateTime: this.data.editable, - updateGroup: this.data.editable, - remove: this.data.editable - } - } - else if(typeof this.options.editable === 'object') { - this.editable = {}; - util.selectiveExtend(['updateTime', 'updateGroup', 'remove'], this.editable, data.editable); - } - } - this.data = data; + this._updateEditStatus(); this.dirty = true; if (this.displayed) this.redraw(); }; @@ -461,6 +436,36 @@ Item.prototype._contentToString = function (content) { return content; }; +/** + * Update the editability of this item. + */ +Item.prototype._updateEditStatus = function() { + if (this.options) { + if(typeof this.options.editable === 'boolean') { + this.editable = { + updateTime: this.options.editable, + updateGroup: this.options.editable, + remove: this.options.editable + }; + } else if(typeof this.options.editable === 'object') { + this.editable = {}; + util.selectiveExtend(['updateTime', 'updateGroup', 'remove'], this.editable, this.options.editable); + }; + } + // Item data overrides, except if options.editable.overrideItems is set. + if (!this.options || !(this.options.editable) || (this.options.editable.overrideItems !== true)) { + if (this.data) { + if (typeof this.data.editable === 'boolean') { + this.editable = { + updateTime: this.data.editable, + updateGroup: this.data.editable, + remove: this.data.editable + } + } + } + } +}; + /** * Return the width of the item left from its start date * @return {number} diff --git a/lib/timeline/component/item/PointItem.js b/lib/timeline/component/item/PointItem.js index 959d22da..26fb784e 100644 --- a/lib/timeline/component/item/PointItem.js +++ b/lib/timeline/component/item/PointItem.js @@ -99,11 +99,7 @@ PointItem.prototype.redraw = function() { this._updateDataAttributes(this.dom.point); this._updateStyle(this.dom.point); - var editable = (this.options.editable.updateTime || - this.options.editable.updateGroup || - this.editable === true) && - this.editable !== false; - + var editable = (this.editable.updateTime || this.editable.updateGroup); // update class var className = (this.data.className ? ' ' + this.data.className : '') + (this.selected ? ' vis-selected' : '') + diff --git a/lib/timeline/component/item/RangeItem.js b/lib/timeline/component/item/RangeItem.js index b0d71636..7deaf74c 100644 --- a/lib/timeline/component/item/RangeItem.js +++ b/lib/timeline/component/item/RangeItem.js @@ -103,10 +103,7 @@ RangeItem.prototype.redraw = function() { this._updateDataAttributes(this.dom.box); this._updateStyle(this.dom.box); - var editable = (this.options.editable.updateTime || - this.options.editable.updateGroup || - this.editable === true) && - this.editable !== false; + var editable = (this.editable.updateTime || this.editable.updateGroup); // update class var className = (this.data.className ? (' ' + this.data.className) : '') + diff --git a/test/PointItem.test.js b/test/PointItem.test.js index 1f88ea38..19c86558 100644 --- a/test/PointItem.test.js +++ b/test/PointItem.test.js @@ -10,16 +10,15 @@ var TestSupport = require('./TestSupport'); describe('Timeline PointItem', function () { jsdom(); + var now = moment(); it('should initialize with minimal data', function() { - var now = moment().toDate(); - var pointItem = new PointItem({start: now}, null, null); + var pointItem = new PointItem({start: now.toDate()}, null, null); assert.equal(pointItem.props.content.height, 0); - assert.equal(pointItem.data.start, now); + assert.deepEqual(pointItem.data.start, now.toDate()); }); it('should have a default width of 0', function() { - var now = moment().toDate(); var pointItem = new PointItem({start: now}, null, null); assert.equal(pointItem.getWidthRight(), 0); assert.equal(pointItem.getWidthLeft(), 0); @@ -30,7 +29,6 @@ describe('Timeline PointItem', function () { }); it('should be visible if the range is during', function() { - var now = moment(); var range = new Range(TestSupport.buildSimpleTimelineRangeBody()); range.start = now.clone().add(-1, 'second'); range.end = range.start.clone().add(1, 'hour'); @@ -39,7 +37,6 @@ describe('Timeline PointItem', function () { }); it('should not be visible if the range is after', function() { - var now = moment(); var range = new Range(TestSupport.buildSimpleTimelineRangeBody()); range.start = now.clone().add(1, 'second'); range.end = range.start.clone().add(1, 'hour'); @@ -58,8 +55,114 @@ describe('Timeline PointItem', function () { it('should be visible for a "now" point with a default range', function() { var range = new Range(TestSupport.buildSimpleTimelineRangeBody()); - var now = moment().toDate(); - var pointItem = new PointItem({start: now}, null, null); + var pointItem = new PointItem({start: now.toDate()}, null, null); assert(pointItem.isVisible(range)); }); -}); \ No newline at end of file + + it('should redraw() and then not be dirty', function() { + var pointItem = new PointItem({start: now.toDate()}, null, {editable: false}); + pointItem.setParent(TestSupport.buildMockItemSet()); + assert(pointItem.dirty); + pointItem.redraw(); + assert(!pointItem.dirty); + }); + + it('should redraw() and then have point attached to its parent', function() { + var pointItem = new PointItem({start: now.toDate()}, null, {editable: false}); + var parent = TestSupport.buildMockItemSet(); + pointItem.setParent(parent); + assert(!parent.dom.foreground.hasChildNodes()); + pointItem.redraw(); + assert(parent.dom.foreground.hasChildNodes()); + }); + + it('should redraw() and then have the correct classname for a non-editable item', function() { + var pointItem = new PointItem({start: now.toDate(), editable: false}, null, {editable: false}); + var parent = TestSupport.buildMockItemSet(); + pointItem.setParent(parent); + pointItem.redraw(); + assert.equal(pointItem.dom.dot.className, "vis-item vis-dot vis-readonly"); + assert.equal(pointItem.dom.point.className, "vis-item vis-point vis-readonly"); + }); + + it('should redraw() and then have the correct classname for an editable item (with object option)', function() { + var pointItem = new PointItem({start: now.toDate()}, null, {editable: {updateTime: true, updateGroup: false}}); + var parent = TestSupport.buildMockItemSet(); + pointItem.setParent(parent); + pointItem.redraw(); + assert.equal(pointItem.dom.dot.className, "vis-item vis-dot vis-editable"); + assert.equal(pointItem.dom.point.className, "vis-item vis-point vis-editable"); + }); + + it('should redraw() and then have the correct classname for an editable item (with boolean option)', function() { + var pointItem = new PointItem({start: now.toDate()}, null, {editable: true}); + var parent = TestSupport.buildMockItemSet(); + pointItem.setParent(parent); + pointItem.redraw(); + assert.equal(pointItem.dom.dot.className, "vis-item vis-dot vis-editable"); + assert.equal(pointItem.dom.point.className, "vis-item vis-point vis-editable"); + }); + + it('should redraw() and then have the correct classname for an editable:false override item (with boolean option)', function() { + var pointItem = new PointItem({start: now.toDate(), editable: false}, null, {editable: true}); + var parent = TestSupport.buildMockItemSet(); + pointItem.setParent(parent); + pointItem.redraw(); + assert.equal(pointItem.dom.dot.className, "vis-item vis-dot vis-readonly"); + assert.equal(pointItem.dom.point.className, "vis-item vis-point vis-readonly"); + }); + + it('should redraw() and then have the correct classname for an editable:true override item (with boolean option)', function() { + var pointItem = new PointItem({start: now.toDate(), editable: true}, null, {editable: false}); + var parent = TestSupport.buildMockItemSet(); + pointItem.setParent(parent); + pointItem.redraw(); + assert.equal(pointItem.dom.dot.className, "vis-item vis-dot vis-editable"); + assert.equal(pointItem.dom.point.className, "vis-item vis-point vis-editable"); + }); + + it('should redraw() and then have the correct classname for an editable:false override item (with object option)', function() { + var pointItem = new PointItem({start: now.toDate(), editable: false}, null, {editable: {updateTime: true, updateGroup: false}}); + var parent = TestSupport.buildMockItemSet(); + pointItem.setParent(parent); + pointItem.redraw(); + assert.equal(pointItem.dom.dot.className, "vis-item vis-dot vis-readonly"); + assert.equal(pointItem.dom.point.className, "vis-item vis-point vis-readonly"); + }); + + it('should redraw() and then have the correct classname for an editable:false override item (with object option for group change)', function() { + var pointItem = new PointItem({start: now.toDate(), editable: false}, null, {editable: {updateTime: false, updateGroup: true}}); + var parent = TestSupport.buildMockItemSet(); + pointItem.setParent(parent); + pointItem.redraw(); + assert.equal(pointItem.dom.dot.className, "vis-item vis-dot vis-readonly"); + assert.equal(pointItem.dom.point.className, "vis-item vis-point vis-readonly"); + }); + + it('should redraw() and then have the correct classname for an editable:true override item (with object option)', function() { + var pointItem = new PointItem({start: now.toDate(), editable: true}, null, {editable: {updateTime: false, updateGroup: false}}); + var parent = TestSupport.buildMockItemSet(); + pointItem.setParent(parent); + pointItem.redraw(); + assert.equal(pointItem.dom.dot.className, "vis-item vis-dot vis-editable"); + assert.equal(pointItem.dom.point.className, "vis-item vis-point vis-editable"); + }); + + it('should redraw() and then have the correct classname for an editable:true non-override item (with object option)', function() { + var pointItem = new PointItem({start: now.toDate(), editable: true}, null, {editable: {updateTime: false, updateGroup: false, overrideItems: true}}); + var parent = TestSupport.buildMockItemSet(); + pointItem.setParent(parent); + pointItem.redraw(); + assert.equal(pointItem.dom.dot.className, "vis-item vis-dot vis-readonly"); + assert.equal(pointItem.dom.point.className, "vis-item vis-point vis-readonly"); + }); + + it('should redraw() and then have the correct classname for an editable:false non-override item (with object option)', function() { + var pointItem = new PointItem({start: now.toDate(), editable: false}, null, {editable: {updateTime: true, updateGroup: false, overrideItems: true}}); + var parent = TestSupport.buildMockItemSet(); + pointItem.setParent(parent); + pointItem.redraw(); + assert.equal(pointItem.dom.dot.className, "vis-item vis-dot vis-editable"); + assert.equal(pointItem.dom.point.className, "vis-item vis-point vis-editable"); + }); +}); diff --git a/test/TestSupport.js b/test/TestSupport.js index 06d67852..d767c180 100644 --- a/test/TestSupport.js +++ b/test/TestSupport.js @@ -1,5 +1,20 @@ +var vis = require('../dist/vis'); +var DataSet = vis.DataSet; module.exports = { + buildMockItemSet: function() { + var itemset = { + dom: { + foreground: document.createElement('div'), + content: document.createElement('div') + }, + itemSet: { + itemsData: new DataSet() + } + }; + return itemset; + }, + buildSimpleTimelineRangeBody: function () { var body = { dom: { From 6acc7bdd8cae1c6467b45f9718227020d4114626 Mon Sep 17 00:00:00 2001 From: Richard van der Hoff Date: Wed, 22 Feb 2017 21:03:44 +0000 Subject: [PATCH 08/20] feat(network): Improve the performance of the network layout engine (#2729) * Improve the performance of the network layout engine Short-cut the execution of a number of methods in LayoutEngine to make them handle highly-connected graphs better. * Demonstrations of layouts of large networks --- examples/network/layout/demo.jsonp | 1894 +++++++++ examples/network/layout/demo_big.jsonp | 3762 +++++++++++++++++ .../hierarchicalLayoutBigUserDefined.html | 46 + lib/network/modules/LayoutEngine.js | 60 +- 4 files changed, 5741 insertions(+), 21 deletions(-) create mode 100644 examples/network/layout/demo.jsonp create mode 100644 examples/network/layout/demo_big.jsonp create mode 100644 examples/network/layout/hierarchicalLayoutBigUserDefined.html diff --git a/examples/network/layout/demo.jsonp b/examples/network/layout/demo.jsonp new file mode 100644 index 00000000..727db6fc --- /dev/null +++ b/examples/network/layout/demo.jsonp @@ -0,0 +1,1894 @@ +p( { + "nodes": [ + { + "level": 0, + "id": "0", + "label": "0" + }, + { + "level": 1, + "id": "1", + "label": "1" + }, + { + "level": 2, + "id": "2", + "label": "2" + }, + { + "level": 3, + "id": "3", + "label": "3" + }, + { + "level": 4, + "id": "4", + "label": "4" + }, + { + "level": 5, + "id": "5", + "label": "5" + }, + { + "level": 6, + "id": "6", + "label": "6" + }, + { + "level": 7, + "id": "7", + "label": "7" + }, + { + "level": 8, + "id": "8", + "label": "8" + }, + { + "level": 0, + "id": "9", + "label": "9" + }, + { + "level": 9, + "id": "10", + "label": "10" + }, + { + "level": 10, + "id": "11", + "label": "11" + }, + { + "level": 11, + "id": "12", + "label": "12" + }, + { + "level": 12, + "id": "13", + "label": "13" + }, + { + "level": 13, + "id": "14", + "label": "14" + }, + { + "level": 13, + "id": "15", + "label": "15" + }, + { + "level": 14, + "id": "16", + "label": "16" + }, + { + "level": 15, + "id": "17", + "label": "17" + }, + { + "level": 16, + "id": "18", + "label": "18" + }, + { + "level": 17, + "id": "19", + "label": "19" + }, + { + "level": 18, + "id": "20", + "label": "20" + }, + { + "level": 19, + "id": "21", + "label": "21" + }, + { + "level": 20, + "id": "22", + "label": "22" + }, + { + "level": 21, + "id": "23", + "label": "23" + }, + { + "level": 22, + "id": "24", + "label": "24" + }, + { + "level": 23, + "id": "25", + "label": "25" + }, + { + "level": 24, + "id": "26", + "label": "26" + }, + { + "level": 25, + "id": "27", + "label": "27" + }, + { + "level": 26, + "id": "28", + "label": "28" + }, + { + "level": 27, + "id": "29", + "label": "29" + }, + { + "level": 28, + "id": "30", + "label": "30" + }, + { + "level": 29, + "id": "31", + "label": "31" + }, + { + "level": 30, + "id": "32", + "label": "32" + }, + { + "level": 31, + "id": "33", + "label": "33" + }, + { + "level": 32, + "id": "34", + "label": "34" + }, + { + "level": 32, + "id": "35", + "label": "35" + }, + { + "level": 33, + "id": "36", + "label": "36" + }, + { + "level": 32, + "id": "37", + "label": "37" + }, + { + "level": 34, + "id": "38", + "label": "38" + }, + { + "level": 35, + "id": "39", + "label": "39" + }, + { + "level": 36, + "id": "40", + "label": "40" + }, + { + "level": 37, + "id": "41", + "label": "41" + }, + { + "level": 38, + "id": "42", + "label": "42" + }, + { + "level": 33, + "id": "43", + "label": "43" + }, + { + "level": 39, + "id": "44", + "label": "44" + }, + { + "level": 40, + "id": "45", + "label": "45" + }, + { + "level": 41, + "id": "46", + "label": "46" + }, + { + "level": 42, + "id": "47", + "label": "47" + }, + { + "level": 43, + "id": "48", + "label": "48" + }, + { + "level": 44, + "id": "49", + "label": "49" + }, + { + "level": 45, + "id": "50", + "label": "50" + }, + { + "level": 46, + "id": "51", + "label": "51" + }, + { + "level": 47, + "id": "52", + "label": "52" + }, + { + "level": 48, + "id": "53", + "label": "53" + }, + { + "level": 49, + "id": "54", + "label": "54" + }, + { + "level": 50, + "id": "55", + "label": "55" + }, + { + "level": 51, + "id": "56", + "label": "56" + }, + { + "level": 52, + "id": "57", + "label": "57" + }, + { + "level": 53, + "id": "58", + "label": "58" + }, + { + "level": 54, + "id": "59", + "label": "59" + }, + { + "level": 55, + "id": "60", + "label": "60" + }, + { + "level": 56, + "id": "61", + "label": "61" + }, + { + "level": 57, + "id": "62", + "label": "62" + }, + { + "level": 58, + "id": "63", + "label": "63" + }, + { + "level": 59, + "id": "64", + "label": "64" + }, + { + "level": 55, + "id": "65", + "label": "65" + }, + { + "level": 60, + "id": "66", + "label": "66" + }, + { + "level": 61, + "id": "67", + "label": "67" + }, + { + "level": 62, + "id": "68", + "label": "68" + }, + { + "level": 63, + "id": "69", + "label": "69" + }, + { + "level": 64, + "id": "70", + "label": "70" + }, + { + "level": 65, + "id": "71", + "label": "71" + }, + { + "level": 66, + "id": "72", + "label": "72" + }, + { + "level": 67, + "id": "73", + "label": "73" + }, + { + "level": 68, + "id": "74", + "label": "74" + }, + { + "level": 69, + "id": "75", + "label": "75" + }, + { + "level": 70, + "id": "76", + "label": "76" + }, + { + "level": 71, + "id": "77", + "label": "77" + }, + { + "level": 72, + "id": "78", + "label": "78" + }, + { + "level": 73, + "id": "79", + "label": "79" + }, + { + "level": 74, + "id": "80", + "label": "80" + }, + { + "level": 75, + "id": "81", + "label": "81" + }, + { + "level": 76, + "id": "82", + "label": "82" + }, + { + "level": 77, + "id": "83", + "label": "83" + }, + { + "level": 78, + "id": "84", + "label": "84" + }, + { + "level": 79, + "id": "85", + "label": "85" + }, + { + "level": 80, + "id": "86", + "label": "86" + }, + { + "level": 81, + "id": "87", + "label": "87" + }, + { + "level": 82, + "id": "88", + "label": "88" + }, + { + "level": 83, + "id": "89", + "label": "89" + }, + { + "level": 84, + "id": "90", + "label": "90" + }, + { + "level": 80, + "id": "91", + "label": "91" + }, + { + "level": 85, + "id": "92", + "label": "92" + }, + { + "level": 86, + "id": "93", + "label": "93" + }, + { + "level": 87, + "id": "94", + "label": "94" + }, + { + "level": 88, + "id": "95", + "label": "95" + }, + { + "level": 89, + "id": "96", + "label": "96" + }, + { + "level": 90, + "id": "97", + "label": "97" + }, + { + "level": 91, + "id": "98", + "label": "98" + }, + { + "level": 92, + "id": "99", + "label": "99" + }, + { + "level": 93, + "id": "100", + "label": "100" + }, + { + "level": 94, + "id": "101", + "label": "101" + }, + { + "level": 95, + "id": "102", + "label": "102" + }, + { + "level": 96, + "id": "103", + "label": "103" + }, + { + "level": 97, + "id": "104", + "label": "104" + }, + { + "level": 98, + "id": "105", + "label": "105" + }, + { + "level": 99, + "id": "106", + "label": "106" + }, + { + "level": 100, + "id": "107", + "label": "107" + }, + { + "level": 101, + "id": "108", + "label": "108" + }, + { + "level": 102, + "id": "109", + "label": "109" + }, + { + "level": 103, + "id": "110", + "label": "110" + }, + { + "level": 104, + "id": "111", + "label": "111" + }, + { + "level": 105, + "id": "112", + "label": "112" + }, + { + "level": 106, + "id": "113", + "label": "113" + }, + { + "level": 107, + "id": "114", + "label": "114" + }, + { + "level": 108, + "id": "115", + "label": "115" + }, + { + "level": 109, + "id": "116", + "label": "116" + }, + { + "level": 110, + "id": "117", + "label": "117" + }, + { + "level": 111, + "id": "118", + "label": "118" + }, + { + "level": 112, + "id": "119", + "label": "119" + }, + { + "level": 113, + "id": "120", + "label": "120" + }, + { + "level": 114, + "id": "121", + "label": "121" + }, + { + "level": 115, + "id": "122", + "label": "122" + }, + { + "level": 116, + "id": "123", + "label": "123" + }, + { + "level": 117, + "id": "124", + "label": "124" + }, + { + "level": 118, + "id": "125", + "label": "125" + }, + { + "level": 119, + "id": "126", + "label": "126" + }, + { + "level": 120, + "id": "127", + "label": "127" + }, + { + "level": 121, + "id": "128", + "label": "128" + }, + { + "level": 122, + "id": "129", + "label": "129" + }, + { + "level": 123, + "id": "130", + "label": "130" + }, + { + "level": 124, + "id": "131", + "label": "131" + }, + { + "level": 125, + "id": "132", + "label": "132" + }, + { + "level": 126, + "id": "133", + "label": "133" + }, + { + "level": 126, + "id": "134", + "label": "134" + }, + { + "level": 127, + "id": "135", + "label": "135" + }, + { + "level": 128, + "id": "136", + "label": "136" + }, + { + "level": 129, + "id": "137", + "label": "137" + }, + { + "level": 130, + "id": "138", + "label": "138" + }, + { + "level": 131, + "id": "139", + "label": "139" + }, + { + "level": 131, + "id": "140", + "label": "140" + }, + { + "level": 132, + "id": "141", + "label": "141" + }, + { + "level": 133, + "id": "142", + "label": "142" + }, + { + "level": 134, + "id": "143", + "label": "143" + }, + { + "level": 135, + "id": "144", + "label": "144" + }, + { + "level": 136, + "id": "145", + "label": "145" + }, + { + "level": 137, + "id": "146", + "label": "146" + }, + { + "level": 138, + "id": "147", + "label": "147" + }, + { + "level": 139, + "id": "148", + "label": "148" + }, + { + "level": 140, + "id": "149", + "label": "149" + }, + { + "level": 141, + "id": "150", + "label": "150" + }, + { + "level": 142, + "id": "151", + "label": "151" + }, + { + "level": 143, + "id": "152", + "label": "152" + }, + { + "level": 144, + "id": "153", + "label": "153" + }, + { + "level": 145, + "id": "154", + "label": "154" + }, + { + "level": 146, + "id": "155", + "label": "155" + }, + { + "level": 147, + "id": "156", + "label": "156" + }, + { + "level": 147, + "id": "157", + "label": "157" + }, + { + "level": 148, + "id": "158", + "label": "158" + }, + { + "level": 149, + "id": "159", + "label": "159" + }, + { + "level": 150, + "id": "160", + "label": "160" + }, + { + "level": 151, + "id": "161", + "label": "161" + }, + { + "level": 150, + "id": "162", + "label": "162" + }, + { + "level": 152, + "id": "163", + "label": "163" + }, + { + "level": 151, + "id": "164", + "label": "164" + }, + { + "level": 153, + "id": "165", + "label": "165" + }, + { + "level": 154, + "id": "166", + "label": "166" + }, + { + "level": 155, + "id": "167", + "label": "167" + }, + { + "level": 156, + "id": "168", + "label": "168" + }, + { + "level": 157, + "id": "169", + "label": "169" + }, + { + "level": 157, + "id": "170", + "label": "170" + }, + { + "level": 158, + "id": "171", + "label": "171" + }, + { + "level": 159, + "id": "172", + "label": "172" + }, + { + "level": 160, + "id": "173", + "label": "173" + }, + { + "level": 161, + "id": "174", + "label": "174" + }, + { + "level": 162, + "id": "175", + "label": "175" + }, + { + "level": 163, + "id": "176", + "label": "176" + }, + { + "level": 164, + "id": "177", + "label": "177" + }, + { + "level": 165, + "id": "178", + "label": "178" + }, + { + "level": 166, + "id": "179", + "label": "179" + }, + { + "level": 166, + "id": "180", + "label": "180" + }, + { + "level": 167, + "id": "181", + "label": "181" + }, + { + "level": 168, + "id": "182", + "label": "182" + }, + { + "level": 168, + "id": "183", + "label": "183" + }, + { + "level": 169, + "id": "184", + "label": "184" + }, + { + "level": 170, + "id": "185", + "label": "185" + }, + { + "level": 170, + "id": "186", + "label": "186" + }, + { + "level": 171, + "id": "187", + "label": "187" + }, + { + "level": 172, + "id": "188", + "label": "188" + }, + { + "level": 172, + "id": "189", + "label": "189" + }, + { + "level": 173, + "id": "190", + "label": "190" + }, + { + "level": 174, + "id": "191", + "label": "191" + }, + { + "level": 175, + "id": "192", + "label": "192" + }, + { + "level": 176, + "id": "193", + "label": "193" + }, + { + "level": 177, + "id": "194", + "label": "194" + }, + { + "level": 178, + "id": "195", + "label": "195" + }, + { + "level": 179, + "id": "196", + "label": "196" + }, + { + "level": 179, + "id": "197", + "label": "197" + }, + { + "level": 180, + "id": "198", + "label": "198" + }, + { + "level": 181, + "id": "199", + "label": "199" + } + ], + "edges": [ + { + "to": "0", + "from": "1" + }, + { + "to": "1", + "from": "2" + }, + { + "to": "2", + "from": "3" + }, + { + "to": "3", + "from": "4" + }, + { + "to": "4", + "from": "5" + }, + { + "to": "5", + "from": "6" + }, + { + "to": "6", + "from": "7" + }, + { + "to": "7", + "from": "8" + }, + { + "to": "8", + "from": "10" + }, + { + "to": "9", + "from": "11" + }, + { + "to": "10", + "from": "11" + }, + { + "to": "11", + "from": "12" + }, + { + "to": "12", + "from": "13" + }, + { + "to": "13", + "from": "15" + }, + { + "to": "13", + "from": "14" + }, + { + "to": "14", + "from": "16" + }, + { + "to": "15", + "from": "16" + }, + { + "to": "16", + "from": "17" + }, + { + "to": "17", + "from": "18" + }, + { + "to": "18", + "from": "19" + }, + { + "to": "19", + "from": "20" + }, + { + "to": "20", + "from": "21" + }, + { + "to": "21", + "from": "22" + }, + { + "to": "22", + "from": "23" + }, + { + "to": "23", + "from": "24" + }, + { + "to": "24", + "from": "25" + }, + { + "to": "25", + "from": "26" + }, + { + "to": "26", + "from": "27" + }, + { + "to": "27", + "from": "28" + }, + { + "to": "28", + "from": "29" + }, + { + "to": "29", + "from": "30" + }, + { + "to": "30", + "from": "31" + }, + { + "to": "31", + "from": "32" + }, + { + "to": "32", + "from": "33" + }, + { + "to": "33", + "from": "34" + }, + { + "to": "33", + "from": "35" + }, + { + "to": "33", + "from": "37" + }, + { + "to": "34", + "from": "36" + }, + { + "to": "34", + "from": "43" + }, + { + "to": "35", + "from": "36" + }, + { + "to": "35", + "from": "43" + }, + { + "to": "36", + "from": "38" + }, + { + "to": "37", + "from": "39" + }, + { + "to": "37", + "from": "43" + }, + { + "to": "38", + "from": "39" + }, + { + "to": "39", + "from": "40" + }, + { + "to": "40", + "from": "41" + }, + { + "to": "41", + "from": "42" + }, + { + "to": "42", + "from": "44" + }, + { + "to": "43", + "from": "45" + }, + { + "to": "44", + "from": "45" + }, + { + "to": "45", + "from": "46" + }, + { + "to": "46", + "from": "47" + }, + { + "to": "47", + "from": "48" + }, + { + "to": "48", + "from": "49" + }, + { + "to": "49", + "from": "50" + }, + { + "to": "50", + "from": "51" + }, + { + "to": "51", + "from": "52" + }, + { + "to": "52", + "from": "53" + }, + { + "to": "53", + "from": "54" + }, + { + "to": "54", + "from": "55" + }, + { + "to": "55", + "from": "56" + }, + { + "to": "56", + "from": "57" + }, + { + "to": "57", + "from": "58" + }, + { + "to": "58", + "from": "59" + }, + { + "to": "59", + "from": "60" + }, + { + "to": "59", + "from": "65" + }, + { + "to": "60", + "from": "61" + }, + { + "to": "61", + "from": "62" + }, + { + "to": "62", + "from": "63" + }, + { + "to": "63", + "from": "64" + }, + { + "to": "64", + "from": "66" + }, + { + "to": "65", + "from": "67" + }, + { + "to": "65", + "from": "124" + }, + { + "to": "66", + "from": "67" + }, + { + "to": "67", + "from": "68" + }, + { + "to": "68", + "from": "69" + }, + { + "to": "69", + "from": "70" + }, + { + "to": "70", + "from": "71" + }, + { + "to": "71", + "from": "72" + }, + { + "to": "72", + "from": "73" + }, + { + "to": "73", + "from": "74" + }, + { + "to": "74", + "from": "75" + }, + { + "to": "75", + "from": "76" + }, + { + "to": "76", + "from": "77" + }, + { + "to": "77", + "from": "78" + }, + { + "to": "78", + "from": "79" + }, + { + "to": "79", + "from": "80" + }, + { + "to": "80", + "from": "81" + }, + { + "to": "81", + "from": "82" + }, + { + "to": "82", + "from": "83" + }, + { + "to": "83", + "from": "84" + }, + { + "to": "84", + "from": "85" + }, + { + "to": "85", + "from": "91" + }, + { + "to": "85", + "from": "86" + }, + { + "to": "86", + "from": "87" + }, + { + "to": "87", + "from": "88" + }, + { + "to": "88", + "from": "89" + }, + { + "to": "89", + "from": "90" + }, + { + "to": "90", + "from": "92" + }, + { + "to": "91", + "from": "195" + }, + { + "to": "91", + "from": "93" + }, + { + "to": "91", + "from": "125" + }, + { + "to": "92", + "from": "93" + }, + { + "to": "93", + "from": "94" + }, + { + "to": "94", + "from": "95" + }, + { + "to": "95", + "from": "96" + }, + { + "to": "96", + "from": "97" + }, + { + "to": "97", + "from": "98" + }, + { + "to": "98", + "from": "99" + }, + { + "to": "99", + "from": "100" + }, + { + "to": "100", + "from": "101" + }, + { + "to": "101", + "from": "102" + }, + { + "to": "102", + "from": "103" + }, + { + "to": "103", + "from": "104" + }, + { + "to": "104", + "from": "105" + }, + { + "to": "105", + "from": "106" + }, + { + "to": "106", + "from": "107" + }, + { + "to": "107", + "from": "108" + }, + { + "to": "108", + "from": "109" + }, + { + "to": "109", + "from": "110" + }, + { + "to": "110", + "from": "111" + }, + { + "to": "111", + "from": "112" + }, + { + "to": "112", + "from": "113" + }, + { + "to": "113", + "from": "114" + }, + { + "to": "114", + "from": "115" + }, + { + "to": "115", + "from": "116" + }, + { + "to": "116", + "from": "117" + }, + { + "to": "117", + "from": "118" + }, + { + "to": "118", + "from": "119" + }, + { + "to": "119", + "from": "120" + }, + { + "to": "120", + "from": "121" + }, + { + "to": "121", + "from": "122" + }, + { + "to": "122", + "from": "123" + }, + { + "to": "123", + "from": "124" + }, + { + "to": "124", + "from": "125" + }, + { + "to": "125", + "from": "126" + }, + { + "to": "126", + "from": "127" + }, + { + "to": "127", + "from": "128" + }, + { + "to": "128", + "from": "129" + }, + { + "to": "129", + "from": "130" + }, + { + "to": "130", + "from": "131" + }, + { + "to": "131", + "from": "132" + }, + { + "to": "132", + "from": "134" + }, + { + "to": "132", + "from": "133" + }, + { + "to": "133", + "from": "135" + }, + { + "to": "134", + "from": "135" + }, + { + "to": "135", + "from": "136" + }, + { + "to": "136", + "from": "137" + }, + { + "to": "137", + "from": "138" + }, + { + "to": "138", + "from": "139" + }, + { + "to": "138", + "from": "140" + }, + { + "to": "139", + "from": "141" + }, + { + "to": "140", + "from": "141" + }, + { + "to": "141", + "from": "142" + }, + { + "to": "142", + "from": "143" + }, + { + "to": "143", + "from": "144" + }, + { + "to": "144", + "from": "145" + }, + { + "to": "145", + "from": "146" + }, + { + "to": "146", + "from": "147" + }, + { + "to": "147", + "from": "148" + }, + { + "to": "148", + "from": "149" + }, + { + "to": "149", + "from": "150" + }, + { + "to": "150", + "from": "151" + }, + { + "to": "151", + "from": "152" + }, + { + "to": "152", + "from": "153" + }, + { + "to": "153", + "from": "154" + }, + { + "to": "154", + "from": "155" + }, + { + "to": "155", + "from": "157" + }, + { + "to": "155", + "from": "156" + }, + { + "to": "156", + "from": "158" + }, + { + "to": "157", + "from": "158" + }, + { + "to": "158", + "from": "159" + }, + { + "to": "159", + "from": "162" + }, + { + "to": "159", + "from": "160" + }, + { + "to": "160", + "from": "164" + }, + { + "to": "160", + "from": "161" + }, + { + "to": "161", + "from": "163" + }, + { + "to": "162", + "from": "164" + }, + { + "to": "163", + "from": "165" + }, + { + "to": "164", + "from": "166" + }, + { + "to": "165", + "from": "166" + }, + { + "to": "166", + "from": "167" + }, + { + "to": "167", + "from": "168" + }, + { + "to": "168", + "from": "170" + }, + { + "to": "168", + "from": "169" + }, + { + "to": "169", + "from": "171" + }, + { + "to": "170", + "from": "171" + }, + { + "to": "171", + "from": "172" + }, + { + "to": "172", + "from": "173" + }, + { + "to": "173", + "from": "174" + }, + { + "to": "174", + "from": "175" + }, + { + "to": "175", + "from": "176" + }, + { + "to": "176", + "from": "177" + }, + { + "to": "177", + "from": "178" + }, + { + "to": "178", + "from": "180" + }, + { + "to": "178", + "from": "179" + }, + { + "to": "179", + "from": "181" + }, + { + "to": "180", + "from": "181" + }, + { + "to": "181", + "from": "183" + }, + { + "to": "181", + "from": "182" + }, + { + "to": "182", + "from": "184" + }, + { + "to": "183", + "from": "184" + }, + { + "to": "184", + "from": "186" + }, + { + "to": "184", + "from": "185" + }, + { + "to": "185", + "from": "187" + }, + { + "to": "186", + "from": "189" + }, + { + "to": "186", + "from": "188" + }, + { + "to": "187", + "from": "188" + }, + { + "to": "187", + "from": "189" + }, + { + "to": "188", + "from": "190" + }, + { + "to": "189", + "from": "191" + }, + { + "to": "190", + "from": "191" + }, + { + "to": "191", + "from": "192" + }, + { + "to": "192", + "from": "193" + }, + { + "to": "193", + "from": "194" + }, + { + "to": "194", + "from": "195" + }, + { + "to": "195", + "from": "197" + }, + { + "to": "195", + "from": "196" + }, + { + "to": "196", + "from": "198" + }, + { + "to": "197", + "from": "198" + }, + { + "to": "198", + "from": "199" + } + ] +} ); diff --git a/examples/network/layout/demo_big.jsonp b/examples/network/layout/demo_big.jsonp new file mode 100644 index 00000000..e9f2c0b9 --- /dev/null +++ b/examples/network/layout/demo_big.jsonp @@ -0,0 +1,3762 @@ +p( { + "nodes": [ + { + "level": 0, + "id": "0", + "label": "0" + }, + { + "level": 1, + "id": "1", + "label": "1" + }, + { + "level": 2, + "id": "2", + "label": "2" + }, + { + "level": 3, + "id": "3", + "label": "3" + }, + { + "level": 4, + "id": "4", + "label": "4" + }, + { + "level": 5, + "id": "5", + "label": "5" + }, + { + "level": 6, + "id": "6", + "label": "6" + }, + { + "level": 7, + "id": "7", + "label": "7" + }, + { + "level": 8, + "id": "8", + "label": "8" + }, + { + "level": 0, + "id": "9", + "label": "9" + }, + { + "level": 9, + "id": "10", + "label": "10" + }, + { + "level": 10, + "id": "11", + "label": "11" + }, + { + "level": 11, + "id": "12", + "label": "12" + }, + { + "level": 12, + "id": "13", + "label": "13" + }, + { + "level": 13, + "id": "14", + "label": "14" + }, + { + "level": 13, + "id": "15", + "label": "15" + }, + { + "level": 14, + "id": "16", + "label": "16" + }, + { + "level": 15, + "id": "17", + "label": "17" + }, + { + "level": 16, + "id": "18", + "label": "18" + }, + { + "level": 17, + "id": "19", + "label": "19" + }, + { + "level": 18, + "id": "20", + "label": "20" + }, + { + "level": 19, + "id": "21", + "label": "21" + }, + { + "level": 20, + "id": "22", + "label": "22" + }, + { + "level": 21, + "id": "23", + "label": "23" + }, + { + "level": 22, + "id": "24", + "label": "24" + }, + { + "level": 23, + "id": "25", + "label": "25" + }, + { + "level": 24, + "id": "26", + "label": "26" + }, + { + "level": 25, + "id": "27", + "label": "27" + }, + { + "level": 26, + "id": "28", + "label": "28" + }, + { + "level": 27, + "id": "29", + "label": "29" + }, + { + "level": 28, + "id": "30", + "label": "30" + }, + { + "level": 29, + "id": "31", + "label": "31" + }, + { + "level": 30, + "id": "32", + "label": "32" + }, + { + "level": 31, + "id": "33", + "label": "33" + }, + { + "level": 32, + "id": "34", + "label": "34" + }, + { + "level": 32, + "id": "35", + "label": "35" + }, + { + "level": 33, + "id": "36", + "label": "36" + }, + { + "level": 32, + "id": "37", + "label": "37" + }, + { + "level": 34, + "id": "38", + "label": "38" + }, + { + "level": 35, + "id": "39", + "label": "39" + }, + { + "level": 36, + "id": "40", + "label": "40" + }, + { + "level": 37, + "id": "41", + "label": "41" + }, + { + "level": 38, + "id": "42", + "label": "42" + }, + { + "level": 33, + "id": "43", + "label": "43" + }, + { + "level": 39, + "id": "44", + "label": "44" + }, + { + "level": 40, + "id": "45", + "label": "45" + }, + { + "level": 41, + "id": "46", + "label": "46" + }, + { + "level": 42, + "id": "47", + "label": "47" + }, + { + "level": 43, + "id": "48", + "label": "48" + }, + { + "level": 44, + "id": "49", + "label": "49" + }, + { + "level": 45, + "id": "50", + "label": "50" + }, + { + "level": 46, + "id": "51", + "label": "51" + }, + { + "level": 47, + "id": "52", + "label": "52" + }, + { + "level": 48, + "id": "53", + "label": "53" + }, + { + "level": 49, + "id": "54", + "label": "54" + }, + { + "level": 50, + "id": "55", + "label": "55" + }, + { + "level": 51, + "id": "56", + "label": "56" + }, + { + "level": 52, + "id": "57", + "label": "57" + }, + { + "level": 53, + "id": "58", + "label": "58" + }, + { + "level": 54, + "id": "59", + "label": "59" + }, + { + "level": 55, + "id": "60", + "label": "60" + }, + { + "level": 56, + "id": "61", + "label": "61" + }, + { + "level": 57, + "id": "62", + "label": "62" + }, + { + "level": 58, + "id": "63", + "label": "63" + }, + { + "level": 59, + "id": "64", + "label": "64" + }, + { + "level": 55, + "id": "65", + "label": "65" + }, + { + "level": 60, + "id": "66", + "label": "66" + }, + { + "level": 61, + "id": "67", + "label": "67" + }, + { + "level": 62, + "id": "68", + "label": "68" + }, + { + "level": 63, + "id": "69", + "label": "69" + }, + { + "level": 64, + "id": "70", + "label": "70" + }, + { + "level": 65, + "id": "71", + "label": "71" + }, + { + "level": 66, + "id": "72", + "label": "72" + }, + { + "level": 67, + "id": "73", + "label": "73" + }, + { + "level": 68, + "id": "74", + "label": "74" + }, + { + "level": 69, + "id": "75", + "label": "75" + }, + { + "level": 70, + "id": "76", + "label": "76" + }, + { + "level": 71, + "id": "77", + "label": "77" + }, + { + "level": 72, + "id": "78", + "label": "78" + }, + { + "level": 73, + "id": "79", + "label": "79" + }, + { + "level": 74, + "id": "80", + "label": "80" + }, + { + "level": 75, + "id": "81", + "label": "81" + }, + { + "level": 76, + "id": "82", + "label": "82" + }, + { + "level": 77, + "id": "83", + "label": "83" + }, + { + "level": 78, + "id": "84", + "label": "84" + }, + { + "level": 79, + "id": "85", + "label": "85" + }, + { + "level": 80, + "id": "86", + "label": "86" + }, + { + "level": 81, + "id": "87", + "label": "87" + }, + { + "level": 82, + "id": "88", + "label": "88" + }, + { + "level": 83, + "id": "89", + "label": "89" + }, + { + "level": 84, + "id": "90", + "label": "90" + }, + { + "level": 80, + "id": "91", + "label": "91" + }, + { + "level": 85, + "id": "92", + "label": "92" + }, + { + "level": 86, + "id": "93", + "label": "93" + }, + { + "level": 87, + "id": "94", + "label": "94" + }, + { + "level": 88, + "id": "95", + "label": "95" + }, + { + "level": 89, + "id": "96", + "label": "96" + }, + { + "level": 90, + "id": "97", + "label": "97" + }, + { + "level": 91, + "id": "98", + "label": "98" + }, + { + "level": 92, + "id": "99", + "label": "99" + }, + { + "level": 93, + "id": "100", + "label": "100" + }, + { + "level": 94, + "id": "101", + "label": "101" + }, + { + "level": 95, + "id": "102", + "label": "102" + }, + { + "level": 96, + "id": "103", + "label": "103" + }, + { + "level": 97, + "id": "104", + "label": "104" + }, + { + "level": 98, + "id": "105", + "label": "105" + }, + { + "level": 99, + "id": "106", + "label": "106" + }, + { + "level": 100, + "id": "107", + "label": "107" + }, + { + "level": 101, + "id": "108", + "label": "108" + }, + { + "level": 102, + "id": "109", + "label": "109" + }, + { + "level": 103, + "id": "110", + "label": "110" + }, + { + "level": 104, + "id": "111", + "label": "111" + }, + { + "level": 105, + "id": "112", + "label": "112" + }, + { + "level": 106, + "id": "113", + "label": "113" + }, + { + "level": 107, + "id": "114", + "label": "114" + }, + { + "level": 108, + "id": "115", + "label": "115" + }, + { + "level": 109, + "id": "116", + "label": "116" + }, + { + "level": 110, + "id": "117", + "label": "117" + }, + { + "level": 111, + "id": "118", + "label": "118" + }, + { + "level": 112, + "id": "119", + "label": "119" + }, + { + "level": 113, + "id": "120", + "label": "120" + }, + { + "level": 114, + "id": "121", + "label": "121" + }, + { + "level": 115, + "id": "122", + "label": "122" + }, + { + "level": 116, + "id": "123", + "label": "123" + }, + { + "level": 117, + "id": "124", + "label": "124" + }, + { + "level": 118, + "id": "125", + "label": "125" + }, + { + "level": 119, + "id": "126", + "label": "126" + }, + { + "level": 120, + "id": "127", + "label": "127" + }, + { + "level": 121, + "id": "128", + "label": "128" + }, + { + "level": 122, + "id": "129", + "label": "129" + }, + { + "level": 123, + "id": "130", + "label": "130" + }, + { + "level": 124, + "id": "131", + "label": "131" + }, + { + "level": 125, + "id": "132", + "label": "132" + }, + { + "level": 126, + "id": "133", + "label": "133" + }, + { + "level": 126, + "id": "134", + "label": "134" + }, + { + "level": 127, + "id": "135", + "label": "135" + }, + { + "level": 128, + "id": "136", + "label": "136" + }, + { + "level": 129, + "id": "137", + "label": "137" + }, + { + "level": 130, + "id": "138", + "label": "138" + }, + { + "level": 131, + "id": "139", + "label": "139" + }, + { + "level": 131, + "id": "140", + "label": "140" + }, + { + "level": 132, + "id": "141", + "label": "141" + }, + { + "level": 133, + "id": "142", + "label": "142" + }, + { + "level": 134, + "id": "143", + "label": "143" + }, + { + "level": 135, + "id": "144", + "label": "144" + }, + { + "level": 136, + "id": "145", + "label": "145" + }, + { + "level": 137, + "id": "146", + "label": "146" + }, + { + "level": 138, + "id": "147", + "label": "147" + }, + { + "level": 139, + "id": "148", + "label": "148" + }, + { + "level": 140, + "id": "149", + "label": "149" + }, + { + "level": 141, + "id": "150", + "label": "150" + }, + { + "level": 142, + "id": "151", + "label": "151" + }, + { + "level": 143, + "id": "152", + "label": "152" + }, + { + "level": 144, + "id": "153", + "label": "153" + }, + { + "level": 145, + "id": "154", + "label": "154" + }, + { + "level": 146, + "id": "155", + "label": "155" + }, + { + "level": 147, + "id": "156", + "label": "156" + }, + { + "level": 147, + "id": "157", + "label": "157" + }, + { + "level": 148, + "id": "158", + "label": "158" + }, + { + "level": 149, + "id": "159", + "label": "159" + }, + { + "level": 150, + "id": "160", + "label": "160" + }, + { + "level": 151, + "id": "161", + "label": "161" + }, + { + "level": 150, + "id": "162", + "label": "162" + }, + { + "level": 152, + "id": "163", + "label": "163" + }, + { + "level": 151, + "id": "164", + "label": "164" + }, + { + "level": 153, + "id": "165", + "label": "165" + }, + { + "level": 154, + "id": "166", + "label": "166" + }, + { + "level": 155, + "id": "167", + "label": "167" + }, + { + "level": 156, + "id": "168", + "label": "168" + }, + { + "level": 157, + "id": "169", + "label": "169" + }, + { + "level": 157, + "id": "170", + "label": "170" + }, + { + "level": 158, + "id": "171", + "label": "171" + }, + { + "level": 159, + "id": "172", + "label": "172" + }, + { + "level": 160, + "id": "173", + "label": "173" + }, + { + "level": 161, + "id": "174", + "label": "174" + }, + { + "level": 162, + "id": "175", + "label": "175" + }, + { + "level": 163, + "id": "176", + "label": "176" + }, + { + "level": 164, + "id": "177", + "label": "177" + }, + { + "level": 165, + "id": "178", + "label": "178" + }, + { + "level": 166, + "id": "179", + "label": "179" + }, + { + "level": 166, + "id": "180", + "label": "180" + }, + { + "level": 167, + "id": "181", + "label": "181" + }, + { + "level": 168, + "id": "182", + "label": "182" + }, + { + "level": 168, + "id": "183", + "label": "183" + }, + { + "level": 169, + "id": "184", + "label": "184" + }, + { + "level": 170, + "id": "185", + "label": "185" + }, + { + "level": 170, + "id": "186", + "label": "186" + }, + { + "level": 171, + "id": "187", + "label": "187" + }, + { + "level": 172, + "id": "188", + "label": "188" + }, + { + "level": 172, + "id": "189", + "label": "189" + }, + { + "level": 173, + "id": "190", + "label": "190" + }, + { + "level": 174, + "id": "191", + "label": "191" + }, + { + "level": 175, + "id": "192", + "label": "192" + }, + { + "level": 176, + "id": "193", + "label": "193" + }, + { + "level": 177, + "id": "194", + "label": "194" + }, + { + "level": 178, + "id": "195", + "label": "195" + }, + { + "level": 179, + "id": "196", + "label": "196" + }, + { + "level": 179, + "id": "197", + "label": "197" + }, + { + "level": 180, + "id": "198", + "label": "198" + }, + { + "level": 181, + "id": "199", + "label": "199" + }, + { + "level": 182, + "id": "200", + "label": "200" + }, + { + "level": 183, + "id": "201", + "label": "201" + }, + { + "level": 184, + "id": "202", + "label": "202" + }, + { + "level": 185, + "id": "203", + "label": "203" + }, + { + "level": 186, + "id": "204", + "label": "204" + }, + { + "level": 187, + "id": "205", + "label": "205" + }, + { + "level": 188, + "id": "206", + "label": "206" + }, + { + "level": 189, + "id": "207", + "label": "207" + }, + { + "level": 190, + "id": "208", + "label": "208" + }, + { + "level": 191, + "id": "209", + "label": "209" + }, + { + "level": 192, + "id": "210", + "label": "210" + }, + { + "level": 193, + "id": "211", + "label": "211" + }, + { + "level": 194, + "id": "212", + "label": "212" + }, + { + "level": 195, + "id": "213", + "label": "213" + }, + { + "level": 196, + "id": "214", + "label": "214" + }, + { + "level": 197, + "id": "215", + "label": "215" + }, + { + "level": 198, + "id": "216", + "label": "216" + }, + { + "level": 199, + "id": "217", + "label": "217" + }, + { + "level": 200, + "id": "218", + "label": "218" + }, + { + "level": 201, + "id": "219", + "label": "219" + }, + { + "level": 202, + "id": "220", + "label": "220" + }, + { + "level": 203, + "id": "221", + "label": "221" + }, + { + "level": 204, + "id": "222", + "label": "222" + }, + { + "level": 205, + "id": "223", + "label": "223" + }, + { + "level": 206, + "id": "224", + "label": "224" + }, + { + "level": 207, + "id": "225", + "label": "225" + }, + { + "level": 208, + "id": "226", + "label": "226" + }, + { + "level": 209, + "id": "227", + "label": "227" + }, + { + "level": 210, + "id": "228", + "label": "228" + }, + { + "level": 211, + "id": "229", + "label": "229" + }, + { + "level": 212, + "id": "230", + "label": "230" + }, + { + "level": 213, + "id": "231", + "label": "231" + }, + { + "level": 214, + "id": "232", + "label": "232" + }, + { + "level": 215, + "id": "233", + "label": "233" + }, + { + "level": 216, + "id": "234", + "label": "234" + }, + { + "level": 217, + "id": "235", + "label": "235" + }, + { + "level": 218, + "id": "236", + "label": "236" + }, + { + "level": 219, + "id": "237", + "label": "237" + }, + { + "level": 220, + "id": "238", + "label": "238" + }, + { + "level": 221, + "id": "239", + "label": "239" + }, + { + "level": 222, + "id": "240", + "label": "240" + }, + { + "level": 223, + "id": "241", + "label": "241" + }, + { + "level": 212, + "id": "242", + "label": "242" + }, + { + "level": 213, + "id": "243", + "label": "243" + }, + { + "level": 214, + "id": "244", + "label": "244" + }, + { + "level": 215, + "id": "245", + "label": "245" + }, + { + "level": 215, + "id": "246", + "label": "246" + }, + { + "level": 216, + "id": "247", + "label": "247" + }, + { + "level": 217, + "id": "248", + "label": "248" + }, + { + "level": 218, + "id": "249", + "label": "249" + }, + { + "level": 219, + "id": "250", + "label": "250" + }, + { + "level": 220, + "id": "251", + "label": "251" + }, + { + "level": 221, + "id": "252", + "label": "252" + }, + { + "level": 222, + "id": "253", + "label": "253" + }, + { + "level": 223, + "id": "254", + "label": "254" + }, + { + "level": 223, + "id": "255", + "label": "255" + }, + { + "level": 224, + "id": "256", + "label": "256" + }, + { + "level": 225, + "id": "257", + "label": "257" + }, + { + "level": 226, + "id": "258", + "label": "258" + }, + { + "level": 227, + "id": "259", + "label": "259" + }, + { + "level": 228, + "id": "260", + "label": "260" + }, + { + "level": 229, + "id": "261", + "label": "261" + }, + { + "level": 230, + "id": "262", + "label": "262" + }, + { + "level": 231, + "id": "263", + "label": "263" + }, + { + "level": 232, + "id": "264", + "label": "264" + }, + { + "level": 233, + "id": "265", + "label": "265" + }, + { + "level": 234, + "id": "266", + "label": "266" + }, + { + "level": 235, + "id": "267", + "label": "267" + }, + { + "level": 234, + "id": "268", + "label": "268" + }, + { + "level": 236, + "id": "269", + "label": "269" + }, + { + "level": 237, + "id": "270", + "label": "270" + }, + { + "level": 238, + "id": "271", + "label": "271" + }, + { + "level": 239, + "id": "272", + "label": "272" + }, + { + "level": 240, + "id": "273", + "label": "273" + }, + { + "level": 241, + "id": "274", + "label": "274" + }, + { + "level": 242, + "id": "275", + "label": "275" + }, + { + "level": 243, + "id": "276", + "label": "276" + }, + { + "level": 244, + "id": "277", + "label": "277" + }, + { + "level": 245, + "id": "278", + "label": "278" + }, + { + "level": 246, + "id": "279", + "label": "279" + }, + { + "level": 246, + "id": "280", + "label": "280" + }, + { + "level": 247, + "id": "281", + "label": "281" + }, + { + "level": 247, + "id": "282", + "label": "282" + }, + { + "level": 248, + "id": "283", + "label": "283" + }, + { + "level": 248, + "id": "284", + "label": "284" + }, + { + "level": 249, + "id": "285", + "label": "285" + }, + { + "level": 249, + "id": "286", + "label": "286" + }, + { + "level": 250, + "id": "287", + "label": "287" + }, + { + "level": 251, + "id": "288", + "label": "288" + }, + { + "level": 252, + "id": "289", + "label": "289" + }, + { + "level": 253, + "id": "290", + "label": "290" + }, + { + "level": 254, + "id": "291", + "label": "291" + }, + { + "level": 255, + "id": "292", + "label": "292" + }, + { + "level": 256, + "id": "293", + "label": "293" + }, + { + "level": 257, + "id": "294", + "label": "294" + }, + { + "level": 258, + "id": "295", + "label": "295" + }, + { + "level": 259, + "id": "296", + "label": "296" + }, + { + "level": 260, + "id": "297", + "label": "297" + }, + { + "level": 261, + "id": "298", + "label": "298" + }, + { + "level": 262, + "id": "299", + "label": "299" + }, + { + "level": 263, + "id": "300", + "label": "300" + }, + { + "level": 264, + "id": "301", + "label": "301" + }, + { + "level": 265, + "id": "302", + "label": "302" + }, + { + "level": 266, + "id": "303", + "label": "303" + }, + { + "level": 267, + "id": "304", + "label": "304" + }, + { + "level": 268, + "id": "305", + "label": "305" + }, + { + "level": 269, + "id": "306", + "label": "306" + }, + { + "level": 270, + "id": "307", + "label": "307" + }, + { + "level": 271, + "id": "308", + "label": "308" + }, + { + "level": 272, + "id": "309", + "label": "309" + }, + { + "level": 273, + "id": "310", + "label": "310" + }, + { + "level": 274, + "id": "311", + "label": "311" + }, + { + "level": 275, + "id": "312", + "label": "312" + }, + { + "level": 276, + "id": "313", + "label": "313" + }, + { + "level": 277, + "id": "314", + "label": "314" + }, + { + "level": 278, + "id": "315", + "label": "315" + }, + { + "level": 279, + "id": "316", + "label": "316" + }, + { + "level": 280, + "id": "317", + "label": "317" + }, + { + "level": 280, + "id": "318", + "label": "318" + }, + { + "level": 281, + "id": "319", + "label": "319" + }, + { + "level": 282, + "id": "320", + "label": "320" + }, + { + "level": 283, + "id": "321", + "label": "321" + }, + { + "level": 284, + "id": "322", + "label": "322" + }, + { + "level": 285, + "id": "323", + "label": "323" + }, + { + "level": 286, + "id": "324", + "label": "324" + }, + { + "level": 287, + "id": "325", + "label": "325" + }, + { + "level": 288, + "id": "326", + "label": "326" + }, + { + "level": 289, + "id": "327", + "label": "327" + }, + { + "level": 290, + "id": "328", + "label": "328" + }, + { + "level": 291, + "id": "329", + "label": "329" + }, + { + "level": 292, + "id": "330", + "label": "330" + }, + { + "level": 293, + "id": "331", + "label": "331" + }, + { + "level": 281, + "id": "332", + "label": "332" + }, + { + "level": 282, + "id": "333", + "label": "333" + }, + { + "level": 283, + "id": "334", + "label": "334" + }, + { + "level": 284, + "id": "335", + "label": "335" + }, + { + "level": 285, + "id": "336", + "label": "336" + }, + { + "level": 286, + "id": "337", + "label": "337" + }, + { + "level": 287, + "id": "338", + "label": "338" + }, + { + "level": 288, + "id": "339", + "label": "339" + }, + { + "level": 289, + "id": "340", + "label": "340" + }, + { + "level": 290, + "id": "341", + "label": "341" + }, + { + "level": 291, + "id": "342", + "label": "342" + }, + { + "level": 292, + "id": "343", + "label": "343" + }, + { + "level": 293, + "id": "344", + "label": "344" + }, + { + "level": 294, + "id": "345", + "label": "345" + }, + { + "level": 295, + "id": "346", + "label": "346" + }, + { + "level": 296, + "id": "347", + "label": "347" + }, + { + "level": 297, + "id": "348", + "label": "348" + }, + { + "level": 298, + "id": "349", + "label": "349" + }, + { + "level": 299, + "id": "350", + "label": "350" + }, + { + "level": 300, + "id": "351", + "label": "351" + }, + { + "level": 301, + "id": "352", + "label": "352" + }, + { + "level": 302, + "id": "353", + "label": "353" + }, + { + "level": 303, + "id": "354", + "label": "354" + }, + { + "level": 304, + "id": "355", + "label": "355" + }, + { + "level": 305, + "id": "356", + "label": "356" + }, + { + "level": 306, + "id": "357", + "label": "357" + }, + { + "level": 307, + "id": "358", + "label": "358" + }, + { + "level": 308, + "id": "359", + "label": "359" + }, + { + "level": 309, + "id": "360", + "label": "360" + }, + { + "level": 310, + "id": "361", + "label": "361" + }, + { + "level": 311, + "id": "362", + "label": "362" + }, + { + "level": 312, + "id": "363", + "label": "363" + }, + { + "level": 313, + "id": "364", + "label": "364" + }, + { + "level": 314, + "id": "365", + "label": "365" + }, + { + "level": 315, + "id": "366", + "label": "366" + }, + { + "level": 316, + "id": "367", + "label": "367" + }, + { + "level": 317, + "id": "368", + "label": "368" + }, + { + "level": 318, + "id": "369", + "label": "369" + }, + { + "level": 319, + "id": "370", + "label": "370" + }, + { + "level": 320, + "id": "371", + "label": "371" + }, + { + "level": 321, + "id": "372", + "label": "372" + }, + { + "level": 322, + "id": "373", + "label": "373" + }, + { + "level": 323, + "id": "374", + "label": "374" + }, + { + "level": 324, + "id": "375", + "label": "375" + }, + { + "level": 325, + "id": "376", + "label": "376" + }, + { + "level": 326, + "id": "377", + "label": "377" + }, + { + "level": 327, + "id": "378", + "label": "378" + }, + { + "level": 328, + "id": "379", + "label": "379" + }, + { + "level": 329, + "id": "380", + "label": "380" + }, + { + "level": 330, + "id": "381", + "label": "381" + }, + { + "level": 331, + "id": "382", + "label": "382" + }, + { + "level": 332, + "id": "383", + "label": "383" + }, + { + "level": 333, + "id": "384", + "label": "384" + }, + { + "level": 334, + "id": "385", + "label": "385" + }, + { + "level": 14, + "id": "386", + "label": "386" + }, + { + "level": 335, + "id": "387", + "label": "387" + }, + { + "level": 15, + "id": "388", + "label": "388" + }, + { + "level": 336, + "id": "389", + "label": "389" + }, + { + "level": 337, + "id": "390", + "label": "390" + }, + { + "level": 338, + "id": "391", + "label": "391" + }, + { + "level": 339, + "id": "392", + "label": "392" + }, + { + "level": 340, + "id": "393", + "label": "393" + }, + { + "level": 341, + "id": "394", + "label": "394" + }, + { + "level": 342, + "id": "395", + "label": "395" + }, + { + "level": 343, + "id": "396", + "label": "396" + }, + { + "level": 344, + "id": "397", + "label": "397" + }, + { + "level": 345, + "id": "398", + "label": "398" + }, + { + "level": 346, + "id": "399", + "label": "399" + } + ], + "edges": [ + { + "to": "0", + "from": "1" + }, + { + "to": "1", + "from": "2" + }, + { + "to": "2", + "from": "3" + }, + { + "to": "3", + "from": "4" + }, + { + "to": "4", + "from": "5" + }, + { + "to": "5", + "from": "6" + }, + { + "to": "6", + "from": "7" + }, + { + "to": "7", + "from": "8" + }, + { + "to": "8", + "from": "10" + }, + { + "to": "9", + "from": "11" + }, + { + "to": "10", + "from": "11" + }, + { + "to": "11", + "from": "12" + }, + { + "to": "12", + "from": "13" + }, + { + "to": "13", + "from": "15" + }, + { + "to": "13", + "from": "14" + }, + { + "to": "14", + "from": "386" + }, + { + "to": "14", + "from": "16" + }, + { + "to": "15", + "from": "386" + }, + { + "to": "15", + "from": "16" + }, + { + "to": "16", + "from": "17" + }, + { + "to": "17", + "from": "18" + }, + { + "to": "18", + "from": "19" + }, + { + "to": "19", + "from": "20" + }, + { + "to": "20", + "from": "21" + }, + { + "to": "21", + "from": "22" + }, + { + "to": "22", + "from": "23" + }, + { + "to": "23", + "from": "24" + }, + { + "to": "24", + "from": "25" + }, + { + "to": "25", + "from": "26" + }, + { + "to": "26", + "from": "27" + }, + { + "to": "27", + "from": "28" + }, + { + "to": "28", + "from": "29" + }, + { + "to": "29", + "from": "30" + }, + { + "to": "30", + "from": "31" + }, + { + "to": "31", + "from": "32" + }, + { + "to": "32", + "from": "33" + }, + { + "to": "33", + "from": "34" + }, + { + "to": "33", + "from": "35" + }, + { + "to": "33", + "from": "37" + }, + { + "to": "34", + "from": "36" + }, + { + "to": "34", + "from": "43" + }, + { + "to": "35", + "from": "36" + }, + { + "to": "35", + "from": "43" + }, + { + "to": "36", + "from": "38" + }, + { + "to": "37", + "from": "39" + }, + { + "to": "37", + "from": "43" + }, + { + "to": "38", + "from": "39" + }, + { + "to": "39", + "from": "40" + }, + { + "to": "40", + "from": "41" + }, + { + "to": "41", + "from": "42" + }, + { + "to": "42", + "from": "44" + }, + { + "to": "43", + "from": "45" + }, + { + "to": "44", + "from": "45" + }, + { + "to": "45", + "from": "46" + }, + { + "to": "46", + "from": "47" + }, + { + "to": "47", + "from": "48" + }, + { + "to": "48", + "from": "49" + }, + { + "to": "49", + "from": "50" + }, + { + "to": "50", + "from": "51" + }, + { + "to": "51", + "from": "52" + }, + { + "to": "52", + "from": "53" + }, + { + "to": "53", + "from": "54" + }, + { + "to": "54", + "from": "55" + }, + { + "to": "55", + "from": "56" + }, + { + "to": "56", + "from": "57" + }, + { + "to": "57", + "from": "58" + }, + { + "to": "58", + "from": "59" + }, + { + "to": "59", + "from": "60" + }, + { + "to": "59", + "from": "65" + }, + { + "to": "60", + "from": "61" + }, + { + "to": "61", + "from": "62" + }, + { + "to": "62", + "from": "63" + }, + { + "to": "63", + "from": "64" + }, + { + "to": "64", + "from": "66" + }, + { + "to": "65", + "from": "67" + }, + { + "to": "65", + "from": "124" + }, + { + "to": "65", + "from": "229" + }, + { + "to": "65", + "from": "322" + }, + { + "to": "65", + "from": "363" + }, + { + "to": "66", + "from": "67" + }, + { + "to": "67", + "from": "68" + }, + { + "to": "68", + "from": "69" + }, + { + "to": "69", + "from": "70" + }, + { + "to": "70", + "from": "71" + }, + { + "to": "71", + "from": "72" + }, + { + "to": "72", + "from": "73" + }, + { + "to": "73", + "from": "74" + }, + { + "to": "74", + "from": "75" + }, + { + "to": "75", + "from": "76" + }, + { + "to": "76", + "from": "77" + }, + { + "to": "77", + "from": "78" + }, + { + "to": "78", + "from": "79" + }, + { + "to": "79", + "from": "80" + }, + { + "to": "80", + "from": "81" + }, + { + "to": "81", + "from": "82" + }, + { + "to": "82", + "from": "83" + }, + { + "to": "83", + "from": "84" + }, + { + "to": "84", + "from": "85" + }, + { + "to": "85", + "from": "91" + }, + { + "to": "85", + "from": "86" + }, + { + "to": "86", + "from": "87" + }, + { + "to": "87", + "from": "88" + }, + { + "to": "88", + "from": "89" + }, + { + "to": "89", + "from": "90" + }, + { + "to": "90", + "from": "92" + }, + { + "to": "91", + "from": "195" + }, + { + "to": "91", + "from": "93" + }, + { + "to": "91", + "from": "397" + }, + { + "to": "91", + "from": "233" + }, + { + "to": "91", + "from": "125" + }, + { + "to": "92", + "from": "93" + }, + { + "to": "93", + "from": "94" + }, + { + "to": "94", + "from": "95" + }, + { + "to": "95", + "from": "96" + }, + { + "to": "96", + "from": "97" + }, + { + "to": "97", + "from": "98" + }, + { + "to": "98", + "from": "99" + }, + { + "to": "99", + "from": "100" + }, + { + "to": "100", + "from": "101" + }, + { + "to": "101", + "from": "102" + }, + { + "to": "102", + "from": "103" + }, + { + "to": "103", + "from": "104" + }, + { + "to": "104", + "from": "105" + }, + { + "to": "105", + "from": "106" + }, + { + "to": "106", + "from": "107" + }, + { + "to": "107", + "from": "108" + }, + { + "to": "108", + "from": "109" + }, + { + "to": "109", + "from": "110" + }, + { + "to": "110", + "from": "111" + }, + { + "to": "111", + "from": "112" + }, + { + "to": "112", + "from": "113" + }, + { + "to": "113", + "from": "114" + }, + { + "to": "114", + "from": "115" + }, + { + "to": "115", + "from": "116" + }, + { + "to": "116", + "from": "117" + }, + { + "to": "117", + "from": "118" + }, + { + "to": "118", + "from": "119" + }, + { + "to": "119", + "from": "120" + }, + { + "to": "120", + "from": "121" + }, + { + "to": "121", + "from": "122" + }, + { + "to": "122", + "from": "123" + }, + { + "to": "123", + "from": "124" + }, + { + "to": "124", + "from": "125" + }, + { + "to": "125", + "from": "126" + }, + { + "to": "126", + "from": "127" + }, + { + "to": "127", + "from": "128" + }, + { + "to": "128", + "from": "129" + }, + { + "to": "129", + "from": "130" + }, + { + "to": "130", + "from": "131" + }, + { + "to": "131", + "from": "132" + }, + { + "to": "132", + "from": "134" + }, + { + "to": "132", + "from": "133" + }, + { + "to": "133", + "from": "135" + }, + { + "to": "134", + "from": "135" + }, + { + "to": "135", + "from": "136" + }, + { + "to": "136", + "from": "137" + }, + { + "to": "137", + "from": "138" + }, + { + "to": "138", + "from": "139" + }, + { + "to": "138", + "from": "140" + }, + { + "to": "139", + "from": "141" + }, + { + "to": "140", + "from": "141" + }, + { + "to": "141", + "from": "142" + }, + { + "to": "142", + "from": "143" + }, + { + "to": "143", + "from": "144" + }, + { + "to": "144", + "from": "145" + }, + { + "to": "145", + "from": "146" + }, + { + "to": "146", + "from": "147" + }, + { + "to": "147", + "from": "148" + }, + { + "to": "148", + "from": "149" + }, + { + "to": "149", + "from": "150" + }, + { + "to": "150", + "from": "151" + }, + { + "to": "151", + "from": "152" + }, + { + "to": "152", + "from": "153" + }, + { + "to": "153", + "from": "154" + }, + { + "to": "154", + "from": "155" + }, + { + "to": "155", + "from": "157" + }, + { + "to": "155", + "from": "156" + }, + { + "to": "156", + "from": "158" + }, + { + "to": "157", + "from": "158" + }, + { + "to": "158", + "from": "159" + }, + { + "to": "159", + "from": "162" + }, + { + "to": "159", + "from": "160" + }, + { + "to": "160", + "from": "164" + }, + { + "to": "160", + "from": "161" + }, + { + "to": "161", + "from": "163" + }, + { + "to": "162", + "from": "164" + }, + { + "to": "163", + "from": "165" + }, + { + "to": "164", + "from": "166" + }, + { + "to": "165", + "from": "166" + }, + { + "to": "166", + "from": "167" + }, + { + "to": "167", + "from": "168" + }, + { + "to": "168", + "from": "170" + }, + { + "to": "168", + "from": "169" + }, + { + "to": "169", + "from": "171" + }, + { + "to": "170", + "from": "171" + }, + { + "to": "171", + "from": "172" + }, + { + "to": "172", + "from": "173" + }, + { + "to": "173", + "from": "174" + }, + { + "to": "174", + "from": "175" + }, + { + "to": "175", + "from": "176" + }, + { + "to": "176", + "from": "177" + }, + { + "to": "177", + "from": "178" + }, + { + "to": "178", + "from": "180" + }, + { + "to": "178", + "from": "179" + }, + { + "to": "179", + "from": "181" + }, + { + "to": "180", + "from": "181" + }, + { + "to": "181", + "from": "183" + }, + { + "to": "181", + "from": "182" + }, + { + "to": "182", + "from": "184" + }, + { + "to": "183", + "from": "184" + }, + { + "to": "184", + "from": "186" + }, + { + "to": "184", + "from": "185" + }, + { + "to": "185", + "from": "187" + }, + { + "to": "186", + "from": "189" + }, + { + "to": "186", + "from": "188" + }, + { + "to": "187", + "from": "188" + }, + { + "to": "187", + "from": "189" + }, + { + "to": "188", + "from": "190" + }, + { + "to": "189", + "from": "191" + }, + { + "to": "190", + "from": "191" + }, + { + "to": "191", + "from": "192" + }, + { + "to": "192", + "from": "193" + }, + { + "to": "193", + "from": "194" + }, + { + "to": "194", + "from": "195" + }, + { + "to": "195", + "from": "197" + }, + { + "to": "195", + "from": "196" + }, + { + "to": "196", + "from": "198" + }, + { + "to": "197", + "from": "198" + }, + { + "to": "198", + "from": "199" + }, + { + "to": "199", + "from": "200" + }, + { + "to": "200", + "from": "201" + }, + { + "to": "201", + "from": "202" + }, + { + "to": "202", + "from": "203" + }, + { + "to": "203", + "from": "204" + }, + { + "to": "204", + "from": "205" + }, + { + "to": "205", + "from": "206" + }, + { + "to": "206", + "from": "207" + }, + { + "to": "207", + "from": "208" + }, + { + "to": "208", + "from": "209" + }, + { + "to": "209", + "from": "210" + }, + { + "to": "210", + "from": "211" + }, + { + "to": "211", + "from": "212" + }, + { + "to": "212", + "from": "213" + }, + { + "to": "213", + "from": "214" + }, + { + "to": "214", + "from": "215" + }, + { + "to": "215", + "from": "216" + }, + { + "to": "216", + "from": "217" + }, + { + "to": "217", + "from": "218" + }, + { + "to": "218", + "from": "219" + }, + { + "to": "219", + "from": "220" + }, + { + "to": "220", + "from": "221" + }, + { + "to": "221", + "from": "222" + }, + { + "to": "222", + "from": "223" + }, + { + "to": "223", + "from": "224" + }, + { + "to": "224", + "from": "225" + }, + { + "to": "225", + "from": "226" + }, + { + "to": "226", + "from": "227" + }, + { + "to": "227", + "from": "228" + }, + { + "to": "228", + "from": "229" + }, + { + "to": "229", + "from": "230" + }, + { + "to": "229", + "from": "242" + }, + { + "to": "230", + "from": "231" + }, + { + "to": "231", + "from": "232" + }, + { + "to": "232", + "from": "233" + }, + { + "to": "233", + "from": "234" + }, + { + "to": "234", + "from": "235" + }, + { + "to": "235", + "from": "236" + }, + { + "to": "236", + "from": "237" + }, + { + "to": "237", + "from": "238" + }, + { + "to": "238", + "from": "239" + }, + { + "to": "239", + "from": "240" + }, + { + "to": "240", + "from": "241" + }, + { + "to": "242", + "from": "243" + }, + { + "to": "243", + "from": "244" + }, + { + "to": "244", + "from": "246" + }, + { + "to": "244", + "from": "245" + }, + { + "to": "245", + "from": "247" + }, + { + "to": "246", + "from": "247" + }, + { + "to": "247", + "from": "248" + }, + { + "to": "248", + "from": "249" + }, + { + "to": "249", + "from": "250" + }, + { + "to": "250", + "from": "251" + }, + { + "to": "251", + "from": "252" + }, + { + "to": "252", + "from": "253" + }, + { + "to": "253", + "from": "254" + }, + { + "to": "253", + "from": "255" + }, + { + "to": "254", + "from": "256" + }, + { + "to": "255", + "from": "256" + }, + { + "to": "256", + "from": "257" + }, + { + "to": "257", + "from": "258" + }, + { + "to": "258", + "from": "259" + }, + { + "to": "259", + "from": "260" + }, + { + "to": "260", + "from": "261" + }, + { + "to": "261", + "from": "262" + }, + { + "to": "262", + "from": "263" + }, + { + "to": "263", + "from": "264" + }, + { + "to": "264", + "from": "265" + }, + { + "to": "265", + "from": "268" + }, + { + "to": "265", + "from": "266" + }, + { + "to": "266", + "from": "267" + }, + { + "to": "267", + "from": "269" + }, + { + "to": "268", + "from": "269" + }, + { + "to": "269", + "from": "270" + }, + { + "to": "270", + "from": "271" + }, + { + "to": "271", + "from": "272" + }, + { + "to": "272", + "from": "273" + }, + { + "to": "273", + "from": "274" + }, + { + "to": "274", + "from": "275" + }, + { + "to": "275", + "from": "276" + }, + { + "to": "276", + "from": "277" + }, + { + "to": "277", + "from": "278" + }, + { + "to": "278", + "from": "280" + }, + { + "to": "278", + "from": "279" + }, + { + "to": "279", + "from": "282" + }, + { + "to": "280", + "from": "281" + }, + { + "to": "280", + "from": "282" + }, + { + "to": "281", + "from": "284" + }, + { + "to": "281", + "from": "283" + }, + { + "to": "282", + "from": "284" + }, + { + "to": "282", + "from": "283" + }, + { + "to": "283", + "from": "286" + }, + { + "to": "283", + "from": "285" + }, + { + "to": "284", + "from": "286" + }, + { + "to": "284", + "from": "285" + }, + { + "to": "285", + "from": "287" + }, + { + "to": "286", + "from": "287" + }, + { + "to": "287", + "from": "288" + }, + { + "to": "288", + "from": "289" + }, + { + "to": "289", + "from": "290" + }, + { + "to": "290", + "from": "291" + }, + { + "to": "291", + "from": "292" + }, + { + "to": "292", + "from": "293" + }, + { + "to": "293", + "from": "294" + }, + { + "to": "294", + "from": "295" + }, + { + "to": "295", + "from": "296" + }, + { + "to": "296", + "from": "297" + }, + { + "to": "297", + "from": "298" + }, + { + "to": "298", + "from": "299" + }, + { + "to": "299", + "from": "300" + }, + { + "to": "300", + "from": "301" + }, + { + "to": "301", + "from": "302" + }, + { + "to": "302", + "from": "303" + }, + { + "to": "303", + "from": "304" + }, + { + "to": "304", + "from": "305" + }, + { + "to": "305", + "from": "306" + }, + { + "to": "306", + "from": "307" + }, + { + "to": "307", + "from": "308" + }, + { + "to": "308", + "from": "309" + }, + { + "to": "309", + "from": "310" + }, + { + "to": "310", + "from": "311" + }, + { + "to": "311", + "from": "312" + }, + { + "to": "312", + "from": "313" + }, + { + "to": "313", + "from": "314" + }, + { + "to": "314", + "from": "315" + }, + { + "to": "315", + "from": "316" + }, + { + "to": "316", + "from": "317" + }, + { + "to": "316", + "from": "318" + }, + { + "to": "317", + "from": "332" + }, + { + "to": "317", + "from": "319" + }, + { + "to": "318", + "from": "319" + }, + { + "to": "319", + "from": "320" + }, + { + "to": "320", + "from": "321" + }, + { + "to": "321", + "from": "322" + }, + { + "to": "322", + "from": "323" + }, + { + "to": "323", + "from": "324" + }, + { + "to": "324", + "from": "325" + }, + { + "to": "325", + "from": "326" + }, + { + "to": "326", + "from": "327" + }, + { + "to": "327", + "from": "328" + }, + { + "to": "328", + "from": "329" + }, + { + "to": "329", + "from": "330" + }, + { + "to": "330", + "from": "331" + }, + { + "to": "332", + "from": "333" + }, + { + "to": "333", + "from": "334" + }, + { + "to": "334", + "from": "335" + }, + { + "to": "335", + "from": "336" + }, + { + "to": "336", + "from": "337" + }, + { + "to": "337", + "from": "338" + }, + { + "to": "338", + "from": "339" + }, + { + "to": "339", + "from": "340" + }, + { + "to": "340", + "from": "341" + }, + { + "to": "341", + "from": "342" + }, + { + "to": "342", + "from": "343" + }, + { + "to": "343", + "from": "344" + }, + { + "to": "344", + "from": "345" + }, + { + "to": "345", + "from": "346" + }, + { + "to": "346", + "from": "347" + }, + { + "to": "347", + "from": "348" + }, + { + "to": "348", + "from": "349" + }, + { + "to": "349", + "from": "350" + }, + { + "to": "350", + "from": "351" + }, + { + "to": "351", + "from": "352" + }, + { + "to": "352", + "from": "353" + }, + { + "to": "353", + "from": "354" + }, + { + "to": "354", + "from": "355" + }, + { + "to": "355", + "from": "356" + }, + { + "to": "356", + "from": "357" + }, + { + "to": "357", + "from": "358" + }, + { + "to": "358", + "from": "359" + }, + { + "to": "359", + "from": "360" + }, + { + "to": "360", + "from": "361" + }, + { + "to": "361", + "from": "362" + }, + { + "to": "362", + "from": "363" + }, + { + "to": "363", + "from": "364" + }, + { + "to": "364", + "from": "365" + }, + { + "to": "365", + "from": "366" + }, + { + "to": "366", + "from": "367" + }, + { + "to": "367", + "from": "368" + }, + { + "to": "368", + "from": "369" + }, + { + "to": "369", + "from": "370" + }, + { + "to": "370", + "from": "371" + }, + { + "to": "371", + "from": "372" + }, + { + "to": "372", + "from": "373" + }, + { + "to": "373", + "from": "374" + }, + { + "to": "374", + "from": "375" + }, + { + "to": "375", + "from": "376" + }, + { + "to": "376", + "from": "377" + }, + { + "to": "377", + "from": "378" + }, + { + "to": "378", + "from": "379" + }, + { + "to": "379", + "from": "380" + }, + { + "to": "380", + "from": "381" + }, + { + "to": "381", + "from": "382" + }, + { + "to": "382", + "from": "383" + }, + { + "to": "383", + "from": "384" + }, + { + "to": "384", + "from": "385" + }, + { + "to": "385", + "from": "387" + }, + { + "to": "386", + "from": "388" + }, + { + "to": "387", + "from": "389" + }, + { + "to": "388", + "from": "390" + }, + { + "to": "389", + "from": "390" + }, + { + "to": "390", + "from": "391" + }, + { + "to": "391", + "from": "392" + }, + { + "to": "392", + "from": "393" + }, + { + "to": "393", + "from": "394" + }, + { + "to": "394", + "from": "395" + }, + { + "to": "395", + "from": "396" + }, + { + "to": "396", + "from": "397" + }, + { + "to": "397", + "from": "398" + }, + { + "to": "398", + "from": "399" + } + ] +} ); diff --git a/examples/network/layout/hierarchicalLayoutBigUserDefined.html b/examples/network/layout/hierarchicalLayoutBigUserDefined.html new file mode 100644 index 00000000..a0ecd356 --- /dev/null +++ b/examples/network/layout/hierarchicalLayoutBigUserDefined.html @@ -0,0 +1,46 @@ + + + + Network | Hierarchical layout + + + + + + + + + + +

Hierarchical Layout

+ +
+ + + + + diff --git a/lib/network/modules/LayoutEngine.js b/lib/network/modules/LayoutEngine.js index 14a281e2..166781e1 100644 --- a/lib/network/modules/LayoutEngine.js +++ b/lib/network/modules/LayoutEngine.js @@ -429,6 +429,9 @@ class LayoutEngine { // get a map of all nodes in this branch let getBranchNodes = (source, map) => { + if (map[source.id]) { + return; + } map[source.id] = true; if (this.hierarchicalChildrenReference[source.id]) { let children = this.hierarchicalChildrenReference[source.id]; @@ -471,16 +474,24 @@ class LayoutEngine { // get the maximum level of a branch. let getMaxLevel = (nodeId) => { - let level = this.hierarchicalLevels[nodeId]; - if (this.hierarchicalChildrenReference[nodeId]) { - let children = this.hierarchicalChildrenReference[nodeId]; - if (children.length > 0) { - for (let i = 0; i < children.length; i++) { - level = Math.max(level,getMaxLevel(children[i])); + let accumulator = {}; + let _getMaxLevel = (nodeId) => { + if (accumulator[nodeId] !== undefined) { + return accumulator[nodeId]; + } + let level = this.hierarchicalLevels[nodeId]; + if (this.hierarchicalChildrenReference[nodeId]) { + let children = this.hierarchicalChildrenReference[nodeId]; + if (children.length > 0) { + for (let i = 0; i < children.length; i++) { + level = Math.max(level,_getMaxLevel(children[i])); + } } } - } - return level; + accumulator[nodeId] = level; + return level; + }; + return _getMaxLevel(nodeId); }; // check what the maximum level is these nodes have in common. @@ -532,8 +543,8 @@ class LayoutEngine { let diffAbs = Math.abs(pos2 - pos1); //console.log("NOW CHEcKING:", node1.id, node2.id, diffAbs); if (diffAbs > this.options.hierarchical.nodeSpacing) { - let branchNodes1 = {}; branchNodes1[node1.id] = true; - let branchNodes2 = {}; branchNodes2[node2.id] = true; + let branchNodes1 = {}; + let branchNodes2 = {}; getBranchNodes(node1, branchNodes1); getBranchNodes(node2, branchNodes2); @@ -639,7 +650,6 @@ class LayoutEngine { // check movable area of the branch if (branches[node.id] === undefined) { let branchNodes = {}; - branchNodes[node.id] = true; getBranchNodes(node, branchNodes); branches[node.id] = branchNodes; } @@ -1238,17 +1248,25 @@ class LayoutEngine { * @private */ _shiftBlock(parentId, diff) { - if (this.options.hierarchical.direction === 'UD' || this.options.hierarchical.direction === 'DU') { - this.body.nodes[parentId].x += diff; - } - else { - this.body.nodes[parentId].y += diff; - } - if (this.hierarchicalChildrenReference[parentId] !== undefined) { - for (let i = 0; i < this.hierarchicalChildrenReference[parentId].length; i++) { - this._shiftBlock(this.hierarchicalChildrenReference[parentId][i], diff); + let progress = {}; + let shifter = (parentId) => { + if (progress[parentId]) { + return; } - } + progress[parentId] = true; + if (this.options.hierarchical.direction === 'UD' || this.options.hierarchical.direction === 'DU') { + this.body.nodes[parentId].x += diff; + } + else { + this.body.nodes[parentId].y += diff; + } + if (this.hierarchicalChildrenReference[parentId] !== undefined) { + for (let i = 0; i < this.hierarchicalChildrenReference[parentId].length; i++) { + shifter(this.hierarchicalChildrenReference[parentId][i]); + } + } + }; + shifter(parentId); } From c83492e23fd4193768526533ccac24879c3f5720 Mon Sep 17 00:00:00 2001 From: Brad Hards Date: Sun, 26 Feb 2017 07:02:55 +1100 Subject: [PATCH 09/20] Initial tests for timeline ItemSet. (#2750) Somewhat more complicated setup, associated with the need for a real window. --- package.json | 1 + test/TestSupport.js | 7 ++- test/TimelineItemSet.test.js | 108 +++++++++++++++++++++++++++++++++++ 3 files changed, 115 insertions(+), 1 deletion(-) create mode 100644 test/TimelineItemSet.test.js diff --git a/package.json b/package.json index bed62546..f7698cd3 100644 --- a/package.json +++ b/package.json @@ -56,6 +56,7 @@ "gulp-rename": "^1.2.2", "gulp-util": "^3.0.8", "jsdom": "9.9.1", + "jsdom-global": "^2.1.1", "mocha": "^3.2.0", "mocha-jsdom": "^1.1.0", "rimraf": "^2.5.4", diff --git a/test/TestSupport.js b/test/TestSupport.js index d767c180..1de998b6 100644 --- a/test/TestSupport.js +++ b/test/TestSupport.js @@ -22,7 +22,12 @@ module.exports = { clientWidth: 1000 } }, - domProps: this.props, + domProps: { + centerContainer: { + width: 900, + height: 600 + } + }, emitter: { on: function () {}, off: function () {}, diff --git a/test/TimelineItemSet.test.js b/test/TimelineItemSet.test.js new file mode 100644 index 00000000..8892c49e --- /dev/null +++ b/test/TimelineItemSet.test.js @@ -0,0 +1,108 @@ +var assert = require('assert'); + +describe('Timeline ItemSet', function () { + before(function () { + delete require.cache[require.resolve('../dist/vis')] + this.jsdom = require('jsdom-global')(); + this.vis = require('../dist/vis'); + var TestSupport = require('./TestSupport'); + var rangeBody = TestSupport.buildSimpleTimelineRangeBody(); + this.testrange = new this.vis.timeline.Range(rangeBody); + this.testrange.setRange(new Date(2017, 1, 26, 13, 26, 3, 320), new Date(2017, 1, 26, 13, 26, 4, 320), false, false, null); + this.testitems = new this.vis.DataSet({ + type: { + start: 'Date', + end: 'Date' + } + }); + // add single items with different date types + this.testitems.add({id: 1, content: 'Item 1', start: new Date(2017, 1, 26, 13, 26, 3, 600), type: 'point'}); + this.testitems.add({id: 2, content: 'Item 2', start: new Date(2017, 1, 26, 13, 26, 5, 600), type: 'point'}); + }) + + after(function () { + this.jsdom(); + }) + + var getBasicBody = function() { + var body = { + dom: { + container: document.createElement('div'), + leftContainer: document.createElement('div'), + centerContainer: document.createElement('div'), + top: document.createElement('div'), + left: document.createElement('div'), + center: document.createElement('div'), + backgroundVertical: document.createElement('div') + }, + domProps: { + root: {}, + background: {}, + centerContainer: {}, + leftContainer: {}, + rightContainer: {}, + center: {}, + left: {}, + right: {}, + top: {}, + bottom: {}, + border: {}, + scrollTop: 0, + scrollTopMin: 0 + }, + emitter: { + on: function() {return {};}, + emit: function() {} + }, + util: { + } + } + return body; + }; + + it('should initialise with minimal data', function () { + var body = getBasicBody(); + var itemset = new this.vis.timeline.components.ItemSet(body, {}); + assert(itemset); + }); + + it('should redraw() and have the right classNames', function () { + var body = getBasicBody(); + body.range = this.testrange; + var itemset = new this.vis.timeline.components.ItemSet(body, {}); + itemset.redraw(); + assert.equal(itemset.dom.frame.className, 'vis-itemset'); + assert.equal(itemset.dom.background.className, 'vis-background'); + assert.equal(itemset.dom.foreground.className, 'vis-foreground'); + assert.equal(itemset.dom.axis.className, 'vis-axis'); + assert.equal(itemset.dom.labelSet.className, 'vis-labelset'); + }); + + it('should start with no items', function () { + var body = getBasicBody(); + var itemset = new this.vis.timeline.components.ItemSet(body, {}); + assert.equal(itemset.getItems(), null); + }); + + it('should store items correctly', function() { + var body = getBasicBody(); + body.range = this.testrange; + var DateUtil = this.vis.timeline.DateUtil; + body.util.toScreen = function(time) { + return DateUtil.toScreen({ + body: { + hiddenDates: [] + }, + range: { + conversion: function() { + return {offset: 0, scale: 100}; + } + } + }, time, 900) + }; + var itemset = new this.vis.timeline.components.ItemSet(body, {}); + itemset.setItems(this.testitems); + assert.equal(itemset.getItems().length, 2); + assert.deepEqual(itemset.getItems(), this.testitems); + }); +}); From 6b5462ec433d217ce0fb19d3e51fd86ce48bd031 Mon Sep 17 00:00:00 2001 From: Brad Hards Date: Sun, 26 Feb 2017 07:12:06 +1100 Subject: [PATCH 10/20] [Timeline] Modify redraw logic to treat scroll as needing restack. (#2774) This addresses #1982 and #1417. It possibly reduces performance, but correctness seems better. --- lib/timeline/component/ItemSet.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/timeline/component/ItemSet.js b/lib/timeline/component/ItemSet.js index 972db387..695602e8 100644 --- a/lib/timeline/component/ItemSet.js +++ b/lib/timeline/component/ItemSet.js @@ -616,8 +616,10 @@ ItemSet.prototype.redraw = function() { // TODO: would be nicer to get this as a trigger from Range var visibleInterval = range.end - range.start; var zoomed = (visibleInterval != this.lastVisibleInterval) || (this.props.width != this.props.lastWidth); - if (zoomed) this.stackDirty = true; + var scrolled = range.start != this.lastRangeStart; + if (zoomed || scrolled) this.stackDirty = true; this.lastVisibleInterval = visibleInterval; + this.lastRangeStart = range.start; this.props.lastWidth = this.props.width; var restack = this.stackDirty; From d0f2a63b91b028ccc1c1b89fd2c1a7f03577d498 Mon Sep 17 00:00:00 2001 From: Vx2gas Date: Sat, 25 Feb 2017 13:18:10 -0700 Subject: [PATCH 11/20] Added support to supply an end to bar charts to have them scale (#2760) * Added support to supply an X2 to bar charts to have them scale * Fixed graph2d stacking issue. It no longer takes into account hidden items * Changed x2 to end per recommendation and added this to the docs --- docs/graph2d/index.html | 8 +++- examples/graph2d/21_barsWithEnd.html | 51 +++++++++++++++++++++ lib/timeline/component/LineGraph.js | 11 ++++- lib/timeline/component/graph2d_types/bar.js | 18 +++++++- 4 files changed, 84 insertions(+), 4 deletions(-) create mode 100644 examples/graph2d/21_barsWithEnd.html diff --git a/docs/graph2d/index.html b/docs/graph2d/index.html index 66a488f0..7683d82d 100644 --- a/docs/graph2d/index.html +++ b/docs/graph2d/index.html @@ -297,7 +297,13 @@ var items = [ label Object no - A label object which will be displayed near to the item. A label object has one requirement - a content property. In addition you can set the xOffset, yOffset and className for further appearance customisations + A label object which will be displayed near to the item. A label object has one requirement - a content property. In addition you can set the xOffset, yOffset and className for further appearance customisations. + + + end + Date + no + A location on the x-axis that when supplied will have the bar stretch to the end point and ignore the barChart.width property. diff --git a/examples/graph2d/21_barsWithEnd.html b/examples/graph2d/21_barsWithEnd.html new file mode 100644 index 00000000..c5d131ff --- /dev/null +++ b/examples/graph2d/21_barsWithEnd.html @@ -0,0 +1,51 @@ + + + + Graph2d | Bar Graph Example + + + + + + + +

Graph2d | Bar Graph With End Example

+
+ This example shows how you can plot a bar chart and supply an end value to have it fill. +
+
+ +
+ + + + \ No newline at end of file diff --git a/lib/timeline/component/LineGraph.js b/lib/timeline/component/LineGraph.js index fa0934e2..ec797541 100644 --- a/lib/timeline/component/LineGraph.js +++ b/lib/timeline/component/LineGraph.js @@ -487,6 +487,7 @@ LineGraph.prototype._updateAllGroupData = function (ids, groupIds) { //Copy data (because of unmodifiable DataView input. var extended = util.bridgeObject(item); extended.x = util.convert(item.x, 'Date'); + extended.end = util.convert(item.end, 'Date'); extended.orginalY = item.y; //real Y extended.y = Number(item.y); extended[fieldId] = item[fieldId]; @@ -908,10 +909,10 @@ LineGraph.prototype._getYRanges = function (groupIds, groupsData, groupRanges) { // if bar graphs are stacked, their range need to be handled differently and accumulated over all groups. if (options.stack === true && options.style === 'bar') { if (options.yAxisOrientation === 'left') { - combinedDataLeft = combinedDataLeft.concat(group.getItems()); + combinedDataLeft = combinedDataLeft.concat(groupData); } else { - combinedDataRight = combinedDataRight.concat(group.getItems()); + combinedDataRight = combinedDataRight.concat(groupData); } } else { @@ -1064,6 +1065,12 @@ LineGraph.prototype._convertXcoordinates = function (datapoints) { for (var i = 0; i < datapoints.length; i++) { datapoints[i].screen_x = toScreen(datapoints[i].x) + this.props.width; datapoints[i].screen_y = datapoints[i].y; //starting point for range calculations + if (datapoints[i].end != undefined) { + datapoints[i].screen_end = toScreen(datapoints[i].end) + this.props.width; + } + else { + datapoints[i].screen_end = undefined; + } } }; diff --git a/lib/timeline/component/graph2d_types/bar.js b/lib/timeline/component/graph2d_types/bar.js index 32b3d36e..a8db2e24 100644 --- a/lib/timeline/component/graph2d_types/bar.js +++ b/lib/timeline/component/graph2d_types/bar.js @@ -62,8 +62,10 @@ Bargraph.draw = function (groupIds, processedGroupData, framework) { for (j = 0; j < processedGroupData[groupIds[i]].length; j++) { combinedData.push({ screen_x: processedGroupData[groupIds[i]][j].screen_x, + screen_end: processedGroupData[groupIds[i]][j].screen_end, screen_y: processedGroupData[groupIds[i]][j].screen_y, x: processedGroupData[groupIds[i]][j].x, + end: processedGroupData[groupIds[i]][j].end, y: processedGroupData[groupIds[i]][j].y, groupId: groupIds[i], label: processedGroupData[groupIds[i]][j].label @@ -128,7 +130,21 @@ Bargraph.draw = function (groupIds, processedGroupData, framework) { drawData.offset += (intersections[key].resolved) * drawData.width - (0.5 * drawData.width * (intersections[key].amount + 1)); } } - DOMutil.drawBar(combinedData[i].screen_x + drawData.offset, combinedData[i].screen_y - heightOffset, drawData.width, group.zeroPosition - combinedData[i].screen_y, group.className + ' vis-bar', framework.svgElements, framework.svg, group.style); + + let dataWidth = drawData.width; + let start = combinedData[i].screen_x; + + // are we drawing explicit boxes? (we supplied an end value) + if (combinedData[i].screen_end != undefined){ + dataWidth = combinedData[i].screen_end - combinedData[i].screen_x; + start += (dataWidth * 0.5); + } + else { + start += drawData.offset + } + + DOMutil.drawBar(start, combinedData[i].screen_y - heightOffset, dataWidth, group.zeroPosition - combinedData[i].screen_y, group.className + ' vis-bar', framework.svgElements, framework.svg, group.style); + // draw points if (group.options.drawPoints.enabled === true) { let pointData = { From 20fc8ed96614316937c26adc7806a600d05c7066 Mon Sep 17 00:00:00 2001 From: Brad Hards Date: Sun, 26 Feb 2017 18:38:54 +1100 Subject: [PATCH 12/20] [timeline] Update examples to use ISOString format. (#2791) Resolves #2790 --- examples/timeline/groups/subgroups.html | 4 +-- .../items/expectedVsActualTimesItems.html | 18 +++++------ examples/timeline/resources/data/wk2014.json | 32 +++++++++---------- examples/timeline/styling/itemTemplates.html | 32 +++++++++---------- 4 files changed, 43 insertions(+), 43 deletions(-) diff --git a/examples/timeline/groups/subgroups.html b/examples/timeline/groups/subgroups.html index da2670ed..4647d191 100644 --- a/examples/timeline/groups/subgroups.html +++ b/examples/timeline/groups/subgroups.html @@ -51,7 +51,7 @@ {id: 'SG_1_1',start: '2014-01-25', end: '2014-01-27', type: 'background', group:'bar', subgroup:'sg_1', subgroupOrder:0}, {id: 'SG_1_2', start: '2014-01-26', end: '2014-01-27', type: 'background', className: 'positive',group:'bar', subgroup:'sg_1', subgroupOrder:0}, - {id: 1, content: 'subgroup0', start: '2014-01-23 12:00:00', end: '2014-01-26 12:00:00',group:'bar', subgroup:'sg_1', subgroupOrder:0}, + {id: 1, content: 'subgroup0', start: '2014-01-23T12:00:00', end: '2014-01-26T12:00:00',group:'bar', subgroup:'sg_1', subgroupOrder:0}, {id: 'SG_2_1', start: '2014-01-27', end: '2014-01-29', type: 'background', group:'bar', subgroup:'sg_2', subgroupOrder:1}, {id: 'SG_2_2', start: '2014-01-27', end: '2014-01-28', type: 'background', className: 'negative',group:'bar', subgroup:'sg_2', subgroupOrder:1}, {id: 2, content: 'subgroup1', start: '2014-01-27', end: '2014-01-29',group:'bar', subgroup:'sg_2', subgroupOrder:1}, @@ -78,4 +78,4 @@ } - \ No newline at end of file + diff --git a/examples/timeline/items/expectedVsActualTimesItems.html b/examples/timeline/items/expectedVsActualTimesItems.html index 8ef427cc..eda66556 100644 --- a/examples/timeline/items/expectedVsActualTimesItems.html +++ b/examples/timeline/items/expectedVsActualTimesItems.html @@ -61,16 +61,16 @@ id: 1, content: 'item 1 (expected time)', className: 'expected', - start: '2014-01-23 12:00:00', - end: '2014-01-26 12:00:00', + start: '2014-01-23T12:00:00', + end: '2014-01-26T12:00:00', group:'group1', subgroup:'sg_1' }, { id: 2, content: 'item 1 (actual time)', - start: '2014-01-24 12:00:00', - end: '2014-01-27 12:00:00', + start: '2014-01-24T12:00:00', + end: '2014-01-27T12:00:00', group:'group1', subgroup:'sg_1' }, @@ -80,16 +80,16 @@ id: 3, content: 'item 2 (expected time)', className: 'expected', - start: '2014-01-13 12:00:00', - end: '2014-01-16 12:00:00', + start: '2014-01-13T12:00:00', + end: '2014-01-16T12:00:00', group:'group1', subgroup:'sg_2' }, { id: 4, content: 'item 2 (actual time)', - start: '2014-01-14 12:00:00', - end: '2014-01-17 12:00:00', + start: '2014-01-14T12:00:00', + end: '2014-01-17T12:00:00', group:'group1', subgroup:'sg_2' } @@ -108,4 +108,4 @@ - \ No newline at end of file + diff --git a/examples/timeline/resources/data/wk2014.json b/examples/timeline/resources/data/wk2014.json index 2bcb3d75..519169d3 100644 --- a/examples/timeline/resources/data/wk2014.json +++ b/examples/timeline/resources/data/wk2014.json @@ -7,7 +7,7 @@ "abbr2": "cl", "score2": "1 (2)", "description": "round of 16", - "start": "2014-06-28 13:00" + "start": "2014-06-28T13:00" }, { "player1": "Colombia", @@ -17,7 +17,7 @@ "abbr2": "uy", "score2": 0, "description": "round of 16", - "start": "2014-06-28 17:00" + "start": "2014-06-28T17:00" }, { "player1": "Netherlands", @@ -27,7 +27,7 @@ "abbr2": "mx", "score2": 1, "description": "round of 16", - "start": "2014-06-29 13:00" + "start": "2014-06-29T13:00" }, { "player1": "Costa Rica", @@ -37,7 +37,7 @@ "abbr2": "gr", "score2": "1 (3)", "description": "round of 16", - "start": "2014-06-29 17:00" + "start": "2014-06-29T17:00" }, { "player1": "France", @@ -47,7 +47,7 @@ "abbr2": "ng", "score2": 0, "description": "round of 16", - "start": "2014-06-30 13:00" + "start": "2014-06-30T13:00" }, { "player1": "Germany", @@ -57,7 +57,7 @@ "abbr2": "dz", "score2": 1, "description": "round of 16", - "start": "2014-06-30 17:00" + "start": "2014-06-30T17:00" }, { "player1": "Argentina", @@ -67,7 +67,7 @@ "abbr2": "ch", "score2": 0, "description": "round of 16", - "start": "2014-07-01 13:00" + "start": "2014-07-01T13:00" }, { "player1": "Belgium", @@ -77,7 +77,7 @@ "abbr2": "us", "score2": 1, "description": "round of 16", - "start": "2014-07-01 17:00" + "start": "2014-07-01T17:00" }, { "player1": "France", @@ -87,7 +87,7 @@ "abbr2": "de", "score2": 1, "description": "quarter-finals", - "start": "2014-07-04 13:00" + "start": "2014-07-04T13:00" }, { "player1": "Brazil", @@ -97,7 +97,7 @@ "abbr2": "co", "score2": 1, "description": "quarter-finals", - "start": "2014-07-04 17:00" + "start": "2014-07-04T17:00" }, { "player1": "Argentina", @@ -107,7 +107,7 @@ "abbr2": "be", "score2": 0, "description": "quarter-finals", - "start": "2014-07-05 13:00" + "start": "2014-07-05T13:00" }, { "player1": "Netherlands", @@ -117,7 +117,7 @@ "abbr2": "cr", "score2": "0 (3)", "description": "quarter-finals", - "start": "2014-07-05 17:00" + "start": "2014-07-05T17:00" }, { "player1": "Brazil", @@ -127,7 +127,7 @@ "abbr2": "de", "score2": 7, "description": "semi-finals", - "start": "2014-07-08 17:00" + "start": "2014-07-08T17:00" }, { "player1": "Netherlands", @@ -137,7 +137,7 @@ "abbr2": "ar", "score2": "0 (4)", "description": "semi-finals", - "start": "2014-07-09 17:00" + "start": "2014-07-09T17:00" }, { "player1": "Germany", @@ -147,6 +147,6 @@ "abbr2": "ar", "score2": 0, "description": "final", - "start": "2014-07-13 16:00" + "start": "2014-07-13T16:00" } -] \ No newline at end of file +] diff --git a/examples/timeline/styling/itemTemplates.html b/examples/timeline/styling/itemTemplates.html index 76900d2b..d7df592a 100644 --- a/examples/timeline/styling/itemTemplates.html +++ b/examples/timeline/styling/itemTemplates.html @@ -88,7 +88,7 @@ abbr2: 'cl', score2: '1 (2)', description: 'round of 16', - start: '2014-06-28 13:00' + start: '2014-06-28T13:00:00' }, { player1: 'Colombia', @@ -98,7 +98,7 @@ abbr2: 'uy', score2: 0, description: 'round of 16', - start: '2014-06-28 17:00' + start: '2014-06-28T17:00:00' }, { player1: 'Netherlands', @@ -108,7 +108,7 @@ abbr2: 'mx', score2: 1, description: 'round of 16', - start: '2014-06-29 13:00' + start: '2014-06-29T13:00:00' }, { player1: 'Costa Rica', @@ -118,7 +118,7 @@ abbr2: 'gr', score2: '1 (3)', description: 'round of 16', - start: '2014-06-29 17:00' + start: '2014-06-29T17:00:00' }, { player1: 'France', @@ -128,7 +128,7 @@ abbr2: 'ng', score2: 0, description: 'round of 16', - start: '2014-06-30 13:00' + start: '2014-06-30T13:00:00' }, { player1: 'Germany', @@ -138,7 +138,7 @@ abbr2: 'dz', score2: 1, description: 'round of 16', - start: '2014-06-30 17:00' + start: '2014-06-30T17:00:00' }, { player1: 'Argentina', @@ -148,7 +148,7 @@ abbr2: 'ch', score2: 0, description: 'round of 16', - start: '2014-07-01 13:00' + start: '2014-07-01T13:00:00' }, { player1: 'Belgium', @@ -158,7 +158,7 @@ abbr2: 'us', score2: 1, description: 'round of 16', - start: '2014-07-01 17:00' + start: '2014-07-01T17:00:00' }, // quarter-finals @@ -170,7 +170,7 @@ abbr2: 'de', score2: 1, description: 'quarter-finals', - start: '2014-07-04 13:00' + start: '2014-07-04T13:00:00' }, { player1: 'Brazil', @@ -180,7 +180,7 @@ abbr2: 'co', score2: 1, description: 'quarter-finals', - start: '2014-07-04 17:00' + start: '2014-07-04T17:00:00' }, { player1: 'Argentina', @@ -190,7 +190,7 @@ abbr2: 'be', score2: 0, description: 'quarter-finals', - start: '2014-07-05 13:00' + start: '2014-07-05T13:00:00' }, { player1: 'Netherlands', @@ -200,7 +200,7 @@ abbr2: 'cr', score2: '0 (3)', description: 'quarter-finals', - start: '2014-07-05 17:00' + start: '2014-07-05T17:00:00' }, // semi-finals @@ -212,7 +212,7 @@ abbr2: 'de', score2: 7, description: 'semi-finals', - start: '2014-07-08 17:00' + start: '2014-07-08T17:00:00' }, { player1: 'Netherlands', @@ -222,7 +222,7 @@ abbr2: 'ar', score2: '0 (4)', description: 'semi-finals', - start: '2014-07-09 17:00' + start: '2014-07-09T17:00:00' }, // final @@ -234,7 +234,7 @@ abbr2: 'ar', score2: 0, description: 'final', - start: '2014-07-13 16:00' + start: '2014-07-13T16:00:00' } ]); @@ -248,4 +248,4 @@ var timeline = new vis.Timeline(container, items, options); - \ No newline at end of file + From 0750015797999c04b8cf00caebf1133b7e009bda Mon Sep 17 00:00:00 2001 From: Brad Hards Date: Sun, 26 Feb 2017 18:39:22 +1100 Subject: [PATCH 13/20] [timeline] Update serialization example to use ISOString dates. (#2789) Resolves #2696 --- .../dataHandling/dataSerialization.html | 38 ++++++++++++++++--- 1 file changed, 32 insertions(+), 6 deletions(-) diff --git a/examples/timeline/dataHandling/dataSerialization.html b/examples/timeline/dataHandling/dataSerialization.html index e1936438..65e8d01b 100644 --- a/examples/timeline/dataHandling/dataSerialization.html +++ b/examples/timeline/dataHandling/dataSerialization.html @@ -35,12 +35,38 @@ From f5b43e8518766dc23383417a7c72f438f4a46b17 Mon Sep 17 00:00:00 2001 From: yotamberk Date: Sun, 26 Feb 2017 10:55:28 +0200 Subject: [PATCH 14/20] fix(timeline): #2672 Item events original event (#2704) * Fix redraw order * Fix error when option is not defined * Allow template labels * Add .travis.yml file * Add experiment travis code * Fix react example * Fix events returned from mouse events * Fix example * Rename censor to stringifyObject in example --- .../timeline/interaction/eventListeners.html | 17 ++++++++++++++++- lib/timeline/Range.js | 8 ++++---- lib/timeline/component/ItemSet.js | 8 ++++---- lib/util.js | 17 ----------------- 4 files changed, 24 insertions(+), 26 deletions(-) diff --git a/examples/timeline/interaction/eventListeners.html b/examples/timeline/interaction/eventListeners.html index b88e846b..91bacfb0 100644 --- a/examples/timeline/interaction/eventListeners.html +++ b/examples/timeline/interaction/eventListeners.html @@ -41,9 +41,11 @@ timeline.on('rangechange', function (properties) { logEvent('rangechange', properties); }); + timeline.on('rangechanged', function (properties) { logEvent('rangechanged', properties); }); + timeline.on('select', function (properties) { logEvent('select', properties); }); @@ -52,6 +54,7 @@ logEvent('itemover', properties); setHoveredItem(properties.item); }); + timeline.on('itemout', function (properties) { logEvent('itemout', properties); setHoveredItem('none'); @@ -83,11 +86,23 @@ logEvent(event, properties); }); + function stringifyObject (object) { + if (!object) return; + var replacer = function(key, value) { + if (value && value.tagName) { + return "DOM Element"; + } else { + return value; + } + } + return JSON.stringify(object, replacer) + } + function logEvent(event, properties) { var log = document.getElementById('log'); var msg = document.createElement('div'); msg.innerHTML = 'event=' + JSON.stringify(event) + ', ' + - 'properties=' + JSON.stringify(properties); + 'properties=' + stringifyObject(properties); log.firstChild ? log.insertBefore(msg, log.firstChild) : log.appendChild(msg); } diff --git a/lib/timeline/Range.js b/lib/timeline/Range.js index 29fadd28..ced39db8 100644 --- a/lib/timeline/Range.js +++ b/lib/timeline/Range.js @@ -218,7 +218,7 @@ Range.prototype.setRange = function(start, end, animation, byUser, event) { start: new Date(me.start), end: new Date(me.end), byUser:byUser, - event: util.elementsCensor(event) + event: event } if (changed) { @@ -248,7 +248,7 @@ Range.prototype.setRange = function(start, end, animation, byUser, event) { start: new Date(this.start), end: new Date(this.end), byUser:byUser, - event: util.elementsCensor(event) + event: event }; this.body.emitter.emit('rangechange', params); this.body.emitter.emit('rangechanged', params); @@ -532,7 +532,7 @@ Range.prototype._onDrag = function (event) { start: startDate, end: endDate, byUser: true, - event: util.elementsCensor(event) + event: event }); // fire a panmove event @@ -565,7 +565,7 @@ Range.prototype._onDragEnd = function (event) { start: new Date(this.start), end: new Date(this.end), byUser: true, - event: util.elementsCensor(event) + event: event }); }; diff --git a/lib/timeline/component/ItemSet.js b/lib/timeline/component/ItemSet.js index 695602e8..28d610f5 100644 --- a/lib/timeline/component/ItemSet.js +++ b/lib/timeline/component/ItemSet.js @@ -1876,7 +1876,7 @@ ItemSet.prototype._onSelectItem = function (event) { if (newSelection.length > 0 || oldSelection.length > 0) { this.body.emitter.emit('select', { items: newSelection, - event: util.elementsCensor(event) + event: event }); } }; @@ -1921,7 +1921,7 @@ ItemSet.prototype._onMouseOver = function (event) { this.body.emitter.emit('itemover', { item: item.id, - event: util.elementsCensor(event) + event: event }); }; ItemSet.prototype._onMouseOut = function (event) { @@ -1941,7 +1941,7 @@ ItemSet.prototype._onMouseOut = function (event) { this.body.emitter.emit('itemout', { item: item.id, - event: util.elementsCensor(event) + event: event }); }; ItemSet.prototype._onMouseMove = function (event) { @@ -2145,7 +2145,7 @@ ItemSet.prototype._onMultiSelectItem = function (event) { this.body.emitter.emit('select', { items: this.getSelection(), - event: util.elementsCensor(event) + event: event }); } }; diff --git a/lib/util.js b/lib/util.js index 31ca9bb7..cfbfbaf5 100644 --- a/lib/util.js +++ b/lib/util.js @@ -16,23 +16,6 @@ exports.isNumber = function (object) { return (object instanceof Number || typeof object == 'number'); }; -/** - * Censors object elements containing dom elements - * @param {*} object - * @return {Object} object without elements - */ -exports.elementsCensor = function (object) { - if (!object) return; - var replacer = function(key, value) { - if (value instanceof Element) { - return "DOM Element"; - } else { - return value; - } - } - return JSON.parse(JSON.stringify(object, replacer)) -} - /** * Remove everything in the DOM object From dd55439b0dc26ba74f1151baf872e9e83fd083fb Mon Sep 17 00:00:00 2001 From: Alexander Wunschik Date: Sun, 26 Feb 2017 21:18:04 +0100 Subject: [PATCH 15/20] added github templates for issues and pull-requests (#2787) fixes #2418 --- .github/ISSUE_TEMPLATE.md | 10 ++++++++++ .github/PULL_REQUEST_TEMPLATE.md | 11 +++++++++++ 2 files changed, 21 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE.md create mode 100644 .github/PULL_REQUEST_TEMPLATE.md diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md new file mode 100644 index 00000000..e4b4ce7d --- /dev/null +++ b/.github/ISSUE_TEMPLATE.md @@ -0,0 +1,10 @@ + +Please make sure to **read the following list** before creating a new issue: + +* This issue tracker is not supposed to be used for questions on how to use visjs. It is intended to be used for bug reports and feature requests! In case you face yourself with a usage question, then post your question e.g. on [stackoverflow](https://stackoverflow.com/questions/tagged/vis.js) tagged with "vis.js". +* Have you already used the [github search](https://github.com/almende/vis/issues), read the [documentation](http://visjs.org/) and looked at the [examples](https://github.com/almende/vis/tree/develop/examples)? +* Make sure to mention which vis-component (network, timeline, graph2D, graph3d) you are referring to. +* Make sure to use the [latest version of vis.js](https://cdnjs.com/libraries/vis) for bug reports. +* Make sure to mention which browser and OS you are using when creating a bug report. +* Please provide a minimal code example that demonstrates your issue. We recommend using [jsbin](jsbin.com) for that. +* Delete this list from the actual issue. diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 00000000..1a43ae70 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,11 @@ +**Thank you for contributing to vis.js!!** + +Please make sure to check the following requirements before creating a pull request: + +* [ ] All pull requests must be to the [develop branch](https://github.com/almende/vis/tree/develop). Pull requests to the `master` branch will be closed! +* [ ] Make sure your changes are based on the latest version of the [develop branch](https://github.com/almende/vis/tree/develop). (Use e.g. `git fetch && git rebase origin develop` to update you feature branch). +* [ ] Provide an additional or update an example to demonstrate your changes or new features. +* [ ] Update the documentation if you introduced new behavior or changed existing behavior. +* [ ] Reference issue numbers of issues that your pull request addresses. (If you write something like `fixes #1781` in your git commit message this issue gets closed automatically by merging your pull request). +* [ ] Expect review comments and change requests by reviewer. +* [ ] Delete this checklist from your pull request. From d13748348dc652b2490be3cb4c6f83fe77d135a3 Mon Sep 17 00:00:00 2001 From: RealRegatta Date: Mon, 27 Feb 2017 16:37:57 +0100 Subject: [PATCH 16/20] feat(timeline): Add item data as argument to the template function (#2799) --- lib/timeline/component/item/Item.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/timeline/component/item/Item.js b/lib/timeline/component/item/Item.js index 0671f68f..f12d44d2 100644 --- a/lib/timeline/component/item/Item.js +++ b/lib/timeline/component/item/Item.js @@ -342,7 +342,7 @@ Item.prototype._updateContents = function (element) { if (this.options.template) { templateFunction = this.options.template.bind(this); - content = templateFunction(itemData, element); + content = templateFunction(itemData, element, this.data); } else { content = this.data.content; } From ee77164e4abc54eb7a97d2bd186456fe1fd9fa36 Mon Sep 17 00:00:00 2001 From: Alexander Wunschik Date: Mon, 27 Feb 2017 23:03:07 +0100 Subject: [PATCH 17/20] added @bradh as member of the support team (#2801) --- misc/we_need_help.md | 1 + 1 file changed, 1 insertion(+) diff --git a/misc/we_need_help.md b/misc/we_need_help.md index 00287215..7eb941bc 100644 --- a/misc/we_need_help.md +++ b/misc/we_need_help.md @@ -15,3 +15,4 @@ If you have shown some commitment to the project you can ask [@ludost](//github. * [@yotamberk](//github.com/yotamberk) * [@Tooa](//github.com/Tooa) * [@eymiha](//github.com/eymiha) +* [@bradh](//github.com/bradh) From 3df8107467bdcf88f1c9f55836dc33a12be21f1f Mon Sep 17 00:00:00 2001 From: Brad Hards Date: Tue, 28 Feb 2017 09:03:30 +1100 Subject: [PATCH 18/20] Fix regression introduced in #2743. (#2796) --- lib/timeline/component/item/Item.js | 5 ++ test/PointItem.test.js | 100 ++++++++++++++++++++++++++++ 2 files changed, 105 insertions(+) diff --git a/lib/timeline/component/item/Item.js b/lib/timeline/component/item/Item.js index f12d44d2..6713a7ac 100644 --- a/lib/timeline/component/item/Item.js +++ b/lib/timeline/component/item/Item.js @@ -461,6 +461,11 @@ Item.prototype._updateEditStatus = function() { updateGroup: this.data.editable, remove: this.data.editable } + } else if (typeof this.data.editable === 'object') { + // TODO: in vis.js 5.0, we should change this to not reset options from the timeline configuration. + // Basically just remove the next line... + this.editable = {}; + util.selectiveExtend(['updateTime', 'updateGroup', 'remove'], this.editable, this.data.editable); } } } diff --git a/test/PointItem.test.js b/test/PointItem.test.js index 19c86558..d7345aa1 100644 --- a/test/PointItem.test.js +++ b/test/PointItem.test.js @@ -165,4 +165,104 @@ describe('Timeline PointItem', function () { assert.equal(pointItem.dom.dot.className, "vis-item vis-dot vis-editable"); assert.equal(pointItem.dom.point.className, "vis-item vis-point vis-editable"); }); + + it('should redraw() and then have the correct property for an editable: {updateTime} override item (with boolean option)', function() { + var pointItem = new PointItem({start: now.toDate(), editable: {updateTime: true}}, null, {editable: true}); + var parent = TestSupport.buildMockItemSet(); + pointItem.setParent(parent); + pointItem.redraw(); + assert.equal(pointItem.editable.updateTime, true); + assert.equal(pointItem.editable.updateGroup, undefined); + assert.equal(pointItem.editable.remove, undefined); + }); + + it('should redraw() and then have the correct property for an editable: {updateTime} override item (with boolean option false)', function() { + var pointItem = new PointItem({start: now.toDate(), editable: {updateTime: true}}, null, {editable: false}); + var parent = TestSupport.buildMockItemSet(); + pointItem.setParent(parent); + pointItem.redraw(); + assert.equal(pointItem.editable.updateTime, true); + assert.equal(pointItem.editable.updateGroup, undefined); + assert.equal(pointItem.editable.remove, undefined); + }); + + it('should redraw() and then have the correct property for an editable: {updateGroup} override item (with boolean option)', function() { + var pointItem = new PointItem({start: now.toDate(), editable: {updateGroup: true}}, null, {editable: true}); + var parent = TestSupport.buildMockItemSet(); + pointItem.setParent(parent); + pointItem.redraw(); + assert.equal(pointItem.editable.updateTime, undefined); + assert.equal(pointItem.editable.updateGroup, true); + assert.equal(pointItem.editable.remove, undefined); + }); + + it('should redraw() and then have the correct property for an editable: {updateGroup} override item (with boolean option false)', function() { + var pointItem = new PointItem({start: now.toDate(), editable: {updateGroup: true}}, null, {editable: false}); + var parent = TestSupport.buildMockItemSet(); + pointItem.setParent(parent); + pointItem.redraw(); + assert.equal(pointItem.editable.updateTime, undefined); + assert.equal(pointItem.editable.updateGroup, true); + assert.equal(pointItem.editable.remove, undefined); + }); + + it('should redraw() and then have the correct property for an editable: {remove} override item (with boolean option)', function() { + var pointItem = new PointItem({start: now.toDate(), editable: {remove: true}}, null, {editable: true}); + var parent = TestSupport.buildMockItemSet(); + pointItem.setParent(parent); + pointItem.redraw(); + assert.equal(pointItem.editable.updateTime, undefined); + assert.equal(pointItem.editable.updateGroup, undefined); + assert.equal(pointItem.editable.remove, true); + }); + + it('should redraw() and then have the correct property for an editable: {remove} override item (with boolean option false)', function() { + var pointItem = new PointItem({start: now.toDate(), editable: {remove: true}}, null, {editable: false}); + var parent = TestSupport.buildMockItemSet(); + pointItem.setParent(parent); + pointItem.redraw(); + assert.equal(pointItem.editable.updateTime, undefined); + assert.equal(pointItem.editable.updateGroup, undefined); + assert.equal(pointItem.editable.remove, true); + }); + + it('should redraw() and then have the correct property for an editable: {updateTime, remove} override item (with boolean option)', function() { + var pointItem = new PointItem({start: now.toDate(), editable: {updateTime: true, remove: true}}, null, {editable: true}); + var parent = TestSupport.buildMockItemSet(); + pointItem.setParent(parent); + pointItem.redraw(); + assert.equal(pointItem.editable.updateTime, true); + assert.equal(pointItem.editable.updateGroup, undefined); + assert.equal(pointItem.editable.remove, true); + }); + + it('should redraw() and then have the correct property for an editable: {updateTime, remove} override item (with boolean option false)', function() { + var pointItem = new PointItem({start: now.toDate(), editable: {updateTime: true, remove: true}}, null, {editable: false}); + var parent = TestSupport.buildMockItemSet(); + pointItem.setParent(parent); + pointItem.redraw(); + assert.equal(pointItem.editable.updateTime, true); + assert.equal(pointItem.editable.updateGroup, undefined); + assert.equal(pointItem.editable.remove, true); + }); + + it('should redraw() and then have the correct property for an editable: {updateTime, updateGroup, remove} override item (with boolean option)', function() { + var pointItem = new PointItem({start: now.toDate(), editable: {updateTime: true, updateGroup: true, remove: true}}, null, {editable: true}); + var parent = TestSupport.buildMockItemSet(); + pointItem.setParent(parent); + pointItem.redraw(); + assert.equal(pointItem.editable.updateTime, true); + assert.equal(pointItem.editable.updateGroup, true); + assert.equal(pointItem.editable.remove, true); + }); + + it('should redraw() and then have the correct property for an editable: {updateTime, updateGroup, remove} override item (with boolean option false)', function() { + var pointItem = new PointItem({start: now.toDate(), editable: {updateTime: true, updateGroup: true, remove: true}}, null, {editable: false}); + var parent = TestSupport.buildMockItemSet(); + pointItem.setParent(parent); + pointItem.redraw(); + assert.equal(pointItem.editable.updateTime, true); + assert.equal(pointItem.editable.updateGroup, true); + assert.equal(pointItem.editable.remove, true); + }); }); From af86650c391894bf882a00b42822fc49c0d84e8c Mon Sep 17 00:00:00 2001 From: wimrijnders Date: Thu, 2 Mar 2017 16:30:41 +0100 Subject: [PATCH 19/20] Fix for issue #2536 (#2803) * Fix for issue #2536 * Adjusted documentation for fix. * Adjustments due to review * Grrrrr whitespace * Fixed Travis issue --- docs/graph3d/index.html | 8 ++++---- lib/graph3d/Graph3d.js | 37 +++++++++++++++++++++++++++++++------ 2 files changed, 35 insertions(+), 10 deletions(-) diff --git a/docs/graph3d/index.html b/docs/graph3d/index.html index fd9ba49a..974e2d27 100644 --- a/docs/graph3d/index.html +++ b/docs/graph3d/index.html @@ -532,8 +532,8 @@ var options = { xBarWidth number none - The width of bars in x direction. By default, the width is equal to the distance - between the data points, such that bars adjoin each other. + The width of bars in x direction. By default, the width is equal to the smallest distance + between the data points. Only applicable for styles 'bar' and 'bar-color'. @@ -575,8 +575,8 @@ var options = { yBarWidth number none - The width of bars in y direction. By default, the width is equal to the distance - between the data points, such that bars adjoin each other. + The width of bars in y direction. By default, the width is equal to the smallest distance + between the data points. Only applicable for styles 'bar' and 'bar-color'. diff --git a/lib/graph3d/Graph3d.js b/lib/graph3d/Graph3d.js index e355c9db..7a1884cc 100755 --- a/lib/graph3d/Graph3d.js +++ b/lib/graph3d/Graph3d.js @@ -327,7 +327,34 @@ Graph3d.prototype.getDistinctValues = function(data, column) { distinctValues.push(data[i][column]); } } - return distinctValues; + return distinctValues.sort(function(a,b) { return a - b; }); +} + + +/** + * Determine the smallest difference between the values for given + * column in the passed data set. + * + * @returns {Number|null} Smallest difference value or + * null, if it can't be determined. + */ +Graph3d.prototype.getSmallestDifference = function(data, column) { + var values = this.getDistinctValues(data, column); + var diffs = []; + + // Get all the distinct diffs + // Array values is assumed to be sorted here + var smallest_diff = null; + + for (var i = 1; i < values.length; i++) { + var diff = values[i] - values[i - 1]; + + if (smallest_diff == null || smallest_diff > diff ) { + smallest_diff = diff; + } + } + + return smallest_diff; } @@ -467,16 +494,14 @@ Graph3d.prototype._dataInitialize = function (rawData, style) { this.xBarWidth = this.defaultXBarWidth; } else { - var dataX = this.getDistinctValues(data,this.colX); - this.xBarWidth = (dataX[1] - dataX[0]) || 1; + this.xBarWidth = this.getSmallestDifference(data, this.colX) || 1; } if (this.defaultYBarWidth !== undefined) { this.yBarWidth = this.defaultYBarWidth; } else { - var dataY = this.getDistinctValues(data,this.colY); - this.yBarWidth = (dataY[1] - dataY[0]) || 1; + this.yBarWidth = this.getSmallestDifference(data, this.colY) || 1; } } @@ -2449,4 +2474,4 @@ Graph3d.prototype.setSize = function(width, height) { // ----------------------------------------------------------------------------- -module.exports = Graph3d; \ No newline at end of file +module.exports = Graph3d; From e835e350b13bdb7bb8431386987ac1b15ea9df2e Mon Sep 17 00:00:00 2001 From: Brad Hards Date: Sun, 5 Mar 2017 03:22:29 +1100 Subject: [PATCH 20/20] [timeline] Update "progress bar" example to reflect values. (#2828) Resolves #2827. --- examples/timeline/items/visibleFrameTemplateContent.html | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/examples/timeline/items/visibleFrameTemplateContent.html b/examples/timeline/items/visibleFrameTemplateContent.html index 67715766..f01d57ed 100644 --- a/examples/timeline/items/visibleFrameTemplateContent.html +++ b/examples/timeline/items/visibleFrameTemplateContent.html @@ -45,18 +45,18 @@ {id: 1, value: 0.2, content: 'item 1', start: '2014-04-20', end: '2014-04-26'}, {id: 2, value: 0.6, content: 'item 2', start: '2014-05-14', end: '2014-05-18'}, {id: 3, type: 'point', content: 'item 3', start: '2014-04-15', end: '2014-05-18'}, - {id: 4, content: 'item 4 with visibleFramTemplate in item', start: '2014-04-16', end: '2014-04-26', visibleFramTemplate: '
' + {id: 4, content: 'item 4 with visibleFrameTemplate in item', start: '2014-04-16', end: '2014-04-26', visibleFrameTemplate: '
' } ]); // Configuration for the Timeline var options = { visibleFrameTemplate: function(item) { - if (item.visibleFramTemplate) { - return item.visibleFramTemplate; + if (item.visibleFrameTemplate) { + return item.visibleFrameTemplate; } var percentage = item.value * 100 + '%'; - return '
'; + return '
'; } };