diff --git a/lib/vis/HISTORY.md b/lib/vis/HISTORY.md index 6d7c8254ac..412837d26f 100644 --- a/lib/vis/HISTORY.md +++ b/lib/vis/HISTORY.md @@ -1,6 +1,276 @@ # vis.js history http://visjs.org + +## 2016-02-04, version 4.14.0 + +### Timeline + +- Fixed a regression: Timeline/Graph2d constructor throwing an exception when + no options are provided via the constructor. + +### Graph2d + +- Fixed a regression: Timeline/Graph2d constructor throwing an exception when + no options are provided via the constructor. + +### Graph3d + +- Fixed #1615: implemented new option `dotSizeRatio`. + + +## 2016-02-01, version 4.13.0 + +### Network + +- Added options to customize the hierarchical layout without the use of physics. +- Altered edges for arrows and added the arrowStrikethrough option. +- Improved the hierarchical layout algorithm by adding a condensing method to remove whitespace. +- Fixed #1556: Network throwing an error when clicking the "Edit" button + on the manipulation toolbar. +- Fixed #1334 (again): Network now ignores scroll when interaction:zoomView is false. +- Fixed #1588: destroy now unsubscribed from the dataset. +- Fixed #1584: Navigation buttons broken. +- Fixed #1596: correct clean up of manipulation dom elements. +- Fixed #1594: bug in hierarchical layout. +- Fixed #1597: Allow zero borders and addressed scaling artifacts. +- Fixed #1608: Fixed wrong variable reference + +### Timeline + +- Moved initial autoscale/fit method to an handler of the "changed" event. +- Fixed #1580: Invisible timeline/graph should not be drawn, as most inputs are invalid +- Fixed #1521: Prevent items from staying stuck to the left side of the viewport. +- Fixed #1592: Emit a "changed" event after each redraw. +- Fixed #1541: Timeline and Graph2d did not load synchronously anymore. + +### Graph2d + +- Major redesign of data axis/scales, with large focus on creating a sane slave axis setup +- Cleanup of linegraph's event handling. +- Fixed #1585: Allow bar groups to exclude from stacking +- Fixed #1580: Invisible timeline/graph should not be drawn, as most inputs are invalid +- Fixed #1177: Fix custom range of slaved right axis. +- Fixed #1592: Emit a "changed" event after each redraw. +- Fixed #1017: Fixed minWidth behavior for bars. +- Fixes #1557: Fix default axis formatting function. +- Fixed #1541: Timeline and Graph2d did not load synchronously anymore. +- Fixed a performance regression + + +## 2016-01-08, version 4.12.0 + +### Timeline + +- Fixed #1527: error when creating/updating a Timeline without data. +- Fixed #1127: `doubleClick` event not being fired. +- Fixed #1554: wrong cursor on readonly range items. + +### Network + +- Fixed #1531, #1335: border distances for arrow positioning +- Fixed findNode method. It now does not return internal objects anymore. +- Fixed #1529, clustering and declustering now respects the original settings of the edges for physics and hidden. +- Fixed #1406, control nodes are now drawn immediately without a second redraw. +- Fixed #1404, made the array returned by findNode match the docs. +- Added #1138, enable the user to define the color of the shadows for nodes and edges. +- Fixed #1528, #1278, avoided ID's being cast to string for methods that return ID's as well as storePositions casting to string. +- Fixed upscaling when the window size increases. +- Accepted pull request #1544, thanks @felixhayashi! +- Fixed documented bug in #1544. + + +## 2015-12-18, version 4.11.0 + +### Network + +- Expose `setSelection` method. Thanks @zefrog. + +### Timeline + +- Fixed #1441: Height of subgroups not immediately updated after updating + data in a DataSet or DataView. +- Fixed #1491: Problem using ctrl+drag in combination with using a `DataView`, + and an issue with ctrl+drag when using `snap: null`. +- Fixed #1486: Item range sometimes wrongly calculated on IE in case of old dates. +- Fixed #1523: end of data range wrongly determined. + +### Graph2d + +- Large refactoring of Graph2d code base: + - Implemented a new option for `shaded.orientation` to always shade towards zero. + - Implemented a new option for `shaded.orientation` to follow another group (fill in between) + - Implemented line-graph stacking + - Fixed support for using a `DataView` in Graph2d. + - Implemented a new zindex option for controlling svg rendering order. + - Performance updates and fixes + +### DataSet +- Fixed #1487: DataSet cannot remove an item with id `0` correctly. + +### DataView +- Added the map() function from DataSet. + + +## 2015-11-27, version 4.10.0 + +### General + +- Fixed #1353: Custom bundling with browserify requiring manual installation + of `babelify`. + +### Network + +- Implemented new method `setSelection({nodes:[...], edges: [...]})`. + Thanks @zefrog. +- Fixed #1343: Connected edges are now deselected too when deselecting a node. +- Fixed #1398: Support nodes start with the correct positions. +- Fixed #1324: Labels now scale again. +- Fixed #1362: Layout of hierarchicaly systems no longer overlaps NODES. +- Fixed #1414: Fixed color references for nodes and edges. +- Fixed #1408: Unclustering without release function respects fixed positions now. +- Fixed #1358: Fixed example for clustering on zoom. +- Fixed #1416: Fixed error in improvedLayout. +- Improvements on hierarchical layout. + +### Timeline + +- Implemented option `itemsAlwaysDraggable`, See #1395. Thanks @liuqingc. +- Implemented option `multiselectPerGroup`. Thanks @hansmaulwurf23. +- Implemented property `oldData` on change events of the DataSet, and + deprecated the `data` property which wrongly contained new data instead of + old data. Thanks @hansmaulwurf23. +- Implemented option `maxMinorChars` to customize the width of the grid. +- Expose `vis.timeline.Core` for customization purposes. +- Fixed #1449, #1393: text of minor grids sometimes not being drawn. + +### Graph2d + +- Fixed #1385: Draw lines on top of bars. +- Fixed #1461 and #1345: Reset order of SVG elements in legend icons. + +### DataSet/DataView + +- Performance improvements (see #1381). Thanks @phimimms. + + +## 2015-10-01, version 4.9.0 + +### Network + +- Fixed bug where an edge that was not connected would crash the layout algorithms. +- Fixed bug where a box shape could not be drawn outside of the viewable area. +- Fixed bug where dragging a node that is not a control node during edit edge mode would throw an error. +- Made auto scaling on container size change pick the lowest between delta height and delta width. +- Added images with borders option (useBorderWithImage) +- Updated the manipulation css to fix offset if there is no separator. + +### Timeline + +- Fixed #1326: wrongly positioned dot of PointItems. +- Fixed #1249: option `hiddenDates` not accepting a single hidden date. +- Fixed a bug when pinching and using hidden dates. Thanks @lauzierj. + + +## 2015-09-14, version 4.8.2 + +### Network + +- Fixed Phantom Edges during clustering. +- Fixed scaling not doing anything to edges. +- Fixed setting font to null so the network won't crash anymore. +- Fixed stabilized event not firing if layout algorithm does very well. +- Fixed arrows with some shapes when they are selected. #1292 +- Fixed deletion of options by settings them to null. + + +## 2015-09-07, version 4.8.1 + +### Network + +- Added German (de) locale. Thanks @Tooa. +- Fixed critical camera zoom bug #1273. +- Fixed unselectAll method. #1256 +- Fixed bug that broke the network if drawn in a hidden div #1254 + +### Timeline + +- Fixed #1215: inconsistent types of properties `start` and `end` in callback + functions `onMove`, `onMoving`, `onAdd`. + + +## 2015-08-28, version 4.8.0 + +### Timeline + +- Implemented reordering groups by dragging them vertically. Thanks @hansmaulwurf23. + +### Network + +- Added Spanish (es) locale. Thanks @gomezgoiri. +- Added support for labels in edges and titles for both nodes and edges during gephi import. +- Added KamadaKawai layout engine for improved initial layout. +- Added Adaptive timestep to the physics solvers for increased performance during stabilization. +- Added improvedLayout as experimental option for greatly improved stabilization times. +- Added adaptiveTimestep as experimental option for greatly improved stabilization times. +- Added support for Gephi directed edges, edge labels and titles. +- Improved the positioning and CSS of the configurator and the color picker. +- Greatly improved performance in clustering. +- Made the network keep its 'view' during a change of the size of the container. +- Fixed #1152, updating images now works. +- Fixed cleaning up of nodes. +- Fixed dynamic updating of label properties. +- Fixed bugs in clustering algorithm. +- Fixed find node return types. +- Fixed bug where stabilization iterations were counted double. If it looks like the stabilization is slower, its because it is doing twice the amount of steps it did before. +- Fixed getPositions return values. + +## Graph2d + +- Implemented configuration option `excludeFromLegend`. Thanks @Bernd0. + + +## 2015-07-27, version 4.7.0 + +### Timeline + +- Fixed #192: Items keep their group offset while dragging items located in + multiple groups. Thanks @Fice. +- Fixed #1118: since v4.6.0, grid of time axis was wrongly positioned on some + scales. + +### Network + +- Added moveNode method. +- Added cubic Bezier curves. + + +## 2015-07-22, version 4.6.0 + +### Timeline + +- Implemented #24: support for custom timezones, see configuration option `moment`. + +### Graph2d + +- Implemented #24: support for custom timezones, see configuration option `moment`. + +### Network + +- Fixed #1111, check if edges exist was not correct on update. +- Fixed #1112, network now works in firefox on unix again. +- Added #931, borderRadius in shapeProperties for the box shape. +- Added #936, useImageSize for images and circularImages + +## 2015-07-20, version 4.5.1 + +### Network + +- Fixed another clustering bug, phantom edges should be gone now. +- Fixed disabling hierarchical layout. +- Fixed delete button when using multiple selected items in manipulation system. + + ## 2015-07-17, version 4.5.0 ### General diff --git a/lib/vis/LICENSE-MIT b/lib/vis/LICENSE-MIT index 9585e4bf4e..61da206c09 100644 --- a/lib/vis/LICENSE-MIT +++ b/lib/vis/LICENSE-MIT @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2014-2015 Almende B.V. +Copyright (c) 2014-2016 Almende B.V. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/lib/vis/NOTICE b/lib/vis/NOTICE index 45c5d3d1aa..a5ef8dbf57 100644 --- a/lib/vis/NOTICE +++ b/lib/vis/NOTICE @@ -1,5 +1,5 @@ Vis.js -Copyright 2010-2015 Almende B.V. +Copyright 2010-2016 Almende B.V. Vis.js is dual licensed under both diff --git a/lib/vis/README.md b/lib/vis/README.md index 7237c5f0e4..00f1666f95 100644 --- a/lib/vis/README.md +++ b/lib/vis/README.md @@ -22,15 +22,13 @@ The vis.js library is developed by [Almende B.V](http://almende.com). Install via npm: - npm install vis + $ npm install vis Install via bower: - bower install vis + $ bower install vis -Link via cdnjs: - - http://cdnjs.com +Link via cdnjs: http://cdnjs.com Or download the library from the github project: [https://github.com/almende/vis.git](https://github.com/almende/vis.git). @@ -126,28 +124,28 @@ of the project. To build the library from source, clone the project from github - git clone git://github.com/almende/vis.git + $ git clone git://github.com/almende/vis.git The source code uses the module style of node (require and module.exports) to organize dependencies. To install all dependencies and build the library, run `npm install` in the root of the project. - cd vis - npm install + $ cd vis + $ npm install Then, the project can be build running: - npm run build + $ npm run build To automatically rebuild on changes in the source files, once can use - npm run watch + $ npm run watch This will both build and minify the library on changes. Minifying is relatively slow, so when only the non-minified library is needed, one can use the `watch-dev` script instead: - npm run watch-dev + $ npm run watch-dev ## Custom builds @@ -163,10 +161,25 @@ The source code of vis.js consists of commonjs modules, which makes it possible Before you can do a build: -- Install node.js, npm, browserify, and uglify-js on your system. -- Download or clone the vis.js project. -- Install the dependencies of vis.js by running `npm install` in the root of the project. +- Install node.js and npm on your system: https://nodejs.org/ +- Install the following modules using npm: `browserify`, `babelify`, and `uglify-js`: + + ``` + $ [sudo] npm install -g browserify babelify uglify-js + ``` + +- Download or clone the vis.js project: + ``` + $ git clone https://github.com/almende/vis.git + ``` + +- Install the dependencies of vis.js by running `npm install` in the root of the project: + + ``` + $ cd vis + $ npm install + ``` #### Example 1: Bundle a single visualization @@ -177,13 +190,13 @@ exports.DataSet = require('./lib/DataSet'); exports.Timeline = require('./lib/timeline/Timeline'); ``` -Install browserify globally via `[sudo] npm install -g browserify`, then create a custom bundle like: +Then create a custom bundle using browserify, like: - browserify custom.js -t babelify -o vis-custom.js -s vis + $ browserify custom.js -t babelify -o vis-custom.js -s vis -This will generate a custom bundle *vis-custom.js*, which exposes the namespace `vis` containing only `DataSet` and `Timeline`. The generated bundle can be minified with uglifyjs (installed globally with `[sudo] npm install -g uglify-js`): +This will generate a custom bundle *vis-custom.js*, which exposes the namespace `vis` containing only `DataSet` and `Timeline`. The generated bundle can be minified using uglifyjs: - uglifyjs vis-custom.js -o vis-custom.min.js + $ uglifyjs vis-custom.js -o vis-custom.min.js The custom bundle can now be loaded like: @@ -204,11 +217,11 @@ The custom bundle can now be loaded like: The default bundle `vis.js` is standalone and includes external dependencies such as hammer.js and moment.js. When these libraries are already loaded by the application, vis.js does not need to include these dependencies itself too. To build a custom bundle of vis.js excluding moment.js and hammer.js, run browserify in the root of the project: - browserify index.js -t babelify -o vis-custom.js -s vis -x moment -x hammerjs + $ browserify index.js -t babelify -o vis-custom.js -s vis -x moment -x hammerjs This will generate a custom bundle *vis-custom.js*, which exposes the namespace `vis`, and has moment and hammerjs excluded. The generated bundle can be minified with uglifyjs: - uglifyjs vis-custom.js -o vis-custom.min.js + $ uglifyjs vis-custom.js -o vis-custom.min.js The custom bundle can now be loaded as: @@ -254,12 +267,12 @@ var timeline = new Timeline(container, data, options); Install the application dependencies via npm: - npm install vis moment + $ npm install vis moment The application can be bundled and minified: - browserify app.js -o app-bundle.js -t babelify - uglifyjs app-bundle.js -o app-bundle.min.js + $ browserify app.js -o app-bundle.js -t babelify + $ uglifyjs app-bundle.js -o app-bundle.min.js And loaded into a webpage: @@ -282,11 +295,11 @@ And loaded into a webpage: To test the library, install the project dependencies once: - npm install + $ npm install Then run the tests: - npm test + $ npm test ## License diff --git a/lib/vis/bower.json b/lib/vis/bower.json index 51fcae85bd..7da02ad8b1 100644 --- a/lib/vis/bower.json +++ b/lib/vis/bower.json @@ -1,6 +1,5 @@ { "name": "vis", - "version": "4.5.0", "main": ["dist/vis.min.js", "dist/vis.min.css"], "description": "A dynamic, browser-based visualization library.", "homepage": "http://visjs.org/", diff --git a/lib/vis/dist/vis.css b/lib/vis/dist/vis.css index bca66454e9..7fcbb4ce95 100644 --- a/lib/vis/dist/vis.css +++ b/lib/vis/dist/vis.css @@ -20,6 +20,294 @@ width: auto; } +div.vis-configuration { + position:relative; + display:block; + float:left; + font-size:12px; +} + +div.vis-configuration-wrapper { + display:block; + width:700px; +} + +div.vis-configuration-wrapper::after { + clear: both; + content: ""; + display: block; +} + +div.vis-configuration.vis-config-option-container{ + display:block; + width:495px; + background-color: #ffffff; + border:2px solid #f7f8fa; + border-radius:4px; + margin-top:20px; + left:10px; + padding-left:5px; +} + +div.vis-configuration.vis-config-button{ + display:block; + width:495px; + height:25px; + vertical-align: middle; + line-height:25px; + background-color: #f7f8fa; + border:2px solid #ceced0; + border-radius:4px; + margin-top:20px; + left:10px; + padding-left:5px; + cursor: pointer; + margin-bottom:30px; +} + +div.vis-configuration.vis-config-button.hover{ + background-color: #4588e6; + border:2px solid #214373; + color:#ffffff; +} + +div.vis-configuration.vis-config-item{ + display:block; + float:left; + width:495px; + height:25px; + vertical-align: middle; + line-height:25px; +} + + +div.vis-configuration.vis-config-item.vis-config-s2{ + left:10px; + background-color: #f7f8fa; + padding-left:5px; + border-radius:3px; +} +div.vis-configuration.vis-config-item.vis-config-s3{ + left:20px; + background-color: #e4e9f0; + padding-left:5px; + border-radius:3px; +} +div.vis-configuration.vis-config-item.vis-config-s4{ + left:30px; + background-color: #cfd8e6; + padding-left:5px; + border-radius:3px; +} + +div.vis-configuration.vis-config-header{ + font-size:18px; + font-weight: bold; +} + +div.vis-configuration.vis-config-label{ + width:120px; + height:25px; + line-height: 25px; +} + +div.vis-configuration.vis-config-label.vis-config-s3{ + width:110px; +} +div.vis-configuration.vis-config-label.vis-config-s4{ + width:100px; +} + +div.vis-configuration.vis-config-colorBlock{ + top:1px; + width:30px; + height:19px; + border:1px solid #444444; + border-radius:2px; + padding:0px; + margin:0px; + cursor:pointer; +} + +input.vis-configuration.vis-config-checkbox { + left:-5px; +} + + +input.vis-configuration.vis-config-rangeinput{ + position:relative; + top:-5px; + width:60px; + /*height:13px;*/ + padding:1px; + margin:0; + pointer-events:none; +} + +input.vis-configuration.vis-config-range{ + /*removes default webkit styles*/ + -webkit-appearance: none; + + /*fix for FF unable to apply focus style bug */ + border: 0px solid white; + background-color:rgba(0,0,0,0); + + /*required for proper track sizing in FF*/ + width: 300px; + height:20px; +} +input.vis-configuration.vis-config-range::-webkit-slider-runnable-track { + width: 300px; + height: 5px; + background: #dedede; /* Old browsers */ + background: -moz-linear-gradient(top, #dedede 0%, #c8c8c8 99%); /* FF3.6+ */ + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#dedede), color-stop(99%,#c8c8c8)); /* Chrome,Safari4+ */ + background: -webkit-linear-gradient(top, #dedede 0%,#c8c8c8 99%); /* Chrome10+,Safari5.1+ */ + background: -o-linear-gradient(top, #dedede 0%, #c8c8c8 99%); /* Opera 11.10+ */ + background: -ms-linear-gradient(top, #dedede 0%,#c8c8c8 99%); /* IE10+ */ + background: linear-gradient(to bottom, #dedede 0%,#c8c8c8 99%); /* W3C */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#dedede', endColorstr='#c8c8c8',GradientType=0 ); /* IE6-9 */ + + border: 1px solid #999999; + box-shadow: #aaaaaa 0px 0px 3px 0px; + border-radius: 3px; +} +input.vis-configuration.vis-config-range::-webkit-slider-thumb { + -webkit-appearance: none; + border: 1px solid #14334b; + height: 17px; + width: 17px; + border-radius: 50%; + background: #3876c2; /* Old browsers */ + background: -moz-linear-gradient(top, #3876c2 0%, #385380 100%); /* FF3.6+ */ + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#3876c2), color-stop(100%,#385380)); /* Chrome,Safari4+ */ + background: -webkit-linear-gradient(top, #3876c2 0%,#385380 100%); /* Chrome10+,Safari5.1+ */ + background: -o-linear-gradient(top, #3876c2 0%,#385380 100%); /* Opera 11.10+ */ + background: -ms-linear-gradient(top, #3876c2 0%,#385380 100%); /* IE10+ */ + background: linear-gradient(to bottom, #3876c2 0%,#385380 100%); /* W3C */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#3876c2', endColorstr='#385380',GradientType=0 ); /* IE6-9 */ + box-shadow: #111927 0px 0px 1px 0px; + margin-top: -7px; +} +input.vis-configuration.vis-config-range:focus { + outline: none; +} +input.vis-configuration.vis-config-range:focus::-webkit-slider-runnable-track { + background: #9d9d9d; /* Old browsers */ + background: -moz-linear-gradient(top, #9d9d9d 0%, #c8c8c8 99%); /* FF3.6+ */ + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#9d9d9d), color-stop(99%,#c8c8c8)); /* Chrome,Safari4+ */ + background: -webkit-linear-gradient(top, #9d9d9d 0%,#c8c8c8 99%); /* Chrome10+,Safari5.1+ */ + background: -o-linear-gradient(top, #9d9d9d 0%,#c8c8c8 99%); /* Opera 11.10+ */ + background: -ms-linear-gradient(top, #9d9d9d 0%,#c8c8c8 99%); /* IE10+ */ + background: linear-gradient(to bottom, #9d9d9d 0%,#c8c8c8 99%); /* W3C */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#9d9d9d', endColorstr='#c8c8c8',GradientType=0 ); /* IE6-9 */ +} + +input.vis-configuration.vis-config-range::-moz-range-track { + width: 300px; + height: 10px; + background: #dedede; /* Old browsers */ + background: -moz-linear-gradient(top, #dedede 0%, #c8c8c8 99%); /* FF3.6+ */ + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#dedede), color-stop(99%,#c8c8c8)); /* Chrome,Safari4+ */ + background: -webkit-linear-gradient(top, #dedede 0%,#c8c8c8 99%); /* Chrome10+,Safari5.1+ */ + background: -o-linear-gradient(top, #dedede 0%, #c8c8c8 99%); /* Opera 11.10+ */ + background: -ms-linear-gradient(top, #dedede 0%,#c8c8c8 99%); /* IE10+ */ + background: linear-gradient(to bottom, #dedede 0%,#c8c8c8 99%); /* W3C */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#dedede', endColorstr='#c8c8c8',GradientType=0 ); /* IE6-9 */ + + border: 1px solid #999999; + box-shadow: #aaaaaa 0px 0px 3px 0px; + border-radius: 3px; +} +input.vis-configuration.vis-config-range::-moz-range-thumb { + border: none; + height: 16px; + width: 16px; + + border-radius: 50%; + background: #385380; +} + +/*hide the outline behind the border*/ +input.vis-configuration.vis-config-range:-moz-focusring{ + outline: 1px solid white; + outline-offset: -1px; +} + +input.vis-configuration.vis-config-range::-ms-track { + width: 300px; + height: 5px; + + /*remove bg colour from the track, we'll use ms-fill-lower and ms-fill-upper instead */ + background: transparent; + + /*leave room for the larger thumb to overflow with a transparent border */ + border-color: transparent; + border-width: 6px 0; + + /*remove default tick marks*/ + color: transparent; +} +input.vis-configuration.vis-config-range::-ms-fill-lower { + background: #777; + border-radius: 10px; +} +input.vis-configuration.vis-config-range::-ms-fill-upper { + background: #ddd; + border-radius: 10px; +} +input.vis-configuration.vis-config-range::-ms-thumb { + border: none; + height: 16px; + width: 16px; + border-radius: 50%; + background: #385380; +} +input.vis-configuration.vis-config-range:focus::-ms-fill-lower { + background: #888; +} +input.vis-configuration.vis-config-range:focus::-ms-fill-upper { + background: #ccc; +} + +.vis-configuration-popup { + position: absolute; + background: rgba(57, 76, 89, 0.85); + border: 2px solid #f2faff; + line-height:30px; + height:30px; + width:150px; + text-align:center; + color: #ffffff; + font-size:14px; + border-radius:4px; + -webkit-transition: opacity 0.3s ease-in-out; + -moz-transition: opacity 0.3s ease-in-out; + transition: opacity 0.3s ease-in-out; +} +.vis-configuration-popup:after, .vis-configuration-popup:before { + left: 100%; + top: 50%; + border: solid transparent; + content: " "; + height: 0; + width: 0; + position: absolute; + pointer-events: none; +} + +.vis-configuration-popup:after { + border-color: rgba(136, 183, 213, 0); + border-left-color: rgba(57, 76, 89, 0.85); + border-width: 8px; + margin-top: -8px; +} +.vis-configuration-popup:before { + border-color: rgba(194, 225, 245, 0); + border-left-color: #f2faff; + border-width: 12px; + margin-top: -12px; +} .vis-timeline { position: relative; @@ -115,6 +403,10 @@ border-bottom: 1px solid #bfbfbf; } +.vis-labelset .vis-label.draggable { + cursor: pointer; +} + .vis-labelset .vis-label:last-child { border-bottom: none; } @@ -297,6 +589,11 @@ cursor: e-resize; } +.vis-range.vis-item.vis-readonly .vis-drag-left, +.vis-range.vis-item.vis-readonly .vis-drag-right { + cursor: auto; +} + .vis-time-axis { position: relative; overflow: hidden; @@ -616,17 +913,18 @@ div.vis-network div.vis-manipulation { background: linear-gradient(to bottom, #ffffff 0%,#fcfcfc 48%,#fafafa 50%,#fcfcfc 100%); /* W3C */ filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffffff', endColorstr='#fcfcfc',GradientType=0 ); /* IE6-9 */ + padding-top:4px; position: absolute; left: 0; top: 0; width: 100%; - height: 30px; + height: 28px; } div.vis-network div.vis-edit-mode { position:absolute; left: 0; - top: 15px; + top: 5px; height: 30px; } @@ -657,8 +955,7 @@ div.vis-network div.vis-close:hover { div.vis-network div.vis-manipulation div.vis-button, div.vis-network div.vis-edit-mode div.vis-button { - position:relative; - top:-7px; + float:left; font-family: verdana; font-size: 12px; -moz-border-radius: 15px; @@ -667,8 +964,8 @@ div.vis-network div.vis-edit-mode div.vis-button { background-position: 0px 0px; background-repeat:no-repeat; height:24px; - margin: 0px 0px 0px 10px; - vertical-align:middle; + margin-left: 10px; + /*vertical-align:middle;*/ cursor: pointer; padding: 0px 8px 0px 8px; -webkit-touch-callout: none; @@ -734,11 +1031,12 @@ div.vis-network div.vis-edit-mode div.vis-label { line-height: 25px; } div.vis-network div.vis-manipulation div.vis-separator-line { + float:left; display:inline-block; width:1px; - height:20px; + height:21px; background-color: #bdbdbd; - margin: 5px 7px 0 15px; + margin: 0px 7px 0 15px; /*top right bottom left*/ } /* TODO: is this redundant? @@ -750,6 +1048,25 @@ div.network-navigation_wrapper { height: 100%; } */ +div.vis-network-tooltip { + position: absolute; + visibility: hidden; + padding: 5px; + white-space: nowrap; + + font-family: verdana; + font-size:14px; + font-color:#000000; + background-color: #f5f4ed; + + -moz-border-radius: 3px; + -webkit-border-radius: 3px; + border-radius: 3px; + border: 1px solid #808074; + + box-shadow: 3px 3px 10px rgba(0, 0, 0, 0.2); + pointer-events: none; +} div.vis-network div.vis-navigation div.vis-button { width:34px; height:34px; @@ -811,280 +1128,20 @@ div.vis-network div.vis-navigation div.vis-button.vis-zoomExtends { bottom:50px; right:15px; } -div.vis-network-tooltip { - position: absolute; - visibility: hidden; - padding: 5px; - white-space: nowrap; - - font-family: verdana; - font-size:14px; - font-color:#000000; - background-color: #f5f4ed; - - -moz-border-radius: 3px; - -webkit-border-radius: 3px; - border-radius: 3px; - border: 1px solid #808074; - - box-shadow: 3px 3px 10px rgba(0, 0, 0, 0.2); - pointer-events: none; -} -div.vis-network-configuration { - position:relative; - display:block; - float:left; - font-size:12px; -} - -div.vis-network-configuration-wrapper { - display:block; - width:700px; -} - - -div.vis-network-configuration.vis-option-container{ - display:block; - width:495px; - background-color: #ffffff; - border:2px solid #f7f8fa; - border-radius:4px; - margin-top:20px; - left:10px; - padding-left:5px; -} - -div.vis-network-configuration.button{ - display:block; - width:495px; - height:25px; - vertical-align: middle; - line-height:25px; - background-color: #f7f8fa; - border:2px solid #ceced0; - border-radius:4px; - margin-top:20px; - left:10px; - padding-left:5px; - cursor: pointer; - margin-bottom:30px; -} - -div.vis-network-configuration.button.hover{ - background-color: #4588e6; - border:2px solid #214373; - color:#ffffff; -} - -div.vis-network-configuration.item{ - display:block; - float:left; - width:495px; - height:25px; - vertical-align: middle; - line-height:25px; -} - - -div.vis-network-configuration.item.s2{ - left:10px; - background-color: #f7f8fa; - padding-left:5px; - border-radius:3px; -} -div.vis-network-configuration.item.s3{ - left:20px; - background-color: #e4e9f0; - padding-left:5px; - border-radius:3px; -} -div.vis-network-configuration.item.s4{ - left:30px; - background-color: #cfd8e6; - padding-left:5px; - border-radius:3px; -} - -div.vis-network-configuration.header{ - font-size:18px; - font-weight: bold; -} - -div.vis-network-configuration.label{ - width:120px; - height:25px; - line-height: 25px; -} - -div.vis-network-configuration.label.s3{ - width:110px; -} -div.vis-network-configuration.label.s4{ - width:100px; -} - -div.vis-network-configuration.colorBlock{ - top:1px; - width:30px; - height:19px; - border:1px solid #444444; - border-radius:2px; - padding:0px; - margin:0px; - cursor:pointer; -} - -input.vis-network-configuration.checkbox { - left:-5px; -} - - -input.vis-network-configuration.rangeinput{ - position:relative; - top:-5px; - width:60px; - height:13px; - padding:1px; - margin:0; - pointer-events:none; -} - -input.vis-network-configuration.range{ - /*removes default webkit styles*/ - -webkit-appearance: none; - - /*fix for FF unable to apply focus style bug */ - border: 0px solid white; - background-color:rgba(0,0,0,0); - - /*required for proper track sizing in FF*/ - width: 300px; - height:20px; -} -input.vis-network-configuration.range::-webkit-slider-runnable-track { - width: 300px; - height: 5px; - background: #dedede; /* Old browsers */ - background: -moz-linear-gradient(top, #dedede 0%, #c8c8c8 99%); /* FF3.6+ */ - background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#dedede), color-stop(99%,#c8c8c8)); /* Chrome,Safari4+ */ - background: -webkit-linear-gradient(top, #dedede 0%,#c8c8c8 99%); /* Chrome10+,Safari5.1+ */ - background: -o-linear-gradient(top, #dedede 0%, #c8c8c8 99%); /* Opera 11.10+ */ - background: -ms-linear-gradient(top, #dedede 0%,#c8c8c8 99%); /* IE10+ */ - background: linear-gradient(to bottom, #dedede 0%,#c8c8c8 99%); /* W3C */ - filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#dedede', endColorstr='#c8c8c8',GradientType=0 ); /* IE6-9 */ - - border: 1px solid #999999; - box-shadow: #aaaaaa 0px 0px 3px 0px; - border-radius: 3px; -} -input.vis-network-configuration.range::-webkit-slider-thumb { - -webkit-appearance: none; - border: 1px solid #14334b; - height: 17px; - width: 17px; - border-radius: 50%; - background: #3876c2; /* Old browsers */ - background: -moz-linear-gradient(top, #3876c2 0%, #385380 100%); /* FF3.6+ */ - background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#3876c2), color-stop(100%,#385380)); /* Chrome,Safari4+ */ - background: -webkit-linear-gradient(top, #3876c2 0%,#385380 100%); /* Chrome10+,Safari5.1+ */ - background: -o-linear-gradient(top, #3876c2 0%,#385380 100%); /* Opera 11.10+ */ - background: -ms-linear-gradient(top, #3876c2 0%,#385380 100%); /* IE10+ */ - background: linear-gradient(to bottom, #3876c2 0%,#385380 100%); /* W3C */ - filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#3876c2', endColorstr='#385380',GradientType=0 ); /* IE6-9 */ - box-shadow: #111927 0px 0px 1px 0px; - margin-top: -7px; -} -input.vis-network-configuration.range:focus { - outline: none; -} -input.vis-network-configuration.range:focus::-webkit-slider-runnable-track { - background: #9d9d9d; /* Old browsers */ - background: -moz-linear-gradient(top, #9d9d9d 0%, #c8c8c8 99%); /* FF3.6+ */ - background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#9d9d9d), color-stop(99%,#c8c8c8)); /* Chrome,Safari4+ */ - background: -webkit-linear-gradient(top, #9d9d9d 0%,#c8c8c8 99%); /* Chrome10+,Safari5.1+ */ - background: -o-linear-gradient(top, #9d9d9d 0%,#c8c8c8 99%); /* Opera 11.10+ */ - background: -ms-linear-gradient(top, #9d9d9d 0%,#c8c8c8 99%); /* IE10+ */ - background: linear-gradient(to bottom, #9d9d9d 0%,#c8c8c8 99%); /* W3C */ - filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#9d9d9d', endColorstr='#c8c8c8',GradientType=0 ); /* IE6-9 */ -} - -input.vis-network-configuration.range::-moz-range-track { - width: 300px; - height: 10px; - background: #dedede; /* Old browsers */ - background: -moz-linear-gradient(top, #dedede 0%, #c8c8c8 99%); /* FF3.6+ */ - background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#dedede), color-stop(99%,#c8c8c8)); /* Chrome,Safari4+ */ - background: -webkit-linear-gradient(top, #dedede 0%,#c8c8c8 99%); /* Chrome10+,Safari5.1+ */ - background: -o-linear-gradient(top, #dedede 0%, #c8c8c8 99%); /* Opera 11.10+ */ - background: -ms-linear-gradient(top, #dedede 0%,#c8c8c8 99%); /* IE10+ */ - background: linear-gradient(to bottom, #dedede 0%,#c8c8c8 99%); /* W3C */ - filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#dedede', endColorstr='#c8c8c8',GradientType=0 ); /* IE6-9 */ - - border: 1px solid #999999; - box-shadow: #aaaaaa 0px 0px 3px 0px; - border-radius: 3px; -} -input.vis-network-configuration.range::-moz-range-thumb { - border: none; - height: 16px; - width: 16px; - - border-radius: 50%; - background: #385380; -} - -/*hide the outline behind the border*/ -input.vis-network-configuration.range:-moz-focusring{ - outline: 1px solid white; - outline-offset: -1px; -} - -input.vis-network-configuration.range::-ms-track { - width: 300px; - height: 5px; - - /*remove bg colour from the track, we'll use ms-fill-lower and ms-fill-upper instead */ - background: transparent; - - /*leave room for the larger thumb to overflow with a transparent border */ - border-color: transparent; - border-width: 6px 0; - - /*remove default tick marks*/ - color: transparent; -} -input.vis-network-configuration.range::-ms-fill-lower { - background: #777; - border-radius: 10px; -} -input.vis-network-configuration.range::-ms-fill-upper { - background: #ddd; - border-radius: 10px; -} -input.vis-network-configuration.range::-ms-thumb { - border: none; - height: 16px; - width: 16px; - border-radius: 50%; - background: #385380; -} -input.vis-network-configuration.range:focus::-ms-fill-lower { - background: #888; -} -input.vis-network-configuration.range:focus::-ms-fill-upper { - background: #ccc; -} div.vis-color-picker { position:absolute; + top: 0px; + left: 30px; margin-top:-140px; margin-left:30px; - width:293px; - height:425px; + width:310px; + height:444px; + z-index: 1; padding: 10px; border-radius:15px; background-color:#ffffff; - display:none; + display: none; box-shadow: rgba(0,0,0,0.5) 0px 0px 10px 0px; } @@ -1094,8 +1151,8 @@ div.vis-color-picker div.vis-arrow { left:5px; } -div.vis-color-picker div.vis-arrow:after, -div.vis-color-picker div.vis-arrow:before { +div.vis-color-picker div.vis-arrow::after, +div.vis-color-picker div.vis-arrow::before { right: 100%; top: 50%; border: solid transparent; diff --git a/lib/vis/dist/vis.js b/lib/vis/dist/vis.js index 4ff5f0a328..661263a518 100644 --- a/lib/vis/dist/vis.js +++ b/lib/vis/dist/vis.js @@ -4,11 +4,11 @@ * * A dynamic, browser-based visualization library. * - * @version 4.5.0 - * @date 2015-07-17 + * @version 4.14.0 + * @date 2016-02-04 * * @license - * Copyright (C) 2011-2014 Almende B.V, http://almende.com + * Copyright (C) 2011-2016 Almende B.V, http://almende.com * * Vis.js is dual licensed under both * @@ -29,7 +29,7 @@ if(typeof exports === 'object' && typeof module === 'object') module.exports = factory(); else if(typeof define === 'function' && define.amd) - define(factory); + define([], factory); else if(typeof exports === 'object') exports["vis"] = factory(); else @@ -84,65 +84,66 @@ return /******/ (function(modules) { // webpackBootstrap // utils 'use strict'; - exports.util = __webpack_require__(7); - exports.DOMutil = __webpack_require__(13); + exports.util = __webpack_require__(1); + exports.DOMutil = __webpack_require__(7); // data - exports.DataSet = __webpack_require__(14); - exports.DataView = __webpack_require__(16); - exports.Queue = __webpack_require__(15); + exports.DataSet = __webpack_require__(8); + exports.DataView = __webpack_require__(10); + exports.Queue = __webpack_require__(9); // Graph3d - exports.Graph3d = __webpack_require__(17); + exports.Graph3d = __webpack_require__(11); exports.graph3d = { - Camera: __webpack_require__(21), - Filter: __webpack_require__(22), - Point2d: __webpack_require__(18), - Point3d: __webpack_require__(20), - Slider: __webpack_require__(23), - StepNumber: __webpack_require__(24) + Camera: __webpack_require__(15), + Filter: __webpack_require__(16), + Point2d: __webpack_require__(14), + Point3d: __webpack_require__(13), + Slider: __webpack_require__(17), + StepNumber: __webpack_require__(18) }; // Timeline - exports.Timeline = __webpack_require__(25); - exports.Graph2d = __webpack_require__(49); + exports.Timeline = __webpack_require__(19); + exports.Graph2d = __webpack_require__(48); exports.timeline = { - DateUtil: __webpack_require__(31), - DataStep: __webpack_require__(52), - Range: __webpack_require__(29), - stack: __webpack_require__(35), - TimeStep: __webpack_require__(37), + Core: __webpack_require__(27), + DateUtil: __webpack_require__(26), + Range: __webpack_require__(23), + stack: __webpack_require__(31), + TimeStep: __webpack_require__(29), components: { items: { - Item: __webpack_require__(2), - BackgroundItem: __webpack_require__(40), - BoxItem: __webpack_require__(39), - PointItem: __webpack_require__(1), - RangeItem: __webpack_require__(36) + Item: __webpack_require__(33), + BackgroundItem: __webpack_require__(37), + BoxItem: __webpack_require__(35), + PointItem: __webpack_require__(36), + RangeItem: __webpack_require__(32) }, - Component: __webpack_require__(27), - CurrentTime: __webpack_require__(26), - CustomTime: __webpack_require__(44), - DataAxis: __webpack_require__(51), - GraphGroup: __webpack_require__(53), - Group: __webpack_require__(34), - BackgroundGroup: __webpack_require__(38), - ItemSet: __webpack_require__(33), - Legend: __webpack_require__(57), - LineGraph: __webpack_require__(50), - TimeAxis: __webpack_require__(41) + BackgroundGroup: __webpack_require__(34), + Component: __webpack_require__(25), + CurrentTime: __webpack_require__(43), + CustomTime: __webpack_require__(41), + DataAxis: __webpack_require__(50), + DataScale: __webpack_require__(51), + GraphGroup: __webpack_require__(52), + Group: __webpack_require__(30), + ItemSet: __webpack_require__(28), + Legend: __webpack_require__(56), + LineGraph: __webpack_require__(49), + TimeAxis: __webpack_require__(38) } }; // Network - exports.Network = __webpack_require__(59); + exports.Network = __webpack_require__(58); exports.network = { - Images: __webpack_require__(112), - dotparser: __webpack_require__(110), - gephiParser: __webpack_require__(111), - allOptions: __webpack_require__(108) + Images: __webpack_require__(116), + dotparser: __webpack_require__(114), + gephiParser: __webpack_require__(115), + allOptions: __webpack_require__(110) }; exports.network.convertDot = function (input) { return exports.network.dotparser.DOTToGraph(input); @@ -151,3243 +152,13 @@ return /******/ (function(modules) { // webpackBootstrap return exports.network.gephiParser.parseGephi(input, options); }; - // Deprecated since v3.0.0 - exports.Graph = function () { - throw new Error('Graph is renamed to Network. Please create a graph as new vis.Network(...)'); - }; - // bundled external libraries - exports.moment = __webpack_require__(8); - exports.hammer = __webpack_require__(3); // TODO: deprecate exports.hammer some day - exports.Hammer = __webpack_require__(3); - exports.keycharm = __webpack_require__(43); + exports.moment = __webpack_require__(2); + exports.Hammer = __webpack_require__(20); + exports.keycharm = __webpack_require__(40); /***/ }, /* 1 */ -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - var Item = __webpack_require__(2); - - /** - * @constructor PointItem - * @extends Item - * @param {Object} data Object containing parameters start - * content, className. - * @param {{toScreen: function, toTime: function}} conversion - * Conversion functions from time to screen and vice versa - * @param {Object} [options] Configuration options - * // TODO: describe available options - */ - function PointItem(data, conversion, options) { - this.props = { - dot: { - top: 0, - width: 0, - height: 0 - }, - content: { - height: 0, - marginLeft: 0 - } - }; - - // validate data - if (data) { - if (data.start == undefined) { - throw new Error('Property "start" missing in item ' + data); - } - } - - Item.call(this, data, conversion, options); - } - - PointItem.prototype = new Item(null, null, null); - - /** - * Check whether this item is visible inside given range - * @returns {{start: Number, end: Number}} range with a timestamp for start and end - * @returns {boolean} True if visible - */ - PointItem.prototype.isVisible = function (range) { - // determine visibility - // TODO: account for the real width of the item. Right now we just add 1/4 to the window - var interval = (range.end - range.start) / 4; - return this.data.start > range.start - interval && this.data.start < range.end + interval; - }; - - /** - * Repaint the item - */ - PointItem.prototype.redraw = function () { - var dom = this.dom; - if (!dom) { - // create DOM - this.dom = {}; - dom = this.dom; - - // background box - dom.point = document.createElement('div'); - // className is updated in redraw() - - // contents box, right from the dot - dom.content = document.createElement('div'); - dom.content.className = 'vis-item-content'; - dom.point.appendChild(dom.content); - - // dot at start - dom.dot = document.createElement('div'); - dom.point.appendChild(dom.dot); - - // attach this item as attribute - dom.point['timeline-item'] = this; - - this.dirty = true; - } - - // append DOM to parent DOM - if (!this.parent) { - throw new Error('Cannot redraw item: no parent attached'); - } - if (!dom.point.parentNode) { - var foreground = this.parent.dom.foreground; - if (!foreground) { - throw new Error('Cannot redraw item: parent has no foreground container element'); - } - foreground.appendChild(dom.point); - } - this.displayed = true; - - // Update DOM when item is marked dirty. An item is marked dirty when: - // - the item is not yet rendered - // - the item's data is changed - // - the item is selected/deselected - if (this.dirty) { - this._updateContents(this.dom.content); - this._updateTitle(this.dom.point); - 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; - - // update class - var className = (this.data.className ? ' ' + this.data.className : '') + (this.selected ? ' vis-selected' : '') + (editable ? ' vis-editable' : ' vis-readonly'); - dom.point.className = 'vis-item vis-point' + className; - dom.dot.className = 'vis-item vis-dot' + className; - - // recalculate size of dot and contents - this.props.dot.width = dom.dot.offsetWidth; - this.props.dot.height = dom.dot.offsetHeight; - this.props.content.height = dom.content.offsetHeight; - - // resize contents - dom.content.style.marginLeft = 2 * this.props.dot.width + 'px'; - //dom.content.style.marginRight = ... + 'px'; // TODO: margin right - - dom.dot.style.top = (this.height - this.props.dot.height) / 2 + 'px'; - dom.dot.style.left = this.props.dot.width / 2 + 'px'; - - // recalculate size - this.width = dom.point.offsetWidth; - this.height = dom.point.offsetHeight; - - this.dirty = false; - } - - this._repaintDeleteButton(dom.point); - }; - - /** - * Show the item in the DOM (when not already visible). The items DOM will - * be created when needed. - */ - PointItem.prototype.show = function () { - if (!this.displayed) { - this.redraw(); - } - }; - - /** - * Hide the item from the DOM (when visible) - */ - PointItem.prototype.hide = function () { - if (this.displayed) { - if (this.dom.point.parentNode) { - this.dom.point.parentNode.removeChild(this.dom.point); - } - - this.displayed = false; - } - }; - - /** - * Reposition the item horizontally - * @Override - */ - PointItem.prototype.repositionX = function () { - var start = this.conversion.toScreen(this.data.start); - - this.left = start - this.props.dot.width; - - // reposition point - this.dom.point.style.left = this.left + 'px'; - }; - - /** - * Reposition the item vertically - * @Override - */ - PointItem.prototype.repositionY = function () { - var orientation = this.options.orientation.item; - var point = this.dom.point; - - if (orientation == 'top') { - point.style.top = this.top + 'px'; - } else { - point.style.top = this.parent.height - this.top - this.height + 'px'; - } - }; - - /** - * Return the width of the item left from its start date - * @return {number} - */ - PointItem.prototype.getWidthLeft = function () { - return this.props.dot.width; - }; - - /** - * Return the width of the item right from its start date - * @return {number} - */ - PointItem.prototype.getWidthRight = function () { - return this.width - this.props.dot.width; - }; - - module.exports = PointItem; - -/***/ }, -/* 2 */ -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - var Hammer = __webpack_require__(3); - var util = __webpack_require__(7); - - /** - * @constructor Item - * @param {Object} data Object containing (optional) parameters type, - * start, end, content, group, className. - * @param {{toScreen: function, toTime: function}} conversion - * Conversion functions from time to screen and vice versa - * @param {Object} options Configuration options - * // TODO: describe available options - */ - function Item(data, conversion, options) { - this.id = null; - this.parent = null; - this.data = data; - this.dom = null; - this.conversion = conversion || {}; - this.options = options || {}; - - this.selected = false; - this.displayed = false; - this.dirty = true; - - this.top = null; - this.left = null; - this.width = null; - this.height = null; - - this.editable = null; - if (this.data && this.data.hasOwnProperty('editable') && typeof this.data.editable === 'boolean') { - this.editable = data.editable; - } - } - - Item.prototype.stack = true; - - /** - * Select current item - */ - Item.prototype.select = function () { - this.selected = true; - this.dirty = true; - if (this.displayed) this.redraw(); - }; - - /** - * Unselect current item - */ - Item.prototype.unselect = function () { - this.selected = false; - this.dirty = true; - if (this.displayed) this.redraw(); - }; - - /** - * Set data for the item. Existing data will be updated. The id should not - * be changed. When the item is displayed, it will be redrawn immediately. - * @param {Object} data - */ - Item.prototype.setData = function (data) { - var groupChanged = data.group != undefined && this.data.group != data.group; - if (groupChanged) { - this.parent.itemSet._moveToGroup(this, data.group); - } - - if (data.hasOwnProperty('editable') && typeof data.editable === 'boolean') { - this.editable = data.editable; - } - - this.data = data; - this.dirty = true; - if (this.displayed) this.redraw(); - }; - - /** - * Set a parent for the item - * @param {ItemSet | Group} parent - */ - Item.prototype.setParent = function (parent) { - if (this.displayed) { - this.hide(); - this.parent = parent; - if (this.parent) { - this.show(); - } - } else { - this.parent = parent; - } - }; - - /** - * Check whether this item is visible inside given range - * @returns {{start: Number, end: Number}} range with a timestamp for start and end - * @returns {boolean} True if visible - */ - Item.prototype.isVisible = function (range) { - // Should be implemented by Item implementations - return false; - }; - - /** - * Show the Item in the DOM (when not already visible) - * @return {Boolean} changed - */ - Item.prototype.show = function () { - return false; - }; - - /** - * Hide the Item from the DOM (when visible) - * @return {Boolean} changed - */ - Item.prototype.hide = function () { - return false; - }; - - /** - * Repaint the item - */ - Item.prototype.redraw = function () {}; - - /** - * Reposition the Item horizontally - */ - Item.prototype.repositionX = function () {}; - - /** - * Reposition the Item vertically - */ - Item.prototype.repositionY = function () {}; - - /** - * Repaint a delete button on the top right of the item when the item is selected - * @param {HTMLElement} anchor - * @protected - */ - Item.prototype._repaintDeleteButton = function (anchor) { - var editable = (this.options.editable.remove || this.data.editable === true) && this.data.editable !== false; - - if (this.selected && editable && !this.dom.deleteButton) { - // create and show button - var me = this; - - var deleteButton = document.createElement('div'); - deleteButton.className = 'vis-delete'; - deleteButton.title = 'Delete this item'; - - // TODO: be able to destroy the delete button - new Hammer(deleteButton).on('tap', function (event) { - event.stopPropagation(); - me.parent.removeFromDataSet(me); - }); - - anchor.appendChild(deleteButton); - this.dom.deleteButton = deleteButton; - } else if (!this.selected && this.dom.deleteButton) { - // remove button - if (this.dom.deleteButton.parentNode) { - this.dom.deleteButton.parentNode.removeChild(this.dom.deleteButton); - } - this.dom.deleteButton = null; - } - }; - - /** - * Set HTML contents for the item - * @param {Element} element HTML element to fill with the contents - * @private - */ - Item.prototype._updateContents = function (element) { - var content; - if (this.options.template) { - var itemData = this.parent.itemSet.itemsData.get(this.id); // get a clone of the data from the dataset - content = this.options.template(itemData); - } else { - content = this.data.content; - } - - var changed = this._contentToString(this.content) !== this._contentToString(content); - if (changed) { - // only replace the content when changed - if (content instanceof Element) { - element.innerHTML = ''; - element.appendChild(content); - } else if (content != undefined) { - element.innerHTML = content; - } else { - if (!(this.data.type == 'background' && this.data.content === undefined)) { - throw new Error('Property "content" missing in item ' + this.id); - } - } - - this.content = content; - } - }; - - /** - * Set HTML contents for the item - * @param {Element} element HTML element to fill with the contents - * @private - */ - Item.prototype._updateTitle = function (element) { - if (this.data.title != null) { - element.title = this.data.title || ''; - } else { - element.removeAttribute('vis-title'); - } - }; - - /** - * Process dataAttributes timeline option and set as data- attributes on dom.content - * @param {Element} element HTML element to which the attributes will be attached - * @private - */ - Item.prototype._updateDataAttributes = function (element) { - if (this.options.dataAttributes && this.options.dataAttributes.length > 0) { - var attributes = []; - - if (Array.isArray(this.options.dataAttributes)) { - attributes = this.options.dataAttributes; - } else if (this.options.dataAttributes == 'all') { - attributes = Object.keys(this.data); - } else { - return; - } - - for (var i = 0; i < attributes.length; i++) { - var name = attributes[i]; - var value = this.data[name]; - - if (value != null) { - element.setAttribute('data-' + name, value); - } else { - element.removeAttribute('data-' + name); - } - } - } - }; - - /** - * Update custom styles of the element - * @param element - * @private - */ - Item.prototype._updateStyle = function (element) { - // remove old styles - if (this.style) { - util.removeCssText(element, this.style); - this.style = null; - } - - // append new styles - if (this.data.style) { - util.addCssText(element, this.data.style); - this.style = this.data.style; - } - }; - - /** - * Stringify the items contents - * @param {string | Element | undefined} content - * @returns {string | undefined} - * @private - */ - Item.prototype._contentToString = function (content) { - if (typeof content === 'string') return content; - if (content && 'outerHTML' in content) return content.outerHTML; - return content; - }; - - /** - * Return the width of the item left from its start date - * @return {number} - */ - Item.prototype.getWidthLeft = function () { - return 0; - }; - - /** - * Return the width of the item right from the max of its start and end date - * @return {number} - */ - Item.prototype.getWidthRight = function () { - return 0; - }; - - module.exports = Item; - - // should be implemented by the item - - // should be implemented by the item - - // should be implemented by the item - -/***/ }, -/* 3 */ -/***/ function(module, exports, __webpack_require__) { - - // Only load hammer.js when in a browser environment - // (loading hammer.js in a node.js environment gives errors) - 'use strict'; - - if (typeof window !== 'undefined') { - var propagating = __webpack_require__(4); - var Hammer = window['Hammer'] || __webpack_require__(5); - module.exports = propagating(Hammer, { - preventDefault: 'mouse' - }); - } else { - module.exports = function () { - throw Error('hammer.js is only available in a browser, not in node.js.'); - }; - } - -/***/ }, -/* 4 */ -/***/ function(module, exports, __webpack_require__) { - - var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;'use strict'; - - (function (factory) { - if (true) { - // AMD. Register as an anonymous module. - !(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory), __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); - } else if (typeof exports === 'object') { - // Node. Does not work with strict CommonJS, but - // only CommonJS-like environments that support module.exports, - // like Node. - module.exports = factory(); - } else { - // Browser globals (root is window) - window.propagating = factory(); - } - }(function () { - var _firstTarget = null; // singleton, will contain the target element where the touch event started - var _processing = false; // singleton, true when a touch event is being handled - - /** - * Extend an Hammer.js instance with event propagation. - * - * Features: - * - Events emitted by hammer will propagate in order from child to parent - * elements. - * - Events are extended with a function `event.stopPropagation()` to stop - * propagation to parent elements. - * - An option `preventDefault` to stop all default browser behavior. - * - * Usage: - * var hammer = propagatingHammer(new Hammer(element)); - * var hammer = propagatingHammer(new Hammer(element), {preventDefault: true}); - * - * @param {Hammer.Manager} hammer An hammer instance. - * @param {Object} [options] Available options: - * - `preventDefault: true | 'mouse' | 'touch' | 'pen'`. - * Enforce preventing the default browser behavior. - * Cannot be set to `false`. - * @return {Hammer.Manager} Returns the same hammer instance with extended - * functionality - */ - return function propagating(hammer, options) { - var _options = options || { - preventDefault: false - }; - - if (hammer.Manager) { - // This looks like the Hammer constructor. - // Overload the constructors with our own. - var Hammer = hammer; - - var PropagatingHammer = function(element, options) { - var o = Object.create(_options); - if (options) Hammer.extend(o, options); - return propagating(new Hammer(element, o), o); - }; - Hammer.extend(PropagatingHammer, Hammer); - - PropagatingHammer.Manager = function (element, options) { - var o = Object.create(_options); - if (options) Hammer.extend(o, options); - return propagating(new Hammer.Manager(element, o), o); - }; - - return PropagatingHammer; - } - - // create a wrapper object which will override the functions - // `on`, `off`, `destroy`, and `emit` of the hammer instance - var wrapper = Object.create(hammer); - - // attach to DOM element - var element = hammer.element; - element.hammer = wrapper; - - // register an event to catch the start of a gesture and store the - // target in a singleton - hammer.on('hammer.input', function (event) { - if (_options.preventDefault === true || (_options.preventDefault === event.pointerType)) { - event.preventDefault(); - } - if (event.isFirst) { - _firstTarget = event.target; - } - }); - - /** @type {Object.>} */ - wrapper._handlers = {}; - - /** - * Register a handler for one or multiple events - * @param {String} events A space separated string with events - * @param {function} handler A callback function, called as handler(event) - * @returns {Hammer.Manager} Returns the hammer instance - */ - wrapper.on = function (events, handler) { - // register the handler - split(events).forEach(function (event) { - var _handlers = wrapper._handlers[event]; - if (!_handlers) { - wrapper._handlers[event] = _handlers = []; - - // register the static, propagated handler - hammer.on(event, propagatedHandler); - } - _handlers.push(handler); - }); - - return wrapper; - }; - - /** - * Unregister a handler for one or multiple events - * @param {String} events A space separated string with events - * @param {function} [handler] Optional. The registered handler. If not - * provided, all handlers for given events - * are removed. - * @returns {Hammer.Manager} Returns the hammer instance - */ - wrapper.off = function (events, handler) { - // unregister the handler - split(events).forEach(function (event) { - var _handlers = wrapper._handlers[event]; - if (_handlers) { - _handlers = handler ? _handlers.filter(function (h) { - return h !== handler; - }) : []; - - if (_handlers.length > 0) { - wrapper._handlers[event] = _handlers; - } - else { - // remove static, propagated handler - hammer.off(event, propagatedHandler); - delete wrapper._handlers[event]; - } - } - }); - - return wrapper; - }; - - /** - * Emit to the event listeners - * @param {string} eventType - * @param {Event} event - */ - wrapper.emit = function(eventType, event) { - _firstTarget = event.target; - hammer.emit(eventType, event); - }; - - wrapper.destroy = function () { - // Detach from DOM element - delete hammer.element.hammer; - - // clear all handlers - wrapper._handlers = {}; - - // call original hammer destroy - hammer.destroy(); - }; - - // split a string with space separated words - function split(events) { - return events.match(/[^ ]+/g); - } - - /** - * A static event handler, applying event propagation. - * @param {Object} event - */ - function propagatedHandler(event) { - // let only a single hammer instance handle this event - if (event.type !== 'hammer.input') { - // it is possible that the same srcEvent is used with multiple hammer events, - // we keep track on which events are handled in an object _handled - if (!event.srcEvent._handled) { - event.srcEvent._handled = {}; - } - - if (event.srcEvent._handled[event.type]) { - return; - } - else { - event.srcEvent._handled[event.type] = true; - } - } - - // attach a stopPropagation function to the event - var stopped = false; - event.stopPropagation = function () { - stopped = true; - }; - - // attach firstTarget property to the event - event.firstTarget = _firstTarget; - - // propagate over all elements (until stopped) - var elem = _firstTarget; - while (elem && !stopped) { - var _handlers = elem.hammer && elem.hammer._handlers[event.type]; - if (_handlers) { - for (var i = 0; i < _handlers.length && !stopped; i++) { - _handlers[i](event); - } - } - - elem = elem.parentNode; - } - } - - return wrapper; - }; - })); - - -/***/ }, -/* 5 */ -/***/ function(module, exports, __webpack_require__) { - - var __WEBPACK_AMD_DEFINE_RESULT__;/*! Hammer.JS - v2.0.4 - 2014-09-28 - * http://hammerjs.github.io/ - * - * Copyright (c) 2014 Jorik Tangelder; - * Licensed under the MIT license */ - (function(window, document, exportName, undefined) { - 'use strict'; - - var VENDOR_PREFIXES = ['', 'webkit', 'moz', 'MS', 'ms', 'o']; - var TEST_ELEMENT = document.createElement('div'); - - var TYPE_FUNCTION = 'function'; - - var round = Math.round; - var abs = Math.abs; - var now = Date.now; - - /** - * set a timeout with a given scope - * @param {Function} fn - * @param {Number} timeout - * @param {Object} context - * @returns {number} - */ - function setTimeoutContext(fn, timeout, context) { - return setTimeout(bindFn(fn, context), timeout); - } - - /** - * if the argument is an array, we want to execute the fn on each entry - * if it aint an array we don't want to do a thing. - * this is used by all the methods that accept a single and array argument. - * @param {*|Array} arg - * @param {String} fn - * @param {Object} [context] - * @returns {Boolean} - */ - function invokeArrayArg(arg, fn, context) { - if (Array.isArray(arg)) { - each(arg, context[fn], context); - return true; - } - return false; - } - - /** - * walk objects and arrays - * @param {Object} obj - * @param {Function} iterator - * @param {Object} context - */ - function each(obj, iterator, context) { - var i; - - if (!obj) { - return; - } - - if (obj.forEach) { - obj.forEach(iterator, context); - } else if (obj.length !== undefined) { - i = 0; - while (i < obj.length) { - iterator.call(context, obj[i], i, obj); - i++; - } - } else { - for (i in obj) { - obj.hasOwnProperty(i) && iterator.call(context, obj[i], i, obj); - } - } - } - - /** - * extend object. - * means that properties in dest will be overwritten by the ones in src. - * @param {Object} dest - * @param {Object} src - * @param {Boolean} [merge] - * @returns {Object} dest - */ - function extend(dest, src, merge) { - var keys = Object.keys(src); - var i = 0; - while (i < keys.length) { - if (!merge || (merge && dest[keys[i]] === undefined)) { - dest[keys[i]] = src[keys[i]]; - } - i++; - } - return dest; - } - - /** - * merge the values from src in the dest. - * means that properties that exist in dest will not be overwritten by src - * @param {Object} dest - * @param {Object} src - * @returns {Object} dest - */ - function merge(dest, src) { - return extend(dest, src, true); - } - - /** - * simple class inheritance - * @param {Function} child - * @param {Function} base - * @param {Object} [properties] - */ - function inherit(child, base, properties) { - var baseP = base.prototype, - childP; - - childP = child.prototype = Object.create(baseP); - childP.constructor = child; - childP._super = baseP; - - if (properties) { - extend(childP, properties); - } - } - - /** - * simple function bind - * @param {Function} fn - * @param {Object} context - * @returns {Function} - */ - function bindFn(fn, context) { - return function boundFn() { - return fn.apply(context, arguments); - }; - } - - /** - * let a boolean value also be a function that must return a boolean - * this first item in args will be used as the context - * @param {Boolean|Function} val - * @param {Array} [args] - * @returns {Boolean} - */ - function boolOrFn(val, args) { - if (typeof val == TYPE_FUNCTION) { - return val.apply(args ? args[0] || undefined : undefined, args); - } - return val; - } - - /** - * use the val2 when val1 is undefined - * @param {*} val1 - * @param {*} val2 - * @returns {*} - */ - function ifUndefined(val1, val2) { - return (val1 === undefined) ? val2 : val1; - } - - /** - * addEventListener with multiple events at once - * @param {EventTarget} target - * @param {String} types - * @param {Function} handler - */ - function addEventListeners(target, types, handler) { - each(splitStr(types), function(type) { - target.addEventListener(type, handler, false); - }); - } - - /** - * removeEventListener with multiple events at once - * @param {EventTarget} target - * @param {String} types - * @param {Function} handler - */ - function removeEventListeners(target, types, handler) { - each(splitStr(types), function(type) { - target.removeEventListener(type, handler, false); - }); - } - - /** - * find if a node is in the given parent - * @method hasParent - * @param {HTMLElement} node - * @param {HTMLElement} parent - * @return {Boolean} found - */ - function hasParent(node, parent) { - while (node) { - if (node == parent) { - return true; - } - node = node.parentNode; - } - return false; - } - - /** - * small indexOf wrapper - * @param {String} str - * @param {String} find - * @returns {Boolean} found - */ - function inStr(str, find) { - return str.indexOf(find) > -1; - } - - /** - * split string on whitespace - * @param {String} str - * @returns {Array} words - */ - function splitStr(str) { - return str.trim().split(/\s+/g); - } - - /** - * find if a array contains the object using indexOf or a simple polyFill - * @param {Array} src - * @param {String} find - * @param {String} [findByKey] - * @return {Boolean|Number} false when not found, or the index - */ - function inArray(src, find, findByKey) { - if (src.indexOf && !findByKey) { - return src.indexOf(find); - } else { - var i = 0; - while (i < src.length) { - if ((findByKey && src[i][findByKey] == find) || (!findByKey && src[i] === find)) { - return i; - } - i++; - } - return -1; - } - } - - /** - * convert array-like objects to real arrays - * @param {Object} obj - * @returns {Array} - */ - function toArray(obj) { - return Array.prototype.slice.call(obj, 0); - } - - /** - * unique array with objects based on a key (like 'id') or just by the array's value - * @param {Array} src [{id:1},{id:2},{id:1}] - * @param {String} [key] - * @param {Boolean} [sort=False] - * @returns {Array} [{id:1},{id:2}] - */ - function uniqueArray(src, key, sort) { - var results = []; - var values = []; - var i = 0; - - while (i < src.length) { - var val = key ? src[i][key] : src[i]; - if (inArray(values, val) < 0) { - results.push(src[i]); - } - values[i] = val; - i++; - } - - if (sort) { - if (!key) { - results = results.sort(); - } else { - results = results.sort(function sortUniqueArray(a, b) { - return a[key] > b[key]; - }); - } - } - - return results; - } - - /** - * get the prefixed property - * @param {Object} obj - * @param {String} property - * @returns {String|Undefined} prefixed - */ - function prefixed(obj, property) { - var prefix, prop; - var camelProp = property[0].toUpperCase() + property.slice(1); - - var i = 0; - while (i < VENDOR_PREFIXES.length) { - prefix = VENDOR_PREFIXES[i]; - prop = (prefix) ? prefix + camelProp : property; - - if (prop in obj) { - return prop; - } - i++; - } - return undefined; - } - - /** - * get a unique id - * @returns {number} uniqueId - */ - var _uniqueId = 1; - function uniqueId() { - return _uniqueId++; - } - - /** - * get the window object of an element - * @param {HTMLElement} element - * @returns {DocumentView|Window} - */ - function getWindowForElement(element) { - var doc = element.ownerDocument; - return (doc.defaultView || doc.parentWindow); - } - - var MOBILE_REGEX = /mobile|tablet|ip(ad|hone|od)|android/i; - - var SUPPORT_TOUCH = ('ontouchstart' in window); - var SUPPORT_POINTER_EVENTS = prefixed(window, 'PointerEvent') !== undefined; - var SUPPORT_ONLY_TOUCH = SUPPORT_TOUCH && MOBILE_REGEX.test(navigator.userAgent); - - var INPUT_TYPE_TOUCH = 'touch'; - var INPUT_TYPE_PEN = 'pen'; - var INPUT_TYPE_MOUSE = 'mouse'; - var INPUT_TYPE_KINECT = 'kinect'; - - var COMPUTE_INTERVAL = 25; - - var INPUT_START = 1; - var INPUT_MOVE = 2; - var INPUT_END = 4; - var INPUT_CANCEL = 8; - - var DIRECTION_NONE = 1; - var DIRECTION_LEFT = 2; - var DIRECTION_RIGHT = 4; - var DIRECTION_UP = 8; - var DIRECTION_DOWN = 16; - - var DIRECTION_HORIZONTAL = DIRECTION_LEFT | DIRECTION_RIGHT; - var DIRECTION_VERTICAL = DIRECTION_UP | DIRECTION_DOWN; - var DIRECTION_ALL = DIRECTION_HORIZONTAL | DIRECTION_VERTICAL; - - var PROPS_XY = ['x', 'y']; - var PROPS_CLIENT_XY = ['clientX', 'clientY']; - - /** - * create new input type manager - * @param {Manager} manager - * @param {Function} callback - * @returns {Input} - * @constructor - */ - function Input(manager, callback) { - var self = this; - this.manager = manager; - this.callback = callback; - this.element = manager.element; - this.target = manager.options.inputTarget; - - // smaller wrapper around the handler, for the scope and the enabled state of the manager, - // so when disabled the input events are completely bypassed. - this.domHandler = function(ev) { - if (boolOrFn(manager.options.enable, [manager])) { - self.handler(ev); - } - }; - - this.init(); - - } - - Input.prototype = { - /** - * should handle the inputEvent data and trigger the callback - * @virtual - */ - handler: function() { }, - - /** - * bind the events - */ - init: function() { - this.evEl && addEventListeners(this.element, this.evEl, this.domHandler); - this.evTarget && addEventListeners(this.target, this.evTarget, this.domHandler); - this.evWin && addEventListeners(getWindowForElement(this.element), this.evWin, this.domHandler); - }, - - /** - * unbind the events - */ - destroy: function() { - this.evEl && removeEventListeners(this.element, this.evEl, this.domHandler); - this.evTarget && removeEventListeners(this.target, this.evTarget, this.domHandler); - this.evWin && removeEventListeners(getWindowForElement(this.element), this.evWin, this.domHandler); - } - }; - - /** - * create new input type manager - * called by the Manager constructor - * @param {Hammer} manager - * @returns {Input} - */ - function createInputInstance(manager) { - var Type; - var inputClass = manager.options.inputClass; - - if (inputClass) { - Type = inputClass; - } else if (SUPPORT_POINTER_EVENTS) { - Type = PointerEventInput; - } else if (SUPPORT_ONLY_TOUCH) { - Type = TouchInput; - } else if (!SUPPORT_TOUCH) { - Type = MouseInput; - } else { - Type = TouchMouseInput; - } - return new (Type)(manager, inputHandler); - } - - /** - * handle input events - * @param {Manager} manager - * @param {String} eventType - * @param {Object} input - */ - function inputHandler(manager, eventType, input) { - var pointersLen = input.pointers.length; - var changedPointersLen = input.changedPointers.length; - var isFirst = (eventType & INPUT_START && (pointersLen - changedPointersLen === 0)); - var isFinal = (eventType & (INPUT_END | INPUT_CANCEL) && (pointersLen - changedPointersLen === 0)); - - input.isFirst = !!isFirst; - input.isFinal = !!isFinal; - - if (isFirst) { - manager.session = {}; - } - - // source event is the normalized value of the domEvents - // like 'touchstart, mouseup, pointerdown' - input.eventType = eventType; - - // compute scale, rotation etc - computeInputData(manager, input); - - // emit secret event - manager.emit('hammer.input', input); - - manager.recognize(input); - manager.session.prevInput = input; - } - - /** - * extend the data with some usable properties like scale, rotate, velocity etc - * @param {Object} manager - * @param {Object} input - */ - function computeInputData(manager, input) { - var session = manager.session; - var pointers = input.pointers; - var pointersLength = pointers.length; - - // store the first input to calculate the distance and direction - if (!session.firstInput) { - session.firstInput = simpleCloneInputData(input); - } - - // to compute scale and rotation we need to store the multiple touches - if (pointersLength > 1 && !session.firstMultiple) { - session.firstMultiple = simpleCloneInputData(input); - } else if (pointersLength === 1) { - session.firstMultiple = false; - } - - var firstInput = session.firstInput; - var firstMultiple = session.firstMultiple; - var offsetCenter = firstMultiple ? firstMultiple.center : firstInput.center; - - var center = input.center = getCenter(pointers); - input.timeStamp = now(); - input.deltaTime = input.timeStamp - firstInput.timeStamp; - - input.angle = getAngle(offsetCenter, center); - input.distance = getDistance(offsetCenter, center); - - computeDeltaXY(session, input); - input.offsetDirection = getDirection(input.deltaX, input.deltaY); - - input.scale = firstMultiple ? getScale(firstMultiple.pointers, pointers) : 1; - input.rotation = firstMultiple ? getRotation(firstMultiple.pointers, pointers) : 0; - - computeIntervalInputData(session, input); - - // find the correct target - var target = manager.element; - if (hasParent(input.srcEvent.target, target)) { - target = input.srcEvent.target; - } - input.target = target; - } - - function computeDeltaXY(session, input) { - var center = input.center; - var offset = session.offsetDelta || {}; - var prevDelta = session.prevDelta || {}; - var prevInput = session.prevInput || {}; - - if (input.eventType === INPUT_START || prevInput.eventType === INPUT_END) { - prevDelta = session.prevDelta = { - x: prevInput.deltaX || 0, - y: prevInput.deltaY || 0 - }; - - offset = session.offsetDelta = { - x: center.x, - y: center.y - }; - } - - input.deltaX = prevDelta.x + (center.x - offset.x); - input.deltaY = prevDelta.y + (center.y - offset.y); - } - - /** - * velocity is calculated every x ms - * @param {Object} session - * @param {Object} input - */ - function computeIntervalInputData(session, input) { - var last = session.lastInterval || input, - deltaTime = input.timeStamp - last.timeStamp, - velocity, velocityX, velocityY, direction; - - if (input.eventType != INPUT_CANCEL && (deltaTime > COMPUTE_INTERVAL || last.velocity === undefined)) { - var deltaX = last.deltaX - input.deltaX; - var deltaY = last.deltaY - input.deltaY; - - var v = getVelocity(deltaTime, deltaX, deltaY); - velocityX = v.x; - velocityY = v.y; - velocity = (abs(v.x) > abs(v.y)) ? v.x : v.y; - direction = getDirection(deltaX, deltaY); - - session.lastInterval = input; - } else { - // use latest velocity info if it doesn't overtake a minimum period - velocity = last.velocity; - velocityX = last.velocityX; - velocityY = last.velocityY; - direction = last.direction; - } - - input.velocity = velocity; - input.velocityX = velocityX; - input.velocityY = velocityY; - input.direction = direction; - } - - /** - * create a simple clone from the input used for storage of firstInput and firstMultiple - * @param {Object} input - * @returns {Object} clonedInputData - */ - function simpleCloneInputData(input) { - // make a simple copy of the pointers because we will get a reference if we don't - // we only need clientXY for the calculations - var pointers = []; - var i = 0; - while (i < input.pointers.length) { - pointers[i] = { - clientX: round(input.pointers[i].clientX), - clientY: round(input.pointers[i].clientY) - }; - i++; - } - - return { - timeStamp: now(), - pointers: pointers, - center: getCenter(pointers), - deltaX: input.deltaX, - deltaY: input.deltaY - }; - } - - /** - * get the center of all the pointers - * @param {Array} pointers - * @return {Object} center contains `x` and `y` properties - */ - function getCenter(pointers) { - var pointersLength = pointers.length; - - // no need to loop when only one touch - if (pointersLength === 1) { - return { - x: round(pointers[0].clientX), - y: round(pointers[0].clientY) - }; - } - - var x = 0, y = 0, i = 0; - while (i < pointersLength) { - x += pointers[i].clientX; - y += pointers[i].clientY; - i++; - } - - return { - x: round(x / pointersLength), - y: round(y / pointersLength) - }; - } - - /** - * calculate the velocity between two points. unit is in px per ms. - * @param {Number} deltaTime - * @param {Number} x - * @param {Number} y - * @return {Object} velocity `x` and `y` - */ - function getVelocity(deltaTime, x, y) { - return { - x: x / deltaTime || 0, - y: y / deltaTime || 0 - }; - } - - /** - * get the direction between two points - * @param {Number} x - * @param {Number} y - * @return {Number} direction - */ - function getDirection(x, y) { - if (x === y) { - return DIRECTION_NONE; - } - - if (abs(x) >= abs(y)) { - return x > 0 ? DIRECTION_LEFT : DIRECTION_RIGHT; - } - return y > 0 ? DIRECTION_UP : DIRECTION_DOWN; - } - - /** - * calculate the absolute distance between two points - * @param {Object} p1 {x, y} - * @param {Object} p2 {x, y} - * @param {Array} [props] containing x and y keys - * @return {Number} distance - */ - function getDistance(p1, p2, props) { - if (!props) { - props = PROPS_XY; - } - var x = p2[props[0]] - p1[props[0]], - y = p2[props[1]] - p1[props[1]]; - - return Math.sqrt((x * x) + (y * y)); - } - - /** - * calculate the angle between two coordinates - * @param {Object} p1 - * @param {Object} p2 - * @param {Array} [props] containing x and y keys - * @return {Number} angle - */ - function getAngle(p1, p2, props) { - if (!props) { - props = PROPS_XY; - } - var x = p2[props[0]] - p1[props[0]], - y = p2[props[1]] - p1[props[1]]; - return Math.atan2(y, x) * 180 / Math.PI; - } - - /** - * calculate the rotation degrees between two pointersets - * @param {Array} start array of pointers - * @param {Array} end array of pointers - * @return {Number} rotation - */ - function getRotation(start, end) { - return getAngle(end[1], end[0], PROPS_CLIENT_XY) - getAngle(start[1], start[0], PROPS_CLIENT_XY); - } - - /** - * calculate the scale factor between two pointersets - * no scale is 1, and goes down to 0 when pinched together, and bigger when pinched out - * @param {Array} start array of pointers - * @param {Array} end array of pointers - * @return {Number} scale - */ - function getScale(start, end) { - return getDistance(end[0], end[1], PROPS_CLIENT_XY) / getDistance(start[0], start[1], PROPS_CLIENT_XY); - } - - var MOUSE_INPUT_MAP = { - mousedown: INPUT_START, - mousemove: INPUT_MOVE, - mouseup: INPUT_END - }; - - var MOUSE_ELEMENT_EVENTS = 'mousedown'; - var MOUSE_WINDOW_EVENTS = 'mousemove mouseup'; - - /** - * Mouse events input - * @constructor - * @extends Input - */ - function MouseInput() { - this.evEl = MOUSE_ELEMENT_EVENTS; - this.evWin = MOUSE_WINDOW_EVENTS; - - this.allow = true; // used by Input.TouchMouse to disable mouse events - this.pressed = false; // mousedown state - - Input.apply(this, arguments); - } - - inherit(MouseInput, Input, { - /** - * handle mouse events - * @param {Object} ev - */ - handler: function MEhandler(ev) { - var eventType = MOUSE_INPUT_MAP[ev.type]; - - // on start we want to have the left mouse button down - if (eventType & INPUT_START && ev.button === 0) { - this.pressed = true; - } - - if (eventType & INPUT_MOVE && ev.which !== 1) { - eventType = INPUT_END; - } - - // mouse must be down, and mouse events are allowed (see the TouchMouse input) - if (!this.pressed || !this.allow) { - return; - } - - if (eventType & INPUT_END) { - this.pressed = false; - } - - this.callback(this.manager, eventType, { - pointers: [ev], - changedPointers: [ev], - pointerType: INPUT_TYPE_MOUSE, - srcEvent: ev - }); - } - }); - - var POINTER_INPUT_MAP = { - pointerdown: INPUT_START, - pointermove: INPUT_MOVE, - pointerup: INPUT_END, - pointercancel: INPUT_CANCEL, - pointerout: INPUT_CANCEL - }; - - // in IE10 the pointer types is defined as an enum - var IE10_POINTER_TYPE_ENUM = { - 2: INPUT_TYPE_TOUCH, - 3: INPUT_TYPE_PEN, - 4: INPUT_TYPE_MOUSE, - 5: INPUT_TYPE_KINECT // see https://twitter.com/jacobrossi/status/480596438489890816 - }; - - var POINTER_ELEMENT_EVENTS = 'pointerdown'; - var POINTER_WINDOW_EVENTS = 'pointermove pointerup pointercancel'; - - // IE10 has prefixed support, and case-sensitive - if (window.MSPointerEvent) { - POINTER_ELEMENT_EVENTS = 'MSPointerDown'; - POINTER_WINDOW_EVENTS = 'MSPointerMove MSPointerUp MSPointerCancel'; - } - - /** - * Pointer events input - * @constructor - * @extends Input - */ - function PointerEventInput() { - this.evEl = POINTER_ELEMENT_EVENTS; - this.evWin = POINTER_WINDOW_EVENTS; - - Input.apply(this, arguments); - - this.store = (this.manager.session.pointerEvents = []); - } - - inherit(PointerEventInput, Input, { - /** - * handle mouse events - * @param {Object} ev - */ - handler: function PEhandler(ev) { - var store = this.store; - var removePointer = false; - - var eventTypeNormalized = ev.type.toLowerCase().replace('ms', ''); - var eventType = POINTER_INPUT_MAP[eventTypeNormalized]; - var pointerType = IE10_POINTER_TYPE_ENUM[ev.pointerType] || ev.pointerType; - - var isTouch = (pointerType == INPUT_TYPE_TOUCH); - - // get index of the event in the store - var storeIndex = inArray(store, ev.pointerId, 'pointerId'); - - // start and mouse must be down - if (eventType & INPUT_START && (ev.button === 0 || isTouch)) { - if (storeIndex < 0) { - store.push(ev); - storeIndex = store.length - 1; - } - } else if (eventType & (INPUT_END | INPUT_CANCEL)) { - removePointer = true; - } - - // it not found, so the pointer hasn't been down (so it's probably a hover) - if (storeIndex < 0) { - return; - } - - // update the event in the store - store[storeIndex] = ev; - - this.callback(this.manager, eventType, { - pointers: store, - changedPointers: [ev], - pointerType: pointerType, - srcEvent: ev - }); - - if (removePointer) { - // remove from the store - store.splice(storeIndex, 1); - } - } - }); - - var SINGLE_TOUCH_INPUT_MAP = { - touchstart: INPUT_START, - touchmove: INPUT_MOVE, - touchend: INPUT_END, - touchcancel: INPUT_CANCEL - }; - - var SINGLE_TOUCH_TARGET_EVENTS = 'touchstart'; - var SINGLE_TOUCH_WINDOW_EVENTS = 'touchstart touchmove touchend touchcancel'; - - /** - * Touch events input - * @constructor - * @extends Input - */ - function SingleTouchInput() { - this.evTarget = SINGLE_TOUCH_TARGET_EVENTS; - this.evWin = SINGLE_TOUCH_WINDOW_EVENTS; - this.started = false; - - Input.apply(this, arguments); - } - - inherit(SingleTouchInput, Input, { - handler: function TEhandler(ev) { - var type = SINGLE_TOUCH_INPUT_MAP[ev.type]; - - // should we handle the touch events? - if (type === INPUT_START) { - this.started = true; - } - - if (!this.started) { - return; - } - - var touches = normalizeSingleTouches.call(this, ev, type); - - // when done, reset the started state - if (type & (INPUT_END | INPUT_CANCEL) && touches[0].length - touches[1].length === 0) { - this.started = false; - } - - this.callback(this.manager, type, { - pointers: touches[0], - changedPointers: touches[1], - pointerType: INPUT_TYPE_TOUCH, - srcEvent: ev - }); - } - }); - - /** - * @this {TouchInput} - * @param {Object} ev - * @param {Number} type flag - * @returns {undefined|Array} [all, changed] - */ - function normalizeSingleTouches(ev, type) { - var all = toArray(ev.touches); - var changed = toArray(ev.changedTouches); - - if (type & (INPUT_END | INPUT_CANCEL)) { - all = uniqueArray(all.concat(changed), 'identifier', true); - } - - return [all, changed]; - } - - var TOUCH_INPUT_MAP = { - touchstart: INPUT_START, - touchmove: INPUT_MOVE, - touchend: INPUT_END, - touchcancel: INPUT_CANCEL - }; - - var TOUCH_TARGET_EVENTS = 'touchstart touchmove touchend touchcancel'; - - /** - * Multi-user touch events input - * @constructor - * @extends Input - */ - function TouchInput() { - this.evTarget = TOUCH_TARGET_EVENTS; - this.targetIds = {}; - - Input.apply(this, arguments); - } - - inherit(TouchInput, Input, { - handler: function MTEhandler(ev) { - var type = TOUCH_INPUT_MAP[ev.type]; - var touches = getTouches.call(this, ev, type); - if (!touches) { - return; - } - - this.callback(this.manager, type, { - pointers: touches[0], - changedPointers: touches[1], - pointerType: INPUT_TYPE_TOUCH, - srcEvent: ev - }); - } - }); - - /** - * @this {TouchInput} - * @param {Object} ev - * @param {Number} type flag - * @returns {undefined|Array} [all, changed] - */ - function getTouches(ev, type) { - var allTouches = toArray(ev.touches); - var targetIds = this.targetIds; - - // when there is only one touch, the process can be simplified - if (type & (INPUT_START | INPUT_MOVE) && allTouches.length === 1) { - targetIds[allTouches[0].identifier] = true; - return [allTouches, allTouches]; - } - - var i, - targetTouches, - changedTouches = toArray(ev.changedTouches), - changedTargetTouches = [], - target = this.target; - - // get target touches from touches - targetTouches = allTouches.filter(function(touch) { - return hasParent(touch.target, target); - }); - - // collect touches - if (type === INPUT_START) { - i = 0; - while (i < targetTouches.length) { - targetIds[targetTouches[i].identifier] = true; - i++; - } - } - - // filter changed touches to only contain touches that exist in the collected target ids - i = 0; - while (i < changedTouches.length) { - if (targetIds[changedTouches[i].identifier]) { - changedTargetTouches.push(changedTouches[i]); - } - - // cleanup removed touches - if (type & (INPUT_END | INPUT_CANCEL)) { - delete targetIds[changedTouches[i].identifier]; - } - i++; - } - - if (!changedTargetTouches.length) { - return; - } - - return [ - // merge targetTouches with changedTargetTouches so it contains ALL touches, including 'end' and 'cancel' - uniqueArray(targetTouches.concat(changedTargetTouches), 'identifier', true), - changedTargetTouches - ]; - } - - /** - * Combined touch and mouse input - * - * Touch has a higher priority then mouse, and while touching no mouse events are allowed. - * This because touch devices also emit mouse events while doing a touch. - * - * @constructor - * @extends Input - */ - function TouchMouseInput() { - Input.apply(this, arguments); - - var handler = bindFn(this.handler, this); - this.touch = new TouchInput(this.manager, handler); - this.mouse = new MouseInput(this.manager, handler); - } - - inherit(TouchMouseInput, Input, { - /** - * handle mouse and touch events - * @param {Hammer} manager - * @param {String} inputEvent - * @param {Object} inputData - */ - handler: function TMEhandler(manager, inputEvent, inputData) { - var isTouch = (inputData.pointerType == INPUT_TYPE_TOUCH), - isMouse = (inputData.pointerType == INPUT_TYPE_MOUSE); - - // when we're in a touch event, so block all upcoming mouse events - // most mobile browser also emit mouseevents, right after touchstart - if (isTouch) { - this.mouse.allow = false; - } else if (isMouse && !this.mouse.allow) { - return; - } - - // reset the allowMouse when we're done - if (inputEvent & (INPUT_END | INPUT_CANCEL)) { - this.mouse.allow = true; - } - - this.callback(manager, inputEvent, inputData); - }, - - /** - * remove the event listeners - */ - destroy: function destroy() { - this.touch.destroy(); - this.mouse.destroy(); - } - }); - - var PREFIXED_TOUCH_ACTION = prefixed(TEST_ELEMENT.style, 'touchAction'); - var NATIVE_TOUCH_ACTION = PREFIXED_TOUCH_ACTION !== undefined; - - // magical touchAction value - var TOUCH_ACTION_COMPUTE = 'compute'; - var TOUCH_ACTION_AUTO = 'auto'; - var TOUCH_ACTION_MANIPULATION = 'manipulation'; // not implemented - var TOUCH_ACTION_NONE = 'none'; - var TOUCH_ACTION_PAN_X = 'pan-x'; - var TOUCH_ACTION_PAN_Y = 'pan-y'; - - /** - * Touch Action - * sets the touchAction property or uses the js alternative - * @param {Manager} manager - * @param {String} value - * @constructor - */ - function TouchAction(manager, value) { - this.manager = manager; - this.set(value); - } - - TouchAction.prototype = { - /** - * set the touchAction value on the element or enable the polyfill - * @param {String} value - */ - set: function(value) { - // find out the touch-action by the event handlers - if (value == TOUCH_ACTION_COMPUTE) { - value = this.compute(); - } - - if (NATIVE_TOUCH_ACTION) { - this.manager.element.style[PREFIXED_TOUCH_ACTION] = value; - } - this.actions = value.toLowerCase().trim(); - }, - - /** - * just re-set the touchAction value - */ - update: function() { - this.set(this.manager.options.touchAction); - }, - - /** - * compute the value for the touchAction property based on the recognizer's settings - * @returns {String} value - */ - compute: function() { - var actions = []; - each(this.manager.recognizers, function(recognizer) { - if (boolOrFn(recognizer.options.enable, [recognizer])) { - actions = actions.concat(recognizer.getTouchAction()); - } - }); - return cleanTouchActions(actions.join(' ')); - }, - - /** - * this method is called on each input cycle and provides the preventing of the browser behavior - * @param {Object} input - */ - preventDefaults: function(input) { - // not needed with native support for the touchAction property - if (NATIVE_TOUCH_ACTION) { - return; - } - - var srcEvent = input.srcEvent; - var direction = input.offsetDirection; - - // if the touch action did prevented once this session - if (this.manager.session.prevented) { - srcEvent.preventDefault(); - return; - } - - var actions = this.actions; - var hasNone = inStr(actions, TOUCH_ACTION_NONE); - var hasPanY = inStr(actions, TOUCH_ACTION_PAN_Y); - var hasPanX = inStr(actions, TOUCH_ACTION_PAN_X); - - if (hasNone || - (hasPanY && direction & DIRECTION_HORIZONTAL) || - (hasPanX && direction & DIRECTION_VERTICAL)) { - return this.preventSrc(srcEvent); - } - }, - - /** - * call preventDefault to prevent the browser's default behavior (scrolling in most cases) - * @param {Object} srcEvent - */ - preventSrc: function(srcEvent) { - this.manager.session.prevented = true; - srcEvent.preventDefault(); - } - }; - - /** - * when the touchActions are collected they are not a valid value, so we need to clean things up. * - * @param {String} actions - * @returns {*} - */ - function cleanTouchActions(actions) { - // none - if (inStr(actions, TOUCH_ACTION_NONE)) { - return TOUCH_ACTION_NONE; - } - - var hasPanX = inStr(actions, TOUCH_ACTION_PAN_X); - var hasPanY = inStr(actions, TOUCH_ACTION_PAN_Y); - - // pan-x and pan-y can be combined - if (hasPanX && hasPanY) { - return TOUCH_ACTION_PAN_X + ' ' + TOUCH_ACTION_PAN_Y; - } - - // pan-x OR pan-y - if (hasPanX || hasPanY) { - return hasPanX ? TOUCH_ACTION_PAN_X : TOUCH_ACTION_PAN_Y; - } - - // manipulation - if (inStr(actions, TOUCH_ACTION_MANIPULATION)) { - return TOUCH_ACTION_MANIPULATION; - } - - return TOUCH_ACTION_AUTO; - } - - /** - * Recognizer flow explained; * - * All recognizers have the initial state of POSSIBLE when a input session starts. - * The definition of a input session is from the first input until the last input, with all it's movement in it. * - * Example session for mouse-input: mousedown -> mousemove -> mouseup - * - * On each recognizing cycle (see Manager.recognize) the .recognize() method is executed - * which determines with state it should be. - * - * If the recognizer has the state FAILED, CANCELLED or RECOGNIZED (equals ENDED), it is reset to - * POSSIBLE to give it another change on the next cycle. - * - * Possible - * | - * +-----+---------------+ - * | | - * +-----+-----+ | - * | | | - * Failed Cancelled | - * +-------+------+ - * | | - * Recognized Began - * | - * Changed - * | - * Ended/Recognized - */ - var STATE_POSSIBLE = 1; - var STATE_BEGAN = 2; - var STATE_CHANGED = 4; - var STATE_ENDED = 8; - var STATE_RECOGNIZED = STATE_ENDED; - var STATE_CANCELLED = 16; - var STATE_FAILED = 32; - - /** - * Recognizer - * Every recognizer needs to extend from this class. - * @constructor - * @param {Object} options - */ - function Recognizer(options) { - this.id = uniqueId(); - - this.manager = null; - this.options = merge(options || {}, this.defaults); - - // default is enable true - this.options.enable = ifUndefined(this.options.enable, true); - - this.state = STATE_POSSIBLE; - - this.simultaneous = {}; - this.requireFail = []; - } - - Recognizer.prototype = { - /** - * @virtual - * @type {Object} - */ - defaults: {}, - - /** - * set options - * @param {Object} options - * @return {Recognizer} - */ - set: function(options) { - extend(this.options, options); - - // also update the touchAction, in case something changed about the directions/enabled state - this.manager && this.manager.touchAction.update(); - return this; - }, - - /** - * recognize simultaneous with an other recognizer. - * @param {Recognizer} otherRecognizer - * @returns {Recognizer} this - */ - recognizeWith: function(otherRecognizer) { - if (invokeArrayArg(otherRecognizer, 'recognizeWith', this)) { - return this; - } - - var simultaneous = this.simultaneous; - otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this); - if (!simultaneous[otherRecognizer.id]) { - simultaneous[otherRecognizer.id] = otherRecognizer; - otherRecognizer.recognizeWith(this); - } - return this; - }, - - /** - * drop the simultaneous link. it doesnt remove the link on the other recognizer. - * @param {Recognizer} otherRecognizer - * @returns {Recognizer} this - */ - dropRecognizeWith: function(otherRecognizer) { - if (invokeArrayArg(otherRecognizer, 'dropRecognizeWith', this)) { - return this; - } - - otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this); - delete this.simultaneous[otherRecognizer.id]; - return this; - }, - - /** - * recognizer can only run when an other is failing - * @param {Recognizer} otherRecognizer - * @returns {Recognizer} this - */ - requireFailure: function(otherRecognizer) { - if (invokeArrayArg(otherRecognizer, 'requireFailure', this)) { - return this; - } - - var requireFail = this.requireFail; - otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this); - if (inArray(requireFail, otherRecognizer) === -1) { - requireFail.push(otherRecognizer); - otherRecognizer.requireFailure(this); - } - return this; - }, - - /** - * drop the requireFailure link. it does not remove the link on the other recognizer. - * @param {Recognizer} otherRecognizer - * @returns {Recognizer} this - */ - dropRequireFailure: function(otherRecognizer) { - if (invokeArrayArg(otherRecognizer, 'dropRequireFailure', this)) { - return this; - } - - otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this); - var index = inArray(this.requireFail, otherRecognizer); - if (index > -1) { - this.requireFail.splice(index, 1); - } - return this; - }, - - /** - * has require failures boolean - * @returns {boolean} - */ - hasRequireFailures: function() { - return this.requireFail.length > 0; - }, - - /** - * if the recognizer can recognize simultaneous with an other recognizer - * @param {Recognizer} otherRecognizer - * @returns {Boolean} - */ - canRecognizeWith: function(otherRecognizer) { - return !!this.simultaneous[otherRecognizer.id]; - }, - - /** - * You should use `tryEmit` instead of `emit` directly to check - * that all the needed recognizers has failed before emitting. - * @param {Object} input - */ - emit: function(input) { - var self = this; - var state = this.state; - - function emit(withState) { - self.manager.emit(self.options.event + (withState ? stateStr(state) : ''), input); - } - - // 'panstart' and 'panmove' - if (state < STATE_ENDED) { - emit(true); - } - - emit(); // simple 'eventName' events - - // panend and pancancel - if (state >= STATE_ENDED) { - emit(true); - } - }, - - /** - * Check that all the require failure recognizers has failed, - * if true, it emits a gesture event, - * otherwise, setup the state to FAILED. - * @param {Object} input - */ - tryEmit: function(input) { - if (this.canEmit()) { - return this.emit(input); - } - // it's failing anyway - this.state = STATE_FAILED; - }, - - /** - * can we emit? - * @returns {boolean} - */ - canEmit: function() { - var i = 0; - while (i < this.requireFail.length) { - if (!(this.requireFail[i].state & (STATE_FAILED | STATE_POSSIBLE))) { - return false; - } - i++; - } - return true; - }, - - /** - * update the recognizer - * @param {Object} inputData - */ - recognize: function(inputData) { - // make a new copy of the inputData - // so we can change the inputData without messing up the other recognizers - var inputDataClone = extend({}, inputData); - - // is is enabled and allow recognizing? - if (!boolOrFn(this.options.enable, [this, inputDataClone])) { - this.reset(); - this.state = STATE_FAILED; - return; - } - - // reset when we've reached the end - if (this.state & (STATE_RECOGNIZED | STATE_CANCELLED | STATE_FAILED)) { - this.state = STATE_POSSIBLE; - } - - this.state = this.process(inputDataClone); - - // the recognizer has recognized a gesture - // so trigger an event - if (this.state & (STATE_BEGAN | STATE_CHANGED | STATE_ENDED | STATE_CANCELLED)) { - this.tryEmit(inputDataClone); - } - }, - - /** - * return the state of the recognizer - * the actual recognizing happens in this method - * @virtual - * @param {Object} inputData - * @returns {Const} STATE - */ - process: function(inputData) { }, // jshint ignore:line - - /** - * return the preferred touch-action - * @virtual - * @returns {Array} - */ - getTouchAction: function() { }, - - /** - * called when the gesture isn't allowed to recognize - * like when another is being recognized or it is disabled - * @virtual - */ - reset: function() { } - }; - - /** - * get a usable string, used as event postfix - * @param {Const} state - * @returns {String} state - */ - function stateStr(state) { - if (state & STATE_CANCELLED) { - return 'cancel'; - } else if (state & STATE_ENDED) { - return 'end'; - } else if (state & STATE_CHANGED) { - return 'move'; - } else if (state & STATE_BEGAN) { - return 'start'; - } - return ''; - } - - /** - * direction cons to string - * @param {Const} direction - * @returns {String} - */ - function directionStr(direction) { - if (direction == DIRECTION_DOWN) { - return 'down'; - } else if (direction == DIRECTION_UP) { - return 'up'; - } else if (direction == DIRECTION_LEFT) { - return 'left'; - } else if (direction == DIRECTION_RIGHT) { - return 'right'; - } - return ''; - } - - /** - * get a recognizer by name if it is bound to a manager - * @param {Recognizer|String} otherRecognizer - * @param {Recognizer} recognizer - * @returns {Recognizer} - */ - function getRecognizerByNameIfManager(otherRecognizer, recognizer) { - var manager = recognizer.manager; - if (manager) { - return manager.get(otherRecognizer); - } - return otherRecognizer; - } - - /** - * This recognizer is just used as a base for the simple attribute recognizers. - * @constructor - * @extends Recognizer - */ - function AttrRecognizer() { - Recognizer.apply(this, arguments); - } - - inherit(AttrRecognizer, Recognizer, { - /** - * @namespace - * @memberof AttrRecognizer - */ - defaults: { - /** - * @type {Number} - * @default 1 - */ - pointers: 1 - }, - - /** - * Used to check if it the recognizer receives valid input, like input.distance > 10. - * @memberof AttrRecognizer - * @param {Object} input - * @returns {Boolean} recognized - */ - attrTest: function(input) { - var optionPointers = this.options.pointers; - return optionPointers === 0 || input.pointers.length === optionPointers; - }, - - /** - * Process the input and return the state for the recognizer - * @memberof AttrRecognizer - * @param {Object} input - * @returns {*} State - */ - process: function(input) { - var state = this.state; - var eventType = input.eventType; - - var isRecognized = state & (STATE_BEGAN | STATE_CHANGED); - var isValid = this.attrTest(input); - - // on cancel input and we've recognized before, return STATE_CANCELLED - if (isRecognized && (eventType & INPUT_CANCEL || !isValid)) { - return state | STATE_CANCELLED; - } else if (isRecognized || isValid) { - if (eventType & INPUT_END) { - return state | STATE_ENDED; - } else if (!(state & STATE_BEGAN)) { - return STATE_BEGAN; - } - return state | STATE_CHANGED; - } - return STATE_FAILED; - } - }); - - /** - * Pan - * Recognized when the pointer is down and moved in the allowed direction. - * @constructor - * @extends AttrRecognizer - */ - function PanRecognizer() { - AttrRecognizer.apply(this, arguments); - - this.pX = null; - this.pY = null; - } - - inherit(PanRecognizer, AttrRecognizer, { - /** - * @namespace - * @memberof PanRecognizer - */ - defaults: { - event: 'pan', - threshold: 10, - pointers: 1, - direction: DIRECTION_ALL - }, - - getTouchAction: function() { - var direction = this.options.direction; - var actions = []; - if (direction & DIRECTION_HORIZONTAL) { - actions.push(TOUCH_ACTION_PAN_Y); - } - if (direction & DIRECTION_VERTICAL) { - actions.push(TOUCH_ACTION_PAN_X); - } - return actions; - }, - - directionTest: function(input) { - var options = this.options; - var hasMoved = true; - var distance = input.distance; - var direction = input.direction; - var x = input.deltaX; - var y = input.deltaY; - - // lock to axis? - if (!(direction & options.direction)) { - if (options.direction & DIRECTION_HORIZONTAL) { - direction = (x === 0) ? DIRECTION_NONE : (x < 0) ? DIRECTION_LEFT : DIRECTION_RIGHT; - hasMoved = x != this.pX; - distance = Math.abs(input.deltaX); - } else { - direction = (y === 0) ? DIRECTION_NONE : (y < 0) ? DIRECTION_UP : DIRECTION_DOWN; - hasMoved = y != this.pY; - distance = Math.abs(input.deltaY); - } - } - input.direction = direction; - return hasMoved && distance > options.threshold && direction & options.direction; - }, - - attrTest: function(input) { - return AttrRecognizer.prototype.attrTest.call(this, input) && - (this.state & STATE_BEGAN || (!(this.state & STATE_BEGAN) && this.directionTest(input))); - }, - - emit: function(input) { - this.pX = input.deltaX; - this.pY = input.deltaY; - - var direction = directionStr(input.direction); - if (direction) { - this.manager.emit(this.options.event + direction, input); - } - - this._super.emit.call(this, input); - } - }); - - /** - * Pinch - * Recognized when two or more pointers are moving toward (zoom-in) or away from each other (zoom-out). - * @constructor - * @extends AttrRecognizer - */ - function PinchRecognizer() { - AttrRecognizer.apply(this, arguments); - } - - inherit(PinchRecognizer, AttrRecognizer, { - /** - * @namespace - * @memberof PinchRecognizer - */ - defaults: { - event: 'pinch', - threshold: 0, - pointers: 2 - }, - - getTouchAction: function() { - return [TOUCH_ACTION_NONE]; - }, - - attrTest: function(input) { - return this._super.attrTest.call(this, input) && - (Math.abs(input.scale - 1) > this.options.threshold || this.state & STATE_BEGAN); - }, - - emit: function(input) { - this._super.emit.call(this, input); - if (input.scale !== 1) { - var inOut = input.scale < 1 ? 'in' : 'out'; - this.manager.emit(this.options.event + inOut, input); - } - } - }); - - /** - * Press - * Recognized when the pointer is down for x ms without any movement. - * @constructor - * @extends Recognizer - */ - function PressRecognizer() { - Recognizer.apply(this, arguments); - - this._timer = null; - this._input = null; - } - - inherit(PressRecognizer, Recognizer, { - /** - * @namespace - * @memberof PressRecognizer - */ - defaults: { - event: 'press', - pointers: 1, - time: 500, // minimal time of the pointer to be pressed - threshold: 5 // a minimal movement is ok, but keep it low - }, - - getTouchAction: function() { - return [TOUCH_ACTION_AUTO]; - }, - - process: function(input) { - var options = this.options; - var validPointers = input.pointers.length === options.pointers; - var validMovement = input.distance < options.threshold; - var validTime = input.deltaTime > options.time; - - this._input = input; - - // we only allow little movement - // and we've reached an end event, so a tap is possible - if (!validMovement || !validPointers || (input.eventType & (INPUT_END | INPUT_CANCEL) && !validTime)) { - this.reset(); - } else if (input.eventType & INPUT_START) { - this.reset(); - this._timer = setTimeoutContext(function() { - this.state = STATE_RECOGNIZED; - this.tryEmit(); - }, options.time, this); - } else if (input.eventType & INPUT_END) { - return STATE_RECOGNIZED; - } - return STATE_FAILED; - }, - - reset: function() { - clearTimeout(this._timer); - }, - - emit: function(input) { - if (this.state !== STATE_RECOGNIZED) { - return; - } - - if (input && (input.eventType & INPUT_END)) { - this.manager.emit(this.options.event + 'up', input); - } else { - this._input.timeStamp = now(); - this.manager.emit(this.options.event, this._input); - } - } - }); - - /** - * Rotate - * Recognized when two or more pointer are moving in a circular motion. - * @constructor - * @extends AttrRecognizer - */ - function RotateRecognizer() { - AttrRecognizer.apply(this, arguments); - } - - inherit(RotateRecognizer, AttrRecognizer, { - /** - * @namespace - * @memberof RotateRecognizer - */ - defaults: { - event: 'rotate', - threshold: 0, - pointers: 2 - }, - - getTouchAction: function() { - return [TOUCH_ACTION_NONE]; - }, - - attrTest: function(input) { - return this._super.attrTest.call(this, input) && - (Math.abs(input.rotation) > this.options.threshold || this.state & STATE_BEGAN); - } - }); - - /** - * Swipe - * Recognized when the pointer is moving fast (velocity), with enough distance in the allowed direction. - * @constructor - * @extends AttrRecognizer - */ - function SwipeRecognizer() { - AttrRecognizer.apply(this, arguments); - } - - inherit(SwipeRecognizer, AttrRecognizer, { - /** - * @namespace - * @memberof SwipeRecognizer - */ - defaults: { - event: 'swipe', - threshold: 10, - velocity: 0.65, - direction: DIRECTION_HORIZONTAL | DIRECTION_VERTICAL, - pointers: 1 - }, - - getTouchAction: function() { - return PanRecognizer.prototype.getTouchAction.call(this); - }, - - attrTest: function(input) { - var direction = this.options.direction; - var velocity; - - if (direction & (DIRECTION_HORIZONTAL | DIRECTION_VERTICAL)) { - velocity = input.velocity; - } else if (direction & DIRECTION_HORIZONTAL) { - velocity = input.velocityX; - } else if (direction & DIRECTION_VERTICAL) { - velocity = input.velocityY; - } - - return this._super.attrTest.call(this, input) && - direction & input.direction && - input.distance > this.options.threshold && - abs(velocity) > this.options.velocity && input.eventType & INPUT_END; - }, - - emit: function(input) { - var direction = directionStr(input.direction); - if (direction) { - this.manager.emit(this.options.event + direction, input); - } - - this.manager.emit(this.options.event, input); - } - }); - - /** - * A tap is ecognized when the pointer is doing a small tap/click. Multiple taps are recognized if they occur - * between the given interval and position. The delay option can be used to recognize multi-taps without firing - * a single tap. - * - * The eventData from the emitted event contains the property `tapCount`, which contains the amount of - * multi-taps being recognized. - * @constructor - * @extends Recognizer - */ - function TapRecognizer() { - Recognizer.apply(this, arguments); - - // previous time and center, - // used for tap counting - this.pTime = false; - this.pCenter = false; - - this._timer = null; - this._input = null; - this.count = 0; - } - - inherit(TapRecognizer, Recognizer, { - /** - * @namespace - * @memberof PinchRecognizer - */ - defaults: { - event: 'tap', - pointers: 1, - taps: 1, - interval: 300, // max time between the multi-tap taps - time: 250, // max time of the pointer to be down (like finger on the screen) - threshold: 2, // a minimal movement is ok, but keep it low - posThreshold: 10 // a multi-tap can be a bit off the initial position - }, - - getTouchAction: function() { - return [TOUCH_ACTION_MANIPULATION]; - }, - - process: function(input) { - var options = this.options; - - var validPointers = input.pointers.length === options.pointers; - var validMovement = input.distance < options.threshold; - var validTouchTime = input.deltaTime < options.time; - - this.reset(); - - if ((input.eventType & INPUT_START) && (this.count === 0)) { - return this.failTimeout(); - } - - // we only allow little movement - // and we've reached an end event, so a tap is possible - if (validMovement && validTouchTime && validPointers) { - if (input.eventType != INPUT_END) { - return this.failTimeout(); - } - - var validInterval = this.pTime ? (input.timeStamp - this.pTime < options.interval) : true; - var validMultiTap = !this.pCenter || getDistance(this.pCenter, input.center) < options.posThreshold; - - this.pTime = input.timeStamp; - this.pCenter = input.center; - - if (!validMultiTap || !validInterval) { - this.count = 1; - } else { - this.count += 1; - } - - this._input = input; - - // if tap count matches we have recognized it, - // else it has began recognizing... - var tapCount = this.count % options.taps; - if (tapCount === 0) { - // no failing requirements, immediately trigger the tap event - // or wait as long as the multitap interval to trigger - if (!this.hasRequireFailures()) { - return STATE_RECOGNIZED; - } else { - this._timer = setTimeoutContext(function() { - this.state = STATE_RECOGNIZED; - this.tryEmit(); - }, options.interval, this); - return STATE_BEGAN; - } - } - } - return STATE_FAILED; - }, - - failTimeout: function() { - this._timer = setTimeoutContext(function() { - this.state = STATE_FAILED; - }, this.options.interval, this); - return STATE_FAILED; - }, - - reset: function() { - clearTimeout(this._timer); - }, - - emit: function() { - if (this.state == STATE_RECOGNIZED ) { - this._input.tapCount = this.count; - this.manager.emit(this.options.event, this._input); - } - } - }); - - /** - * Simple way to create an manager with a default set of recognizers. - * @param {HTMLElement} element - * @param {Object} [options] - * @constructor - */ - function Hammer(element, options) { - options = options || {}; - options.recognizers = ifUndefined(options.recognizers, Hammer.defaults.preset); - return new Manager(element, options); - } - - /** - * @const {string} - */ - Hammer.VERSION = '2.0.4'; - - /** - * default settings - * @namespace - */ - Hammer.defaults = { - /** - * set if DOM events are being triggered. - * But this is slower and unused by simple implementations, so disabled by default. - * @type {Boolean} - * @default false - */ - domEvents: false, - - /** - * The value for the touchAction property/fallback. - * When set to `compute` it will magically set the correct value based on the added recognizers. - * @type {String} - * @default compute - */ - touchAction: TOUCH_ACTION_COMPUTE, - - /** - * @type {Boolean} - * @default true - */ - enable: true, - - /** - * EXPERIMENTAL FEATURE -- can be removed/changed - * Change the parent input target element. - * If Null, then it is being set the to main element. - * @type {Null|EventTarget} - * @default null - */ - inputTarget: null, - - /** - * force an input class - * @type {Null|Function} - * @default null - */ - inputClass: null, - - /** - * Default recognizer setup when calling `Hammer()` - * When creating a new Manager these will be skipped. - * @type {Array} - */ - preset: [ - // RecognizerClass, options, [recognizeWith, ...], [requireFailure, ...] - [RotateRecognizer, { enable: false }], - [PinchRecognizer, { enable: false }, ['rotate']], - [SwipeRecognizer,{ direction: DIRECTION_HORIZONTAL }], - [PanRecognizer, { direction: DIRECTION_HORIZONTAL }, ['swipe']], - [TapRecognizer], - [TapRecognizer, { event: 'doubletap', taps: 2 }, ['tap']], - [PressRecognizer] - ], - - /** - * Some CSS properties can be used to improve the working of Hammer. - * Add them to this method and they will be set when creating a new Manager. - * @namespace - */ - cssProps: { - /** - * Disables text selection to improve the dragging gesture. Mainly for desktop browsers. - * @type {String} - * @default 'none' - */ - userSelect: 'none', - - /** - * Disable the Windows Phone grippers when pressing an element. - * @type {String} - * @default 'none' - */ - touchSelect: 'none', - - /** - * Disables the default callout shown when you touch and hold a touch target. - * On iOS, when you touch and hold a touch target such as a link, Safari displays - * a callout containing information about the link. This property allows you to disable that callout. - * @type {String} - * @default 'none' - */ - touchCallout: 'none', - - /** - * Specifies whether zooming is enabled. Used by IE10> - * @type {String} - * @default 'none' - */ - contentZooming: 'none', - - /** - * Specifies that an entire element should be draggable instead of its contents. Mainly for desktop browsers. - * @type {String} - * @default 'none' - */ - userDrag: 'none', - - /** - * Overrides the highlight color shown when the user taps a link or a JavaScript - * clickable element in iOS. This property obeys the alpha value, if specified. - * @type {String} - * @default 'rgba(0,0,0,0)' - */ - tapHighlightColor: 'rgba(0,0,0,0)' - } - }; - - var STOP = 1; - var FORCED_STOP = 2; - - /** - * Manager - * @param {HTMLElement} element - * @param {Object} [options] - * @constructor - */ - function Manager(element, options) { - options = options || {}; - - this.options = merge(options, Hammer.defaults); - this.options.inputTarget = this.options.inputTarget || element; - - this.handlers = {}; - this.session = {}; - this.recognizers = []; - - this.element = element; - this.input = createInputInstance(this); - this.touchAction = new TouchAction(this, this.options.touchAction); - - toggleCssProps(this, true); - - each(options.recognizers, function(item) { - var recognizer = this.add(new (item[0])(item[1])); - item[2] && recognizer.recognizeWith(item[2]); - item[3] && recognizer.requireFailure(item[3]); - }, this); - } - - Manager.prototype = { - /** - * set options - * @param {Object} options - * @returns {Manager} - */ - set: function(options) { - extend(this.options, options); - - // Options that need a little more setup - if (options.touchAction) { - this.touchAction.update(); - } - if (options.inputTarget) { - // Clean up existing event listeners and reinitialize - this.input.destroy(); - this.input.target = options.inputTarget; - this.input.init(); - } - return this; - }, - - /** - * stop recognizing for this session. - * This session will be discarded, when a new [input]start event is fired. - * When forced, the recognizer cycle is stopped immediately. - * @param {Boolean} [force] - */ - stop: function(force) { - this.session.stopped = force ? FORCED_STOP : STOP; - }, - - /** - * run the recognizers! - * called by the inputHandler function on every movement of the pointers (touches) - * it walks through all the recognizers and tries to detect the gesture that is being made - * @param {Object} inputData - */ - recognize: function(inputData) { - var session = this.session; - if (session.stopped) { - return; - } - - // run the touch-action polyfill - this.touchAction.preventDefaults(inputData); - - var recognizer; - var recognizers = this.recognizers; - - // this holds the recognizer that is being recognized. - // so the recognizer's state needs to be BEGAN, CHANGED, ENDED or RECOGNIZED - // if no recognizer is detecting a thing, it is set to `null` - var curRecognizer = session.curRecognizer; - - // reset when the last recognizer is recognized - // or when we're in a new session - if (!curRecognizer || (curRecognizer && curRecognizer.state & STATE_RECOGNIZED)) { - curRecognizer = session.curRecognizer = null; - } - - var i = 0; - while (i < recognizers.length) { - recognizer = recognizers[i]; - - // find out if we are allowed try to recognize the input for this one. - // 1. allow if the session is NOT forced stopped (see the .stop() method) - // 2. allow if we still haven't recognized a gesture in this session, or the this recognizer is the one - // that is being recognized. - // 3. allow if the recognizer is allowed to run simultaneous with the current recognized recognizer. - // this can be setup with the `recognizeWith()` method on the recognizer. - if (session.stopped !== FORCED_STOP && ( // 1 - !curRecognizer || recognizer == curRecognizer || // 2 - recognizer.canRecognizeWith(curRecognizer))) { // 3 - recognizer.recognize(inputData); - } else { - recognizer.reset(); - } - - // if the recognizer has been recognizing the input as a valid gesture, we want to store this one as the - // current active recognizer. but only if we don't already have an active recognizer - if (!curRecognizer && recognizer.state & (STATE_BEGAN | STATE_CHANGED | STATE_ENDED)) { - curRecognizer = session.curRecognizer = recognizer; - } - i++; - } - }, - - /** - * get a recognizer by its event name. - * @param {Recognizer|String} recognizer - * @returns {Recognizer|Null} - */ - get: function(recognizer) { - if (recognizer instanceof Recognizer) { - return recognizer; - } - - var recognizers = this.recognizers; - for (var i = 0; i < recognizers.length; i++) { - if (recognizers[i].options.event == recognizer) { - return recognizers[i]; - } - } - return null; - }, - - /** - * add a recognizer to the manager - * existing recognizers with the same event name will be removed - * @param {Recognizer} recognizer - * @returns {Recognizer|Manager} - */ - add: function(recognizer) { - if (invokeArrayArg(recognizer, 'add', this)) { - return this; - } - - // remove existing - var existing = this.get(recognizer.options.event); - if (existing) { - this.remove(existing); - } - - this.recognizers.push(recognizer); - recognizer.manager = this; - - this.touchAction.update(); - return recognizer; - }, - - /** - * remove a recognizer by name or instance - * @param {Recognizer|String} recognizer - * @returns {Manager} - */ - remove: function(recognizer) { - if (invokeArrayArg(recognizer, 'remove', this)) { - return this; - } - - var recognizers = this.recognizers; - recognizer = this.get(recognizer); - recognizers.splice(inArray(recognizers, recognizer), 1); - - this.touchAction.update(); - return this; - }, - - /** - * bind event - * @param {String} events - * @param {Function} handler - * @returns {EventEmitter} this - */ - on: function(events, handler) { - var handlers = this.handlers; - each(splitStr(events), function(event) { - handlers[event] = handlers[event] || []; - handlers[event].push(handler); - }); - return this; - }, - - /** - * unbind event, leave emit blank to remove all handlers - * @param {String} events - * @param {Function} [handler] - * @returns {EventEmitter} this - */ - off: function(events, handler) { - var handlers = this.handlers; - each(splitStr(events), function(event) { - if (!handler) { - delete handlers[event]; - } else { - handlers[event].splice(inArray(handlers[event], handler), 1); - } - }); - return this; - }, - - /** - * emit event to the listeners - * @param {String} event - * @param {Object} data - */ - emit: function(event, data) { - // we also want to trigger dom events - if (this.options.domEvents) { - triggerDomEvent(event, data); - } - - // no handlers, so skip it all - var handlers = this.handlers[event] && this.handlers[event].slice(); - if (!handlers || !handlers.length) { - return; - } - - data.type = event; - data.preventDefault = function() { - data.srcEvent.preventDefault(); - }; - - var i = 0; - while (i < handlers.length) { - handlers[i](data); - i++; - } - }, - - /** - * destroy the manager and unbinds all events - * it doesn't unbind dom events, that is the user own responsibility - */ - destroy: function() { - this.element && toggleCssProps(this, false); - - this.handlers = {}; - this.session = {}; - this.input.destroy(); - this.element = null; - } - }; - - /** - * add/remove the css properties as defined in manager.options.cssProps - * @param {Manager} manager - * @param {Boolean} add - */ - function toggleCssProps(manager, add) { - var element = manager.element; - each(manager.options.cssProps, function(value, name) { - element.style[prefixed(element.style, name)] = add ? value : ''; - }); - } - - /** - * trigger dom event - * @param {String} event - * @param {Object} data - */ - function triggerDomEvent(event, data) { - var gestureEvent = document.createEvent('Event'); - gestureEvent.initEvent(event, true, true); - gestureEvent.gesture = data; - data.target.dispatchEvent(gestureEvent); - } - - extend(Hammer, { - INPUT_START: INPUT_START, - INPUT_MOVE: INPUT_MOVE, - INPUT_END: INPUT_END, - INPUT_CANCEL: INPUT_CANCEL, - - STATE_POSSIBLE: STATE_POSSIBLE, - STATE_BEGAN: STATE_BEGAN, - STATE_CHANGED: STATE_CHANGED, - STATE_ENDED: STATE_ENDED, - STATE_RECOGNIZED: STATE_RECOGNIZED, - STATE_CANCELLED: STATE_CANCELLED, - STATE_FAILED: STATE_FAILED, - - DIRECTION_NONE: DIRECTION_NONE, - DIRECTION_LEFT: DIRECTION_LEFT, - DIRECTION_RIGHT: DIRECTION_RIGHT, - DIRECTION_UP: DIRECTION_UP, - DIRECTION_DOWN: DIRECTION_DOWN, - DIRECTION_HORIZONTAL: DIRECTION_HORIZONTAL, - DIRECTION_VERTICAL: DIRECTION_VERTICAL, - DIRECTION_ALL: DIRECTION_ALL, - - Manager: Manager, - Input: Input, - TouchAction: TouchAction, - - TouchInput: TouchInput, - MouseInput: MouseInput, - PointerEventInput: PointerEventInput, - TouchMouseInput: TouchMouseInput, - SingleTouchInput: SingleTouchInput, - - Recognizer: Recognizer, - AttrRecognizer: AttrRecognizer, - Tap: TapRecognizer, - Pan: PanRecognizer, - Swipe: SwipeRecognizer, - Pinch: PinchRecognizer, - Rotate: RotateRecognizer, - Press: PressRecognizer, - - on: addEventListeners, - off: removeEventListeners, - each: each, - merge: merge, - extend: extend, - inherit: inherit, - bindFn: bindFn, - prefixed: prefixed - }); - - if ("function" == TYPE_FUNCTION && __webpack_require__(6)) { - !(__WEBPACK_AMD_DEFINE_RESULT__ = function() { - return Hammer; - }.call(exports, __webpack_require__, exports, module), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); - } else if (typeof module != 'undefined' && module.exports) { - module.exports = Hammer; - } else { - window[exportName] = Hammer; - } - - })(window, document, 'Hammer'); - - -/***/ }, -/* 6 */ -/***/ function(module, exports) { - - /* WEBPACK VAR INJECTION */(function(__webpack_amd_options__) {module.exports = __webpack_amd_options__; - - /* WEBPACK VAR INJECTION */}.call(exports, {})) - -/***/ }, -/* 7 */ /***/ function(module, exports, __webpack_require__) { // utility functions @@ -3397,8 +168,8 @@ return /******/ (function(modules) { // webpackBootstrap 'use strict'; - var moment = __webpack_require__(8); - var uuid = __webpack_require__(12); + var moment = __webpack_require__(2); + var uuid = __webpack_require__(6); /** * Test whether given object is a number @@ -3618,7 +389,11 @@ return /******/ (function(modules) { // webpackBootstrap } else if (Array.isArray(b[prop])) { throw new TypeError('Arrays are not supported by deepExtend'); } else { - a[prop] = b[prop]; + if (b[prop] === null && a[prop] !== undefined && allowDeletion === true) { + delete a[prop]; + } else { + a[prop] = b[prop]; + } } } } @@ -3663,7 +438,11 @@ return /******/ (function(modules) { // webpackBootstrap a[prop].push(b[prop][i]); } } else { - a[prop] = b[prop]; + if (b[prop] === null && a[prop] !== undefined && allowDeletion === true) { + delete a[prop]; + } else { + a[prop] = b[prop]; + } } } } @@ -3702,7 +481,11 @@ return /******/ (function(modules) { // webpackBootstrap a[prop].push(b[prop][i]); } } else { - a[prop] = b[prop]; + if (b[prop] === null && a[prop] !== undefined && allowDeletion === true) { + delete a[prop]; + } else { + a[prop] = b[prop]; + } } } } @@ -3781,11 +564,11 @@ return /******/ (function(modules) { // webpackBootstrap // object is an ASP date return new Date(Number(match[1])); // parse number } else { - return moment(object).toDate(); // parse string - } + return moment(object).toDate(); // parse string + } } else { - throw new Error('Cannot convert object of type ' + exports.getType(object) + ' to type Date'); - } + throw new Error('Cannot convert object of type ' + exports.getType(object) + ' to type Date'); + } case 'Moment': if (exports.isNumber(object)) { @@ -3802,11 +585,11 @@ return /******/ (function(modules) { // webpackBootstrap // object is an ASP date return moment(Number(match[1])); // parse number } else { - return moment(object); // parse string - } + return moment(object); // parse string + } } else { - throw new Error('Cannot convert object of type ' + exports.getType(object) + ' to type Date'); - } + throw new Error('Cannot convert object of type ' + exports.getType(object) + ' to type Date'); + } case 'ISODate': if (exports.isNumber(object)) { @@ -3821,11 +604,11 @@ return /******/ (function(modules) { // webpackBootstrap // object is an ASP date return new Date(Number(match[1])).toISOString(); // parse number } else { - return new Date(object).toISOString(); // parse string - } + return new Date(object).toISOString(); // parse string + } } else { - throw new Error('Cannot convert object of type ' + exports.getType(object) + ' to type ISODate'); - } + throw new Error('Cannot convert object of type ' + exports.getType(object) + ' to type ISODate'); + } case 'ASPDate': if (exports.isNumber(object)) { @@ -3839,8 +622,8 @@ return /******/ (function(modules) { // webpackBootstrap // object is an ASP date value = new Date(Number(match[1])).valueOf(); // parse number } else { - value = new Date(object).valueOf(); // parse string - } + value = new Date(object).valueOf(); // parse string + } return '/Date(' + value + ')/'; } else { throw new Error('Cannot convert object of type ' + exports.getType(object) + ' to type ASPDate'); @@ -4033,6 +816,33 @@ return /******/ (function(modules) { // webpackBootstrap } }; + /** + * Throttle the given function to be only executed once every `wait` milliseconds + * @param {function} fn + * @param {number} wait Time in milliseconds + * @returns {function} Returns the throttled function + */ + exports.throttle = function (fn, wait) { + var timeout = null; + var needExecution = false; + + return function throttled() { + if (!timeout) { + needExecution = false; + fn(); + + timeout = setTimeout(function () { + timeout = null; + if (needExecution) { + throttled(); + } + }, wait); + } else { + needExecution = true; + } + }; + }; + /** * Add and event listener. Works for all browsers * @param {Element} element An html element @@ -4045,13 +855,13 @@ return /******/ (function(modules) { // webpackBootstrap if (element.addEventListener) { if (useCapture === undefined) useCapture = false; - if (action === 'mousewheel' && navigator.userAgent.indexOf('Firefox') >= 0) { - action = 'DOMMouseScroll'; // For Firefox + if (action === "mousewheel" && navigator.userAgent.indexOf("Firefox") >= 0) { + action = "DOMMouseScroll"; // For Firefox } element.addEventListener(action, listener, useCapture); } else { - element.attachEvent('on' + action, listener); // IE browsers + element.attachEvent("on" + action, listener); // IE browsers } }; @@ -4067,14 +877,14 @@ return /******/ (function(modules) { // webpackBootstrap // non-IE browsers if (useCapture === undefined) useCapture = false; - if (action === 'mousewheel' && navigator.userAgent.indexOf('Firefox') >= 0) { - action = 'DOMMouseScroll'; // For Firefox + if (action === "mousewheel" && navigator.userAgent.indexOf("Firefox") >= 0) { + action = "DOMMouseScroll"; // For Firefox } element.removeEventListener(action, listener, useCapture); } else { // IE browsers - element.detachEvent('on' + action, listener); + element.detachEvent("on" + action, listener); } }; @@ -4087,8 +897,8 @@ return /******/ (function(modules) { // webpackBootstrap if (event.preventDefault) { event.preventDefault(); // non-IE browsers } else { - event.returnValue = false; // IE browsers - } + event.returnValue = false; // IE browsers + } }; /** @@ -4253,17 +1063,17 @@ return /******/ (function(modules) { // webpackBootstrap * @returns {*} */ exports.overrideOpacity = function (color, opacity) { - if (color.indexOf('rgba') != -1) { + if (color.indexOf("rgba") != -1) { return color; - } else if (color.indexOf('rgb') != -1) { - var rgb = color.substr(color.indexOf('(') + 1).replace(')', '').split(','); - return 'rgba(' + rgb[0] + ',' + rgb[1] + ',' + rgb[2] + ',' + opacity + ')'; + } else if (color.indexOf("rgb") != -1) { + var rgb = color.substr(color.indexOf("(") + 1).replace(")", "").split(","); + return "rgba(" + rgb[0] + "," + rgb[1] + "," + rgb[2] + "," + opacity + ")"; } else { var rgb = exports.hexToRGB(color); if (rgb == null) { return color; } else { - return 'rgba(' + rgb.r + ',' + rgb.g + ',' + rgb.b + ',' + opacity + ')'; + return "rgba(" + rgb.r + "," + rgb.g + "," + rgb.b + "," + opacity + ")"; } } }; @@ -4277,7 +1087,7 @@ return /******/ (function(modules) { // webpackBootstrap * @constructor */ exports.RGBToHex = function (red, green, blue) { - return '#' + ((1 << 24) + (red << 16) + (green << 8) + blue).toString(16).slice(1); + return "#" + ((1 << 24) + (red << 16) + (green << 8) + blue).toString(16).slice(1); }; /** @@ -4493,12 +1303,12 @@ return /******/ (function(modules) { // webpackBootstrap }; exports.isValidRGB = function (rgb) { - rgb = rgb.replace(' ', ''); + rgb = rgb.replace(" ", ""); var isOk = /rgb\((\d{1,3}),(\d{1,3}),(\d{1,3})\)/i.test(rgb); return isOk; }; exports.isValidRGBA = function (rgba) { - rgba = rgba.replace(' ', ''); + rgba = rgba.replace(" ", ""); var isOk = /rgba\((\d{1,3}),(\d{1,3}),(\d{1,3}),(.{1,3})\)/i.test(rgba); return isOk; }; @@ -4511,11 +1321,11 @@ return /******/ (function(modules) { // webpackBootstrap * @returns {*} */ exports.selectiveBridgeObject = function (fields, referenceObject) { - if (typeof referenceObject == 'object') { + if (typeof referenceObject == "object") { var objectTo = Object.create(referenceObject); for (var i = 0; i < fields.length; i++) { if (referenceObject.hasOwnProperty(fields[i])) { - if (typeof referenceObject[fields[i]] == 'object') { + if (typeof referenceObject[fields[i]] == "object") { objectTo[fields[i]] = exports.bridgeObject(referenceObject[fields[i]]); } } @@ -4534,11 +1344,11 @@ return /******/ (function(modules) { // webpackBootstrap * @returns {*} */ exports.bridgeObject = function (referenceObject) { - if (typeof referenceObject == 'object') { + if (typeof referenceObject == "object") { var objectTo = Object.create(referenceObject); for (var i in referenceObject) { if (referenceObject.hasOwnProperty(i)) { - if (typeof referenceObject[i] == 'object') { + if (typeof referenceObject[i] == "object") { objectTo[i] = exports.bridgeObject(referenceObject[i]); } } @@ -4549,6 +1359,24 @@ return /******/ (function(modules) { // webpackBootstrap } }; + /** + * This method provides a stable sort implementation, very fast for presorted data + * + * @param a the array + * @param a order comparator + * @returns {the array} + */ + exports.insertSort = function (a, compare) { + for (var i = 0; i < a.length; i++) { + var k = a[i]; + for (var j = i; j > 0 && compare(k, a[j - 1]) < 0; j--) { + a[j] = a[j - 1]; + } + a[j] = k; + } + return a; + }; + /** * this is used to set the options of subobjects in the options object. A requirement of these subobjects * is that they have an 'enabled' element which is optional for the user but mandatory for the program. @@ -4556,14 +1384,13 @@ return /******/ (function(modules) { // webpackBootstrap * @param [object] mergeTarget | this is either this.options or the options used for the groups. * @param [object] options | options * @param [String] option | this is the option key in the options argument - * @private */ exports.mergeOptions = function (mergeTarget, options, option) { var allowDeletion = arguments.length <= 3 || arguments[3] === undefined ? false : arguments[3]; + var globalOptions = arguments.length <= 4 || arguments[4] === undefined ? {} : arguments[4]; if (options[option] === null) { - mergeTarget[option] = undefined; - delete mergeTarget[option]; + mergeTarget[option] = Object.create(globalOptions[option]); } else { if (options[option] !== undefined) { if (typeof options[option] === 'boolean') { @@ -4587,13 +1414,13 @@ return /******/ (function(modules) { // webpackBootstrap * this function will then iterate in both directions over this sorted list to find all visible items. * * @param {Item[]} orderedItems | Items ordered by start - * @param {function} searchFunction | -1 is lower, 0 is found, 1 is higher + * @param {function} comparator | -1 is lower, 0 is equal, 1 is higher * @param {String} field * @param {String} field2 * @returns {number} * @private */ - exports.binarySearchCustom = function (orderedItems, searchFunction, field, field2) { + exports.binarySearchCustom = function (orderedItems, comparator, field, field2) { var maxIterations = 10000; var iteration = 0; var low = 0; @@ -4605,7 +1432,7 @@ return /******/ (function(modules) { // webpackBootstrap var item = orderedItems[middle]; var value = field2 === undefined ? item[field] : item[field][field2]; - var searchResult = searchFunction(value); + var searchResult = comparator(value); if (searchResult == 0) { // jihaa, found a visible item! return middle; @@ -4632,16 +1459,21 @@ return /******/ (function(modules) { // webpackBootstrap * @param {{start: number, end: number}} target * @param {String} field * @param {String} sidePreference 'before' or 'after' + * @param {function} comparator an optional comparator, returning -1,0,1 for <,==,>. * @returns {number} * @private */ - exports.binarySearchValue = function (orderedItems, target, field, sidePreference) { + exports.binarySearchValue = function (orderedItems, target, field, sidePreference, comparator) { var maxIterations = 10000; var iteration = 0; var low = 0; var high = orderedItems.length - 1; var prevValue, value, nextValue, middle; + var comparator = comparator != undefined ? comparator : function (a, b) { + return a == b ? 0 : a < b ? -1 : 1; + }; + while (low <= high && iteration < maxIterations) { // get a new guess middle = Math.floor(0.5 * (high + low)); @@ -4649,18 +1481,18 @@ return /******/ (function(modules) { // webpackBootstrap value = orderedItems[middle][field]; nextValue = orderedItems[Math.min(orderedItems.length - 1, middle + 1)][field]; - if (value == target) { + if (comparator(value, target) == 0) { // we found the target return middle; - } else if (prevValue < target && value > target) { + } else if (comparator(prevValue, target) < 0 && comparator(value, target) > 0) { // target is in between of the previous and the current return sidePreference == 'before' ? Math.max(0, middle - 1) : middle; - } else if (value < target && nextValue > target) { + } else if (comparator(value, target) < 0 && comparator(nextValue, target) > 0) { // target is in between of the current and the next return sidePreference == 'before' ? middle : Math.min(orderedItems.length - 1, middle + 1); } else { // didnt find the target, we need to change our boundaries. - if (value < target) { + if (comparator(value, target) < 0) { // it is too small --> increase low low = middle + 1; } else { @@ -4736,27 +1568,27 @@ return /******/ (function(modules) { // webpackBootstrap }; /***/ }, -/* 8 */ +/* 2 */ /***/ function(module, exports, __webpack_require__) { // first check if moment.js is already loaded in the browser window, if so, // use this instance. Else, load via commonjs. 'use strict'; - module.exports = typeof window !== 'undefined' && window['moment'] || __webpack_require__(9); + module.exports = typeof window !== 'undefined' && window['moment'] || __webpack_require__(3); /***/ }, -/* 9 */ +/* 3 */ /***/ function(module, exports, __webpack_require__) { /* WEBPACK VAR INJECTION */(function(module) {//! moment.js - //! version : 2.10.3 + //! version : 2.11.2 //! authors : Tim Wood, Iskren Chernev, Moment.js contributors //! license : MIT //! momentjs.com - (function (global, factory) { - true ? module.exports = factory() : + ;(function (global, factory) { + true ? module.exports = factory() : typeof define === 'function' && define.amd ? define(factory) : global.moment = factory() }(this, function () { 'use strict'; @@ -4845,6 +1677,7 @@ return /******/ (function(modules) { // webpackBootstrap flags.overflow < 0 && !flags.empty && !flags.invalidMonth && + !flags.invalidWeekday && !flags.nullInput && !flags.invalidFormat && !flags.userInvalidated; @@ -4871,39 +1704,45 @@ return /******/ (function(modules) { // webpackBootstrap return m; } + function isUndefined(input) { + return input === void 0; + } + + // Plugins that add properties should also add the key here (null value), + // so we can properly clone ourselves. var momentProperties = utils_hooks__hooks.momentProperties = []; function copyConfig(to, from) { var i, prop, val; - if (typeof from._isAMomentObject !== 'undefined') { + if (!isUndefined(from._isAMomentObject)) { to._isAMomentObject = from._isAMomentObject; } - if (typeof from._i !== 'undefined') { + if (!isUndefined(from._i)) { to._i = from._i; } - if (typeof from._f !== 'undefined') { + if (!isUndefined(from._f)) { to._f = from._f; } - if (typeof from._l !== 'undefined') { + if (!isUndefined(from._l)) { to._l = from._l; } - if (typeof from._strict !== 'undefined') { + if (!isUndefined(from._strict)) { to._strict = from._strict; } - if (typeof from._tzm !== 'undefined') { + if (!isUndefined(from._tzm)) { to._tzm = from._tzm; } - if (typeof from._isUTC !== 'undefined') { + if (!isUndefined(from._isUTC)) { to._isUTC = from._isUTC; } - if (typeof from._offset !== 'undefined') { + if (!isUndefined(from._offset)) { to._offset = from._offset; } - if (typeof from._pf !== 'undefined') { + if (!isUndefined(from._pf)) { to._pf = getParsingFlags(from); } - if (typeof from._locale !== 'undefined') { + if (!isUndefined(from._locale)) { to._locale = from._locale; } @@ -4911,7 +1750,7 @@ return /******/ (function(modules) { // webpackBootstrap for (i in momentProperties) { prop = momentProperties[i]; val = from[prop]; - if (typeof val !== 'undefined') { + if (!isUndefined(val)) { to[prop] = val; } } @@ -4925,7 +1764,7 @@ return /******/ (function(modules) { // webpackBootstrap // Moment prototype object function Moment(config) { copyConfig(this, config); - this._d = new Date(+config._d); + this._d = new Date(config._d != null ? config._d.getTime() : NaN); // Prevent infinite loop in case updateOffset creates new moment // objects. if (updateInProgress === false) { @@ -4939,21 +1778,26 @@ return /******/ (function(modules) { // webpackBootstrap return obj instanceof Moment || (obj != null && obj._isAMomentObject != null); } + function absFloor (number) { + if (number < 0) { + return Math.ceil(number); + } else { + return Math.floor(number); + } + } + function toInt(argumentForCoercion) { var coercedNumber = +argumentForCoercion, value = 0; if (coercedNumber !== 0 && isFinite(coercedNumber)) { - if (coercedNumber >= 0) { - value = Math.floor(coercedNumber); - } else { - value = Math.ceil(coercedNumber); - } + value = absFloor(coercedNumber); } return value; } + // compare two arrays, return the number of differences function compareArrays(array1, array2, dontConvert) { var len = Math.min(array1.length, array2.length), lengthDiff = Math.abs(array1.length - array2.length), @@ -4971,6 +1815,7 @@ return /******/ (function(modules) { // webpackBootstrap function Locale() { } + // internal storage for locale config files var locales = {}; var globalLocale; @@ -5008,7 +1853,7 @@ return /******/ (function(modules) { // webpackBootstrap function loadLocale(name) { var oldLocale = null; // TODO: Find a better way to register and load all the locales in Node - if (!locales[name] && typeof module !== 'undefined' && + if (!locales[name] && (typeof module !== 'undefined') && module && module.exports) { try { oldLocale = globalLocale._abbr; @@ -5027,7 +1872,7 @@ return /******/ (function(modules) { // webpackBootstrap function locale_locales__getSetGlobalLocale (key, values) { var data; if (key) { - if (typeof values === 'undefined') { + if (isUndefined(values)) { data = locale_locales__getLocale(key); } else { @@ -5046,9 +1891,7 @@ return /******/ (function(modules) { // webpackBootstrap function defineLocale (name, values) { if (values !== null) { values.abbr = name; - if (!locales[name]) { - locales[name] = new Locale(); - } + locales[name] = locales[name] || new Locale(); locales[name].set(values); // backwards compat for now: also set the locale @@ -5114,6 +1957,10 @@ return /******/ (function(modules) { // webpackBootstrap return normalizedInput; } + function isFunction(input) { + return input instanceof Function || Object.prototype.toString.call(input) === '[object Function]'; + } + function makeGetSet (unit, keepTime) { return function (value) { if (value != null) { @@ -5127,11 +1974,14 @@ return /******/ (function(modules) { // webpackBootstrap } function get_set__get (mom, unit) { - return mom._d['get' + (mom._isUTC ? 'UTC' : '') + unit](); + return mom.isValid() ? + mom._d['get' + (mom._isUTC ? 'UTC' : '') + unit]() : NaN; } function get_set__set (mom, unit, value) { - return mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value); + if (mom.isValid()) { + mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value); + } } // MOMENTS @@ -5144,7 +1994,7 @@ return /******/ (function(modules) { // webpackBootstrap } } else { units = normalizeUnits(units); - if (typeof this[units] === 'function') { + if (isFunction(this[units])) { return this[units](value); } } @@ -5152,16 +2002,14 @@ return /******/ (function(modules) { // webpackBootstrap } function zeroFill(number, targetLength, forceSign) { - var output = '' + Math.abs(number), + var absNumber = '' + Math.abs(number), + zerosToFill = targetLength - absNumber.length, sign = number >= 0; - - while (output.length < targetLength) { - output = '0' + output; - } - return (sign ? (forceSign ? '+' : '') : '-') + output; + return (sign ? (forceSign ? '+' : '') : '-') + + Math.pow(10, Math.max(0, zerosToFill)).toString().substr(1) + absNumber; } - var formattingTokens = /(\[[^\[]*\])|(\\)?(Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Q|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|mm?|ss?|S{1,4}|x|X|zz?|ZZ?|.)/g; + var formattingTokens = /(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g; var localFormattingTokens = /(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g; @@ -5229,10 +2077,7 @@ return /******/ (function(modules) { // webpackBootstrap } format = expandFormat(format, m.localeData()); - - if (!formatFunctions[format]) { - formatFunctions[format] = makeFormatFunction(format); - } + formatFunctions[format] = formatFunctions[format] || makeFormatFunction(format); return formatFunctions[format](m); } @@ -5260,6 +2105,8 @@ return /******/ (function(modules) { // webpackBootstrap var match4 = /\d{4}/; // 0000 - 9999 var match6 = /[+-]?\d{6}/; // -999999 - 999999 var match1to2 = /\d\d?/; // 0 - 99 + var match3to4 = /\d\d\d\d?/; // 999 - 9999 + var match5to6 = /\d\d\d\d\d\d?/; // 99999 - 999999 var match1to3 = /\d{1,3}/; // 0 - 999 var match1to4 = /\d{1,4}/; // 0 - 9999 var match1to6 = /[+-]?\d{1,6}/; // -999999 - 999999 @@ -5268,16 +2115,19 @@ return /******/ (function(modules) { // webpackBootstrap var matchSigned = /[+-]?\d+/; // -inf - inf var matchOffset = /Z|[+-]\d\d:?\d\d/gi; // +00:00 -00:00 +0000 -0000 or Z + var matchShortOffset = /Z|[+-]\d\d(?::?\d\d)?/gi; // +00 -00 +00:00 -00:00 +0000 -0000 or Z var matchTimestamp = /[+-]?\d+(\.\d{1,3})?/; // 123456789 123456789.123 // any word (or two) characters or numbers including two/three word month in arabic. + // includes scottish gaelic two word and hyphenated months var matchWord = /[0-9]*['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+|[\u0600-\u06FF\/]+(\s*?[\u0600-\u06FF]+){1,2}/i; + var regexes = {}; function addRegexToken (token, regex, strictRegex) { - regexes[token] = typeof regex === 'function' ? regex : function (isStrict) { + regexes[token] = isFunction(regex) ? regex : function (isStrict, localeData) { return (isStrict && strictRegex) ? strictRegex : regex; }; } @@ -5292,9 +2142,13 @@ return /******/ (function(modules) { // webpackBootstrap // Code from http://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript function unescapeFormat(s) { - return s.replace('\\', '').replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g, function (matched, p1, p2, p3, p4) { + return regexEscape(s.replace('\\', '').replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g, function (matched, p1, p2, p3, p4) { return p1 || p2 || p3 || p4; - }).replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'); + })); + } + + function regexEscape(s) { + return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'); } var tokens = {}; @@ -5334,6 +2188,8 @@ return /******/ (function(modules) { // webpackBootstrap var MINUTE = 4; var SECOND = 5; var MILLISECOND = 6; + var WEEK = 7; + var WEEKDAY = 8; function daysInMonth(year, month) { return new Date(Date.UTC(year, month + 1, 0)).getUTCDate(); @@ -5361,8 +2217,12 @@ return /******/ (function(modules) { // webpackBootstrap addRegexToken('M', match1to2); addRegexToken('MM', match1to2, match2); - addRegexToken('MMM', matchWord); - addRegexToken('MMMM', matchWord); + addRegexToken('MMM', function (isStrict, locale) { + return locale.monthsShortRegex(isStrict); + }); + addRegexToken('MMMM', function (isStrict, locale) { + return locale.monthsRegex(isStrict); + }); addParseToken(['M', 'MM'], function (input, array) { array[MONTH] = toInt(input) - 1; @@ -5380,14 +2240,17 @@ return /******/ (function(modules) { // webpackBootstrap // LOCALES + var MONTHS_IN_FORMAT = /D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/; var defaultLocaleMonths = 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'); - function localeMonths (m) { - return this._months[m.month()]; + function localeMonths (m, format) { + return isArray(this._months) ? this._months[m.month()] : + this._months[MONTHS_IN_FORMAT.test(format) ? 'format' : 'standalone'][m.month()]; } var defaultLocaleMonthsShort = 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'); - function localeMonthsShort (m) { - return this._monthsShort[m.month()]; + function localeMonthsShort (m, format) { + return isArray(this._monthsShort) ? this._monthsShort[m.month()] : + this._monthsShort[MONTHS_IN_FORMAT.test(format) ? 'format' : 'standalone'][m.month()]; } function localeMonthsParse (monthName, format, strict) { @@ -5426,6 +2289,11 @@ return /******/ (function(modules) { // webpackBootstrap function setMonth (mom, value) { var dayOfMonth; + if (!mom.isValid()) { + // No op + return mom; + } + // TODO: Move this out of here! if (typeof value === 'string') { value = mom.localeData().monthsParse(value); @@ -5454,6 +2322,72 @@ return /******/ (function(modules) { // webpackBootstrap return daysInMonth(this.year(), this.month()); } + var defaultMonthsShortRegex = matchWord; + function monthsShortRegex (isStrict) { + if (this._monthsParseExact) { + if (!hasOwnProp(this, '_monthsRegex')) { + computeMonthsParse.call(this); + } + if (isStrict) { + return this._monthsShortStrictRegex; + } else { + return this._monthsShortRegex; + } + } else { + return this._monthsShortStrictRegex && isStrict ? + this._monthsShortStrictRegex : this._monthsShortRegex; + } + } + + var defaultMonthsRegex = matchWord; + function monthsRegex (isStrict) { + if (this._monthsParseExact) { + if (!hasOwnProp(this, '_monthsRegex')) { + computeMonthsParse.call(this); + } + if (isStrict) { + return this._monthsStrictRegex; + } else { + return this._monthsRegex; + } + } else { + return this._monthsStrictRegex && isStrict ? + this._monthsStrictRegex : this._monthsRegex; + } + } + + function computeMonthsParse () { + function cmpLenRev(a, b) { + return b.length - a.length; + } + + var shortPieces = [], longPieces = [], mixedPieces = [], + i, mom; + for (i = 0; i < 12; i++) { + // make the regex if we don't have it already + mom = create_utc__createUTC([2000, i]); + shortPieces.push(this.monthsShort(mom, '')); + longPieces.push(this.months(mom, '')); + mixedPieces.push(this.months(mom, '')); + mixedPieces.push(this.monthsShort(mom, '')); + } + // Sorting makes sure if one month (or abbr) is a prefix of another it + // will match the longer piece. + shortPieces.sort(cmpLenRev); + longPieces.sort(cmpLenRev); + mixedPieces.sort(cmpLenRev); + for (i = 0; i < 12; i++) { + shortPieces[i] = regexEscape(shortPieces[i]); + longPieces[i] = regexEscape(longPieces[i]); + mixedPieces[i] = regexEscape(mixedPieces[i]); + } + + this._monthsRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i'); + this._monthsShortRegex = this._monthsRegex; + this._monthsStrictRegex = new RegExp('^(' + longPieces.join('|') + ')$', 'i'); + this._monthsShortStrictRegex = new RegExp('^(' + shortPieces.join('|') + ')$', 'i'); + } + function checkOverflow (m) { var overflow; var a = m._a; @@ -5471,6 +2405,12 @@ return /******/ (function(modules) { // webpackBootstrap if (getParsingFlags(m)._overflowDayOfYear && (overflow < YEAR || overflow > DATE)) { overflow = DATE; } + if (getParsingFlags(m)._overflowWeeks && overflow === -1) { + overflow = WEEK; + } + if (getParsingFlags(m)._overflowWeekday && overflow === -1) { + overflow = WEEKDAY; + } getParsingFlags(m).overflow = overflow; } @@ -5479,18 +2419,18 @@ return /******/ (function(modules) { // webpackBootstrap } function warn(msg) { - if (utils_hooks__hooks.suppressDeprecationWarnings === false && typeof console !== 'undefined' && console.warn) { + if (utils_hooks__hooks.suppressDeprecationWarnings === false && + (typeof console !== 'undefined') && console.warn) { console.warn('Deprecation warning: ' + msg); } } function deprecate(msg, fn) { - var firstTime = true, - msgWithStack = msg + '\n' + (new Error()).stack; + var firstTime = true; return extend(function () { if (firstTime) { - warn(msgWithStack); + warn(msg + '\nArguments: ' + Array.prototype.slice.call(arguments).join(', ') + '\n' + (new Error()).stack); firstTime = false; } return fn.apply(this, arguments); @@ -5508,22 +2448,39 @@ return /******/ (function(modules) { // webpackBootstrap utils_hooks__hooks.suppressDeprecationWarnings = false; - var from_string__isoRegex = /^\s*(?:[+-]\d{6}|\d{4})-(?:(\d\d-\d\d)|(W\d\d$)|(W\d\d-\d)|(\d\d\d))((T| )(\d\d(:\d\d(:\d\d(\.\d+)?)?)?)?([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/; + // iso 8601 regex + // 0000-00-00 0000-W00 or 0000-W00-0 + T + 00 or 00:00 or 00:00:00 or 00:00:00.000 + +00:00 or +0000 or +00) + var extendedIsoRegex = /^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?/; + var basicIsoRegex = /^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?/; + + var tzRegex = /Z|[+-]\d\d(?::?\d\d)?/; var isoDates = [ - ['YYYYYY-MM-DD', /[+-]\d{6}-\d{2}-\d{2}/], - ['YYYY-MM-DD', /\d{4}-\d{2}-\d{2}/], - ['GGGG-[W]WW-E', /\d{4}-W\d{2}-\d/], - ['GGGG-[W]WW', /\d{4}-W\d{2}/], - ['YYYY-DDD', /\d{4}-\d{3}/] + ['YYYYYY-MM-DD', /[+-]\d{6}-\d\d-\d\d/], + ['YYYY-MM-DD', /\d{4}-\d\d-\d\d/], + ['GGGG-[W]WW-E', /\d{4}-W\d\d-\d/], + ['GGGG-[W]WW', /\d{4}-W\d\d/, false], + ['YYYY-DDD', /\d{4}-\d{3}/], + ['YYYY-MM', /\d{4}-\d\d/, false], + ['YYYYYYMMDD', /[+-]\d{10}/], + ['YYYYMMDD', /\d{8}/], + // YYYYMM is NOT allowed by the standard + ['GGGG[W]WWE', /\d{4}W\d{3}/], + ['GGGG[W]WW', /\d{4}W\d{2}/, false], + ['YYYYDDD', /\d{7}/] ]; // iso time formats and regexes var isoTimes = [ - ['HH:mm:ss.SSSS', /(T| )\d\d:\d\d:\d\d\.\d+/], - ['HH:mm:ss', /(T| )\d\d:\d\d:\d\d/], - ['HH:mm', /(T| )\d\d:\d\d/], - ['HH', /(T| )\d\d/] + ['HH:mm:ss.SSSS', /\d\d:\d\d:\d\d\.\d+/], + ['HH:mm:ss,SSSS', /\d\d:\d\d:\d\d,\d+/], + ['HH:mm:ss', /\d\d:\d\d:\d\d/], + ['HH:mm', /\d\d:\d\d/], + ['HHmmss.SSSS', /\d\d\d\d\d\d\.\d+/], + ['HHmmss,SSSS', /\d\d\d\d\d\d,\d+/], + ['HHmmss', /\d\d\d\d\d\d/], + ['HHmm', /\d\d\d\d/], + ['HH', /\d\d/] ]; var aspNetJsonRegex = /^\/?Date\((\-?\d+)/i; @@ -5532,26 +2489,49 @@ return /******/ (function(modules) { // webpackBootstrap function configFromISO(config) { var i, l, string = config._i, - match = from_string__isoRegex.exec(string); + match = extendedIsoRegex.exec(string) || basicIsoRegex.exec(string), + allowTime, dateFormat, timeFormat, tzFormat; if (match) { getParsingFlags(config).iso = true; + for (i = 0, l = isoDates.length; i < l; i++) { - if (isoDates[i][1].exec(string)) { - // match[5] should be 'T' or undefined - config._f = isoDates[i][0] + (match[6] || ' '); + if (isoDates[i][1].exec(match[1])) { + dateFormat = isoDates[i][0]; + allowTime = isoDates[i][2] !== false; break; } } - for (i = 0, l = isoTimes.length; i < l; i++) { - if (isoTimes[i][1].exec(string)) { - config._f += isoTimes[i][0]; - break; + if (dateFormat == null) { + config._isValid = false; + return; + } + if (match[3]) { + for (i = 0, l = isoTimes.length; i < l; i++) { + if (isoTimes[i][1].exec(match[3])) { + // match[2] should be 'T' or space + timeFormat = (match[2] || ' ') + isoTimes[i][0]; + break; + } + } + if (timeFormat == null) { + config._isValid = false; + return; } } - if (string.match(matchOffset)) { - config._f += 'Z'; + if (!allowTime && timeFormat != null) { + config._isValid = false; + return; } + if (match[4]) { + if (tzRegex.exec(match[4])) { + tzFormat = 'Z'; + } else { + config._isValid = false; + return; + } + } + config._f = dateFormat + (timeFormat || '') + (tzFormat || ''); configFromStringAndFormat(config); } else { config._isValid = false; @@ -5589,8 +2569,8 @@ return /******/ (function(modules) { // webpackBootstrap //http://stackoverflow.com/questions/181348/instantiating-a-javascript-object-by-calling-prototype-constructor-apply var date = new Date(y, m, d, h, M, s, ms); - //the date constructor doesn't accept years < 1970 - if (y < 1970) { + //the date constructor remaps years 0-99 to 1900-1999 + if (y < 100 && y >= 0 && isFinite(date.getFullYear())) { date.setFullYear(y); } return date; @@ -5598,12 +2578,21 @@ return /******/ (function(modules) { // webpackBootstrap function createUTCDate (y) { var date = new Date(Date.UTC.apply(null, arguments)); - if (y < 1970) { + + //the Date.UTC function remaps years 0-99 to 1900-1999 + if (y < 100 && y >= 0 && isFinite(date.getUTCFullYear())) { date.setUTCFullYear(y); } return date; } + // FORMATTING + + addFormatToken('Y', 0, 0, function () { + var y = this.year(); + return y <= 9999 ? '' + y : '+' + y; + }); + addFormatToken(0, ['YY', 2], 0, function () { return this.year() % 100; }); @@ -5624,10 +2613,16 @@ return /******/ (function(modules) { // webpackBootstrap addRegexToken('YYYYY', match1to6, match6); addRegexToken('YYYYYY', match1to6, match6); - addParseToken(['YYYY', 'YYYYY', 'YYYYYY'], YEAR); + addParseToken(['YYYYY', 'YYYYYY'], YEAR); + addParseToken('YYYY', function (input, array) { + array[YEAR] = input.length === 2 ? utils_hooks__hooks.parseTwoDigitYear(input) : toInt(input); + }); addParseToken('YY', function (input, array) { array[YEAR] = utils_hooks__hooks.parseTwoDigitYear(input); }); + addParseToken('Y', function (input, array) { + array[YEAR] = parseInt(input, 10); + }); // HELPERS @@ -5653,124 +2648,66 @@ return /******/ (function(modules) { // webpackBootstrap return isLeapYear(this.year()); } - addFormatToken('w', ['ww', 2], 'wo', 'week'); - addFormatToken('W', ['WW', 2], 'Wo', 'isoWeek'); + // start-of-first-week - start-of-year + function firstWeekOffset(year, dow, doy) { + var // first-week day -- which january is always in the first week (4 for iso, 1 for other) + fwd = 7 + dow - doy, + // first-week day local weekday -- which local weekday is fwd + fwdlw = (7 + createUTCDate(year, 0, fwd).getUTCDay() - dow) % 7; - // ALIASES - - addUnitAlias('week', 'w'); - addUnitAlias('isoWeek', 'W'); - - // PARSING - - addRegexToken('w', match1to2); - addRegexToken('ww', match1to2, match2); - addRegexToken('W', match1to2); - addRegexToken('WW', match1to2, match2); - - addWeekParseToken(['w', 'ww', 'W', 'WW'], function (input, week, config, token) { - week[token.substr(0, 1)] = toInt(input); - }); - - // HELPERS - - // firstDayOfWeek 0 = sun, 6 = sat - // the day of the week that starts the week - // (usually sunday or monday) - // firstDayOfWeekOfYear 0 = sun, 6 = sat - // the first week is the week that contains the first - // of this day of the week - // (eg. ISO weeks use thursday (4)) - function weekOfYear(mom, firstDayOfWeek, firstDayOfWeekOfYear) { - var end = firstDayOfWeekOfYear - firstDayOfWeek, - daysToDayOfWeek = firstDayOfWeekOfYear - mom.day(), - adjustedMoment; - - - if (daysToDayOfWeek > end) { - daysToDayOfWeek -= 7; - } - - if (daysToDayOfWeek < end - 7) { - daysToDayOfWeek += 7; - } - - adjustedMoment = local__createLocal(mom).add(daysToDayOfWeek, 'd'); - return { - week: Math.ceil(adjustedMoment.dayOfYear() / 7), - year: adjustedMoment.year() - }; + return -fwdlw + fwd - 1; } - // LOCALES - - function localeWeek (mom) { - return weekOfYear(mom, this._week.dow, this._week.doy).week; - } - - var defaultLocaleWeek = { - dow : 0, // Sunday is the first day of the week. - doy : 6 // The week that contains Jan 1st is the first week of the year. - }; - - function localeFirstDayOfWeek () { - return this._week.dow; - } - - function localeFirstDayOfYear () { - return this._week.doy; - } - - // MOMENTS - - function getSetWeek (input) { - var week = this.localeData().week(this); - return input == null ? week : this.add((input - week) * 7, 'd'); - } - - function getSetISOWeek (input) { - var week = weekOfYear(this, 1, 4).week; - return input == null ? week : this.add((input - week) * 7, 'd'); - } - - addFormatToken('DDD', ['DDDD', 3], 'DDDo', 'dayOfYear'); - - // ALIASES - - addUnitAlias('dayOfYear', 'DDD'); - - // PARSING - - addRegexToken('DDD', match1to3); - addRegexToken('DDDD', match3); - addParseToken(['DDD', 'DDDD'], function (input, array, config) { - config._dayOfYear = toInt(input); - }); - - // HELPERS - //http://en.wikipedia.org/wiki/ISO_week_date#Calculating_a_date_given_the_year.2C_week_number_and_weekday - function dayOfYearFromWeeks(year, week, weekday, firstDayOfWeekOfYear, firstDayOfWeek) { - var d = createUTCDate(year, 0, 1).getUTCDay(); - var daysToAdd; - var dayOfYear; + function dayOfYearFromWeeks(year, week, weekday, dow, doy) { + var localWeekday = (7 + weekday - dow) % 7, + weekOffset = firstWeekOffset(year, dow, doy), + dayOfYear = 1 + 7 * (week - 1) + localWeekday + weekOffset, + resYear, resDayOfYear; - d = d === 0 ? 7 : d; - weekday = weekday != null ? weekday : firstDayOfWeek; - daysToAdd = firstDayOfWeek - d + (d > firstDayOfWeekOfYear ? 7 : 0) - (d < firstDayOfWeek ? 7 : 0); - dayOfYear = 7 * (week - 1) + (weekday - firstDayOfWeek) + daysToAdd + 1; + if (dayOfYear <= 0) { + resYear = year - 1; + resDayOfYear = daysInYear(resYear) + dayOfYear; + } else if (dayOfYear > daysInYear(year)) { + resYear = year + 1; + resDayOfYear = dayOfYear - daysInYear(year); + } else { + resYear = year; + resDayOfYear = dayOfYear; + } return { - year : dayOfYear > 0 ? year : year - 1, - dayOfYear : dayOfYear > 0 ? dayOfYear : daysInYear(year - 1) + dayOfYear + year: resYear, + dayOfYear: resDayOfYear }; } - // MOMENTS + function weekOfYear(mom, dow, doy) { + var weekOffset = firstWeekOffset(mom.year(), dow, doy), + week = Math.floor((mom.dayOfYear() - weekOffset - 1) / 7) + 1, + resWeek, resYear; - function getSetDayOfYear (input) { - var dayOfYear = Math.round((this.clone().startOf('day') - this.clone().startOf('year')) / 864e5) + 1; - return input == null ? dayOfYear : this.add((input - dayOfYear), 'd'); + if (week < 1) { + resYear = mom.year() - 1; + resWeek = week + weeksInYear(resYear, dow, doy); + } else if (week > weeksInYear(mom.year(), dow, doy)) { + resWeek = week - weeksInYear(mom.year(), dow, doy); + resYear = mom.year() + 1; + } else { + resYear = mom.year(); + resWeek = week; + } + + return { + week: resWeek, + year: resYear + }; + } + + function weeksInYear(year, dow, doy) { + var weekOffset = firstWeekOffset(year, dow, doy), + weekOffsetNext = firstWeekOffset(year + 1, dow, doy); + return (daysInYear(year) - weekOffset + weekOffsetNext) / 7; } // Pick the first defined of two or three arguments. @@ -5785,11 +2722,12 @@ return /******/ (function(modules) { // webpackBootstrap } function currentDateArray(config) { - var now = new Date(); + // hooks is actually the exported moment object + var nowValue = new Date(utils_hooks__hooks.now()); if (config._useUTC) { - return [now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate()]; + return [nowValue.getUTCFullYear(), nowValue.getUTCMonth(), nowValue.getUTCDate()]; } - return [now.getFullYear(), now.getMonth(), now.getDate()]; + return [nowValue.getFullYear(), nowValue.getMonth(), nowValue.getDate()]; } // convert an array to a date. @@ -5859,7 +2797,7 @@ return /******/ (function(modules) { // webpackBootstrap } function dayOfYearFromWeekInfo(config) { - var w, weekYear, week, weekday, dow, doy, temp; + var w, weekYear, week, weekday, dow, doy, temp, weekdayOverflow; w = config._w; if (w.GG != null || w.W != null || w.E != null) { @@ -5873,6 +2811,9 @@ return /******/ (function(modules) { // webpackBootstrap weekYear = defaults(w.GG, config._a[YEAR], weekOfYear(local__createLocal(), 1, 4).year); week = defaults(w.W, 1); weekday = defaults(w.E, 1); + if (weekday < 1 || weekday > 7) { + weekdayOverflow = true; + } } else { dow = config._locale._week.dow; doy = config._locale._week.doy; @@ -5883,23 +2824,32 @@ return /******/ (function(modules) { // webpackBootstrap if (w.d != null) { // weekday -- low day numbers are considered next week weekday = w.d; - if (weekday < dow) { - ++week; + if (weekday < 0 || weekday > 6) { + weekdayOverflow = true; } } else if (w.e != null) { // local weekday -- counting starts from begining of week weekday = w.e + dow; + if (w.e < 0 || w.e > 6) { + weekdayOverflow = true; + } } else { // default to begining of week weekday = dow; } } - temp = dayOfYearFromWeeks(weekYear, week, weekday, doy, dow); - - config._a[YEAR] = temp.year; - config._dayOfYear = temp.dayOfYear; + if (week < 1 || week > weeksInYear(weekYear, dow, doy)) { + getParsingFlags(config)._overflowWeeks = true; + } else if (weekdayOverflow != null) { + getParsingFlags(config)._overflowWeekday = true; + } else { + temp = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy); + config._a[YEAR] = temp.year; + config._dayOfYear = temp.dayOfYear; + } } + // constant that refers to the ISO standard utils_hooks__hooks.ISO_8601 = function () {}; // date from string and format string @@ -5924,6 +2874,8 @@ return /******/ (function(modules) { // webpackBootstrap for (i = 0; i < tokens.length; i++) { token = tokens[i]; parsedInput = (string.match(getParseRegexForToken(token, config)) || [])[0]; + // console.log('token', token, 'parsedInput', parsedInput, + // 'regex', getParseRegexForToken(token, config)); if (parsedInput) { skipped = string.substr(0, string.indexOf(parsedInput)); if (skipped.length > 0) { @@ -5992,6 +2944,7 @@ return /******/ (function(modules) { // webpackBootstrap } } + // date from string and array of format strings function configFromStringAndArray(config) { var tempConfig, bestMoment, @@ -6042,15 +2995,27 @@ return /******/ (function(modules) { // webpackBootstrap } var i = normalizeObjectUnits(config._i); - config._a = [i.year, i.month, i.day || i.date, i.hour, i.minute, i.second, i.millisecond]; + config._a = map([i.year, i.month, i.day || i.date, i.hour, i.minute, i.second, i.millisecond], function (obj) { + return obj && parseInt(obj, 10); + }); configFromArray(config); } function createFromConfig (config) { + var res = new Moment(checkOverflow(prepareConfig(config))); + if (res._nextDay) { + // Adding is smart enough around DST + res.add(1, 'd'); + res._nextDay = undefined; + } + + return res; + } + + function prepareConfig (config) { var input = config._i, - format = config._f, - res; + format = config._f; config._locale = config._locale || locale_locales__getLocale(config._l); @@ -6074,20 +3039,17 @@ return /******/ (function(modules) { // webpackBootstrap configFromInput(config); } - res = new Moment(checkOverflow(config)); - if (res._nextDay) { - // Adding is smart enough around DST - res.add(1, 'd'); - res._nextDay = undefined; + if (!valid__isValid(config)) { + config._d = null; } - return res; + return config; } function configFromInput(config) { var input = config._i; if (input === undefined) { - config._d = new Date(); + config._d = new Date(utils_hooks__hooks.now()); } else if (isDate(input)) { config._d = new Date(+input); } else if (typeof input === 'string') { @@ -6134,7 +3096,11 @@ return /******/ (function(modules) { // webpackBootstrap 'moment().min is deprecated, use moment.min instead. https://github.com/moment/moment/issues/1548', function () { var other = local__createLocal.apply(null, arguments); - return other < this ? this : other; + if (this.isValid() && other.isValid()) { + return other < this ? this : other; + } else { + return valid__createInvalid(); + } } ); @@ -6142,7 +3108,11 @@ return /******/ (function(modules) { // webpackBootstrap 'moment().max is deprecated, use moment.max instead. https://github.com/moment/moment/issues/1548', function () { var other = local__createLocal.apply(null, arguments); - return other > this ? this : other; + if (this.isValid() && other.isValid()) { + return other > this ? this : other; + } else { + return valid__createInvalid(); + } } ); @@ -6161,7 +3131,7 @@ return /******/ (function(modules) { // webpackBootstrap } res = moments[0]; for (i = 1; i < moments.length; ++i) { - if (moments[i][fn](res)) { + if (!moments[i].isValid() || moments[i][fn](res)) { res = moments[i]; } } @@ -6181,6 +3151,10 @@ return /******/ (function(modules) { // webpackBootstrap return pickBy('isAfter', args); } + var now = function () { + return Date.now ? Date.now() : +(new Date()); + }; + function Duration (duration) { var normalizedInput = normalizeObjectUnits(duration), years = normalizedInput.year || 0, @@ -6220,6 +3194,8 @@ return /******/ (function(modules) { // webpackBootstrap return obj instanceof Duration; } + // FORMATTING + function offset (token, separator) { addFormatToken(token, 0, 0, function () { var offset = this.utcOffset(); @@ -6237,11 +3213,11 @@ return /******/ (function(modules) { // webpackBootstrap // PARSING - addRegexToken('Z', matchOffset); - addRegexToken('ZZ', matchOffset); + addRegexToken('Z', matchShortOffset); + addRegexToken('ZZ', matchShortOffset); addParseToken(['Z', 'ZZ'], function (input, array, config) { config._useUTC = true; - config._tzm = offsetFromString(input); + config._tzm = offsetFromString(matchShortOffset, input); }); // HELPERS @@ -6251,8 +3227,8 @@ return /******/ (function(modules) { // webpackBootstrap // '-1530' > ['-15', '30'] var chunkOffset = /([\+\-]|\d\d)/gi; - function offsetFromString(string) { - var matches = ((string || '').match(matchOffset) || []); + function offsetFromString(matcher, string) { + var matches = ((string || '').match(matcher) || []); var chunk = matches[matches.length - 1] || []; var parts = (chunk + '').match(chunkOffset) || ['-', 0, 0]; var minutes = +(parts[1] * 60) + toInt(parts[2]); @@ -6273,7 +3249,6 @@ return /******/ (function(modules) { // webpackBootstrap } else { return local__createLocal(input).local(); } - return model._isUTC ? local__createLocal(input).zone(model._offset || 0) : local__createLocal(input).local(); } function getDateOffset (m) { @@ -6303,11 +3278,13 @@ return /******/ (function(modules) { // webpackBootstrap function getSetOffset (input, keepLocalTime) { var offset = this._offset || 0, localAdjust; + if (!this.isValid()) { + return input != null ? this : NaN; + } if (input != null) { if (typeof input === 'string') { - input = offsetFromString(input); - } - if (Math.abs(input) < 16) { + input = offsetFromString(matchShortOffset, input); + } else if (Math.abs(input) < 16) { input = input * 60; } if (!this._isUTC && keepLocalTime) { @@ -6367,18 +3344,16 @@ return /******/ (function(modules) { // webpackBootstrap if (this._tzm) { this.utcOffset(this._tzm); } else if (typeof this._i === 'string') { - this.utcOffset(offsetFromString(this._i)); + this.utcOffset(offsetFromString(matchOffset, this._i)); } return this; } function hasAlignedHourOffset (input) { - if (!input) { - input = 0; - } - else { - input = local__createLocal(input).utcOffset(); + if (!this.isValid()) { + return false; } + input = input ? local__createLocal(input).utcOffset() : 0; return (this.utcOffset() - input) % 60 === 0; } @@ -6391,31 +3366,44 @@ return /******/ (function(modules) { // webpackBootstrap } function isDaylightSavingTimeShifted () { - if (this._a) { - var other = this._isUTC ? create_utc__createUTC(this._a) : local__createLocal(this._a); - return this.isValid() && compareArrays(this._a, other.toArray()) > 0; + if (!isUndefined(this._isDSTShifted)) { + return this._isDSTShifted; } - return false; + var c = {}; + + copyConfig(c, this); + c = prepareConfig(c); + + if (c._a) { + var other = c._isUTC ? create_utc__createUTC(c._a) : local__createLocal(c._a); + this._isDSTShifted = this.isValid() && + compareArrays(c._a, other.toArray()) > 0; + } else { + this._isDSTShifted = false; + } + + return this._isDSTShifted; } function isLocal () { - return !this._isUTC; + return this.isValid() ? !this._isUTC : false; } function isUtcOffset () { - return this._isUTC; + return this.isValid() ? this._isUTC : false; } function isUtc () { - return this._isUTC && this._offset === 0; + return this.isValid() ? this._isUTC && this._offset === 0 : false; } - var aspNetRegex = /(\-)?(?:(\d*)\.)?(\d+)\:(\d+)(?:\:(\d+)\.?(\d{3})?)?/; + // ASP.NET json date format regex + var aspNetRegex = /^(\-)?(?:(\d*)[. ])?(\d+)\:(\d+)(?:\:(\d+)\.?(\d{3})?\d*)?$/; // from http://docs.closure-library.googlecode.com/git/closure_goog_date_date.js.source.html // somewhat more in line with 4.4.3.2 2004 spec, but allows decimal anywhere - var create__isoRegex = /^(-)?P(?:(?:([0-9,.]*)Y)?(?:([0-9,.]*)M)?(?:([0-9,.]*)D)?(?:T(?:([0-9,.]*)H)?(?:([0-9,.]*)M)?(?:([0-9,.]*)S)?)?|([0-9,.]*)W)$/; + var isoRegex = /^(-)?P(?:(?:([0-9,.]*)Y)?(?:([0-9,.]*)M)?(?:([0-9,.]*)D)?(?:T(?:([0-9,.]*)H)?(?:([0-9,.]*)M)?(?:([0-9,.]*)S)?)?|([0-9,.]*)W)$/; function create__createDuration (input, key) { var duration = input, @@ -6448,7 +3436,7 @@ return /******/ (function(modules) { // webpackBootstrap s : toInt(match[SECOND]) * sign, ms : toInt(match[MILLISECOND]) * sign }; - } else if (!!(match = create__isoRegex.exec(input))) { + } else if (!!(match = isoRegex.exec(input))) { sign = (match[1] === '-') ? -1 : 1; duration = { y : parseIso(match[2], sign), @@ -6505,6 +3493,10 @@ return /******/ (function(modules) { // webpackBootstrap function momentsDifference(base, other) { var res; + if (!(base.isValid() && other.isValid())) { + return {milliseconds: 0, months: 0}; + } + other = cloneWithOffset(other, base); if (base.isBefore(other)) { res = positiveMomentsDifference(base, other); @@ -6517,6 +3509,7 @@ return /******/ (function(modules) { // webpackBootstrap return res; } + // TODO: remove 'name' arg after deprecation is removed function createAdder(direction, name) { return function (val, period) { var dur, tmp; @@ -6537,6 +3530,12 @@ return /******/ (function(modules) { // webpackBootstrap var milliseconds = duration._milliseconds, days = duration._days, months = duration._months; + + if (!mom.isValid()) { + // No op + return; + } + updateOffset = updateOffset == null ? true : updateOffset; if (milliseconds) { @@ -6556,7 +3555,7 @@ return /******/ (function(modules) { // webpackBootstrap var add_subtract__add = createAdder(1, 'add'); var add_subtract__subtract = createAdder(-1, 'subtract'); - function moment_calendar__calendar (time) { + function moment_calendar__calendar (time, formats) { // We want to compare the start of today, vs this. // Getting start-of-today depends on whether we're local/utc/offset or not. var now = time || local__createLocal(), @@ -6568,7 +3567,10 @@ return /******/ (function(modules) { // webpackBootstrap diff < 1 ? 'sameDay' : diff < 2 ? 'nextDay' : diff < 7 ? 'nextWeek' : 'sameElse'; - return this.format(this.localeData().calendar(format, this, local__createLocal(now))); + + var output = formats && (isFunction(formats[format]) ? formats[format]() : formats[format]); + + return this.format(output || this.localeData().calendar(format, this, local__createLocal(now))); } function clone () { @@ -6576,26 +3578,28 @@ return /******/ (function(modules) { // webpackBootstrap } function isAfter (input, units) { - var inputMs; - units = normalizeUnits(typeof units !== 'undefined' ? units : 'millisecond'); + var localInput = isMoment(input) ? input : local__createLocal(input); + if (!(this.isValid() && localInput.isValid())) { + return false; + } + units = normalizeUnits(!isUndefined(units) ? units : 'millisecond'); if (units === 'millisecond') { - input = isMoment(input) ? input : local__createLocal(input); - return +this > +input; + return +this > +localInput; } else { - inputMs = isMoment(input) ? +input : +local__createLocal(input); - return inputMs < +this.clone().startOf(units); + return +localInput < +this.clone().startOf(units); } } function isBefore (input, units) { - var inputMs; - units = normalizeUnits(typeof units !== 'undefined' ? units : 'millisecond'); + var localInput = isMoment(input) ? input : local__createLocal(input); + if (!(this.isValid() && localInput.isValid())) { + return false; + } + units = normalizeUnits(!isUndefined(units) ? units : 'millisecond'); if (units === 'millisecond') { - input = isMoment(input) ? input : local__createLocal(input); - return +this < +input; + return +this < +localInput; } else { - inputMs = isMoment(input) ? +input : +local__createLocal(input); - return +this.clone().endOf(units) < inputMs; + return +this.clone().endOf(units) < +localInput; } } @@ -6604,30 +3608,45 @@ return /******/ (function(modules) { // webpackBootstrap } function isSame (input, units) { - var inputMs; + var localInput = isMoment(input) ? input : local__createLocal(input), + inputMs; + if (!(this.isValid() && localInput.isValid())) { + return false; + } units = normalizeUnits(units || 'millisecond'); if (units === 'millisecond') { - input = isMoment(input) ? input : local__createLocal(input); - return +this === +input; + return +this === +localInput; } else { - inputMs = +local__createLocal(input); + inputMs = +localInput; return +(this.clone().startOf(units)) <= inputMs && inputMs <= +(this.clone().endOf(units)); } } - function absFloor (number) { - if (number < 0) { - return Math.ceil(number); - } else { - return Math.floor(number); - } + function isSameOrAfter (input, units) { + return this.isSame(input, units) || this.isAfter(input,units); + } + + function isSameOrBefore (input, units) { + return this.isSame(input, units) || this.isBefore(input,units); } function diff (input, units, asFloat) { - var that = cloneWithOffset(input, this), - zoneDelta = (that.utcOffset() - this.utcOffset()) * 6e4, + var that, + zoneDelta, delta, output; + if (!this.isValid()) { + return NaN; + } + + that = cloneWithOffset(input, this); + + if (!that.isValid()) { + return NaN; + } + + zoneDelta = (that.utcOffset() - this.utcOffset()) * 6e4; + units = normalizeUnits(units); if (units === 'year' || units === 'month' || units === 'quarter') { @@ -6678,7 +3697,7 @@ return /******/ (function(modules) { // webpackBootstrap function moment_format__toISOString () { var m = this.clone().utc(); if (0 < m.year() && m.year() <= 9999) { - if ('function' === typeof Date.prototype.toISOString) { + if (isFunction(Date.prototype.toISOString)) { // native implementation is ~50x faster, use it when we can return this.toDate().toISOString(); } else { @@ -6695,10 +3714,13 @@ return /******/ (function(modules) { // webpackBootstrap } function from (time, withoutSuffix) { - if (!this.isValid()) { + if (this.isValid() && + ((isMoment(time) && time.isValid()) || + local__createLocal(time).isValid())) { + return create__createDuration({to: this, from: time}).locale(this.locale()).humanize(!withoutSuffix); + } else { return this.localeData().invalidDate(); } - return create__createDuration({to: this, from: time}).locale(this.locale()).humanize(!withoutSuffix); } function fromNow (withoutSuffix) { @@ -6706,16 +3728,22 @@ return /******/ (function(modules) { // webpackBootstrap } function to (time, withoutSuffix) { - if (!this.isValid()) { + if (this.isValid() && + ((isMoment(time) && time.isValid()) || + local__createLocal(time).isValid())) { + return create__createDuration({from: this, to: time}).locale(this.locale()).humanize(!withoutSuffix); + } else { return this.localeData().invalidDate(); } - return create__createDuration({from: this, to: time}).locale(this.locale()).humanize(!withoutSuffix); } function toNow (withoutSuffix) { return this.to(local__createLocal(), withoutSuffix); } + // If passed a locale key, it will set the locale for this + // instance. Otherwise, it will return the locale configuration + // variables for this instance. function locale (key) { var newLocaleData; @@ -6813,6 +3841,24 @@ return /******/ (function(modules) { // webpackBootstrap return [m.year(), m.month(), m.date(), m.hour(), m.minute(), m.second(), m.millisecond()]; } + function toObject () { + var m = this; + return { + years: m.year(), + months: m.month(), + date: m.date(), + hours: m.hours(), + minutes: m.minutes(), + seconds: m.seconds(), + milliseconds: m.milliseconds() + }; + } + + function toJSON () { + // JSON.stringify(new Date(NaN)) === 'null' + return this.isValid() ? this.toISOString() : 'null'; + } + function moment_valid__isValid () { return valid__isValid(this); } @@ -6825,6 +3871,18 @@ return /******/ (function(modules) { // webpackBootstrap return getParsingFlags(this).overflow; } + function creationData() { + return { + input: this._i, + format: this._f, + locale: this._locale, + isUTC: this._isUTC, + strict: this._strict + }; + } + + // FORMATTING + addFormatToken(0, ['gg', 2], 0, function () { return this.weekYear() % 100; }); @@ -6866,22 +3924,20 @@ return /******/ (function(modules) { // webpackBootstrap week[token] = utils_hooks__hooks.parseTwoDigitYear(input); }); - // HELPERS - - function weeksInYear(year, dow, doy) { - return weekOfYear(local__createLocal([year, 11, 31 + dow - doy]), dow, doy).week; - } - // MOMENTS function getSetWeekYear (input) { - var year = weekOfYear(this, this.localeData()._week.dow, this.localeData()._week.doy).year; - return input == null ? year : this.add((input - year), 'y'); + return getSetWeekYearHelper.call(this, + input, + this.week(), + this.weekday(), + this.localeData()._week.dow, + this.localeData()._week.doy); } function getSetISOWeekYear (input) { - var year = weekOfYear(this, 1, 4).year; - return input == null ? year : this.add((input - year), 'y'); + return getSetWeekYearHelper.call(this, + input, this.isoWeek(), this.isoWeekday(), 1, 4); } function getISOWeeksInYear () { @@ -6893,7 +3949,33 @@ return /******/ (function(modules) { // webpackBootstrap return weeksInYear(this.year(), weekInfo.dow, weekInfo.doy); } - addFormatToken('Q', 0, 0, 'quarter'); + function getSetWeekYearHelper(input, week, weekday, dow, doy) { + var weeksTarget; + if (input == null) { + return weekOfYear(this, dow, doy).year; + } else { + weeksTarget = weeksInYear(input, dow, doy); + if (week > weeksTarget) { + week = weeksTarget; + } + return setWeekAll.call(this, input, week, weekday, dow, doy); + } + } + + function setWeekAll(weekYear, week, weekday, dow, doy) { + var dayOfYearData = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy), + date = createUTCDate(dayOfYearData.year, 0, dayOfYearData.dayOfYear); + + // console.log("got", weekYear, week, weekday, "set", date.toISOString()); + this.year(date.getUTCFullYear()); + this.month(date.getUTCMonth()); + this.date(date.getUTCDate()); + return this; + } + + // FORMATTING + + addFormatToken('Q', 0, 'Qo', 'quarter'); // ALIASES @@ -6912,6 +3994,62 @@ return /******/ (function(modules) { // webpackBootstrap return input == null ? Math.ceil((this.month() + 1) / 3) : this.month((input - 1) * 3 + this.month() % 3); } + // FORMATTING + + addFormatToken('w', ['ww', 2], 'wo', 'week'); + addFormatToken('W', ['WW', 2], 'Wo', 'isoWeek'); + + // ALIASES + + addUnitAlias('week', 'w'); + addUnitAlias('isoWeek', 'W'); + + // PARSING + + addRegexToken('w', match1to2); + addRegexToken('ww', match1to2, match2); + addRegexToken('W', match1to2); + addRegexToken('WW', match1to2, match2); + + addWeekParseToken(['w', 'ww', 'W', 'WW'], function (input, week, config, token) { + week[token.substr(0, 1)] = toInt(input); + }); + + // HELPERS + + // LOCALES + + function localeWeek (mom) { + return weekOfYear(mom, this._week.dow, this._week.doy).week; + } + + var defaultLocaleWeek = { + dow : 0, // Sunday is the first day of the week. + doy : 6 // The week that contains Jan 1st is the first week of the year. + }; + + function localeFirstDayOfWeek () { + return this._week.dow; + } + + function localeFirstDayOfYear () { + return this._week.doy; + } + + // MOMENTS + + function getSetWeek (input) { + var week = this.localeData().week(this); + return input == null ? week : this.add((input - week) * 7, 'd'); + } + + function getSetISOWeek (input) { + var week = weekOfYear(this, 1, 4).week; + return input == null ? week : this.add((input - week) * 7, 'd'); + } + + // FORMATTING + addFormatToken('D', ['DD', 2], 'Do', 'date'); // ALIASES @@ -6935,6 +4073,8 @@ return /******/ (function(modules) { // webpackBootstrap var getSetDayOfMonth = makeGetSet('Date', true); + // FORMATTING + addFormatToken('d', 0, 'do', 'day'); addFormatToken('dd', 0, 0, function (format) { @@ -6967,8 +4107,8 @@ return /******/ (function(modules) { // webpackBootstrap addRegexToken('ddd', matchWord); addRegexToken('dddd', matchWord); - addWeekParseToken(['dd', 'ddd', 'dddd'], function (input, week, config) { - var weekday = config._locale.weekdaysParse(input); + addWeekParseToken(['dd', 'ddd', 'dddd'], function (input, week, config, token) { + var weekday = config._locale.weekdaysParse(input, token, config._strict); // if we didn't get a weekday name, mark the date as invalid if (weekday != null) { week.d = weekday; @@ -6984,25 +4124,28 @@ return /******/ (function(modules) { // webpackBootstrap // HELPERS function parseWeekday(input, locale) { - if (typeof input === 'string') { - if (!isNaN(input)) { - input = parseInt(input, 10); - } - else { - input = locale.weekdaysParse(input); - if (typeof input !== 'number') { - return null; - } - } + if (typeof input !== 'string') { + return input; } - return input; + + if (!isNaN(input)) { + return parseInt(input, 10); + } + + input = locale.weekdaysParse(input); + if (typeof input === 'number') { + return input; + } + + return null; } // LOCALES var defaultLocaleWeekdays = 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'); - function localeWeekdays (m) { - return this._weekdays[m.day()]; + function localeWeekdays (m, format) { + return isArray(this._weekdays) ? this._weekdays[m.day()] : + this._weekdays[this._weekdays.isFormat.test(format) ? 'format' : 'standalone'][m.day()]; } var defaultLocaleWeekdaysShort = 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'); @@ -7015,22 +4158,37 @@ return /******/ (function(modules) { // webpackBootstrap return this._weekdaysMin[m.day()]; } - function localeWeekdaysParse (weekdayName) { + function localeWeekdaysParse (weekdayName, format, strict) { var i, mom, regex; if (!this._weekdaysParse) { this._weekdaysParse = []; + this._minWeekdaysParse = []; + this._shortWeekdaysParse = []; + this._fullWeekdaysParse = []; } for (i = 0; i < 7; i++) { // make the regex if we don't have it already + + mom = local__createLocal([2000, 1]).day(i); + if (strict && !this._fullWeekdaysParse[i]) { + this._fullWeekdaysParse[i] = new RegExp('^' + this.weekdays(mom, '').replace('.', '\.?') + '$', 'i'); + this._shortWeekdaysParse[i] = new RegExp('^' + this.weekdaysShort(mom, '').replace('.', '\.?') + '$', 'i'); + this._minWeekdaysParse[i] = new RegExp('^' + this.weekdaysMin(mom, '').replace('.', '\.?') + '$', 'i'); + } if (!this._weekdaysParse[i]) { - mom = local__createLocal([2000, 1]).day(i); regex = '^' + this.weekdays(mom, '') + '|^' + this.weekdaysShort(mom, '') + '|^' + this.weekdaysMin(mom, ''); this._weekdaysParse[i] = new RegExp(regex.replace('.', ''), 'i'); } // test the regex - if (this._weekdaysParse[i].test(weekdayName)) { + if (strict && format === 'dddd' && this._fullWeekdaysParse[i].test(weekdayName)) { + return i; + } else if (strict && format === 'ddd' && this._shortWeekdaysParse[i].test(weekdayName)) { + return i; + } else if (strict && format === 'dd' && this._minWeekdaysParse[i].test(weekdayName)) { + return i; + } else if (!strict && this._weekdaysParse[i].test(weekdayName)) { return i; } } @@ -7039,6 +4197,9 @@ return /******/ (function(modules) { // webpackBootstrap // MOMENTS function getSetDayOfWeek (input) { + if (!this.isValid()) { + return input != null ? this : NaN; + } var day = this._isUTC ? this._d.getUTCDay() : this._d.getDay(); if (input != null) { input = parseWeekday(input, this.localeData()); @@ -7049,20 +4210,73 @@ return /******/ (function(modules) { // webpackBootstrap } function getSetLocaleDayOfWeek (input) { + if (!this.isValid()) { + return input != null ? this : NaN; + } var weekday = (this.day() + 7 - this.localeData()._week.dow) % 7; return input == null ? weekday : this.add(input - weekday, 'd'); } function getSetISODayOfWeek (input) { + if (!this.isValid()) { + return input != null ? this : NaN; + } // behaves the same as moment#day except // as a getter, returns 7 instead of 0 (1-7 range instead of 0-6) // as a setter, sunday should belong to the previous week. return input == null ? this.day() || 7 : this.day(this.day() % 7 ? input : input - 7); } - addFormatToken('H', ['HH', 2], 0, 'hour'); - addFormatToken('h', ['hh', 2], 0, function () { + // FORMATTING + + addFormatToken('DDD', ['DDDD', 3], 'DDDo', 'dayOfYear'); + + // ALIASES + + addUnitAlias('dayOfYear', 'DDD'); + + // PARSING + + addRegexToken('DDD', match1to3); + addRegexToken('DDDD', match3); + addParseToken(['DDD', 'DDDD'], function (input, array, config) { + config._dayOfYear = toInt(input); + }); + + // HELPERS + + // MOMENTS + + function getSetDayOfYear (input) { + var dayOfYear = Math.round((this.clone().startOf('day') - this.clone().startOf('year')) / 864e5) + 1; + return input == null ? dayOfYear : this.add((input - dayOfYear), 'd'); + } + + // FORMATTING + + function hFormat() { return this.hours() % 12 || 12; + } + + addFormatToken('H', ['HH', 2], 0, 'hour'); + addFormatToken('h', ['hh', 2], 0, hFormat); + + addFormatToken('hmm', 0, 0, function () { + return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2); + }); + + addFormatToken('hmmss', 0, 0, function () { + return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2) + + zeroFill(this.seconds(), 2); + }); + + addFormatToken('Hmm', 0, 0, function () { + return '' + this.hours() + zeroFill(this.minutes(), 2); + }); + + addFormatToken('Hmmss', 0, 0, function () { + return '' + this.hours() + zeroFill(this.minutes(), 2) + + zeroFill(this.seconds(), 2); }); function meridiem (token, lowercase) { @@ -7091,6 +4305,11 @@ return /******/ (function(modules) { // webpackBootstrap addRegexToken('HH', match1to2, match2); addRegexToken('hh', match1to2, match2); + addRegexToken('hmm', match3to4); + addRegexToken('hmmss', match5to6); + addRegexToken('Hmm', match3to4); + addRegexToken('Hmmss', match5to6); + addParseToken(['H', 'HH'], HOUR); addParseToken(['a', 'A'], function (input, array, config) { config._isPm = config._locale.isPM(input); @@ -7100,6 +4319,32 @@ return /******/ (function(modules) { // webpackBootstrap array[HOUR] = toInt(input); getParsingFlags(config).bigHour = true; }); + addParseToken('hmm', function (input, array, config) { + var pos = input.length - 2; + array[HOUR] = toInt(input.substr(0, pos)); + array[MINUTE] = toInt(input.substr(pos)); + getParsingFlags(config).bigHour = true; + }); + addParseToken('hmmss', function (input, array, config) { + var pos1 = input.length - 4; + var pos2 = input.length - 2; + array[HOUR] = toInt(input.substr(0, pos1)); + array[MINUTE] = toInt(input.substr(pos1, 2)); + array[SECOND] = toInt(input.substr(pos2)); + getParsingFlags(config).bigHour = true; + }); + addParseToken('Hmm', function (input, array, config) { + var pos = input.length - 2; + array[HOUR] = toInt(input.substr(0, pos)); + array[MINUTE] = toInt(input.substr(pos)); + }); + addParseToken('Hmmss', function (input, array, config) { + var pos1 = input.length - 4; + var pos2 = input.length - 2; + array[HOUR] = toInt(input.substr(0, pos1)); + array[MINUTE] = toInt(input.substr(pos1, 2)); + array[SECOND] = toInt(input.substr(pos2)); + }); // LOCALES @@ -7127,6 +4372,8 @@ return /******/ (function(modules) { // webpackBootstrap // this rule. var getSetHour = makeGetSet('Hours', true); + // FORMATTING + addFormatToken('m', ['mm', 2], 0, 'minute'); // ALIASES @@ -7143,6 +4390,8 @@ return /******/ (function(modules) { // webpackBootstrap var getSetMinute = makeGetSet('Minutes', false); + // FORMATTING + addFormatToken('s', ['ss', 2], 0, 'second'); // ALIASES @@ -7159,6 +4408,8 @@ return /******/ (function(modules) { // webpackBootstrap var getSetSecond = makeGetSet('Seconds', false); + // FORMATTING + addFormatToken('S', 0, 0, function () { return ~~(this.millisecond() / 100); }); @@ -7167,12 +4418,26 @@ return /******/ (function(modules) { // webpackBootstrap return ~~(this.millisecond() / 10); }); - function millisecond__milliseconds (token) { - addFormatToken(0, [token, 3], 0, 'millisecond'); - } + addFormatToken(0, ['SSS', 3], 0, 'millisecond'); + addFormatToken(0, ['SSSS', 4], 0, function () { + return this.millisecond() * 10; + }); + addFormatToken(0, ['SSSSS', 5], 0, function () { + return this.millisecond() * 100; + }); + addFormatToken(0, ['SSSSSS', 6], 0, function () { + return this.millisecond() * 1000; + }); + addFormatToken(0, ['SSSSSSS', 7], 0, function () { + return this.millisecond() * 10000; + }); + addFormatToken(0, ['SSSSSSSS', 8], 0, function () { + return this.millisecond() * 100000; + }); + addFormatToken(0, ['SSSSSSSSS', 9], 0, function () { + return this.millisecond() * 1000000; + }); - millisecond__milliseconds('SSS'); - millisecond__milliseconds('SSSS'); // ALIASES @@ -7183,15 +4448,25 @@ return /******/ (function(modules) { // webpackBootstrap addRegexToken('S', match1to3, match1); addRegexToken('SS', match1to3, match2); addRegexToken('SSS', match1to3, match3); - addRegexToken('SSSS', matchUnsigned); - addParseToken(['S', 'SS', 'SSS', 'SSSS'], function (input, array) { - array[MILLISECOND] = toInt(('0.' + input) * 1000); - }); + var token; + for (token = 'SSSS'; token.length <= 9; token += 'S') { + addRegexToken(token, matchUnsigned); + } + + function parseMs(input, array) { + array[MILLISECOND] = toInt(('0.' + input) * 1000); + } + + for (token = 'S'; token.length <= 9; token += 'S') { + addParseToken(token, parseMs); + } // MOMENTS var getSetMillisecond = makeGetSet('Milliseconds', false); + // FORMATTING + addFormatToken('z', 0, 0, 'zoneAbbr'); addFormatToken('zz', 0, 0, 'zoneName'); @@ -7207,39 +4482,43 @@ return /******/ (function(modules) { // webpackBootstrap var momentPrototype__proto = Moment.prototype; - momentPrototype__proto.add = add_subtract__add; - momentPrototype__proto.calendar = moment_calendar__calendar; - momentPrototype__proto.clone = clone; - momentPrototype__proto.diff = diff; - momentPrototype__proto.endOf = endOf; - momentPrototype__proto.format = format; - momentPrototype__proto.from = from; - momentPrototype__proto.fromNow = fromNow; - momentPrototype__proto.to = to; - momentPrototype__proto.toNow = toNow; - momentPrototype__proto.get = getSet; - momentPrototype__proto.invalidAt = invalidAt; - momentPrototype__proto.isAfter = isAfter; - momentPrototype__proto.isBefore = isBefore; - momentPrototype__proto.isBetween = isBetween; - momentPrototype__proto.isSame = isSame; - momentPrototype__proto.isValid = moment_valid__isValid; - momentPrototype__proto.lang = lang; - momentPrototype__proto.locale = locale; - momentPrototype__proto.localeData = localeData; - momentPrototype__proto.max = prototypeMax; - momentPrototype__proto.min = prototypeMin; - momentPrototype__proto.parsingFlags = parsingFlags; - momentPrototype__proto.set = getSet; - momentPrototype__proto.startOf = startOf; - momentPrototype__proto.subtract = add_subtract__subtract; - momentPrototype__proto.toArray = toArray; - momentPrototype__proto.toDate = toDate; - momentPrototype__proto.toISOString = moment_format__toISOString; - momentPrototype__proto.toJSON = moment_format__toISOString; - momentPrototype__proto.toString = toString; - momentPrototype__proto.unix = unix; - momentPrototype__proto.valueOf = to_type__valueOf; + momentPrototype__proto.add = add_subtract__add; + momentPrototype__proto.calendar = moment_calendar__calendar; + momentPrototype__proto.clone = clone; + momentPrototype__proto.diff = diff; + momentPrototype__proto.endOf = endOf; + momentPrototype__proto.format = format; + momentPrototype__proto.from = from; + momentPrototype__proto.fromNow = fromNow; + momentPrototype__proto.to = to; + momentPrototype__proto.toNow = toNow; + momentPrototype__proto.get = getSet; + momentPrototype__proto.invalidAt = invalidAt; + momentPrototype__proto.isAfter = isAfter; + momentPrototype__proto.isBefore = isBefore; + momentPrototype__proto.isBetween = isBetween; + momentPrototype__proto.isSame = isSame; + momentPrototype__proto.isSameOrAfter = isSameOrAfter; + momentPrototype__proto.isSameOrBefore = isSameOrBefore; + momentPrototype__proto.isValid = moment_valid__isValid; + momentPrototype__proto.lang = lang; + momentPrototype__proto.locale = locale; + momentPrototype__proto.localeData = localeData; + momentPrototype__proto.max = prototypeMax; + momentPrototype__proto.min = prototypeMin; + momentPrototype__proto.parsingFlags = parsingFlags; + momentPrototype__proto.set = getSet; + momentPrototype__proto.startOf = startOf; + momentPrototype__proto.subtract = add_subtract__subtract; + momentPrototype__proto.toArray = toArray; + momentPrototype__proto.toObject = toObject; + momentPrototype__proto.toDate = toDate; + momentPrototype__proto.toISOString = moment_format__toISOString; + momentPrototype__proto.toJSON = toJSON; + momentPrototype__proto.toString = toString; + momentPrototype__proto.unix = unix; + momentPrototype__proto.valueOf = to_type__valueOf; + momentPrototype__proto.creationData = creationData; // Year momentPrototype__proto.year = getSetYear; @@ -7325,7 +4604,7 @@ return /******/ (function(modules) { // webpackBootstrap function locale_calendar__calendar (key, mom, now) { var output = this._calendar[key]; - return typeof output === 'function' ? output.call(mom, now) : output; + return isFunction(output) ? output.call(mom, now) : output; } var defaultLongDateFormat = { @@ -7333,19 +4612,23 @@ return /******/ (function(modules) { // webpackBootstrap LT : 'h:mm A', L : 'MM/DD/YYYY', LL : 'MMMM D, YYYY', - LLL : 'MMMM D, YYYY LT', - LLLL : 'dddd, MMMM D, YYYY LT' + LLL : 'MMMM D, YYYY h:mm A', + LLLL : 'dddd, MMMM D, YYYY h:mm A' }; function longDateFormat (key) { - var output = this._longDateFormat[key]; - if (!output && this._longDateFormat[key.toUpperCase()]) { - output = this._longDateFormat[key.toUpperCase()].replace(/MMMM|MM|DD|dddd/g, function (val) { - return val.slice(1); - }); - this._longDateFormat[key] = output; + var format = this._longDateFormat[key], + formatUpper = this._longDateFormat[key.toUpperCase()]; + + if (format || !formatUpper) { + return format; } - return output; + + this._longDateFormat[key] = formatUpper.replace(/MMMM|MM|DD|dddd/g, function (val) { + return val.slice(1); + }); + + return this._longDateFormat[key]; } var defaultInvalidDate = 'Invalid date'; @@ -7383,21 +4666,21 @@ return /******/ (function(modules) { // webpackBootstrap function relative__relativeTime (number, withoutSuffix, string, isFuture) { var output = this._relativeTime[string]; - return (typeof output === 'function') ? + return (isFunction(output)) ? output(number, withoutSuffix, string, isFuture) : output.replace(/%d/i, number); } function pastFuture (diff, output) { var format = this._relativeTime[diff > 0 ? 'future' : 'past']; - return typeof format === 'function' ? format(output) : format.replace(/%s/i, output); + return isFunction(format) ? format(output) : format.replace(/%s/i, output); } function locale_set__set (config) { var prop, i; for (i in config) { prop = config[i]; - if (typeof prop === 'function') { + if (isFunction(prop)) { this[i] = prop; } else { this['_' + i] = prop; @@ -7427,11 +4710,15 @@ return /******/ (function(modules) { // webpackBootstrap prototype__proto.set = locale_set__set; // Month - prototype__proto.months = localeMonths; - prototype__proto._months = defaultLocaleMonths; - prototype__proto.monthsShort = localeMonthsShort; - prototype__proto._monthsShort = defaultLocaleMonthsShort; - prototype__proto.monthsParse = localeMonthsParse; + prototype__proto.months = localeMonths; + prototype__proto._months = defaultLocaleMonths; + prototype__proto.monthsShort = localeMonthsShort; + prototype__proto._monthsShort = defaultLocaleMonthsShort; + prototype__proto.monthsParse = localeMonthsParse; + prototype__proto._monthsRegex = defaultMonthsRegex; + prototype__proto.monthsRegex = monthsRegex; + prototype__proto._monthsShortRegex = defaultMonthsShortRegex; + prototype__proto.monthsShortRegex = monthsShortRegex; // Week prototype__proto.week = localeWeek; @@ -7554,12 +4841,29 @@ return /******/ (function(modules) { // webpackBootstrap return duration_add_subtract__addSubtract(this, input, value, -1); } + function absCeil (number) { + if (number < 0) { + return Math.floor(number); + } else { + return Math.ceil(number); + } + } + function bubble () { var milliseconds = this._milliseconds; var days = this._days; var months = this._months; var data = this._data; - var seconds, minutes, hours, years = 0; + var seconds, minutes, hours, years, monthsFromDays; + + // if we have a mix of positive and negative values, bubble down first + // check: https://github.com/moment/moment/issues/2166 + if (!((milliseconds >= 0 && days >= 0 && months >= 0) || + (milliseconds <= 0 && days <= 0 && months <= 0))) { + milliseconds += absCeil(monthsToDays(months) + days) * 864e5; + days = 0; + months = 0; + } // The following code bubbles up values, see the tests for // examples of what that means. @@ -7576,17 +4880,13 @@ return /******/ (function(modules) { // webpackBootstrap days += absFloor(hours / 24); - // Accurately convert days to years, assume start from year 0. - years = absFloor(daysToYears(days)); - days -= absFloor(yearsToDays(years)); - - // 30 days to a month - // TODO (iskren): Use anchor date (like 1st Jan) to compute this. - months += absFloor(days / 30); - days %= 30; + // convert days to months + monthsFromDays = absFloor(daysToMonths(days)); + months += monthsFromDays; + days -= absCeil(monthsToDays(monthsFromDays)); // 12 months -> 1 year - years += absFloor(months / 12); + years = absFloor(months / 12); months %= 12; data.days = days; @@ -7596,15 +4896,15 @@ return /******/ (function(modules) { // webpackBootstrap return this; } - function daysToYears (days) { + function daysToMonths (days) { // 400 years have 146097 days (taking into account leap year rules) - return days * 400 / 146097; + // 400 years have 12 months === 4800 + return days * 4800 / 146097; } - function yearsToDays (years) { - // years * 365 + absFloor(years / 4) - - // absFloor(years / 100) + absFloor(years / 400); - return years * 146097 / 400; + function monthsToDays (months) { + // the reverse of daysToMonths + return months * 146097 / 4800; } function as (units) { @@ -7616,11 +4916,11 @@ return /******/ (function(modules) { // webpackBootstrap if (units === 'month' || units === 'year') { days = this._days + milliseconds / 864e5; - months = this._months + daysToYears(days) * 12; + months = this._months + daysToMonths(days); return units === 'month' ? months : months / 12; } else { // handle milliseconds separately because of floating point math errors (issue #1867) - days = this._days + Math.round(yearsToDays(this._months / 12)); + days = this._days + Math.round(monthsToDays(this._months)); switch (units) { case 'week' : return days / 7 + milliseconds / 6048e5; case 'day' : return days + milliseconds / 864e5; @@ -7670,7 +4970,7 @@ return /******/ (function(modules) { // webpackBootstrap }; } - var duration_get__milliseconds = makeGetter('milliseconds'); + var milliseconds = makeGetter('milliseconds'); var seconds = makeGetter('seconds'); var minutes = makeGetter('minutes'); var hours = makeGetter('hours'); @@ -7706,15 +5006,15 @@ return /******/ (function(modules) { // webpackBootstrap var years = round(duration.as('y')); var a = seconds < thresholds.s && ['s', seconds] || - minutes === 1 && ['m'] || + minutes <= 1 && ['m'] || minutes < thresholds.m && ['mm', minutes] || - hours === 1 && ['h'] || + hours <= 1 && ['h'] || hours < thresholds.h && ['hh', hours] || - days === 1 && ['d'] || + days <= 1 && ['d'] || days < thresholds.d && ['dd', days] || - months === 1 && ['M'] || + months <= 1 && ['M'] || months < thresholds.M && ['MM', months] || - years === 1 && ['y'] || ['yy', years]; + years <= 1 && ['y'] || ['yy', years]; a[2] = withoutSuffix; a[3] = +posNegDuration > 0; @@ -7748,13 +5048,36 @@ return /******/ (function(modules) { // webpackBootstrap var iso_string__abs = Math.abs; function iso_string__toISOString() { + // for ISO strings we do not use the normal bubbling rules: + // * milliseconds bubble up until they become hours + // * days do not bubble at all + // * months bubble up until they become years + // This is because there is no context-free conversion between hours and days + // (think of clock changes) + // and also not between days and months (28-31 days per month) + var seconds = iso_string__abs(this._milliseconds) / 1000; + var days = iso_string__abs(this._days); + var months = iso_string__abs(this._months); + var minutes, hours, years; + + // 3600 seconds -> 60 minutes -> 1 hour + minutes = absFloor(seconds / 60); + hours = absFloor(minutes / 60); + seconds %= 60; + minutes %= 60; + + // 12 months -> 1 year + years = absFloor(months / 12); + months %= 12; + + // inspired by https://github.com/dordille/moment-isoduration/blob/master/moment.isoduration.js - var Y = iso_string__abs(this.years()); - var M = iso_string__abs(this.months()); - var D = iso_string__abs(this.days()); - var h = iso_string__abs(this.hours()); - var m = iso_string__abs(this.minutes()); - var s = iso_string__abs(this.seconds() + this.milliseconds() / 1000); + var Y = years; + var M = months; + var D = days; + var h = hours; + var m = minutes; + var s = seconds; var total = this.asSeconds(); if (!total) { @@ -7791,7 +5114,7 @@ return /******/ (function(modules) { // webpackBootstrap duration_prototype__proto.valueOf = duration_as__valueOf; duration_prototype__proto._bubble = bubble; duration_prototype__proto.get = duration_get__get; - duration_prototype__proto.milliseconds = duration_get__milliseconds; + duration_prototype__proto.milliseconds = milliseconds; duration_prototype__proto.seconds = seconds; duration_prototype__proto.minutes = minutes; duration_prototype__proto.hours = hours; @@ -7812,6 +5135,8 @@ return /******/ (function(modules) { // webpackBootstrap // Side effect imports + // FORMATTING + addFormatToken('X', 0, 0, 'unix'); addFormatToken('x', 0, 0, 'valueOf'); @@ -7829,13 +5154,14 @@ return /******/ (function(modules) { // webpackBootstrap // Side effect imports - utils_hooks__hooks.version = '2.10.3'; + utils_hooks__hooks.version = '2.11.2'; setHookCallback(local__createLocal); utils_hooks__hooks.fn = momentPrototype; utils_hooks__hooks.min = min; utils_hooks__hooks.max = max; + utils_hooks__hooks.now = now; utils_hooks__hooks.utc = create_utc__createUTC; utils_hooks__hooks.unix = moment__createUnix; utils_hooks__hooks.months = lists__listMonths; @@ -7854,16 +5180,17 @@ return /******/ (function(modules) { // webpackBootstrap utils_hooks__hooks.weekdaysShort = lists__listWeekdaysShort; utils_hooks__hooks.normalizeUnits = normalizeUnits; utils_hooks__hooks.relativeTimeThreshold = duration_humanize__getSetRelativeTimeThreshold; + utils_hooks__hooks.prototype = momentPrototype; var _moment = utils_hooks__hooks; return _moment; })); - /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(10)(module))) + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(4)(module))) /***/ }, -/* 10 */ +/* 4 */ /***/ function(module, exports) { module.exports = function(module) { @@ -7879,7 +5206,7 @@ return /******/ (function(modules) { // webpackBootstrap /***/ }, -/* 11 */ +/* 5 */ /***/ function(module, exports) { function webpackContext(req) { @@ -7888,11 +5215,11 @@ return /******/ (function(modules) { // webpackBootstrap webpackContext.keys = function() { return []; }; webpackContext.resolve = webpackContext; module.exports = webpackContext; - webpackContext.id = 11; + webpackContext.id = 5; /***/ }, -/* 12 */ +/* 6 */ /***/ function(module, exports) { /* WEBPACK VAR INJECTION */(function(global) {'use strict'; @@ -8108,7 +5435,7 @@ return /******/ (function(modules) { // webpackBootstrap /* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }()))) /***/ }, -/* 13 */ +/* 7 */ /***/ function(module, exports) { // DOM utility methods @@ -8151,6 +5478,16 @@ return /******/ (function(modules) { // webpackBootstrap } }; + /** + * Ensures that all elements are removed first up so they can be recreated cleanly + * @param JSONcontainer + */ + exports.resetElements = function (JSONcontainer) { + exports.prepareElements(JSONcontainer); + exports.cleanupElements(JSONcontainer); + exports.prepareElements(JSONcontainer); + }; + /** * Allocate or generate an SVG element if needed. Store a reference to it in the JSON container and draw it in the svgContainer * the JSON container and the SVG container have to be supplied so other svg containers (like the legend) can use this. @@ -8244,21 +5581,21 @@ return /******/ (function(modules) { // webpackBootstrap var point; if (groupTemplate.style == 'circle') { point = exports.getSVGElement('circle', JSONcontainer, svgContainer); - point.setAttributeNS(null, 'cx', x); - point.setAttributeNS(null, 'cy', y); - point.setAttributeNS(null, 'r', 0.5 * groupTemplate.size); + point.setAttributeNS(null, "cx", x); + point.setAttributeNS(null, "cy", y); + point.setAttributeNS(null, "r", 0.5 * groupTemplate.size); } else { point = exports.getSVGElement('rect', JSONcontainer, svgContainer); - point.setAttributeNS(null, 'x', x - 0.5 * groupTemplate.size); - point.setAttributeNS(null, 'y', y - 0.5 * groupTemplate.size); - point.setAttributeNS(null, 'width', groupTemplate.size); - point.setAttributeNS(null, 'height', groupTemplate.size); + point.setAttributeNS(null, "x", x - 0.5 * groupTemplate.size); + point.setAttributeNS(null, "y", y - 0.5 * groupTemplate.size); + point.setAttributeNS(null, "width", groupTemplate.size); + point.setAttributeNS(null, "height", groupTemplate.size); } - if (groupTemplate.style !== undefined) { - point.setAttributeNS(null, 'style', groupTemplate.style); + if (groupTemplate.styles !== undefined) { + point.setAttributeNS(null, "style", groupTemplate.styles); } - point.setAttributeNS(null, 'class', groupTemplate.className + ' vis-point'); + point.setAttributeNS(null, "class", groupTemplate.className + " vis-point"); //handle label if (labelObj) { @@ -8275,10 +5612,10 @@ return /******/ (function(modules) { // webpackBootstrap } if (labelObj.className) { - label.setAttributeNS(null, 'class', labelObj.className + ' vis-label'); + label.setAttributeNS(null, "class", labelObj.className + " vis-label"); } - label.setAttributeNS(null, 'x', x); - label.setAttributeNS(null, 'y', y); + label.setAttributeNS(null, "x", x); + label.setAttributeNS(null, "y", y); } return point; @@ -8298,25 +5635,25 @@ return /******/ (function(modules) { // webpackBootstrap y -= height; } var rect = exports.getSVGElement('rect', JSONcontainer, svgContainer); - rect.setAttributeNS(null, 'x', x - 0.5 * width); - rect.setAttributeNS(null, 'y', y); - rect.setAttributeNS(null, 'width', width); - rect.setAttributeNS(null, 'height', height); - rect.setAttributeNS(null, 'class', className); + rect.setAttributeNS(null, "x", x - 0.5 * width); + rect.setAttributeNS(null, "y", y); + rect.setAttributeNS(null, "width", width); + rect.setAttributeNS(null, "height", height); + rect.setAttributeNS(null, "class", className); if (style) { - rect.setAttributeNS(null, 'style', style); + rect.setAttributeNS(null, "style", style); } } }; /***/ }, -/* 14 */ +/* 8 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; - var util = __webpack_require__(7); - var Queue = __webpack_require__(15); + var util = __webpack_require__(1); + var Queue = __webpack_require__(9); /** * DataSet @@ -8377,14 +5714,14 @@ return /******/ (function(modules) { // webpackBootstrap // all variants of a Date are internally stored as Date, so we can convert // from everything to everything (also from ISODate to Number for example) if (this._options.type) { - for (var field in this._options.type) { - if (this._options.type.hasOwnProperty(field)) { - var value = this._options.type[field]; - if (value == 'Date' || value == 'ISODate' || value == 'ASPDate') { - this._type[field] = 'Date'; - } else { - this._type[field] = value; - } + var fields = Object.keys(this._options.type); + for (var i = 0, len = fields.length; i < len; i++) { + var field = fields[i]; + var value = this._options.type[field]; + if (value == 'Date' || value == 'ISODate' || value == 'ASPDate') { + this._type[field] = 'Date'; + } else { + this._type[field] = value; } } } @@ -8501,7 +5838,7 @@ return /******/ (function(modules) { // webpackBootstrap subscribers = subscribers.concat(this._subscribers['*']); } - for (var i = 0; i < subscribers.length; i++) { + for (var i = 0, len = subscribers.length; i < len; i++) { var subscriber = subscribers[i]; if (subscriber.callback) { subscriber.callback(event, params, senderId || null); @@ -8551,6 +5888,7 @@ return /******/ (function(modules) { // webpackBootstrap DataSet.prototype.update = function (data, senderId) { var addedIds = []; var updatedIds = []; + var oldData = []; var updatedData = []; var me = this; var fieldId = me._fieldId; @@ -8558,10 +5896,12 @@ return /******/ (function(modules) { // webpackBootstrap var addOrUpdate = function addOrUpdate(item) { var id = item[fieldId]; if (me._data[id]) { + var oldItem = util.extend({}, me._data[id]); // update item id = me._updateItem(item); updatedIds.push(id); updatedData.push(item); + oldData.push(oldItem); } else { // add new item id = me._addItem(item); @@ -8572,7 +5912,11 @@ return /******/ (function(modules) { // webpackBootstrap if (Array.isArray(data)) { // Array for (var i = 0, len = data.length; i < len; i++) { - addOrUpdate(data[i]); + if (data[i] instanceof Object) { + addOrUpdate(data[i]); + } else { + console.warn('Ignoring input item, which is not an object at index ' + i); + } } } else if (data instanceof Object) { // Single item @@ -8585,7 +5929,15 @@ return /******/ (function(modules) { // webpackBootstrap this._trigger('add', { items: addedIds }, senderId); } if (updatedIds.length) { - this._trigger('update', { items: updatedIds, data: updatedData }, senderId); + var props = { items: updatedIds, oldData: oldData, data: updatedData }; + // TODO: remove deprecated property 'data' some day + //Object.defineProperty(props, 'data', { + // 'get': (function() { + // console.warn('Property data is deprecated. Use DataSet.get(ids) to retrieve the new data, use the oldData property on this object to get the old data'); + // return updatedData; + // }).bind(this) + //}); + this._trigger('update', props, senderId); } return addedIds.concat(updatedIds); @@ -8651,6 +6003,7 @@ return /******/ (function(modules) { // webpackBootstrap var filter = options && options.filter; var items = [], item, + itemIds, itemId, i, len; @@ -8659,7 +6012,7 @@ return /******/ (function(modules) { // webpackBootstrap if (id != undefined) { // return a single item item = me._getItem(id, type); - if (filter && !filter(item)) { + if (item && filter && !filter(item)) { item = null; } } else if (ids != undefined) { @@ -8672,12 +6025,12 @@ return /******/ (function(modules) { // webpackBootstrap } } else { // return all items - for (itemId in this._data) { - if (this._data.hasOwnProperty(itemId)) { - item = me._getItem(itemId, type); - if (!filter || filter(item)) { - items.push(item); - } + itemIds = Object.keys(this._data); + for (i = 0, len = itemIds.length; i < len; i++) { + itemId = itemIds[i]; + item = me._getItem(itemId, type); + if (!filter || filter(item)) { + items.push(item); } } } @@ -8701,9 +6054,11 @@ return /******/ (function(modules) { // webpackBootstrap // return the results if (returnType == 'Object') { - var result = {}; - for (i = 0; i < items.length; i++) { - result[items[i].id] = items[i]; + var result = {}, + resultant; + for (i = 0, len = items.length; i < len; i++) { + resultant = items[i]; + result[resultant.id] = resultant; } return result; } else { @@ -8730,6 +6085,7 @@ return /******/ (function(modules) { // webpackBootstrap filter = options && options.filter, order = options && options.order, type = options && options.type || this._options.type, + itemIds = Object.keys(data), i, len, id, @@ -8742,28 +6098,26 @@ return /******/ (function(modules) { // webpackBootstrap if (order) { // create ordered list items = []; - for (id in data) { - if (data.hasOwnProperty(id)) { - item = this._getItem(id, type); - if (filter(item)) { - items.push(item); - } + for (i = 0, len = itemIds.length; i < len; i++) { + id = itemIds[i]; + item = this._getItem(id, type); + if (filter(item)) { + items.push(item); } } this._sort(items, order); for (i = 0, len = items.length; i < len; i++) { - ids[i] = items[i][this._fieldId]; + ids.push(items[i][this._fieldId]); } } else { // create unordered list - for (id in data) { - if (data.hasOwnProperty(id)) { - item = this._getItem(id, type); - if (filter(item)) { - ids.push(item[this._fieldId]); - } + for (i = 0, len = itemIds.length; i < len; i++) { + id = itemIds[i]; + item = this._getItem(id, type); + if (filter(item)) { + ids.push(item[this._fieldId]); } } } @@ -8772,24 +6126,22 @@ return /******/ (function(modules) { // webpackBootstrap if (order) { // create an ordered list items = []; - for (id in data) { - if (data.hasOwnProperty(id)) { - items.push(data[id]); - } + for (i = 0, len = itemIds.length; i < len; i++) { + id = itemIds[i]; + items.push(data[id]); } this._sort(items, order); for (i = 0, len = items.length; i < len; i++) { - ids[i] = items[i][this._fieldId]; + ids.push(items[i][this._fieldId]); } } else { // create unordered list - for (id in data) { - if (data.hasOwnProperty(id)) { - item = data[id]; - ids.push(item[this._fieldId]); - } + for (i = 0, len = itemIds.length; i < len; i++) { + id = itemIds[i]; + item = data[id]; + ids.push(item[this._fieldId]); } } } @@ -8819,6 +6171,9 @@ return /******/ (function(modules) { // webpackBootstrap var filter = options && options.filter, type = options && options.type || this._options.type, data = this._data, + itemIds = Object.keys(data), + i, + len, item, id; @@ -8826,19 +6181,18 @@ return /******/ (function(modules) { // webpackBootstrap // execute forEach on ordered list var items = this.get(options); - for (var i = 0, len = items.length; i < len; i++) { + for (i = 0, len = items.length; i < len; i++) { item = items[i]; id = item[this._fieldId]; callback(item, id); } } else { // unordered - for (id in data) { - if (data.hasOwnProperty(id)) { - item = this._getItem(id, type); - if (!filter || filter(item)) { - callback(item, id); - } + for (i = 0, len = itemIds.length; i < len; i++) { + id = itemIds[i]; + item = this._getItem(id, type); + if (!filter || filter(item)) { + callback(item, id); } } } @@ -8860,15 +6214,18 @@ return /******/ (function(modules) { // webpackBootstrap type = options && options.type || this._options.type, mappedItems = [], data = this._data, + itemIds = Object.keys(data), + i, + len, + id, item; // convert and filter items - for (var id in data) { - if (data.hasOwnProperty(id)) { - item = this._getItem(id, type); - if (!filter || filter(item)) { - mappedItems.push(callback(item, id)); - } + for (i = 0, len = itemIds.length; i < len; i++) { + id = itemIds[i]; + item = this._getItem(id, type); + if (!filter || filter(item)) { + mappedItems.push(callback(item, id)); } } @@ -8893,17 +6250,23 @@ return /******/ (function(modules) { // webpackBootstrap return item; } - var filteredItem = {}; + var filteredItem = {}, + itemFields = Object.keys(item), + len = itemFields.length, + i, + field; if (Array.isArray(fields)) { - for (var field in item) { - if (item.hasOwnProperty(field) && fields.indexOf(field) != -1) { + for (i = 0; i < len; i++) { + field = itemFields[i]; + if (fields.indexOf(field) != -1) { filteredItem[field] = item[field]; } } } else { - for (var field in item) { - if (item.hasOwnProperty(field) && fields.hasOwnProperty(field)) { + for (i = 0; i < len; i++) { + field = itemFields[i]; + if (fields.hasOwnProperty(field)) { filteredItem[fields[field]] = item[field]; } } @@ -8934,8 +6297,8 @@ return /******/ (function(modules) { // webpackBootstrap // TODO: extend order by an Object {field:String, direction:String} // where direction can be 'asc' or 'desc' else { - throw new TypeError('Order must be a function or a string'); - } + throw new TypeError('Order must be a function or a string'); + } }; /** @@ -8987,7 +6350,7 @@ return /******/ (function(modules) { // webpackBootstrap } } else if (id instanceof Object) { var itemId = id[this._fieldId]; - if (itemId && this._data[itemId]) { + if (itemId !== undefined && this._data[itemId]) { delete this._data[itemId]; this.length--; return itemId; @@ -9019,17 +6382,19 @@ return /******/ (function(modules) { // webpackBootstrap */ DataSet.prototype.max = function (field) { var data = this._data, + itemIds = Object.keys(data), max = null, - maxField = null; + maxField = null, + i, + len; - for (var id in data) { - if (data.hasOwnProperty(id)) { - var item = data[id]; - var itemField = item[field]; - if (itemField != null && (!max || itemField > maxField)) { - max = item; - maxField = itemField; - } + for (i = 0, len = itemIds.length; i < len; i++) { + var id = itemIds[i]; + var item = data[id]; + var itemField = item[field]; + if (itemField != null && (!max || itemField > maxField)) { + max = item; + maxField = itemField; } } @@ -9043,17 +6408,19 @@ return /******/ (function(modules) { // webpackBootstrap */ DataSet.prototype.min = function (field) { var data = this._data, + itemIds = Object.keys(data), min = null, - minField = null; + minField = null, + i, + len; - for (var id in data) { - if (data.hasOwnProperty(id)) { - var item = data[id]; - var itemField = item[field]; - if (itemField != null && (!min || itemField < minField)) { - min = item; - minField = itemField; - } + for (i = 0, len = itemIds.length; i < len; i++) { + var id = itemIds[i]; + var item = data[id]; + var itemField = item[field]; + if (itemField != null && (!min || itemField < minField)) { + min = item; + minField = itemField; } } @@ -9069,31 +6436,31 @@ return /******/ (function(modules) { // webpackBootstrap */ DataSet.prototype.distinct = function (field) { var data = this._data; + var itemIds = Object.keys(data); var values = []; var fieldType = this._options.type && this._options.type[field] || null; var count = 0; - var i; + var i, j, len; - for (var prop in data) { - if (data.hasOwnProperty(prop)) { - var item = data[prop]; - var value = item[field]; - var exists = false; - for (i = 0; i < count; i++) { - if (values[i] == value) { - exists = true; - break; - } - } - if (!exists && value !== undefined) { - values[count] = value; - count++; + for (i = 0, len = itemIds.length; i < len; i++) { + var id = itemIds[i]; + var item = data[id]; + var value = item[field]; + var exists = false; + for (j = 0; j < count; j++) { + if (values[j] == value) { + exists = true; + break; } } + if (!exists && value !== undefined) { + values[count] = value; + count++; + } } if (fieldType) { - for (i = 0; i < values.length; i++) { + for (i = 0, len = values.length; i < len; i++) { values[i] = util.convert(values[i], fieldType); } } @@ -9122,12 +6489,14 @@ return /******/ (function(modules) { // webpackBootstrap item[this._fieldId] = id; } - var d = {}; - for (var field in item) { - if (item.hasOwnProperty(field)) { - var fieldType = this._type[field]; // type may be undefined - d[field] = util.convert(item[field], fieldType); - } + var d = {}, + fields = Object.keys(item), + i, + len; + for (i = 0, len = fields.length; i < len; i++) { + var field = fields[i]; + var fieldType = this._type[field]; // type may be undefined + d[field] = util.convert(item[field], fieldType); } this._data[id] = d; this.length++; @@ -9143,7 +6512,7 @@ return /******/ (function(modules) { // webpackBootstrap * @private */ DataSet.prototype._getItem = function (id, types) { - var field, value; + var field, value, i, len; // get the item from the dataset var raw = this._data[id]; @@ -9152,21 +6521,21 @@ return /******/ (function(modules) { // webpackBootstrap } // convert the items field types - var converted = {}; + var converted = {}, + fields = Object.keys(raw); + if (types) { - for (field in raw) { - if (raw.hasOwnProperty(field)) { - value = raw[field]; - converted[field] = util.convert(value, types[field]); - } + for (i = 0, len = fields.length; i < len; i++) { + field = fields[i]; + value = raw[field]; + converted[field] = util.convert(value, types[field]); } } else { // no field types specified, no converting needed - for (field in raw) { - if (raw.hasOwnProperty(field)) { - value = raw[field]; - converted[field] = value; - } + for (i = 0, len = fields.length; i < len; i++) { + field = fields[i]; + value = raw[field]; + converted[field] = value; } } return converted; @@ -9192,11 +6561,11 @@ return /******/ (function(modules) { // webpackBootstrap } // merge with current item - for (var field in item) { - if (item.hasOwnProperty(field)) { - var fieldType = this._type[field]; // type may be undefined - d[field] = util.convert(item[field], fieldType); - } + var fields = Object.keys(item); + for (var i = 0, len = fields.length; i < len; i++) { + var field = fields[i]; + var fieldType = this._type[field]; // type may be undefined + d[field] = util.convert(item[field], fieldType); } return id; @@ -9205,7 +6574,7 @@ return /******/ (function(modules) { // webpackBootstrap module.exports = DataSet; /***/ }, -/* 15 */ +/* 9 */ /***/ function(module, exports) { /** @@ -9410,13 +6779,13 @@ return /******/ (function(modules) { // webpackBootstrap module.exports = Queue; /***/ }, -/* 16 */ +/* 10 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; - var util = __webpack_require__(7); - var DataSet = __webpack_require__(14); + var util = __webpack_require__(1); + var DataSet = __webpack_require__(8); /** * DataView @@ -9452,7 +6821,7 @@ return /******/ (function(modules) { // webpackBootstrap * @param {DataSet | DataView} data */ DataView.prototype.setData = function (data) { - var ids, i, len; + var ids, id, i, len; if (this._data) { // unsubscribe from current dataset @@ -9461,12 +6830,7 @@ return /******/ (function(modules) { // webpackBootstrap } // trigger a remove of all items in memory - ids = []; - for (var id in this._ids) { - if (this._ids.hasOwnProperty(id)) { - ids.push(id); - } - } + ids = Object.keys(this._ids); this._ids = {}; this.length = 0; this._trigger('remove', { items: ids }); @@ -9499,34 +6863,34 @@ return /******/ (function(modules) { // webpackBootstrap * containing a variable parameter. */ DataView.prototype.refresh = function () { - var id; + var id, i, len; var ids = this._data.getIds({ filter: this._options && this._options.filter }); + var oldIds = Object.keys(this._ids); var newIds = {}; var added = []; var removed = []; // check for additions - for (var i = 0; i < ids.length; i++) { + for (i = 0, len = ids.length; i < len; i++) { id = ids[i]; newIds[id] = true; if (!this._ids[id]) { added.push(id); this._ids[id] = true; - this.length++; } } // check for removals - for (id in this._ids) { - if (this._ids.hasOwnProperty(id)) { - if (!newIds[id]) { - removed.push(id); - delete this._ids[id]; - this.length--; - } + for (i = 0, len = oldIds.length; i < len; i++) { + id = oldIds[i]; + if (!newIds[id]) { + removed.push(id); + delete this._ids[id]; } } + this.length += added.length - removed.length; + // trigger events if (added.length) { this._trigger('add', { items: added }); @@ -9646,6 +7010,46 @@ return /******/ (function(modules) { // webpackBootstrap return ids; }; + /** + * Map every item in the dataset. + * @param {function} callback + * @param {Object} [options] Available options: + * {Object.} [type] + * {String[]} [fields] filter fields + * {function} [filter] filter items + * {String | function} [order] Order the items by + * a field name or custom sort function. + * @return {Object[]} mappedItems + */ + DataView.prototype.map = function (callback, options) { + var mappedItems = []; + if (this._data) { + var defaultFilter = this._options.filter; + var filter; + + if (options && options.filter) { + if (defaultFilter) { + filter = function (item) { + return defaultFilter(item) && options.filter(item); + }; + } else { + filter = options.filter; + } + } else { + filter = defaultFilter; + } + + mappedItems = this._data.map(callback, { + filter: filter, + order: options && options.order + }); + } else { + mappedItems = []; + } + + return mappedItems; + }; + /** * Get the DataSet to which this DataView is connected. In case there is a chain * of multiple DataViews, the root DataSet of this chain is returned. @@ -9711,7 +7115,9 @@ return /******/ (function(modules) { // webpackBootstrap if (this._ids[id]) { delete this._ids[id]; removed.push(id); - } else {} + } else { + // nothing interesting for me :-( + } } } @@ -9755,24 +7161,22 @@ return /******/ (function(modules) { // webpackBootstrap module.exports = DataView; - // nothing interesting for me :-( - /***/ }, -/* 17 */ +/* 11 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; - var Emitter = __webpack_require__(19); - var DataSet = __webpack_require__(14); - var DataView = __webpack_require__(16); - var util = __webpack_require__(7); - var Point3d = __webpack_require__(20); - var Point2d = __webpack_require__(18); - var Camera = __webpack_require__(21); - var Filter = __webpack_require__(22); - var Slider = __webpack_require__(23); - var StepNumber = __webpack_require__(24); + var Emitter = __webpack_require__(12); + var DataSet = __webpack_require__(8); + var DataView = __webpack_require__(10); + var util = __webpack_require__(1); + var Point3d = __webpack_require__(13); + var Point2d = __webpack_require__(14); + var Camera = __webpack_require__(15); + var Filter = __webpack_require__(16); + var Slider = __webpack_require__(17); + var StepNumber = __webpack_require__(18); /** * @constructor Graph3d @@ -9863,6 +7267,8 @@ return /******/ (function(modules) { // webpackBootstrap strokeWidth: 1 // px }; + this.dotSizeRatio = 0.02; // size of the dots as a fraction of the graph width + // create a frame and canvas this.create(); @@ -10000,9 +7406,11 @@ return /******/ (function(modules) { // webpackBootstrap if (backgroundColor.fill !== undefined) fill = backgroundColor.fill; if (backgroundColor.stroke !== undefined) stroke = backgroundColor.stroke; if (backgroundColor.strokeWidth !== undefined) strokeWidth = backgroundColor.strokeWidth; - } else if (backgroundColor === undefined) {} else { - throw 'Unsupported type of backgroundColor'; - } + } else if (backgroundColor === undefined) { + // use use defaults + } else { + throw 'Unsupported type of backgroundColor'; + } this.frame.style.backgroundColor = fill; this.frame.style.borderColor = stroke; @@ -10579,6 +7987,8 @@ return /******/ (function(modules) { // webpackBootstrap if (options.yValueLabel !== undefined) this.yValueLabel = options.yValueLabel; if (options.zValueLabel !== undefined) this.zValueLabel = options.zValueLabel; + if (options.dotSizeRatio !== undefined) this.dotSizeRatio = options.dotSizeRatio; + if (options.style !== undefined) { var styleNumber = this._getStyleNumber(options.style); if (styleNumber !== -1) { @@ -10701,16 +8111,16 @@ return /******/ (function(modules) { // webpackBootstrap if (this.style === Graph3d.STYLE.DOTCOLOR || this.style === Graph3d.STYLE.DOTSIZE) { - var dotSize = this.frame.clientWidth * 0.02; + var dotSize = this.frame.clientWidth * this.dotSizeRatio; var widthMin, widthMax; if (this.style === Graph3d.STYLE.DOTSIZE) { widthMin = dotSize / 2; // px widthMax = dotSize / 2 + dotSize * 2; // Todo: put this in one function } else { - widthMin = 20; // px - widthMax = 20; // px - } + widthMin = 20; // px + widthMax = 20; // px + } var height = Math.max(this.frame.clientHeight * 0.25, 100); var top = this.margin; @@ -11246,9 +8656,9 @@ return /******/ (function(modules) { // webpackBootstrap strokeStyle = this.axisColor; // TODO: should be customizable } } else { - fillStyle = 'gray'; - strokeStyle = this.axisColor; - } + fillStyle = 'gray'; + strokeStyle = this.axisColor; + } ctx.lineWidth = this._getStrokeWidth(point); ctx.fillStyle = fillStyle; @@ -11264,39 +8674,39 @@ return /******/ (function(modules) { // webpackBootstrap } } } else { - // grid style - for (i = 0; i < this.dataPoints.length; i++) { - point = this.dataPoints[i]; - right = this.dataPoints[i].pointRight; - top = this.dataPoints[i].pointTop; + // grid style + for (i = 0; i < this.dataPoints.length; i++) { + point = this.dataPoints[i]; + right = this.dataPoints[i].pointRight; + top = this.dataPoints[i].pointTop; - if (point !== undefined && right !== undefined) { - // calculate Hue from the current value. At zMin the hue is 240, at zMax the hue is 0 - zAvg = (point.point.z + right.point.z) / 2; - h = (1 - (zAvg - this.zMin) * this.scale.z / this.verticalRatio) * 240; + if (point !== undefined && right !== undefined) { + // calculate Hue from the current value. At zMin the hue is 240, at zMax the hue is 0 + zAvg = (point.point.z + right.point.z) / 2; + h = (1 - (zAvg - this.zMin) * this.scale.z / this.verticalRatio) * 240; - ctx.lineWidth = this._getStrokeWidth(point) * 2; - ctx.strokeStyle = this._hsv2rgb(h, 1, 1); - ctx.beginPath(); - ctx.moveTo(point.screen.x, point.screen.y); - ctx.lineTo(right.screen.x, right.screen.y); - ctx.stroke(); - } + ctx.lineWidth = this._getStrokeWidth(point) * 2; + ctx.strokeStyle = this._hsv2rgb(h, 1, 1); + ctx.beginPath(); + ctx.moveTo(point.screen.x, point.screen.y); + ctx.lineTo(right.screen.x, right.screen.y); + ctx.stroke(); + } - if (point !== undefined && top !== undefined) { - // calculate Hue from the current value. At zMin the hue is 240, at zMax the hue is 0 - zAvg = (point.point.z + top.point.z) / 2; - h = (1 - (zAvg - this.zMin) * this.scale.z / this.verticalRatio) * 240; + if (point !== undefined && top !== undefined) { + // calculate Hue from the current value. At zMin the hue is 240, at zMax the hue is 0 + zAvg = (point.point.z + top.point.z) / 2; + h = (1 - (zAvg - this.zMin) * this.scale.z / this.verticalRatio) * 240; - ctx.lineWidth = this._getStrokeWidth(point) * 2; - ctx.strokeStyle = this._hsv2rgb(h, 1, 1); - ctx.beginPath(); - ctx.moveTo(point.screen.x, point.screen.y); - ctx.lineTo(top.screen.x, top.screen.y); - ctx.stroke(); + ctx.lineWidth = this._getStrokeWidth(point) * 2; + ctx.strokeStyle = this._hsv2rgb(h, 1, 1); + ctx.beginPath(); + ctx.moveTo(point.screen.x, point.screen.y); + ctx.lineTo(top.screen.x, top.screen.y); + ctx.stroke(); + } } } - } }; Graph3d.prototype._getStrokeWidth = function (point) { @@ -11341,7 +8751,7 @@ return /******/ (function(modules) { // webpackBootstrap this.dataPoints.sort(sortDepth); // draw the datapoints as colored circles - var dotSize = this.frame.clientWidth * 0.02; // px + var dotSize = this.frame.clientWidth * this.dotSizeRatio; // px for (i = 0; i < this.dataPoints.length; i++) { var point = this.dataPoints[i]; @@ -12003,28 +9413,8 @@ return /******/ (function(modules) { // webpackBootstrap module.exports = Graph3d; - // use use defaults - /***/ }, -/* 18 */ -/***/ function(module, exports) { - - /** - * @prototype Point2d - * @param {Number} [x] - * @param {Number} [y] - */ - "use strict"; - - function Point2d(x, y) { - this.x = x !== undefined ? x : 0; - this.y = y !== undefined ? y : 0; - } - - module.exports = Point2d; - -/***/ }, -/* 19 */ +/* 12 */ /***/ function(module, exports) { @@ -12194,7 +9584,7 @@ return /******/ (function(modules) { // webpackBootstrap /***/ }, -/* 20 */ +/* 13 */ /***/ function(module, exports) { /** @@ -12277,12 +9667,30 @@ return /******/ (function(modules) { // webpackBootstrap module.exports = Point3d; /***/ }, -/* 21 */ +/* 14 */ +/***/ function(module, exports) { + + /** + * @prototype Point2d + * @param {Number} [x] + * @param {Number} [y] + */ + "use strict"; + + function Point2d(x, y) { + this.x = x !== undefined ? x : 0; + this.y = y !== undefined ? y : 0; + } + + module.exports = Point2d; + +/***/ }, +/* 15 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; - var Point3d = __webpack_require__(20); + var Point3d = __webpack_require__(13); /** * @class Camera @@ -12418,12 +9826,12 @@ return /******/ (function(modules) { // webpackBootstrap module.exports = Camera; /***/ }, -/* 22 */ +/* 16 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; - var DataView = __webpack_require__(16); + var DataView = __webpack_require__(10); /** * @class Filter @@ -12629,12 +10037,12 @@ return /******/ (function(modules) { // webpackBootstrap module.exports = Filter; /***/ }, -/* 23 */ +/* 17 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; - var util = __webpack_require__(7); + var util = __webpack_require__(1); /** * @constructor Slider @@ -12977,7 +10385,7 @@ return /******/ (function(modules) { // webpackBootstrap module.exports = Slider; /***/ }, -/* 24 */ +/* 18 */ /***/ function(module, exports) { /** @@ -13121,28 +10529,29 @@ return /******/ (function(modules) { // webpackBootstrap module.exports = StepNumber; /***/ }, -/* 25 */ +/* 19 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; - var Emitter = __webpack_require__(19); - var Hammer = __webpack_require__(3); - var util = __webpack_require__(7); - var DataSet = __webpack_require__(14); - var DataView = __webpack_require__(16); - var Range = __webpack_require__(29); - var Core = __webpack_require__(32); - var TimeAxis = __webpack_require__(41); - var CurrentTime = __webpack_require__(26); - var CustomTime = __webpack_require__(44); - var ItemSet = __webpack_require__(33); + var Emitter = __webpack_require__(12); + var Hammer = __webpack_require__(20); + var moment = __webpack_require__(2); + var util = __webpack_require__(1); + var DataSet = __webpack_require__(8); + var DataView = __webpack_require__(10); + var Range = __webpack_require__(23); + var Core = __webpack_require__(27); + var TimeAxis = __webpack_require__(38); + var CurrentTime = __webpack_require__(43); + var CustomTime = __webpack_require__(41); + var ItemSet = __webpack_require__(28); - var Configurator = __webpack_require__(45); - var Validator = __webpack_require__(47)['default']; - var printStyle = __webpack_require__(47).printStyle; - var allOptions = __webpack_require__(48).allOptions; - var configureOptions = __webpack_require__(48).configureOptions; + var Configurator = __webpack_require__(44); + var Validator = __webpack_require__(46)['default']; + var printStyle = __webpack_require__(46).printStyle; + var allOptions = __webpack_require__(47).allOptions; + var configureOptions = __webpack_require__(47).configureOptions; /** * Create a timeline visualization @@ -13171,12 +10580,15 @@ return /******/ (function(modules) { // webpackBootstrap end: null, autoResize: true, + throttleRedraw: 0, // ms orientation: { axis: 'bottom', // axis orientation: 'bottom', 'top', or 'both' item: 'bottom' // not relevant }, + moment: moment, + width: null, height: null, maxHeight: null, @@ -13245,6 +10657,27 @@ return /******/ (function(modules) { // webpackBootstrap me.emit('contextmenu', me.getEventProperties(event)); }; + //Single time autoscale/fit + this.fitDone = false; + this.on('changed', function () { + if (this.itemsData == null) return; + if (!me.fitDone) { + me.fitDone = true; + if (me.options.start != undefined || me.options.end != undefined) { + if (me.options.start == undefined || me.options.end == undefined) { + var range = me.getItemRange(); + } + + var start = me.options.start != undefined ? me.options.start : range.min; + var end = me.options.end != undefined ? me.options.end : range.max; + + me.setWindow(start, end, { animation: false }); + } else { + me.fit({ animation: false }); + } + } + }); + // apply options if (options) { this.setOptions(options); @@ -13258,9 +10691,10 @@ return /******/ (function(modules) { // webpackBootstrap // create itemset if (items) { this.setItems(items); - } else { - this._redraw(); } + + // draw for the first time + this._redraw(); } // Extend the functionality from Core @@ -13279,6 +10713,8 @@ return /******/ (function(modules) { // webpackBootstrap * Force a redraw. The size of all items will be recalculated. * Can be useful to manually redraw when option autoResize=false and the window * has been resized, or when the items CSS has been changed. + * + * Note: this function will be overridden on construction with a trottled version */ Timeline.prototype.redraw = function () { this.itemSet && this.itemSet.markDirty({ refreshItems: true }); @@ -13315,8 +10751,6 @@ return /******/ (function(modules) { // webpackBootstrap * @param {vis.DataSet | Array | null} items */ Timeline.prototype.setItems = function (items) { - var initialLoad = this.itemsData == null; - // convert to type DataSet when needed var newDataSet; if (!items) { @@ -13336,21 +10770,6 @@ return /******/ (function(modules) { // webpackBootstrap // set items this.itemsData = newDataSet; this.itemSet && this.itemSet.setItems(newDataSet); - - if (initialLoad) { - if (this.options.start != undefined || this.options.end != undefined) { - if (this.options.start == undefined || this.options.end == undefined) { - var range = this.getItemRange(); - } - - var start = this.options.start != undefined ? this.options.start : range.min; - var end = this.options.end != undefined ? this.options.end : range.max; - - this.setWindow(start, end, { animation: false }); - } else { - this.fit({ animation: false }); - } - } }; /** @@ -13497,8 +10916,8 @@ return /******/ (function(modules) { // webpackBootstrap // get a rough approximation for the range based on the items start and end dates var range = this.getDataRange(); - var min = range.min; - var max = range.max; + var min = range.min !== null ? range.min.valueOf() : null; + var max = range.max !== null ? range.max.valueOf() : null; var minItem = null; var maxItem = null; @@ -13517,7 +10936,10 @@ return /******/ (function(modules) { // webpackBootstrap var getEnd = function getEnd(item) { var end = item.data.end != undefined ? item.data.end : item.data.start; return util.convert(end, 'Date').valueOf(); - }; + } + + // calculate the date of the left side and right side of the items given + ; interval = max - min; // ms @@ -13525,16 +10947,15 @@ return /******/ (function(modules) { // webpackBootstrap interval = 10; } factor = interval / _this.props.center.width; - - // calculate the date of the left side and right side of the items given util.forEach(_this.itemSet.items, (function (item) { item.show(); + item.repositionX(); var start = getStart(item); var end = getEnd(item); - var left = new Date(start - (item.getWidthLeft() + 10) * factor); - var right = new Date(end + (item.getWidthRight() + 10) * factor); + var left = start - (item.getWidthLeft() + 10) * factor; + var right = end + (item.getWidthRight() + 10) * factor; if (left < min) { min = left; @@ -13583,7 +11004,7 @@ return /******/ (function(modules) { // webpackBootstrap min = start; } if (max === null || end > max) { - max = start; + max = end; } }); } @@ -13651,274 +11072,2848 @@ return /******/ (function(modules) { // webpackBootstrap module.exports = Timeline; /***/ }, -/* 26 */ +/* 20 */ /***/ function(module, exports, __webpack_require__) { + // Only load hammer.js when in a browser environment + // (loading hammer.js in a node.js environment gives errors) 'use strict'; - var util = __webpack_require__(7); - var Component = __webpack_require__(27); - var moment = __webpack_require__(8); - var locales = __webpack_require__(28); - - /** - * A current time bar - * @param {{range: Range, dom: Object, domProps: Object}} body - * @param {Object} [options] Available parameters: - * {Boolean} [showCurrentTime] - * @constructor CurrentTime - * @extends Component - */ - function CurrentTime(body, options) { - this.body = body; - - // default options - this.defaultOptions = { - showCurrentTime: true, - - locales: locales, - locale: 'en' + if (typeof window !== 'undefined') { + var propagating = __webpack_require__(21); + var Hammer = window['Hammer'] || __webpack_require__(22); + module.exports = propagating(Hammer, { + preventDefault: 'mouse' + }); + } else { + module.exports = function () { + throw Error('hammer.js is only available in a browser, not in node.js.'); }; - this.options = util.extend({}, this.defaultOptions); - this.offset = 0; - - this._create(); - - this.setOptions(options); } - CurrentTime.prototype = new Component(); - - /** - * Create the HTML DOM for the current time bar - * @private - */ - CurrentTime.prototype._create = function () { - var bar = document.createElement('div'); - bar.className = 'vis-current-time'; - bar.style.position = 'absolute'; - bar.style.top = '0px'; - bar.style.height = '100%'; - - this.bar = bar; - }; - - /** - * Destroy the CurrentTime bar - */ - CurrentTime.prototype.destroy = function () { - this.options.showCurrentTime = false; - this.redraw(); // will remove the bar from the DOM and stop refreshing - - this.body = null; - }; - - /** - * Set options for the component. Options will be merged in current options. - * @param {Object} options Available parameters: - * {boolean} [showCurrentTime] - */ - CurrentTime.prototype.setOptions = function (options) { - if (options) { - // copy all options that we know - util.selectiveExtend(['showCurrentTime', 'locale', 'locales'], this.options, options); - } - }; - - /** - * Repaint the component - * @return {boolean} Returns true if the component is resized - */ - CurrentTime.prototype.redraw = function () { - if (this.options.showCurrentTime) { - var parent = this.body.dom.backgroundVertical; - if (this.bar.parentNode != parent) { - // attach to the dom - if (this.bar.parentNode) { - this.bar.parentNode.removeChild(this.bar); - } - parent.appendChild(this.bar); - - this.start(); - } - - var now = new Date(new Date().valueOf() + this.offset); - var x = this.body.util.toScreen(now); - - var locale = this.options.locales[this.options.locale]; - if (!locale) { - if (!this.warned) { - console.log('WARNING: options.locales[\'' + this.options.locale + '\'] not found. See http://visjs.org/docs/timeline.html#Localization'); - this.warned = true; - } - locale = this.options.locales['en']; // fall back on english when not available - } - var title = locale.current + ' ' + locale.time + ': ' + moment(now).format('dddd, MMMM Do YYYY, H:mm:ss'); - title = title.charAt(0).toUpperCase() + title.substring(1); - - this.bar.style.left = x + 'px'; - this.bar.title = title; - } else { - // remove the line from the DOM - if (this.bar.parentNode) { - this.bar.parentNode.removeChild(this.bar); - } - this.stop(); - } - - return false; - }; - - /** - * Start auto refreshing the current time bar - */ - CurrentTime.prototype.start = function () { - var me = this; - - function update() { - me.stop(); - - // determine interval to refresh - var scale = me.body.range.conversion(me.body.domProps.center.width).scale; - var interval = 1 / scale / 10; - if (interval < 30) interval = 30; - if (interval > 1000) interval = 1000; - - me.redraw(); - - // start a renderTimer to adjust for the new time - me.currentTimeTimer = setTimeout(update, interval); - } - - update(); - }; - - /** - * Stop auto refreshing the current time bar - */ - CurrentTime.prototype.stop = function () { - if (this.currentTimeTimer !== undefined) { - clearTimeout(this.currentTimeTimer); - delete this.currentTimeTimer; - } - }; - - /** - * Set a current time. This can be used for example to ensure that a client's - * time is synchronized with a shared server time. - * @param {Date | String | Number} time A Date, unix timestamp, or - * ISO date string. - */ - CurrentTime.prototype.setCurrentTime = function (time) { - var t = util.convert(time, 'Date').valueOf(); - var now = new Date().valueOf(); - this.offset = t - now; - this.redraw(); - }; - - /** - * Get the current time. - * @return {Date} Returns the current time. - */ - CurrentTime.prototype.getCurrentTime = function () { - return new Date(new Date().valueOf() + this.offset); - }; - - module.exports = CurrentTime; - /***/ }, -/* 27 */ -/***/ function(module, exports) { +/* 21 */ +/***/ function(module, exports, __webpack_require__) { + + var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;'use strict'; + + (function (factory) { + if (true) { + // AMD. Register as an anonymous module. + !(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory), __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); + } else if (typeof exports === 'object') { + // Node. Does not work with strict CommonJS, but + // only CommonJS-like environments that support module.exports, + // like Node. + module.exports = factory(); + } else { + // Browser globals (root is window) + window.propagating = factory(); + } + }(function () { + var _firstTarget = null; // singleton, will contain the target element where the touch event started + var _processing = false; // singleton, true when a touch event is being handled + + /** + * Extend an Hammer.js instance with event propagation. + * + * Features: + * - Events emitted by hammer will propagate in order from child to parent + * elements. + * - Events are extended with a function `event.stopPropagation()` to stop + * propagation to parent elements. + * - An option `preventDefault` to stop all default browser behavior. + * + * Usage: + * var hammer = propagatingHammer(new Hammer(element)); + * var hammer = propagatingHammer(new Hammer(element), {preventDefault: true}); + * + * @param {Hammer.Manager} hammer An hammer instance. + * @param {Object} [options] Available options: + * - `preventDefault: true | 'mouse' | 'touch' | 'pen'`. + * Enforce preventing the default browser behavior. + * Cannot be set to `false`. + * @return {Hammer.Manager} Returns the same hammer instance with extended + * functionality + */ + return function propagating(hammer, options) { + var _options = options || { + preventDefault: false + }; + + if (hammer.Manager) { + // This looks like the Hammer constructor. + // Overload the constructors with our own. + var Hammer = hammer; + + var PropagatingHammer = function(element, options) { + var o = Object.create(_options); + if (options) Hammer.assign(o, options); + return propagating(new Hammer(element, o), o); + }; + Hammer.assign(PropagatingHammer, Hammer); + + PropagatingHammer.Manager = function (element, options) { + var o = Object.create(_options); + if (options) Hammer.assign(o, options); + return propagating(new Hammer.Manager(element, o), o); + }; + + return PropagatingHammer; + } + + // create a wrapper object which will override the functions + // `on`, `off`, `destroy`, and `emit` of the hammer instance + var wrapper = Object.create(hammer); + + // attach to DOM element + var element = hammer.element; + + if(!element.hammer) element.hammer = []; + element.hammer.push(wrapper); + + // register an event to catch the start of a gesture and store the + // target in a singleton + hammer.on('hammer.input', function (event) { + if (_options.preventDefault === true || (_options.preventDefault === event.pointerType)) { + event.preventDefault(); + } + if (event.isFirst) { + _firstTarget = event.target; + } + }); + + /** @type {Object.>} */ + wrapper._handlers = {}; + + /** + * Register a handler for one or multiple events + * @param {String} events A space separated string with events + * @param {function} handler A callback function, called as handler(event) + * @returns {Hammer.Manager} Returns the hammer instance + */ + wrapper.on = function (events, handler) { + // register the handler + split(events).forEach(function (event) { + var _handlers = wrapper._handlers[event]; + if (!_handlers) { + wrapper._handlers[event] = _handlers = []; + + // register the static, propagated handler + hammer.on(event, propagatedHandler); + } + _handlers.push(handler); + }); + + return wrapper; + }; + + /** + * Unregister a handler for one or multiple events + * @param {String} events A space separated string with events + * @param {function} [handler] Optional. The registered handler. If not + * provided, all handlers for given events + * are removed. + * @returns {Hammer.Manager} Returns the hammer instance + */ + wrapper.off = function (events, handler) { + // unregister the handler + split(events).forEach(function (event) { + var _handlers = wrapper._handlers[event]; + if (_handlers) { + _handlers = handler ? _handlers.filter(function (h) { + return h !== handler; + }) : []; + + if (_handlers.length > 0) { + wrapper._handlers[event] = _handlers; + } + else { + // remove static, propagated handler + hammer.off(event, propagatedHandler); + delete wrapper._handlers[event]; + } + } + }); + + return wrapper; + }; + + /** + * Emit to the event listeners + * @param {string} eventType + * @param {Event} event + */ + wrapper.emit = function(eventType, event) { + _firstTarget = event.target; + hammer.emit(eventType, event); + }; + + wrapper.destroy = function () { + // Detach from DOM element + var hammers = hammer.element.hammer; + var idx = hammers.indexOf(wrapper); + if(idx !== -1) hammers.splice(idx,1); + if(!hammers.length) delete hammer.element.hammer; + + // clear all handlers + wrapper._handlers = {}; + + // call original hammer destroy + hammer.destroy(); + }; + + // split a string with space separated words + function split(events) { + return events.match(/[^ ]+/g); + } + + /** + * A static event handler, applying event propagation. + * @param {Object} event + */ + function propagatedHandler(event) { + // let only a single hammer instance handle this event + if (event.type !== 'hammer.input') { + // it is possible that the same srcEvent is used with multiple hammer events, + // we keep track on which events are handled in an object _handled + if (!event.srcEvent._handled) { + event.srcEvent._handled = {}; + } + + if (event.srcEvent._handled[event.type]) { + return; + } + else { + event.srcEvent._handled[event.type] = true; + } + } + + // attach a stopPropagation function to the event + var stopped = false; + event.stopPropagation = function () { + stopped = true; + }; + + //wrap the srcEvent's stopPropagation to also stop hammer propagation: + var srcStop = event.srcEvent.stopPropagation; + if(typeof srcStop == "function") { + event.srcEvent.stopPropagation = function(){ + srcStop(); + event.stopPropagation(); + } + } + + // attach firstTarget property to the event + event.firstTarget = _firstTarget; + + // propagate over all elements (until stopped) + var elem = _firstTarget; + while (elem && !stopped) { + var elemHammer = elem.hammer; + if(elemHammer){ + var _handlers; + for(var k = 0; k < elemHammer.length; k++){ + _handlers = elemHammer[k]._handlers[event.type]; + if(_handlers) for (var i = 0; i < _handlers.length && !stopped; i++) { + _handlers[i](event); + } + } + } + elem = elem.parentNode; + } + } + + return wrapper; + }; + })); + + +/***/ }, +/* 22 */ +/***/ function(module, exports, __webpack_require__) { + + var __WEBPACK_AMD_DEFINE_RESULT__;/*! Hammer.JS - v2.0.6 - 2015-12-23 + * http://hammerjs.github.io/ + * + * Copyright (c) 2015 Jorik Tangelder; + * Licensed under the license */ + (function(window, document, exportName, undefined) { + 'use strict'; + + var VENDOR_PREFIXES = ['', 'webkit', 'Moz', 'MS', 'ms', 'o']; + var TEST_ELEMENT = document.createElement('div'); + + var TYPE_FUNCTION = 'function'; + + var round = Math.round; + var abs = Math.abs; + var now = Date.now; /** - * Prototype for visual components - * @param {{dom: Object, domProps: Object, emitter: Emitter, range: Range}} [body] - * @param {Object} [options] + * set a timeout with a given scope + * @param {Function} fn + * @param {Number} timeout + * @param {Object} context + * @returns {number} */ - "use strict"; - - function Component(body, options) { - this.options = null; - this.props = null; + function setTimeoutContext(fn, timeout, context) { + return setTimeout(bindFn(fn, context), timeout); } /** - * Set options for the component. The new options will be merged into the - * current options. + * if the argument is an array, we want to execute the fn on each entry + * if it aint an array we don't want to do a thing. + * this is used by all the methods that accept a single and array argument. + * @param {*|Array} arg + * @param {String} fn + * @param {Object} [context] + * @returns {Boolean} + */ + function invokeArrayArg(arg, fn, context) { + if (Array.isArray(arg)) { + each(arg, context[fn], context); + return true; + } + return false; + } + + /** + * walk objects and arrays + * @param {Object} obj + * @param {Function} iterator + * @param {Object} context + */ + function each(obj, iterator, context) { + var i; + + if (!obj) { + return; + } + + if (obj.forEach) { + obj.forEach(iterator, context); + } else if (obj.length !== undefined) { + i = 0; + while (i < obj.length) { + iterator.call(context, obj[i], i, obj); + i++; + } + } else { + for (i in obj) { + obj.hasOwnProperty(i) && iterator.call(context, obj[i], i, obj); + } + } + } + + /** + * wrap a method with a deprecation warning and stack trace + * @param {Function} method + * @param {String} name + * @param {String} message + * @returns {Function} A new function wrapping the supplied method. + */ + function deprecate(method, name, message) { + var deprecationMessage = 'DEPRECATED METHOD: ' + name + '\n' + message + ' AT \n'; + return function() { + var e = new Error('get-stack-trace'); + var stack = e && e.stack ? e.stack.replace(/^[^\(]+?[\n$]/gm, '') + .replace(/^\s+at\s+/gm, '') + .replace(/^Object.\s*\(/gm, '{anonymous}()@') : 'Unknown Stack Trace'; + + var log = window.console && (window.console.warn || window.console.log); + if (log) { + log.call(window.console, deprecationMessage, stack); + } + return method.apply(this, arguments); + }; + } + + /** + * extend object. + * means that properties in dest will be overwritten by the ones in src. + * @param {Object} target + * @param {...Object} objects_to_assign + * @returns {Object} target + */ + var assign; + if (typeof Object.assign !== 'function') { + assign = function assign(target) { + if (target === undefined || target === null) { + throw new TypeError('Cannot convert undefined or null to object'); + } + + var output = Object(target); + for (var index = 1; index < arguments.length; index++) { + var source = arguments[index]; + if (source !== undefined && source !== null) { + for (var nextKey in source) { + if (source.hasOwnProperty(nextKey)) { + output[nextKey] = source[nextKey]; + } + } + } + } + return output; + }; + } else { + assign = Object.assign; + } + + /** + * extend object. + * means that properties in dest will be overwritten by the ones in src. + * @param {Object} dest + * @param {Object} src + * @param {Boolean=false} [merge] + * @returns {Object} dest + */ + var extend = deprecate(function extend(dest, src, merge) { + var keys = Object.keys(src); + var i = 0; + while (i < keys.length) { + if (!merge || (merge && dest[keys[i]] === undefined)) { + dest[keys[i]] = src[keys[i]]; + } + i++; + } + return dest; + }, 'extend', 'Use `assign`.'); + + /** + * merge the values from src in the dest. + * means that properties that exist in dest will not be overwritten by src + * @param {Object} dest + * @param {Object} src + * @returns {Object} dest + */ + var merge = deprecate(function merge(dest, src) { + return extend(dest, src, true); + }, 'merge', 'Use `assign`.'); + + /** + * simple class inheritance + * @param {Function} child + * @param {Function} base + * @param {Object} [properties] + */ + function inherit(child, base, properties) { + var baseP = base.prototype, + childP; + + childP = child.prototype = Object.create(baseP); + childP.constructor = child; + childP._super = baseP; + + if (properties) { + assign(childP, properties); + } + } + + /** + * simple function bind + * @param {Function} fn + * @param {Object} context + * @returns {Function} + */ + function bindFn(fn, context) { + return function boundFn() { + return fn.apply(context, arguments); + }; + } + + /** + * let a boolean value also be a function that must return a boolean + * this first item in args will be used as the context + * @param {Boolean|Function} val + * @param {Array} [args] + * @returns {Boolean} + */ + function boolOrFn(val, args) { + if (typeof val == TYPE_FUNCTION) { + return val.apply(args ? args[0] || undefined : undefined, args); + } + return val; + } + + /** + * use the val2 when val1 is undefined + * @param {*} val1 + * @param {*} val2 + * @returns {*} + */ + function ifUndefined(val1, val2) { + return (val1 === undefined) ? val2 : val1; + } + + /** + * addEventListener with multiple events at once + * @param {EventTarget} target + * @param {String} types + * @param {Function} handler + */ + function addEventListeners(target, types, handler) { + each(splitStr(types), function(type) { + target.addEventListener(type, handler, false); + }); + } + + /** + * removeEventListener with multiple events at once + * @param {EventTarget} target + * @param {String} types + * @param {Function} handler + */ + function removeEventListeners(target, types, handler) { + each(splitStr(types), function(type) { + target.removeEventListener(type, handler, false); + }); + } + + /** + * find if a node is in the given parent + * @method hasParent + * @param {HTMLElement} node + * @param {HTMLElement} parent + * @return {Boolean} found + */ + function hasParent(node, parent) { + while (node) { + if (node == parent) { + return true; + } + node = node.parentNode; + } + return false; + } + + /** + * small indexOf wrapper + * @param {String} str + * @param {String} find + * @returns {Boolean} found + */ + function inStr(str, find) { + return str.indexOf(find) > -1; + } + + /** + * split string on whitespace + * @param {String} str + * @returns {Array} words + */ + function splitStr(str) { + return str.trim().split(/\s+/g); + } + + /** + * find if a array contains the object using indexOf or a simple polyFill + * @param {Array} src + * @param {String} find + * @param {String} [findByKey] + * @return {Boolean|Number} false when not found, or the index + */ + function inArray(src, find, findByKey) { + if (src.indexOf && !findByKey) { + return src.indexOf(find); + } else { + var i = 0; + while (i < src.length) { + if ((findByKey && src[i][findByKey] == find) || (!findByKey && src[i] === find)) { + return i; + } + i++; + } + return -1; + } + } + + /** + * convert array-like objects to real arrays + * @param {Object} obj + * @returns {Array} + */ + function toArray(obj) { + return Array.prototype.slice.call(obj, 0); + } + + /** + * unique array with objects based on a key (like 'id') or just by the array's value + * @param {Array} src [{id:1},{id:2},{id:1}] + * @param {String} [key] + * @param {Boolean} [sort=False] + * @returns {Array} [{id:1},{id:2}] + */ + function uniqueArray(src, key, sort) { + var results = []; + var values = []; + var i = 0; + + while (i < src.length) { + var val = key ? src[i][key] : src[i]; + if (inArray(values, val) < 0) { + results.push(src[i]); + } + values[i] = val; + i++; + } + + if (sort) { + if (!key) { + results = results.sort(); + } else { + results = results.sort(function sortUniqueArray(a, b) { + return a[key] > b[key]; + }); + } + } + + return results; + } + + /** + * get the prefixed property + * @param {Object} obj + * @param {String} property + * @returns {String|Undefined} prefixed + */ + function prefixed(obj, property) { + var prefix, prop; + var camelProp = property[0].toUpperCase() + property.slice(1); + + var i = 0; + while (i < VENDOR_PREFIXES.length) { + prefix = VENDOR_PREFIXES[i]; + prop = (prefix) ? prefix + camelProp : property; + + if (prop in obj) { + return prop; + } + i++; + } + return undefined; + } + + /** + * get a unique id + * @returns {number} uniqueId + */ + var _uniqueId = 1; + function uniqueId() { + return _uniqueId++; + } + + /** + * get the window object of an element + * @param {HTMLElement} element + * @returns {DocumentView|Window} + */ + function getWindowForElement(element) { + var doc = element.ownerDocument || element; + return (doc.defaultView || doc.parentWindow || window); + } + + var MOBILE_REGEX = /mobile|tablet|ip(ad|hone|od)|android/i; + + var SUPPORT_TOUCH = ('ontouchstart' in window); + var SUPPORT_POINTER_EVENTS = prefixed(window, 'PointerEvent') !== undefined; + var SUPPORT_ONLY_TOUCH = SUPPORT_TOUCH && MOBILE_REGEX.test(navigator.userAgent); + + var INPUT_TYPE_TOUCH = 'touch'; + var INPUT_TYPE_PEN = 'pen'; + var INPUT_TYPE_MOUSE = 'mouse'; + var INPUT_TYPE_KINECT = 'kinect'; + + var COMPUTE_INTERVAL = 25; + + var INPUT_START = 1; + var INPUT_MOVE = 2; + var INPUT_END = 4; + var INPUT_CANCEL = 8; + + var DIRECTION_NONE = 1; + var DIRECTION_LEFT = 2; + var DIRECTION_RIGHT = 4; + var DIRECTION_UP = 8; + var DIRECTION_DOWN = 16; + + var DIRECTION_HORIZONTAL = DIRECTION_LEFT | DIRECTION_RIGHT; + var DIRECTION_VERTICAL = DIRECTION_UP | DIRECTION_DOWN; + var DIRECTION_ALL = DIRECTION_HORIZONTAL | DIRECTION_VERTICAL; + + var PROPS_XY = ['x', 'y']; + var PROPS_CLIENT_XY = ['clientX', 'clientY']; + + /** + * create new input type manager + * @param {Manager} manager + * @param {Function} callback + * @returns {Input} + * @constructor + */ + function Input(manager, callback) { + var self = this; + this.manager = manager; + this.callback = callback; + this.element = manager.element; + this.target = manager.options.inputTarget; + + // smaller wrapper around the handler, for the scope and the enabled state of the manager, + // so when disabled the input events are completely bypassed. + this.domHandler = function(ev) { + if (boolOrFn(manager.options.enable, [manager])) { + self.handler(ev); + } + }; + + this.init(); + + } + + Input.prototype = { + /** + * should handle the inputEvent data and trigger the callback + * @virtual + */ + handler: function() { }, + + /** + * bind the events + */ + init: function() { + this.evEl && addEventListeners(this.element, this.evEl, this.domHandler); + this.evTarget && addEventListeners(this.target, this.evTarget, this.domHandler); + this.evWin && addEventListeners(getWindowForElement(this.element), this.evWin, this.domHandler); + }, + + /** + * unbind the events + */ + destroy: function() { + this.evEl && removeEventListeners(this.element, this.evEl, this.domHandler); + this.evTarget && removeEventListeners(this.target, this.evTarget, this.domHandler); + this.evWin && removeEventListeners(getWindowForElement(this.element), this.evWin, this.domHandler); + } + }; + + /** + * create new input type manager + * called by the Manager constructor + * @param {Hammer} manager + * @returns {Input} + */ + function createInputInstance(manager) { + var Type; + var inputClass = manager.options.inputClass; + + if (inputClass) { + Type = inputClass; + } else if (SUPPORT_POINTER_EVENTS) { + Type = PointerEventInput; + } else if (SUPPORT_ONLY_TOUCH) { + Type = TouchInput; + } else if (!SUPPORT_TOUCH) { + Type = MouseInput; + } else { + Type = TouchMouseInput; + } + return new (Type)(manager, inputHandler); + } + + /** + * handle input events + * @param {Manager} manager + * @param {String} eventType + * @param {Object} input + */ + function inputHandler(manager, eventType, input) { + var pointersLen = input.pointers.length; + var changedPointersLen = input.changedPointers.length; + var isFirst = (eventType & INPUT_START && (pointersLen - changedPointersLen === 0)); + var isFinal = (eventType & (INPUT_END | INPUT_CANCEL) && (pointersLen - changedPointersLen === 0)); + + input.isFirst = !!isFirst; + input.isFinal = !!isFinal; + + if (isFirst) { + manager.session = {}; + } + + // source event is the normalized value of the domEvents + // like 'touchstart, mouseup, pointerdown' + input.eventType = eventType; + + // compute scale, rotation etc + computeInputData(manager, input); + + // emit secret event + manager.emit('hammer.input', input); + + manager.recognize(input); + manager.session.prevInput = input; + } + + /** + * extend the data with some usable properties like scale, rotate, velocity etc + * @param {Object} manager + * @param {Object} input + */ + function computeInputData(manager, input) { + var session = manager.session; + var pointers = input.pointers; + var pointersLength = pointers.length; + + // store the first input to calculate the distance and direction + if (!session.firstInput) { + session.firstInput = simpleCloneInputData(input); + } + + // to compute scale and rotation we need to store the multiple touches + if (pointersLength > 1 && !session.firstMultiple) { + session.firstMultiple = simpleCloneInputData(input); + } else if (pointersLength === 1) { + session.firstMultiple = false; + } + + var firstInput = session.firstInput; + var firstMultiple = session.firstMultiple; + var offsetCenter = firstMultiple ? firstMultiple.center : firstInput.center; + + var center = input.center = getCenter(pointers); + input.timeStamp = now(); + input.deltaTime = input.timeStamp - firstInput.timeStamp; + + input.angle = getAngle(offsetCenter, center); + input.distance = getDistance(offsetCenter, center); + + computeDeltaXY(session, input); + input.offsetDirection = getDirection(input.deltaX, input.deltaY); + + var overallVelocity = getVelocity(input.deltaTime, input.deltaX, input.deltaY); + input.overallVelocityX = overallVelocity.x; + input.overallVelocityY = overallVelocity.y; + input.overallVelocity = (abs(overallVelocity.x) > abs(overallVelocity.y)) ? overallVelocity.x : overallVelocity.y; + + input.scale = firstMultiple ? getScale(firstMultiple.pointers, pointers) : 1; + input.rotation = firstMultiple ? getRotation(firstMultiple.pointers, pointers) : 0; + + input.maxPointers = !session.prevInput ? input.pointers.length : ((input.pointers.length > + session.prevInput.maxPointers) ? input.pointers.length : session.prevInput.maxPointers); + + computeIntervalInputData(session, input); + + // find the correct target + var target = manager.element; + if (hasParent(input.srcEvent.target, target)) { + target = input.srcEvent.target; + } + input.target = target; + } + + function computeDeltaXY(session, input) { + var center = input.center; + var offset = session.offsetDelta || {}; + var prevDelta = session.prevDelta || {}; + var prevInput = session.prevInput || {}; + + if (input.eventType === INPUT_START || prevInput.eventType === INPUT_END) { + prevDelta = session.prevDelta = { + x: prevInput.deltaX || 0, + y: prevInput.deltaY || 0 + }; + + offset = session.offsetDelta = { + x: center.x, + y: center.y + }; + } + + input.deltaX = prevDelta.x + (center.x - offset.x); + input.deltaY = prevDelta.y + (center.y - offset.y); + } + + /** + * velocity is calculated every x ms + * @param {Object} session + * @param {Object} input + */ + function computeIntervalInputData(session, input) { + var last = session.lastInterval || input, + deltaTime = input.timeStamp - last.timeStamp, + velocity, velocityX, velocityY, direction; + + if (input.eventType != INPUT_CANCEL && (deltaTime > COMPUTE_INTERVAL || last.velocity === undefined)) { + var deltaX = input.deltaX - last.deltaX; + var deltaY = input.deltaY - last.deltaY; + + var v = getVelocity(deltaTime, deltaX, deltaY); + velocityX = v.x; + velocityY = v.y; + velocity = (abs(v.x) > abs(v.y)) ? v.x : v.y; + direction = getDirection(deltaX, deltaY); + + session.lastInterval = input; + } else { + // use latest velocity info if it doesn't overtake a minimum period + velocity = last.velocity; + velocityX = last.velocityX; + velocityY = last.velocityY; + direction = last.direction; + } + + input.velocity = velocity; + input.velocityX = velocityX; + input.velocityY = velocityY; + input.direction = direction; + } + + /** + * create a simple clone from the input used for storage of firstInput and firstMultiple + * @param {Object} input + * @returns {Object} clonedInputData + */ + function simpleCloneInputData(input) { + // make a simple copy of the pointers because we will get a reference if we don't + // we only need clientXY for the calculations + var pointers = []; + var i = 0; + while (i < input.pointers.length) { + pointers[i] = { + clientX: round(input.pointers[i].clientX), + clientY: round(input.pointers[i].clientY) + }; + i++; + } + + return { + timeStamp: now(), + pointers: pointers, + center: getCenter(pointers), + deltaX: input.deltaX, + deltaY: input.deltaY + }; + } + + /** + * get the center of all the pointers + * @param {Array} pointers + * @return {Object} center contains `x` and `y` properties + */ + function getCenter(pointers) { + var pointersLength = pointers.length; + + // no need to loop when only one touch + if (pointersLength === 1) { + return { + x: round(pointers[0].clientX), + y: round(pointers[0].clientY) + }; + } + + var x = 0, y = 0, i = 0; + while (i < pointersLength) { + x += pointers[i].clientX; + y += pointers[i].clientY; + i++; + } + + return { + x: round(x / pointersLength), + y: round(y / pointersLength) + }; + } + + /** + * calculate the velocity between two points. unit is in px per ms. + * @param {Number} deltaTime + * @param {Number} x + * @param {Number} y + * @return {Object} velocity `x` and `y` + */ + function getVelocity(deltaTime, x, y) { + return { + x: x / deltaTime || 0, + y: y / deltaTime || 0 + }; + } + + /** + * get the direction between two points + * @param {Number} x + * @param {Number} y + * @return {Number} direction + */ + function getDirection(x, y) { + if (x === y) { + return DIRECTION_NONE; + } + + if (abs(x) >= abs(y)) { + return x < 0 ? DIRECTION_LEFT : DIRECTION_RIGHT; + } + return y < 0 ? DIRECTION_UP : DIRECTION_DOWN; + } + + /** + * calculate the absolute distance between two points + * @param {Object} p1 {x, y} + * @param {Object} p2 {x, y} + * @param {Array} [props] containing x and y keys + * @return {Number} distance + */ + function getDistance(p1, p2, props) { + if (!props) { + props = PROPS_XY; + } + var x = p2[props[0]] - p1[props[0]], + y = p2[props[1]] - p1[props[1]]; + + return Math.sqrt((x * x) + (y * y)); + } + + /** + * calculate the angle between two coordinates + * @param {Object} p1 + * @param {Object} p2 + * @param {Array} [props] containing x and y keys + * @return {Number} angle + */ + function getAngle(p1, p2, props) { + if (!props) { + props = PROPS_XY; + } + var x = p2[props[0]] - p1[props[0]], + y = p2[props[1]] - p1[props[1]]; + return Math.atan2(y, x) * 180 / Math.PI; + } + + /** + * calculate the rotation degrees between two pointersets + * @param {Array} start array of pointers + * @param {Array} end array of pointers + * @return {Number} rotation + */ + function getRotation(start, end) { + return getAngle(end[1], end[0], PROPS_CLIENT_XY) + getAngle(start[1], start[0], PROPS_CLIENT_XY); + } + + /** + * calculate the scale factor between two pointersets + * no scale is 1, and goes down to 0 when pinched together, and bigger when pinched out + * @param {Array} start array of pointers + * @param {Array} end array of pointers + * @return {Number} scale + */ + function getScale(start, end) { + return getDistance(end[0], end[1], PROPS_CLIENT_XY) / getDistance(start[0], start[1], PROPS_CLIENT_XY); + } + + var MOUSE_INPUT_MAP = { + mousedown: INPUT_START, + mousemove: INPUT_MOVE, + mouseup: INPUT_END + }; + + var MOUSE_ELEMENT_EVENTS = 'mousedown'; + var MOUSE_WINDOW_EVENTS = 'mousemove mouseup'; + + /** + * Mouse events input + * @constructor + * @extends Input + */ + function MouseInput() { + this.evEl = MOUSE_ELEMENT_EVENTS; + this.evWin = MOUSE_WINDOW_EVENTS; + + this.allow = true; // used by Input.TouchMouse to disable mouse events + this.pressed = false; // mousedown state + + Input.apply(this, arguments); + } + + inherit(MouseInput, Input, { + /** + * handle mouse events + * @param {Object} ev + */ + handler: function MEhandler(ev) { + var eventType = MOUSE_INPUT_MAP[ev.type]; + + // on start we want to have the left mouse button down + if (eventType & INPUT_START && ev.button === 0) { + this.pressed = true; + } + + if (eventType & INPUT_MOVE && ev.which !== 1) { + eventType = INPUT_END; + } + + // mouse must be down, and mouse events are allowed (see the TouchMouse input) + if (!this.pressed || !this.allow) { + return; + } + + if (eventType & INPUT_END) { + this.pressed = false; + } + + this.callback(this.manager, eventType, { + pointers: [ev], + changedPointers: [ev], + pointerType: INPUT_TYPE_MOUSE, + srcEvent: ev + }); + } + }); + + var POINTER_INPUT_MAP = { + pointerdown: INPUT_START, + pointermove: INPUT_MOVE, + pointerup: INPUT_END, + pointercancel: INPUT_CANCEL, + pointerout: INPUT_CANCEL + }; + + // in IE10 the pointer types is defined as an enum + var IE10_POINTER_TYPE_ENUM = { + 2: INPUT_TYPE_TOUCH, + 3: INPUT_TYPE_PEN, + 4: INPUT_TYPE_MOUSE, + 5: INPUT_TYPE_KINECT // see https://twitter.com/jacobrossi/status/480596438489890816 + }; + + var POINTER_ELEMENT_EVENTS = 'pointerdown'; + var POINTER_WINDOW_EVENTS = 'pointermove pointerup pointercancel'; + + // IE10 has prefixed support, and case-sensitive + if (window.MSPointerEvent && !window.PointerEvent) { + POINTER_ELEMENT_EVENTS = 'MSPointerDown'; + POINTER_WINDOW_EVENTS = 'MSPointerMove MSPointerUp MSPointerCancel'; + } + + /** + * Pointer events input + * @constructor + * @extends Input + */ + function PointerEventInput() { + this.evEl = POINTER_ELEMENT_EVENTS; + this.evWin = POINTER_WINDOW_EVENTS; + + Input.apply(this, arguments); + + this.store = (this.manager.session.pointerEvents = []); + } + + inherit(PointerEventInput, Input, { + /** + * handle mouse events + * @param {Object} ev + */ + handler: function PEhandler(ev) { + var store = this.store; + var removePointer = false; + + var eventTypeNormalized = ev.type.toLowerCase().replace('ms', ''); + var eventType = POINTER_INPUT_MAP[eventTypeNormalized]; + var pointerType = IE10_POINTER_TYPE_ENUM[ev.pointerType] || ev.pointerType; + + var isTouch = (pointerType == INPUT_TYPE_TOUCH); + + // get index of the event in the store + var storeIndex = inArray(store, ev.pointerId, 'pointerId'); + + // start and mouse must be down + if (eventType & INPUT_START && (ev.button === 0 || isTouch)) { + if (storeIndex < 0) { + store.push(ev); + storeIndex = store.length - 1; + } + } else if (eventType & (INPUT_END | INPUT_CANCEL)) { + removePointer = true; + } + + // it not found, so the pointer hasn't been down (so it's probably a hover) + if (storeIndex < 0) { + return; + } + + // update the event in the store + store[storeIndex] = ev; + + this.callback(this.manager, eventType, { + pointers: store, + changedPointers: [ev], + pointerType: pointerType, + srcEvent: ev + }); + + if (removePointer) { + // remove from the store + store.splice(storeIndex, 1); + } + } + }); + + var SINGLE_TOUCH_INPUT_MAP = { + touchstart: INPUT_START, + touchmove: INPUT_MOVE, + touchend: INPUT_END, + touchcancel: INPUT_CANCEL + }; + + var SINGLE_TOUCH_TARGET_EVENTS = 'touchstart'; + var SINGLE_TOUCH_WINDOW_EVENTS = 'touchstart touchmove touchend touchcancel'; + + /** + * Touch events input + * @constructor + * @extends Input + */ + function SingleTouchInput() { + this.evTarget = SINGLE_TOUCH_TARGET_EVENTS; + this.evWin = SINGLE_TOUCH_WINDOW_EVENTS; + this.started = false; + + Input.apply(this, arguments); + } + + inherit(SingleTouchInput, Input, { + handler: function TEhandler(ev) { + var type = SINGLE_TOUCH_INPUT_MAP[ev.type]; + + // should we handle the touch events? + if (type === INPUT_START) { + this.started = true; + } + + if (!this.started) { + return; + } + + var touches = normalizeSingleTouches.call(this, ev, type); + + // when done, reset the started state + if (type & (INPUT_END | INPUT_CANCEL) && touches[0].length - touches[1].length === 0) { + this.started = false; + } + + this.callback(this.manager, type, { + pointers: touches[0], + changedPointers: touches[1], + pointerType: INPUT_TYPE_TOUCH, + srcEvent: ev + }); + } + }); + + /** + * @this {TouchInput} + * @param {Object} ev + * @param {Number} type flag + * @returns {undefined|Array} [all, changed] + */ + function normalizeSingleTouches(ev, type) { + var all = toArray(ev.touches); + var changed = toArray(ev.changedTouches); + + if (type & (INPUT_END | INPUT_CANCEL)) { + all = uniqueArray(all.concat(changed), 'identifier', true); + } + + return [all, changed]; + } + + var TOUCH_INPUT_MAP = { + touchstart: INPUT_START, + touchmove: INPUT_MOVE, + touchend: INPUT_END, + touchcancel: INPUT_CANCEL + }; + + var TOUCH_TARGET_EVENTS = 'touchstart touchmove touchend touchcancel'; + + /** + * Multi-user touch events input + * @constructor + * @extends Input + */ + function TouchInput() { + this.evTarget = TOUCH_TARGET_EVENTS; + this.targetIds = {}; + + Input.apply(this, arguments); + } + + inherit(TouchInput, Input, { + handler: function MTEhandler(ev) { + var type = TOUCH_INPUT_MAP[ev.type]; + var touches = getTouches.call(this, ev, type); + if (!touches) { + return; + } + + this.callback(this.manager, type, { + pointers: touches[0], + changedPointers: touches[1], + pointerType: INPUT_TYPE_TOUCH, + srcEvent: ev + }); + } + }); + + /** + * @this {TouchInput} + * @param {Object} ev + * @param {Number} type flag + * @returns {undefined|Array} [all, changed] + */ + function getTouches(ev, type) { + var allTouches = toArray(ev.touches); + var targetIds = this.targetIds; + + // when there is only one touch, the process can be simplified + if (type & (INPUT_START | INPUT_MOVE) && allTouches.length === 1) { + targetIds[allTouches[0].identifier] = true; + return [allTouches, allTouches]; + } + + var i, + targetTouches, + changedTouches = toArray(ev.changedTouches), + changedTargetTouches = [], + target = this.target; + + // get target touches from touches + targetTouches = allTouches.filter(function(touch) { + return hasParent(touch.target, target); + }); + + // collect touches + if (type === INPUT_START) { + i = 0; + while (i < targetTouches.length) { + targetIds[targetTouches[i].identifier] = true; + i++; + } + } + + // filter changed touches to only contain touches that exist in the collected target ids + i = 0; + while (i < changedTouches.length) { + if (targetIds[changedTouches[i].identifier]) { + changedTargetTouches.push(changedTouches[i]); + } + + // cleanup removed touches + if (type & (INPUT_END | INPUT_CANCEL)) { + delete targetIds[changedTouches[i].identifier]; + } + i++; + } + + if (!changedTargetTouches.length) { + return; + } + + return [ + // merge targetTouches with changedTargetTouches so it contains ALL touches, including 'end' and 'cancel' + uniqueArray(targetTouches.concat(changedTargetTouches), 'identifier', true), + changedTargetTouches + ]; + } + + /** + * Combined touch and mouse input + * + * Touch has a higher priority then mouse, and while touching no mouse events are allowed. + * This because touch devices also emit mouse events while doing a touch. + * + * @constructor + * @extends Input + */ + function TouchMouseInput() { + Input.apply(this, arguments); + + var handler = bindFn(this.handler, this); + this.touch = new TouchInput(this.manager, handler); + this.mouse = new MouseInput(this.manager, handler); + } + + inherit(TouchMouseInput, Input, { + /** + * handle mouse and touch events + * @param {Hammer} manager + * @param {String} inputEvent + * @param {Object} inputData + */ + handler: function TMEhandler(manager, inputEvent, inputData) { + var isTouch = (inputData.pointerType == INPUT_TYPE_TOUCH), + isMouse = (inputData.pointerType == INPUT_TYPE_MOUSE); + + // when we're in a touch event, so block all upcoming mouse events + // most mobile browser also emit mouseevents, right after touchstart + if (isTouch) { + this.mouse.allow = false; + } else if (isMouse && !this.mouse.allow) { + return; + } + + // reset the allowMouse when we're done + if (inputEvent & (INPUT_END | INPUT_CANCEL)) { + this.mouse.allow = true; + } + + this.callback(manager, inputEvent, inputData); + }, + + /** + * remove the event listeners + */ + destroy: function destroy() { + this.touch.destroy(); + this.mouse.destroy(); + } + }); + + var PREFIXED_TOUCH_ACTION = prefixed(TEST_ELEMENT.style, 'touchAction'); + var NATIVE_TOUCH_ACTION = PREFIXED_TOUCH_ACTION !== undefined; + + // magical touchAction value + var TOUCH_ACTION_COMPUTE = 'compute'; + var TOUCH_ACTION_AUTO = 'auto'; + var TOUCH_ACTION_MANIPULATION = 'manipulation'; // not implemented + var TOUCH_ACTION_NONE = 'none'; + var TOUCH_ACTION_PAN_X = 'pan-x'; + var TOUCH_ACTION_PAN_Y = 'pan-y'; + + /** + * Touch Action + * sets the touchAction property or uses the js alternative + * @param {Manager} manager + * @param {String} value + * @constructor + */ + function TouchAction(manager, value) { + this.manager = manager; + this.set(value); + } + + TouchAction.prototype = { + /** + * set the touchAction value on the element or enable the polyfill + * @param {String} value + */ + set: function(value) { + // find out the touch-action by the event handlers + if (value == TOUCH_ACTION_COMPUTE) { + value = this.compute(); + } + + if (NATIVE_TOUCH_ACTION && this.manager.element.style) { + this.manager.element.style[PREFIXED_TOUCH_ACTION] = value; + } + this.actions = value.toLowerCase().trim(); + }, + + /** + * just re-set the touchAction value + */ + update: function() { + this.set(this.manager.options.touchAction); + }, + + /** + * compute the value for the touchAction property based on the recognizer's settings + * @returns {String} value + */ + compute: function() { + var actions = []; + each(this.manager.recognizers, function(recognizer) { + if (boolOrFn(recognizer.options.enable, [recognizer])) { + actions = actions.concat(recognizer.getTouchAction()); + } + }); + return cleanTouchActions(actions.join(' ')); + }, + + /** + * this method is called on each input cycle and provides the preventing of the browser behavior + * @param {Object} input + */ + preventDefaults: function(input) { + // not needed with native support for the touchAction property + if (NATIVE_TOUCH_ACTION) { + return; + } + + var srcEvent = input.srcEvent; + var direction = input.offsetDirection; + + // if the touch action did prevented once this session + if (this.manager.session.prevented) { + srcEvent.preventDefault(); + return; + } + + var actions = this.actions; + var hasNone = inStr(actions, TOUCH_ACTION_NONE); + var hasPanY = inStr(actions, TOUCH_ACTION_PAN_Y); + var hasPanX = inStr(actions, TOUCH_ACTION_PAN_X); + + if (hasNone) { + //do not prevent defaults if this is a tap gesture + + var isTapPointer = input.pointers.length === 1; + var isTapMovement = input.distance < 2; + var isTapTouchTime = input.deltaTime < 250; + + if (isTapPointer && isTapMovement && isTapTouchTime) { + return; + } + } + + if (hasPanX && hasPanY) { + // `pan-x pan-y` means browser handles all scrolling/panning, do not prevent + return; + } + + if (hasNone || + (hasPanY && direction & DIRECTION_HORIZONTAL) || + (hasPanX && direction & DIRECTION_VERTICAL)) { + return this.preventSrc(srcEvent); + } + }, + + /** + * call preventDefault to prevent the browser's default behavior (scrolling in most cases) + * @param {Object} srcEvent + */ + preventSrc: function(srcEvent) { + this.manager.session.prevented = true; + srcEvent.preventDefault(); + } + }; + + /** + * when the touchActions are collected they are not a valid value, so we need to clean things up. * + * @param {String} actions + * @returns {*} + */ + function cleanTouchActions(actions) { + // none + if (inStr(actions, TOUCH_ACTION_NONE)) { + return TOUCH_ACTION_NONE; + } + + var hasPanX = inStr(actions, TOUCH_ACTION_PAN_X); + var hasPanY = inStr(actions, TOUCH_ACTION_PAN_Y); + + // if both pan-x and pan-y are set (different recognizers + // for different directions, e.g. horizontal pan but vertical swipe?) + // we need none (as otherwise with pan-x pan-y combined none of these + // recognizers will work, since the browser would handle all panning + if (hasPanX && hasPanY) { + return TOUCH_ACTION_NONE; + } + + // pan-x OR pan-y + if (hasPanX || hasPanY) { + return hasPanX ? TOUCH_ACTION_PAN_X : TOUCH_ACTION_PAN_Y; + } + + // manipulation + if (inStr(actions, TOUCH_ACTION_MANIPULATION)) { + return TOUCH_ACTION_MANIPULATION; + } + + return TOUCH_ACTION_AUTO; + } + + /** + * Recognizer flow explained; * + * All recognizers have the initial state of POSSIBLE when a input session starts. + * The definition of a input session is from the first input until the last input, with all it's movement in it. * + * Example session for mouse-input: mousedown -> mousemove -> mouseup + * + * On each recognizing cycle (see Manager.recognize) the .recognize() method is executed + * which determines with state it should be. + * + * If the recognizer has the state FAILED, CANCELLED or RECOGNIZED (equals ENDED), it is reset to + * POSSIBLE to give it another change on the next cycle. + * + * Possible + * | + * +-----+---------------+ + * | | + * +-----+-----+ | + * | | | + * Failed Cancelled | + * +-------+------+ + * | | + * Recognized Began + * | + * Changed + * | + * Ended/Recognized + */ + var STATE_POSSIBLE = 1; + var STATE_BEGAN = 2; + var STATE_CHANGED = 4; + var STATE_ENDED = 8; + var STATE_RECOGNIZED = STATE_ENDED; + var STATE_CANCELLED = 16; + var STATE_FAILED = 32; + + /** + * Recognizer + * Every recognizer needs to extend from this class. + * @constructor * @param {Object} options */ - Component.prototype.setOptions = function (options) { - if (options) { - util.extend(this.options, options); - } + function Recognizer(options) { + this.options = assign({}, this.defaults, options || {}); + + this.id = uniqueId(); + + this.manager = null; + + // default is enable true + this.options.enable = ifUndefined(this.options.enable, true); + + this.state = STATE_POSSIBLE; + + this.simultaneous = {}; + this.requireFail = []; + } + + Recognizer.prototype = { + /** + * @virtual + * @type {Object} + */ + defaults: {}, + + /** + * set options + * @param {Object} options + * @return {Recognizer} + */ + set: function(options) { + assign(this.options, options); + + // also update the touchAction, in case something changed about the directions/enabled state + this.manager && this.manager.touchAction.update(); + return this; + }, + + /** + * recognize simultaneous with an other recognizer. + * @param {Recognizer} otherRecognizer + * @returns {Recognizer} this + */ + recognizeWith: function(otherRecognizer) { + if (invokeArrayArg(otherRecognizer, 'recognizeWith', this)) { + return this; + } + + var simultaneous = this.simultaneous; + otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this); + if (!simultaneous[otherRecognizer.id]) { + simultaneous[otherRecognizer.id] = otherRecognizer; + otherRecognizer.recognizeWith(this); + } + return this; + }, + + /** + * drop the simultaneous link. it doesnt remove the link on the other recognizer. + * @param {Recognizer} otherRecognizer + * @returns {Recognizer} this + */ + dropRecognizeWith: function(otherRecognizer) { + if (invokeArrayArg(otherRecognizer, 'dropRecognizeWith', this)) { + return this; + } + + otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this); + delete this.simultaneous[otherRecognizer.id]; + return this; + }, + + /** + * recognizer can only run when an other is failing + * @param {Recognizer} otherRecognizer + * @returns {Recognizer} this + */ + requireFailure: function(otherRecognizer) { + if (invokeArrayArg(otherRecognizer, 'requireFailure', this)) { + return this; + } + + var requireFail = this.requireFail; + otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this); + if (inArray(requireFail, otherRecognizer) === -1) { + requireFail.push(otherRecognizer); + otherRecognizer.requireFailure(this); + } + return this; + }, + + /** + * drop the requireFailure link. it does not remove the link on the other recognizer. + * @param {Recognizer} otherRecognizer + * @returns {Recognizer} this + */ + dropRequireFailure: function(otherRecognizer) { + if (invokeArrayArg(otherRecognizer, 'dropRequireFailure', this)) { + return this; + } + + otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this); + var index = inArray(this.requireFail, otherRecognizer); + if (index > -1) { + this.requireFail.splice(index, 1); + } + return this; + }, + + /** + * has require failures boolean + * @returns {boolean} + */ + hasRequireFailures: function() { + return this.requireFail.length > 0; + }, + + /** + * if the recognizer can recognize simultaneous with an other recognizer + * @param {Recognizer} otherRecognizer + * @returns {Boolean} + */ + canRecognizeWith: function(otherRecognizer) { + return !!this.simultaneous[otherRecognizer.id]; + }, + + /** + * You should use `tryEmit` instead of `emit` directly to check + * that all the needed recognizers has failed before emitting. + * @param {Object} input + */ + emit: function(input) { + var self = this; + var state = this.state; + + function emit(event) { + self.manager.emit(event, input); + } + + // 'panstart' and 'panmove' + if (state < STATE_ENDED) { + emit(self.options.event + stateStr(state)); + } + + emit(self.options.event); // simple 'eventName' events + + if (input.additionalEvent) { // additional event(panleft, panright, pinchin, pinchout...) + emit(input.additionalEvent); + } + + // panend and pancancel + if (state >= STATE_ENDED) { + emit(self.options.event + stateStr(state)); + } + }, + + /** + * Check that all the require failure recognizers has failed, + * if true, it emits a gesture event, + * otherwise, setup the state to FAILED. + * @param {Object} input + */ + tryEmit: function(input) { + if (this.canEmit()) { + return this.emit(input); + } + // it's failing anyway + this.state = STATE_FAILED; + }, + + /** + * can we emit? + * @returns {boolean} + */ + canEmit: function() { + var i = 0; + while (i < this.requireFail.length) { + if (!(this.requireFail[i].state & (STATE_FAILED | STATE_POSSIBLE))) { + return false; + } + i++; + } + return true; + }, + + /** + * update the recognizer + * @param {Object} inputData + */ + recognize: function(inputData) { + // make a new copy of the inputData + // so we can change the inputData without messing up the other recognizers + var inputDataClone = assign({}, inputData); + + // is is enabled and allow recognizing? + if (!boolOrFn(this.options.enable, [this, inputDataClone])) { + this.reset(); + this.state = STATE_FAILED; + return; + } + + // reset when we've reached the end + if (this.state & (STATE_RECOGNIZED | STATE_CANCELLED | STATE_FAILED)) { + this.state = STATE_POSSIBLE; + } + + this.state = this.process(inputDataClone); + + // the recognizer has recognized a gesture + // so trigger an event + if (this.state & (STATE_BEGAN | STATE_CHANGED | STATE_ENDED | STATE_CANCELLED)) { + this.tryEmit(inputDataClone); + } + }, + + /** + * return the state of the recognizer + * the actual recognizing happens in this method + * @virtual + * @param {Object} inputData + * @returns {Const} STATE + */ + process: function(inputData) { }, // jshint ignore:line + + /** + * return the preferred touch-action + * @virtual + * @returns {Array} + */ + getTouchAction: function() { }, + + /** + * called when the gesture isn't allowed to recognize + * like when another is being recognized or it is disabled + * @virtual + */ + reset: function() { } }; /** - * Repaint the component - * @return {boolean} Returns true if the component is resized + * get a usable string, used as event postfix + * @param {Const} state + * @returns {String} state */ - Component.prototype.redraw = function () { - // should be implemented by the component - return false; + function stateStr(state) { + if (state & STATE_CANCELLED) { + return 'cancel'; + } else if (state & STATE_ENDED) { + return 'end'; + } else if (state & STATE_CHANGED) { + return 'move'; + } else if (state & STATE_BEGAN) { + return 'start'; + } + return ''; + } + + /** + * direction cons to string + * @param {Const} direction + * @returns {String} + */ + function directionStr(direction) { + if (direction == DIRECTION_DOWN) { + return 'down'; + } else if (direction == DIRECTION_UP) { + return 'up'; + } else if (direction == DIRECTION_LEFT) { + return 'left'; + } else if (direction == DIRECTION_RIGHT) { + return 'right'; + } + return ''; + } + + /** + * get a recognizer by name if it is bound to a manager + * @param {Recognizer|String} otherRecognizer + * @param {Recognizer} recognizer + * @returns {Recognizer} + */ + function getRecognizerByNameIfManager(otherRecognizer, recognizer) { + var manager = recognizer.manager; + if (manager) { + return manager.get(otherRecognizer); + } + return otherRecognizer; + } + + /** + * This recognizer is just used as a base for the simple attribute recognizers. + * @constructor + * @extends Recognizer + */ + function AttrRecognizer() { + Recognizer.apply(this, arguments); + } + + inherit(AttrRecognizer, Recognizer, { + /** + * @namespace + * @memberof AttrRecognizer + */ + defaults: { + /** + * @type {Number} + * @default 1 + */ + pointers: 1 + }, + + /** + * Used to check if it the recognizer receives valid input, like input.distance > 10. + * @memberof AttrRecognizer + * @param {Object} input + * @returns {Boolean} recognized + */ + attrTest: function(input) { + var optionPointers = this.options.pointers; + return optionPointers === 0 || input.pointers.length === optionPointers; + }, + + /** + * Process the input and return the state for the recognizer + * @memberof AttrRecognizer + * @param {Object} input + * @returns {*} State + */ + process: function(input) { + var state = this.state; + var eventType = input.eventType; + + var isRecognized = state & (STATE_BEGAN | STATE_CHANGED); + var isValid = this.attrTest(input); + + // on cancel input and we've recognized before, return STATE_CANCELLED + if (isRecognized && (eventType & INPUT_CANCEL || !isValid)) { + return state | STATE_CANCELLED; + } else if (isRecognized || isValid) { + if (eventType & INPUT_END) { + return state | STATE_ENDED; + } else if (!(state & STATE_BEGAN)) { + return STATE_BEGAN; + } + return state | STATE_CHANGED; + } + return STATE_FAILED; + } + }); + + /** + * Pan + * Recognized when the pointer is down and moved in the allowed direction. + * @constructor + * @extends AttrRecognizer + */ + function PanRecognizer() { + AttrRecognizer.apply(this, arguments); + + this.pX = null; + this.pY = null; + } + + inherit(PanRecognizer, AttrRecognizer, { + /** + * @namespace + * @memberof PanRecognizer + */ + defaults: { + event: 'pan', + threshold: 10, + pointers: 1, + direction: DIRECTION_ALL + }, + + getTouchAction: function() { + var direction = this.options.direction; + var actions = []; + if (direction & DIRECTION_HORIZONTAL) { + actions.push(TOUCH_ACTION_PAN_Y); + } + if (direction & DIRECTION_VERTICAL) { + actions.push(TOUCH_ACTION_PAN_X); + } + return actions; + }, + + directionTest: function(input) { + var options = this.options; + var hasMoved = true; + var distance = input.distance; + var direction = input.direction; + var x = input.deltaX; + var y = input.deltaY; + + // lock to axis? + if (!(direction & options.direction)) { + if (options.direction & DIRECTION_HORIZONTAL) { + direction = (x === 0) ? DIRECTION_NONE : (x < 0) ? DIRECTION_LEFT : DIRECTION_RIGHT; + hasMoved = x != this.pX; + distance = Math.abs(input.deltaX); + } else { + direction = (y === 0) ? DIRECTION_NONE : (y < 0) ? DIRECTION_UP : DIRECTION_DOWN; + hasMoved = y != this.pY; + distance = Math.abs(input.deltaY); + } + } + input.direction = direction; + return hasMoved && distance > options.threshold && direction & options.direction; + }, + + attrTest: function(input) { + return AttrRecognizer.prototype.attrTest.call(this, input) && + (this.state & STATE_BEGAN || (!(this.state & STATE_BEGAN) && this.directionTest(input))); + }, + + emit: function(input) { + + this.pX = input.deltaX; + this.pY = input.deltaY; + + var direction = directionStr(input.direction); + + if (direction) { + input.additionalEvent = this.options.event + direction; + } + this._super.emit.call(this, input); + } + }); + + /** + * Pinch + * Recognized when two or more pointers are moving toward (zoom-in) or away from each other (zoom-out). + * @constructor + * @extends AttrRecognizer + */ + function PinchRecognizer() { + AttrRecognizer.apply(this, arguments); + } + + inherit(PinchRecognizer, AttrRecognizer, { + /** + * @namespace + * @memberof PinchRecognizer + */ + defaults: { + event: 'pinch', + threshold: 0, + pointers: 2 + }, + + getTouchAction: function() { + return [TOUCH_ACTION_NONE]; + }, + + attrTest: function(input) { + return this._super.attrTest.call(this, input) && + (Math.abs(input.scale - 1) > this.options.threshold || this.state & STATE_BEGAN); + }, + + emit: function(input) { + if (input.scale !== 1) { + var inOut = input.scale < 1 ? 'in' : 'out'; + input.additionalEvent = this.options.event + inOut; + } + this._super.emit.call(this, input); + } + }); + + /** + * Press + * Recognized when the pointer is down for x ms without any movement. + * @constructor + * @extends Recognizer + */ + function PressRecognizer() { + Recognizer.apply(this, arguments); + + this._timer = null; + this._input = null; + } + + inherit(PressRecognizer, Recognizer, { + /** + * @namespace + * @memberof PressRecognizer + */ + defaults: { + event: 'press', + pointers: 1, + time: 251, // minimal time of the pointer to be pressed + threshold: 9 // a minimal movement is ok, but keep it low + }, + + getTouchAction: function() { + return [TOUCH_ACTION_AUTO]; + }, + + process: function(input) { + var options = this.options; + var validPointers = input.pointers.length === options.pointers; + var validMovement = input.distance < options.threshold; + var validTime = input.deltaTime > options.time; + + this._input = input; + + // we only allow little movement + // and we've reached an end event, so a tap is possible + if (!validMovement || !validPointers || (input.eventType & (INPUT_END | INPUT_CANCEL) && !validTime)) { + this.reset(); + } else if (input.eventType & INPUT_START) { + this.reset(); + this._timer = setTimeoutContext(function() { + this.state = STATE_RECOGNIZED; + this.tryEmit(); + }, options.time, this); + } else if (input.eventType & INPUT_END) { + return STATE_RECOGNIZED; + } + return STATE_FAILED; + }, + + reset: function() { + clearTimeout(this._timer); + }, + + emit: function(input) { + if (this.state !== STATE_RECOGNIZED) { + return; + } + + if (input && (input.eventType & INPUT_END)) { + this.manager.emit(this.options.event + 'up', input); + } else { + this._input.timeStamp = now(); + this.manager.emit(this.options.event, this._input); + } + } + }); + + /** + * Rotate + * Recognized when two or more pointer are moving in a circular motion. + * @constructor + * @extends AttrRecognizer + */ + function RotateRecognizer() { + AttrRecognizer.apply(this, arguments); + } + + inherit(RotateRecognizer, AttrRecognizer, { + /** + * @namespace + * @memberof RotateRecognizer + */ + defaults: { + event: 'rotate', + threshold: 0, + pointers: 2 + }, + + getTouchAction: function() { + return [TOUCH_ACTION_NONE]; + }, + + attrTest: function(input) { + return this._super.attrTest.call(this, input) && + (Math.abs(input.rotation) > this.options.threshold || this.state & STATE_BEGAN); + } + }); + + /** + * Swipe + * Recognized when the pointer is moving fast (velocity), with enough distance in the allowed direction. + * @constructor + * @extends AttrRecognizer + */ + function SwipeRecognizer() { + AttrRecognizer.apply(this, arguments); + } + + inherit(SwipeRecognizer, AttrRecognizer, { + /** + * @namespace + * @memberof SwipeRecognizer + */ + defaults: { + event: 'swipe', + threshold: 10, + velocity: 0.3, + direction: DIRECTION_HORIZONTAL | DIRECTION_VERTICAL, + pointers: 1 + }, + + getTouchAction: function() { + return PanRecognizer.prototype.getTouchAction.call(this); + }, + + attrTest: function(input) { + var direction = this.options.direction; + var velocity; + + if (direction & (DIRECTION_HORIZONTAL | DIRECTION_VERTICAL)) { + velocity = input.overallVelocity; + } else if (direction & DIRECTION_HORIZONTAL) { + velocity = input.overallVelocityX; + } else if (direction & DIRECTION_VERTICAL) { + velocity = input.overallVelocityY; + } + + return this._super.attrTest.call(this, input) && + direction & input.offsetDirection && + input.distance > this.options.threshold && + input.maxPointers == this.options.pointers && + abs(velocity) > this.options.velocity && input.eventType & INPUT_END; + }, + + emit: function(input) { + var direction = directionStr(input.offsetDirection); + if (direction) { + this.manager.emit(this.options.event + direction, input); + } + + this.manager.emit(this.options.event, input); + } + }); + + /** + * A tap is ecognized when the pointer is doing a small tap/click. Multiple taps are recognized if they occur + * between the given interval and position. The delay option can be used to recognize multi-taps without firing + * a single tap. + * + * The eventData from the emitted event contains the property `tapCount`, which contains the amount of + * multi-taps being recognized. + * @constructor + * @extends Recognizer + */ + function TapRecognizer() { + Recognizer.apply(this, arguments); + + // previous time and center, + // used for tap counting + this.pTime = false; + this.pCenter = false; + + this._timer = null; + this._input = null; + this.count = 0; + } + + inherit(TapRecognizer, Recognizer, { + /** + * @namespace + * @memberof PinchRecognizer + */ + defaults: { + event: 'tap', + pointers: 1, + taps: 1, + interval: 300, // max time between the multi-tap taps + time: 250, // max time of the pointer to be down (like finger on the screen) + threshold: 9, // a minimal movement is ok, but keep it low + posThreshold: 10 // a multi-tap can be a bit off the initial position + }, + + getTouchAction: function() { + return [TOUCH_ACTION_MANIPULATION]; + }, + + process: function(input) { + var options = this.options; + + var validPointers = input.pointers.length === options.pointers; + var validMovement = input.distance < options.threshold; + var validTouchTime = input.deltaTime < options.time; + + this.reset(); + + if ((input.eventType & INPUT_START) && (this.count === 0)) { + return this.failTimeout(); + } + + // we only allow little movement + // and we've reached an end event, so a tap is possible + if (validMovement && validTouchTime && validPointers) { + if (input.eventType != INPUT_END) { + return this.failTimeout(); + } + + var validInterval = this.pTime ? (input.timeStamp - this.pTime < options.interval) : true; + var validMultiTap = !this.pCenter || getDistance(this.pCenter, input.center) < options.posThreshold; + + this.pTime = input.timeStamp; + this.pCenter = input.center; + + if (!validMultiTap || !validInterval) { + this.count = 1; + } else { + this.count += 1; + } + + this._input = input; + + // if tap count matches we have recognized it, + // else it has began recognizing... + var tapCount = this.count % options.taps; + if (tapCount === 0) { + // no failing requirements, immediately trigger the tap event + // or wait as long as the multitap interval to trigger + if (!this.hasRequireFailures()) { + return STATE_RECOGNIZED; + } else { + this._timer = setTimeoutContext(function() { + this.state = STATE_RECOGNIZED; + this.tryEmit(); + }, options.interval, this); + return STATE_BEGAN; + } + } + } + return STATE_FAILED; + }, + + failTimeout: function() { + this._timer = setTimeoutContext(function() { + this.state = STATE_FAILED; + }, this.options.interval, this); + return STATE_FAILED; + }, + + reset: function() { + clearTimeout(this._timer); + }, + + emit: function() { + if (this.state == STATE_RECOGNIZED) { + this._input.tapCount = this.count; + this.manager.emit(this.options.event, this._input); + } + } + }); + + /** + * Simple way to create a manager with a default set of recognizers. + * @param {HTMLElement} element + * @param {Object} [options] + * @constructor + */ + function Hammer(element, options) { + options = options || {}; + options.recognizers = ifUndefined(options.recognizers, Hammer.defaults.preset); + return new Manager(element, options); + } + + /** + * @const {string} + */ + Hammer.VERSION = '2.0.6'; + + /** + * default settings + * @namespace + */ + Hammer.defaults = { + /** + * set if DOM events are being triggered. + * But this is slower and unused by simple implementations, so disabled by default. + * @type {Boolean} + * @default false + */ + domEvents: false, + + /** + * The value for the touchAction property/fallback. + * When set to `compute` it will magically set the correct value based on the added recognizers. + * @type {String} + * @default compute + */ + touchAction: TOUCH_ACTION_COMPUTE, + + /** + * @type {Boolean} + * @default true + */ + enable: true, + + /** + * EXPERIMENTAL FEATURE -- can be removed/changed + * Change the parent input target element. + * If Null, then it is being set the to main element. + * @type {Null|EventTarget} + * @default null + */ + inputTarget: null, + + /** + * force an input class + * @type {Null|Function} + * @default null + */ + inputClass: null, + + /** + * Default recognizer setup when calling `Hammer()` + * When creating a new Manager these will be skipped. + * @type {Array} + */ + preset: [ + // RecognizerClass, options, [recognizeWith, ...], [requireFailure, ...] + [RotateRecognizer, {enable: false}], + [PinchRecognizer, {enable: false}, ['rotate']], + [SwipeRecognizer, {direction: DIRECTION_HORIZONTAL}], + [PanRecognizer, {direction: DIRECTION_HORIZONTAL}, ['swipe']], + [TapRecognizer], + [TapRecognizer, {event: 'doubletap', taps: 2}, ['tap']], + [PressRecognizer] + ], + + /** + * Some CSS properties can be used to improve the working of Hammer. + * Add them to this method and they will be set when creating a new Manager. + * @namespace + */ + cssProps: { + /** + * Disables text selection to improve the dragging gesture. Mainly for desktop browsers. + * @type {String} + * @default 'none' + */ + userSelect: 'none', + + /** + * Disable the Windows Phone grippers when pressing an element. + * @type {String} + * @default 'none' + */ + touchSelect: 'none', + + /** + * Disables the default callout shown when you touch and hold a touch target. + * On iOS, when you touch and hold a touch target such as a link, Safari displays + * a callout containing information about the link. This property allows you to disable that callout. + * @type {String} + * @default 'none' + */ + touchCallout: 'none', + + /** + * Specifies whether zooming is enabled. Used by IE10> + * @type {String} + * @default 'none' + */ + contentZooming: 'none', + + /** + * Specifies that an entire element should be draggable instead of its contents. Mainly for desktop browsers. + * @type {String} + * @default 'none' + */ + userDrag: 'none', + + /** + * Overrides the highlight color shown when the user taps a link or a JavaScript + * clickable element in iOS. This property obeys the alpha value, if specified. + * @type {String} + * @default 'rgba(0,0,0,0)' + */ + tapHighlightColor: 'rgba(0,0,0,0)' + } + }; + + var STOP = 1; + var FORCED_STOP = 2; + + /** + * Manager + * @param {HTMLElement} element + * @param {Object} [options] + * @constructor + */ + function Manager(element, options) { + this.options = assign({}, Hammer.defaults, options || {}); + + this.options.inputTarget = this.options.inputTarget || element; + + this.handlers = {}; + this.session = {}; + this.recognizers = []; + + this.element = element; + this.input = createInputInstance(this); + this.touchAction = new TouchAction(this, this.options.touchAction); + + toggleCssProps(this, true); + + each(this.options.recognizers, function(item) { + var recognizer = this.add(new (item[0])(item[1])); + item[2] && recognizer.recognizeWith(item[2]); + item[3] && recognizer.requireFailure(item[3]); + }, this); + } + + Manager.prototype = { + /** + * set options + * @param {Object} options + * @returns {Manager} + */ + set: function(options) { + assign(this.options, options); + + // Options that need a little more setup + if (options.touchAction) { + this.touchAction.update(); + } + if (options.inputTarget) { + // Clean up existing event listeners and reinitialize + this.input.destroy(); + this.input.target = options.inputTarget; + this.input.init(); + } + return this; + }, + + /** + * stop recognizing for this session. + * This session will be discarded, when a new [input]start event is fired. + * When forced, the recognizer cycle is stopped immediately. + * @param {Boolean} [force] + */ + stop: function(force) { + this.session.stopped = force ? FORCED_STOP : STOP; + }, + + /** + * run the recognizers! + * called by the inputHandler function on every movement of the pointers (touches) + * it walks through all the recognizers and tries to detect the gesture that is being made + * @param {Object} inputData + */ + recognize: function(inputData) { + var session = this.session; + if (session.stopped) { + return; + } + + // run the touch-action polyfill + this.touchAction.preventDefaults(inputData); + + var recognizer; + var recognizers = this.recognizers; + + // this holds the recognizer that is being recognized. + // so the recognizer's state needs to be BEGAN, CHANGED, ENDED or RECOGNIZED + // if no recognizer is detecting a thing, it is set to `null` + var curRecognizer = session.curRecognizer; + + // reset when the last recognizer is recognized + // or when we're in a new session + if (!curRecognizer || (curRecognizer && curRecognizer.state & STATE_RECOGNIZED)) { + curRecognizer = session.curRecognizer = null; + } + + var i = 0; + while (i < recognizers.length) { + recognizer = recognizers[i]; + + // find out if we are allowed try to recognize the input for this one. + // 1. allow if the session is NOT forced stopped (see the .stop() method) + // 2. allow if we still haven't recognized a gesture in this session, or the this recognizer is the one + // that is being recognized. + // 3. allow if the recognizer is allowed to run simultaneous with the current recognized recognizer. + // this can be setup with the `recognizeWith()` method on the recognizer. + if (session.stopped !== FORCED_STOP && ( // 1 + !curRecognizer || recognizer == curRecognizer || // 2 + recognizer.canRecognizeWith(curRecognizer))) { // 3 + recognizer.recognize(inputData); + } else { + recognizer.reset(); + } + + // if the recognizer has been recognizing the input as a valid gesture, we want to store this one as the + // current active recognizer. but only if we don't already have an active recognizer + if (!curRecognizer && recognizer.state & (STATE_BEGAN | STATE_CHANGED | STATE_ENDED)) { + curRecognizer = session.curRecognizer = recognizer; + } + i++; + } + }, + + /** + * get a recognizer by its event name. + * @param {Recognizer|String} recognizer + * @returns {Recognizer|Null} + */ + get: function(recognizer) { + if (recognizer instanceof Recognizer) { + return recognizer; + } + + var recognizers = this.recognizers; + for (var i = 0; i < recognizers.length; i++) { + if (recognizers[i].options.event == recognizer) { + return recognizers[i]; + } + } + return null; + }, + + /** + * add a recognizer to the manager + * existing recognizers with the same event name will be removed + * @param {Recognizer} recognizer + * @returns {Recognizer|Manager} + */ + add: function(recognizer) { + if (invokeArrayArg(recognizer, 'add', this)) { + return this; + } + + // remove existing + var existing = this.get(recognizer.options.event); + if (existing) { + this.remove(existing); + } + + this.recognizers.push(recognizer); + recognizer.manager = this; + + this.touchAction.update(); + return recognizer; + }, + + /** + * remove a recognizer by name or instance + * @param {Recognizer|String} recognizer + * @returns {Manager} + */ + remove: function(recognizer) { + if (invokeArrayArg(recognizer, 'remove', this)) { + return this; + } + + recognizer = this.get(recognizer); + + // let's make sure this recognizer exists + if (recognizer) { + var recognizers = this.recognizers; + var index = inArray(recognizers, recognizer); + + if (index !== -1) { + recognizers.splice(index, 1); + this.touchAction.update(); + } + } + + return this; + }, + + /** + * bind event + * @param {String} events + * @param {Function} handler + * @returns {EventEmitter} this + */ + on: function(events, handler) { + var handlers = this.handlers; + each(splitStr(events), function(event) { + handlers[event] = handlers[event] || []; + handlers[event].push(handler); + }); + return this; + }, + + /** + * unbind event, leave emit blank to remove all handlers + * @param {String} events + * @param {Function} [handler] + * @returns {EventEmitter} this + */ + off: function(events, handler) { + var handlers = this.handlers; + each(splitStr(events), function(event) { + if (!handler) { + delete handlers[event]; + } else { + handlers[event] && handlers[event].splice(inArray(handlers[event], handler), 1); + } + }); + return this; + }, + + /** + * emit event to the listeners + * @param {String} event + * @param {Object} data + */ + emit: function(event, data) { + // we also want to trigger dom events + if (this.options.domEvents) { + triggerDomEvent(event, data); + } + + // no handlers, so skip it all + var handlers = this.handlers[event] && this.handlers[event].slice(); + if (!handlers || !handlers.length) { + return; + } + + data.type = event; + data.preventDefault = function() { + data.srcEvent.preventDefault(); + }; + + var i = 0; + while (i < handlers.length) { + handlers[i](data); + i++; + } + }, + + /** + * destroy the manager and unbinds all events + * it doesn't unbind dom events, that is the user own responsibility + */ + destroy: function() { + this.element && toggleCssProps(this, false); + + this.handlers = {}; + this.session = {}; + this.input.destroy(); + this.element = null; + } }; /** - * Destroy the component. Cleanup DOM and event listeners + * add/remove the css properties as defined in manager.options.cssProps + * @param {Manager} manager + * @param {Boolean} add */ - Component.prototype.destroy = function () {}; + function toggleCssProps(manager, add) { + var element = manager.element; + if (!element.style) { + return; + } + each(manager.options.cssProps, function(value, name) { + element.style[prefixed(element.style, name)] = add ? value : ''; + }); + } /** - * Test whether the component is resized since the last time _isResized() was - * called. - * @return {Boolean} Returns true if the component is resized - * @protected + * trigger dom event + * @param {String} event + * @param {Object} data */ - Component.prototype._isResized = function () { - var resized = this.props._previousWidth !== this.props.width || this.props._previousHeight !== this.props.height; + function triggerDomEvent(event, data) { + var gestureEvent = document.createEvent('Event'); + gestureEvent.initEvent(event, true, true); + gestureEvent.gesture = data; + data.target.dispatchEvent(gestureEvent); + } - this.props._previousWidth = this.props.width; - this.props._previousHeight = this.props.height; + assign(Hammer, { + INPUT_START: INPUT_START, + INPUT_MOVE: INPUT_MOVE, + INPUT_END: INPUT_END, + INPUT_CANCEL: INPUT_CANCEL, - return resized; - }; + STATE_POSSIBLE: STATE_POSSIBLE, + STATE_BEGAN: STATE_BEGAN, + STATE_CHANGED: STATE_CHANGED, + STATE_ENDED: STATE_ENDED, + STATE_RECOGNIZED: STATE_RECOGNIZED, + STATE_CANCELLED: STATE_CANCELLED, + STATE_FAILED: STATE_FAILED, - module.exports = Component; + DIRECTION_NONE: DIRECTION_NONE, + DIRECTION_LEFT: DIRECTION_LEFT, + DIRECTION_RIGHT: DIRECTION_RIGHT, + DIRECTION_UP: DIRECTION_UP, + DIRECTION_DOWN: DIRECTION_DOWN, + DIRECTION_HORIZONTAL: DIRECTION_HORIZONTAL, + DIRECTION_VERTICAL: DIRECTION_VERTICAL, + DIRECTION_ALL: DIRECTION_ALL, + + Manager: Manager, + Input: Input, + TouchAction: TouchAction, + + TouchInput: TouchInput, + MouseInput: MouseInput, + PointerEventInput: PointerEventInput, + TouchMouseInput: TouchMouseInput, + SingleTouchInput: SingleTouchInput, + + Recognizer: Recognizer, + AttrRecognizer: AttrRecognizer, + Tap: TapRecognizer, + Pan: PanRecognizer, + Swipe: SwipeRecognizer, + Pinch: PinchRecognizer, + Rotate: RotateRecognizer, + Press: PressRecognizer, + + on: addEventListeners, + off: removeEventListeners, + each: each, + merge: merge, + extend: extend, + assign: assign, + inherit: inherit, + bindFn: bindFn, + prefixed: prefixed + }); + + // this prevents errors when Hammer is loaded in the presence of an AMD + // style loader but by script tag, not by the loader. + var freeGlobal = (typeof window !== 'undefined' ? window : (typeof self !== 'undefined' ? self : {})); // jshint ignore:line + freeGlobal.Hammer = Hammer; + + if (true) { + !(__WEBPACK_AMD_DEFINE_RESULT__ = function() { + return Hammer; + }.call(exports, __webpack_require__, exports, module), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); + } else if (typeof module != 'undefined' && module.exports) { + module.exports = Hammer; + } else { + window[exportName] = Hammer; + } + + })(window, document, 'Hammer'); - // should be implemented by the component /***/ }, -/* 28 */ -/***/ function(module, exports) { - - // English - 'use strict'; - - exports['en'] = { - current: 'current', - time: 'time' - }; - exports['en_EN'] = exports['en']; - exports['en_US'] = exports['en']; - - // Dutch - exports['nl'] = { - current: 'huidige', - time: 'tijd' - }; - exports['nl_NL'] = exports['nl']; - exports['nl_BE'] = exports['nl']; - -/***/ }, -/* 29 */ +/* 23 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; - var util = __webpack_require__(7); - var hammerUtil = __webpack_require__(30); - var moment = __webpack_require__(8); - var Component = __webpack_require__(27); - var DateUtil = __webpack_require__(31); + var util = __webpack_require__(1); + var hammerUtil = __webpack_require__(24); + var moment = __webpack_require__(2); + var Component = __webpack_require__(25); + var DateUtil = __webpack_require__(26); /** * @constructor Range @@ -13943,6 +13938,7 @@ return /******/ (function(modules) { // webpackBootstrap this.defaultOptions = { start: null, end: null, + moment: moment, direction: 'horizontal', // 'horizontal' or 'vertical' moveable: true, zoomable: true, @@ -13994,7 +13990,7 @@ return /******/ (function(modules) { // webpackBootstrap Range.prototype.setOptions = function (options) { if (options) { // copy the options that we know - var fields = ['direction', 'min', 'max', 'zoomMin', 'zoomMax', 'moveable', 'zoomable', 'activate', 'hiddenDates', 'zoomKey']; + var fields = ['direction', 'min', 'max', 'zoomMin', 'zoomMax', 'moveable', 'zoomable', 'moment', 'activate', 'hiddenDates', 'zoomKey']; util.selectiveExtend(fields, this.options, options); if ('start' in options || 'end' in options) { @@ -14060,7 +14056,7 @@ return /******/ (function(modules) { // webpackBootstrap var e = done || finalEnd === null ? finalEnd : initEnd + (finalEnd - initEnd) * ease; changed = me._applyRange(s, e); - DateUtil.updateHiddenDates(me.body, me.options.hiddenDates); + DateUtil.updateHiddenDates(me.options.moment, me.body, me.options.hiddenDates); anyChanged = anyChanged || changed; if (changed) { me.body.emitter.emit('rangechange', { start: new Date(me.start), end: new Date(me.end), byUser: byUser }); @@ -14081,7 +14077,7 @@ return /******/ (function(modules) { // webpackBootstrap return next(); } else { var changed = this._applyRange(finalStart, finalEnd); - DateUtil.updateHiddenDates(this.body, this.options.hiddenDates); + DateUtil.updateHiddenDates(this.options.moment, this.body, this.options.hiddenDates); if (changed) { var params = { start: new Date(this.start), end: new Date(this.end), byUser: byUser }; this.body.emitter.emit('rangechange', params); @@ -14334,10 +14330,13 @@ return /******/ (function(modules) { // webpackBootstrap this.previousDelta = delta; this._applyRange(newStart, newEnd); + var startDate = new Date(this.start); + var endDate = new Date(this.end); + // fire a rangechange event this.body.emitter.emit('rangechange', { - start: new Date(this.start), - end: new Date(this.end), + start: startDate, + end: endDate, byUser: true }); }; @@ -14458,7 +14457,7 @@ return /******/ (function(modules) { // webpackBootstrap var centerDate = this._pointerToDate(this.props.touch.center); var hiddenDuration = DateUtil.getHiddenDurationBetween(this.body.hiddenDates, this.start, this.end); - var hiddenDurationBefore = DateUtil.getHiddenDurationBefore(this.body.hiddenDates, this, centerDate); + var hiddenDurationBefore = DateUtil.getHiddenDurationBefore(this.options.moment, this.body.hiddenDates, this, centerDate); var hiddenDurationAfter = hiddenDuration - hiddenDurationBefore; // calculate new start and end @@ -14554,7 +14553,7 @@ return /******/ (function(modules) { // webpackBootstrap } var hiddenDuration = DateUtil.getHiddenDurationBetween(this.body.hiddenDates, this.start, this.end); - var hiddenDurationBefore = DateUtil.getHiddenDurationBefore(this.body.hiddenDates, this, center); + var hiddenDurationBefore = DateUtil.getHiddenDurationBefore(this.options.moment, this.body.hiddenDates, this, center); var hiddenDurationAfter = hiddenDuration - hiddenDurationBefore; // calculate new start and end @@ -14616,12 +14615,12 @@ return /******/ (function(modules) { // webpackBootstrap module.exports = Range; /***/ }, -/* 30 */ +/* 24 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; - var Hammer = __webpack_require__(3); + var Hammer = __webpack_require__(20); /** * Register a touch event, taking place before a gesture @@ -14630,23 +14629,14 @@ return /******/ (function(modules) { // webpackBootstrap */ exports.onTouch = function (hammer, callback) { callback.inputHandler = function (event) { - if (event.isFirst && !isTouching) { + if (event.isFirst) { callback(event); - - isTouching = true; - setTimeout(function () { - isTouching = false; - }, 0); } }; hammer.on('hammer.input', callback.inputHandler); }; - // isTouching is true while a touch action is being emitted - // this is a hack to prevent `touch` from being fired twice - var isTouching = false; - /** * Register a release event, taking place after a gesture * @param {Hammer} hammer A hammer instance @@ -14654,23 +14644,14 @@ return /******/ (function(modules) { // webpackBootstrap */ exports.onRelease = function (hammer, callback) { callback.inputHandler = function (event) { - if (event.isFinal && !isReleasing) { + if (event.isFinal) { callback(event); - - isReleasing = true; - setTimeout(function () { - isReleasing = false; - }, 0); } }; return hammer.on('hammer.input', callback.inputHandler); }; - // isReleasing is true while a release action is being emitted - // this is a hack to prevent `release` from being fired twice - var isReleasing = false; - /** * Unregister a touch event, taking place before a gesture * @param {Hammer} hammer A hammer instance @@ -14688,19 +14669,84 @@ return /******/ (function(modules) { // webpackBootstrap exports.offRelease = exports.offTouch; /***/ }, -/* 31 */ -/***/ function(module, exports, __webpack_require__) { +/* 25 */ +/***/ function(module, exports) { + /** + * Prototype for visual components + * @param {{dom: Object, domProps: Object, emitter: Emitter, range: Range}} [body] + * @param {Object} [options] + */ "use strict"; - var moment = __webpack_require__(8); + function Component(body, options) { + this.options = null; + this.props = null; + } + /** + * Set options for the component. The new options will be merged into the + * current options. + * @param {Object} options + */ + Component.prototype.setOptions = function (options) { + if (options) { + util.extend(this.options, options); + } + }; + + /** + * Repaint the component + * @return {boolean} Returns true if the component is resized + */ + Component.prototype.redraw = function () { + // should be implemented by the component + return false; + }; + + /** + * Destroy the component. Cleanup DOM and event listeners + */ + Component.prototype.destroy = function () { + // should be implemented by the component + }; + + /** + * Test whether the component is resized since the last time _isResized() was + * called. + * @return {Boolean} Returns true if the component is resized + * @protected + */ + Component.prototype._isResized = function () { + var resized = this.props._previousWidth !== this.props.width || this.props._previousHeight !== this.props.height; + + this.props._previousWidth = this.props.width; + this.props._previousHeight = this.props.height; + + return resized; + }; + + module.exports = Component; + +/***/ }, +/* 26 */ +/***/ function(module, exports) { + + /** * used in Core to convert the options into a volatile variable * - * @param Core + * @param {function} moment + * @param {Object} body + * @param {Array | Object} hiddenDates */ - exports.convertHiddenOptions = function (body, hiddenDates) { + "use strict"; + + exports.convertHiddenOptions = function (moment, body, hiddenDates) { + if (hiddenDates && !Array.isArray(hiddenDates)) { + return exports.convertHiddenOptions(moment, body, [hiddenDates]); + } + body.hiddenDates = []; if (hiddenDates) { if (Array.isArray(hiddenDates) == true) { @@ -14721,12 +14767,17 @@ return /******/ (function(modules) { // webpackBootstrap /** * create new entrees for the repeating hidden dates - * @param body - * @param hiddenDates + * @param {function} moment + * @param {Object} body + * @param {Array | Object} hiddenDates */ - exports.updateHiddenDates = function (body, hiddenDates) { + exports.updateHiddenDates = function (moment, body, hiddenDates) { + if (hiddenDates && !Array.isArray(hiddenDates)) { + return exports.updateHiddenDates(moment, body, [hiddenDates]); + } + if (hiddenDates && body.domProps.centerContainer.width !== undefined) { - exports.convertHiddenOptions(body, hiddenDates); + exports.convertHiddenOptions(moment, body, hiddenDates); var start = moment(body.range.start); var end = moment(body.range.end); @@ -14759,16 +14810,16 @@ return /******/ (function(modules) { // webpackBootstrap } startDate.dayOfYear(start.dayOfYear()); startDate.year(start.year()); - startDate.subtract(7, "days"); + startDate.subtract(7, 'days'); endDate.dayOfYear(start.dayOfYear()); endDate.year(start.year()); - endDate.subtract(7 - offset, "days"); + endDate.subtract(7 - offset, 'days'); - runUntil.add(1, "weeks"); + runUntil.add(1, 'weeks'); break; case "weekly": - var dayOffset = endDate.diff(startDate, "days"); + var dayOffset = endDate.diff(startDate, 'days'); var day = startDate.day(); // set the start date to the range.start @@ -14780,12 +14831,12 @@ return /******/ (function(modules) { // webpackBootstrap // force startDate.day(day); endDate.day(day); - endDate.add(dayOffset, "days"); + endDate.add(dayOffset, 'days'); - startDate.subtract(1, "weeks"); - endDate.subtract(1, "weeks"); + startDate.subtract(1, 'weeks'); + endDate.subtract(1, 'weeks'); - runUntil.add(1, "weeks"); + runUntil.add(1, 'weeks'); break; case "monthly": if (startDate.month() != endDate.month()) { @@ -14793,26 +14844,26 @@ return /******/ (function(modules) { // webpackBootstrap } startDate.month(start.month()); startDate.year(start.year()); - startDate.subtract(1, "months"); + startDate.subtract(1, 'months'); endDate.month(start.month()); endDate.year(start.year()); - endDate.subtract(1, "months"); - endDate.add(offset, "months"); + endDate.subtract(1, 'months'); + endDate.add(offset, 'months'); - runUntil.add(1, "months"); + runUntil.add(1, 'months'); break; case "yearly": if (startDate.year() != endDate.year()) { offset = 1; } startDate.year(start.year()); - startDate.subtract(1, "years"); + startDate.subtract(1, 'years'); endDate.year(start.year()); - endDate.subtract(1, "years"); - endDate.add(offset, "years"); + endDate.subtract(1, 'years'); + endDate.add(offset, 'years'); - runUntil.add(1, "years"); + runUntil.add(1, 'years'); break; default: console.log("Wrong repeat format, allowed are: daily, weekly, monthly, yearly. Given:", hiddenDates[i].repeat); @@ -14822,20 +14873,20 @@ return /******/ (function(modules) { // webpackBootstrap body.hiddenDates.push({ start: startDate.valueOf(), end: endDate.valueOf() }); switch (hiddenDates[i].repeat) { case "daily": - startDate.add(1, "days"); - endDate.add(1, "days"); + startDate.add(1, 'days'); + endDate.add(1, 'days'); break; case "weekly": - startDate.add(1, "weeks"); - endDate.add(1, "weeks"); + startDate.add(1, 'weeks'); + endDate.add(1, 'weeks'); break; case "monthly": - startDate.add(1, "months"); - endDate.add(1, "months"); + startDate.add(1, 'months'); + endDate.add(1, 'months'); break; case "yearly": - startDate.add(1, "y"); - endDate.add(1, "y"); + startDate.add(1, 'y'); + endDate.add(1, 'y'); break; default: console.log("Wrong repeat format, allowed are: daily, weekly, monthly, yearly. Given:", hiddenDates[i].repeat); @@ -14882,14 +14933,14 @@ return /******/ (function(modules) { // webpackBootstrap } // j start inside i else if (hiddenDates[j].start >= hiddenDates[i].start && hiddenDates[j].start <= hiddenDates[i].end) { - hiddenDates[i].end = hiddenDates[j].end; - hiddenDates[j].remove = true; - } - // j end inside i - else if (hiddenDates[j].end >= hiddenDates[i].start && hiddenDates[j].end <= hiddenDates[i].end) { - hiddenDates[i].start = hiddenDates[j].start; - hiddenDates[j].remove = true; - } + hiddenDates[i].end = hiddenDates[j].end; + hiddenDates[j].remove = true; + } + // j end inside i + else if (hiddenDates[j].end >= hiddenDates[i].start && hiddenDates[j].end <= hiddenDates[i].end) { + hiddenDates[i].start = hiddenDates[j].start; + hiddenDates[j].remove = true; + } } } } @@ -14914,10 +14965,11 @@ return /******/ (function(modules) { // webpackBootstrap /** * Used in TimeStep to avoid the hidden times. - * @param timeStep + * @param {function} moment + * @param {TimeStep} timeStep * @param previousTime */ - exports.stepOverHiddenDates = function (timeStep, previousTime) { + exports.stepOverHiddenDates = function (moment, timeStep, previousTime) { var stepInHidden = false; var currentValue = timeStep.current.valueOf(); for (var i = 0; i < timeStep.hiddenDates.length; i++) { @@ -14941,7 +14993,7 @@ return /******/ (function(modules) { // webpackBootstrap timeStep.switchedDay = true; } - timeStep.current = newValue.toDate(); + timeStep.current = newValue; } }; @@ -14986,7 +15038,7 @@ return /******/ (function(modules) { // webpackBootstrap } var duration = exports.getHiddenDurationBetween(Core.body.hiddenDates, Core.range.start, Core.range.end); - time = exports.correctTimeForHidden(Core.body.hiddenDates, Core.range, time); + time = exports.correctTimeForHidden(Core.options.moment, Core.body.hiddenDates, Core.range, time); var conversion = Core.range.conversion(width, duration); return (time.valueOf() - conversion.offset) * conversion.scale; @@ -15038,18 +15090,19 @@ return /******/ (function(modules) { // webpackBootstrap /** * Support function + * @param moment * @param hiddenDates * @param range * @param time * @returns {{duration: number, time: *, offset: number}} */ - exports.correctTimeForHidden = function (hiddenDates, range, time) { + exports.correctTimeForHidden = function (moment, hiddenDates, range, time) { time = moment(time).toDate().valueOf(); - time -= exports.getHiddenDurationBefore(hiddenDates, range, time); + time -= exports.getHiddenDurationBefore(moment, hiddenDates, range, time); return time; }; - exports.getHiddenDurationBefore = function (hiddenDates, range, time) { + exports.getHiddenDurationBefore = function (moment, hiddenDates, range, time) { var timeOffset = 0; time = moment(time).toDate().valueOf(); @@ -15148,23 +15201,23 @@ return /******/ (function(modules) { // webpackBootstrap }; /***/ }, -/* 32 */ +/* 27 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; - var Emitter = __webpack_require__(19); - var Hammer = __webpack_require__(3); - var hammerUtil = __webpack_require__(30); - var util = __webpack_require__(7); - var DataSet = __webpack_require__(14); - var DataView = __webpack_require__(16); - var Range = __webpack_require__(29); - var ItemSet = __webpack_require__(33); - var TimeAxis = __webpack_require__(41); - var Activator = __webpack_require__(42); - var DateUtil = __webpack_require__(31); - var CustomTime = __webpack_require__(44); + var Emitter = __webpack_require__(12); + var Hammer = __webpack_require__(20); + var hammerUtil = __webpack_require__(24); + var util = __webpack_require__(1); + var DataSet = __webpack_require__(8); + var DataView = __webpack_require__(10); + var Range = __webpack_require__(23); + var ItemSet = __webpack_require__(28); + var TimeAxis = __webpack_require__(38); + var Activator = __webpack_require__(39); + var DateUtil = __webpack_require__(26); + var CustomTime = __webpack_require__(41); /** * Create a timeline visualization @@ -15245,12 +15298,16 @@ return /******/ (function(modules) { // webpackBootstrap this.dom.rightContainer.appendChild(this.dom.shadowTopRight); this.dom.rightContainer.appendChild(this.dom.shadowBottomRight); - this.on('rangechange', this.redraw.bind(this)); + this.on('rangechange', (function () { + if (this.initialDrawDone === true) { + this._redraw(); // this allows overriding the _redraw method + } + }).bind(this)); this.on('touch', this._onTouch.bind(this)); this.on('pan', this._onDrag.bind(this)); var me = this; - this.on('change', function (properties) { + this.on('_change', function (properties) { if (properties && properties.queue == true) { // redraw once on next tick if (!me._redrawTimer) { @@ -15330,6 +15387,7 @@ return /******/ (function(modules) { // webpackBootstrap this.touch = {}; this.redrawCount = 0; + this.initialDrawDone = false; // attach the root panel to the provided container if (!container) throw new Error('No container provided'); @@ -15364,9 +15422,10 @@ return /******/ (function(modules) { // webpackBootstrap Core.prototype.setOptions = function (options) { if (options) { // copy the known options - var fields = ['width', 'height', 'minHeight', 'maxHeight', 'autoResize', 'start', 'end', 'clickToUse', 'dataAttributes', 'hiddenDates']; + var fields = ['width', 'height', 'minHeight', 'maxHeight', 'autoResize', 'start', 'end', 'clickToUse', 'dataAttributes', 'hiddenDates', 'locale', 'locales', 'moment', 'throttleRedraw']; util.selectiveExtend(fields, this.options, options); + this.options.orientation = { item: undefined, axis: undefined }; if ('orientation' in options) { if (typeof options.orientation === 'string') { this.options.orientation = { @@ -15412,7 +15471,7 @@ return /******/ (function(modules) { // webpackBootstrap } if ('hiddenDates' in this.options) { - DateUtil.convertHiddenOptions(this.body, this.options.hiddenDates); + DateUtil.convertHiddenOptions(this.options.moment, this.body, this.options.hiddenDates); } if ('clickToUse' in options) { @@ -15457,8 +15516,14 @@ return /******/ (function(modules) { // webpackBootstrap this.configurator.setModuleOptions({ global: appliedOptions }); } - // redraw everything - this._redraw(); + // override redraw with a throttled version + if (!this._origRedraw) { + this._origRedraw = this._redraw.bind(this); + this._redraw = util.throttle(this._origRedraw, this.options.throttleRedraw); + } else { + // Not the initial run: redraw everything + this._redraw(); + } }; /** @@ -15547,6 +15612,24 @@ return /******/ (function(modules) { // webpackBootstrap return customTimes[0].getCustomTime(); }; + /** + * Set a custom title for the custom time bar. + * @param {String} [title] Custom title + * @param {number} [id=undefined] Id of the custom time bar. + */ + Core.prototype.setCustomTimeTitle = function (title, id) { + var customTimes = this.customTimes.filter(function (component) { + return component.options.id === id; + }); + + if (customTimes.length === 0) { + throw new Error('No custom time bar found with id ' + JSON.stringify(id)); + } + if (customTimes.length > 0) { + return customTimes[0].setCustomTitle(title); + } + }; + /** * Retrieve meta information from an event. * Should be overridden by classes extending Core @@ -15577,14 +15660,14 @@ return /******/ (function(modules) { // webpackBootstrap throw new Error('A custom time with id ' + JSON.stringify(id) + ' already exists'); } - var customTime = new CustomTime(this.body, { + var customTime = new CustomTime(this.body, util.extend({}, this.options, { time: timestamp, id: id - }); + })); this.customTimes.push(customTime); this.components.push(customTime); - this.redraw(); + this._redraw(); return id; }; @@ -15724,6 +15807,8 @@ return /******/ (function(modules) { // webpackBootstrap /** * Force a redraw. Can be overridden by implementations of Core + * + * Note: this function will be overridden on construction with a trottled version */ Core.prototype.redraw = function () { this._redraw(); @@ -15735,14 +15820,15 @@ return /******/ (function(modules) { // webpackBootstrap * @protected */ Core.prototype._redraw = function () { + this.redrawCount++; var resized = false; var options = this.options; var props = this.props; var dom = this.dom; - if (!dom) return; // when destroyed + if (!dom || !dom.container || dom.container.clientWidth == 0) return; // when destroyed, or invisible - DateUtil.updateHiddenDates(this.body, this.options.hiddenDates); + DateUtil.updateHiddenDates(this.options.moment, this.body, this.options.hiddenDates); // update class names if (options.orientation == 'top') { @@ -15876,17 +15962,21 @@ return /******/ (function(modules) { // webpackBootstrap this.components.forEach(function (component) { resized = component.redraw() || resized; }); + var MAX_REDRAW = 5; if (resized) { - // keep repainting until all sizes are settled - var MAX_REDRAWS = 3; // maximum number of consecutive redraws - if (this.redrawCount < MAX_REDRAWS) { - this.redrawCount++; - this._redraw(); + if (this.redrawCount < MAX_REDRAW) { + this.body.emitter.emit('_change'); + return; } else { console.log('WARNING: infinite loop in redraw?'); } + } else { this.redrawCount = 0; } + this.initialDrawDone = true; + + //Emit public 'changed' event for UI updates, see issue #1592 + this.body.emitter.emit("changed"); }; // TODO: deprecated since version 1.1.0, remove some day @@ -16011,7 +16101,7 @@ return /******/ (function(modules) { // webpackBootstrap me.props.lastWidth = me.dom.root.offsetWidth; me.props.lastHeight = me.dom.root.offsetHeight; - me.emit('change'); + me.body.emitter.emit('_change'); } } }; @@ -16019,6 +16109,12 @@ return /******/ (function(modules) { // webpackBootstrap // add event listener to window resize util.addEventListener(window, 'resize', this._onResize); + //Prevent initial unnecessary redraw + if (me.dom.root) { + me.props.lastWidth = me.dom.root.offsetWidth; + me.props.lastHeight = me.dom.root.offsetHeight; + } + this.watchTimer = setInterval(this._onResize, 1000); }; @@ -16033,8 +16129,10 @@ return /******/ (function(modules) { // webpackBootstrap } // remove event listener on window.resize - util.removeEventListener(window, 'resize', this._onResize); - this._onResize = null; + if (this._onResize) { + util.removeEventListener(window, 'resize', this._onResize); + this._onResize = null; + } }; /** @@ -16072,8 +16170,7 @@ return /******/ (function(modules) { // webpackBootstrap var newScrollTop = this._setScrollTop(this.touch.initialScrollTop + delta); if (newScrollTop != oldScrollTop) { - this._redraw(); // TODO: this causes two redraws when dragging, the other is triggered by rangechange already - this.emit('verticalDrag'); + this.emit("verticalDrag"); } }; @@ -16134,23 +16231,23 @@ return /******/ (function(modules) { // webpackBootstrap module.exports = Core; /***/ }, -/* 33 */ +/* 28 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; - var Hammer = __webpack_require__(3); - var util = __webpack_require__(7); - var DataSet = __webpack_require__(14); - var DataView = __webpack_require__(16); - var TimeStep = __webpack_require__(37); - var Component = __webpack_require__(27); - var Group = __webpack_require__(34); - var BackgroundGroup = __webpack_require__(38); - var BoxItem = __webpack_require__(39); - var PointItem = __webpack_require__(1); - var RangeItem = __webpack_require__(36); - var BackgroundItem = __webpack_require__(40); + var Hammer = __webpack_require__(20); + var util = __webpack_require__(1); + var DataSet = __webpack_require__(8); + var DataView = __webpack_require__(10); + var TimeStep = __webpack_require__(29); + var Component = __webpack_require__(25); + var Group = __webpack_require__(30); + var BackgroundGroup = __webpack_require__(34); + var BoxItem = __webpack_require__(35); + var PointItem = __webpack_require__(36); + var RangeItem = __webpack_require__(32); + var BackgroundItem = __webpack_require__(37); var UNGROUPED = '__ungrouped__'; // reserved group id for ungrouped items var BACKGROUND = '__background__'; // reserved group id for background items without group @@ -16174,10 +16271,16 @@ return /******/ (function(modules) { // webpackBootstrap }, align: 'auto', // alignment of box items stack: true, - groupOrder: null, + groupOrderSwap: function groupOrderSwap(fromGroup, toGroup, groups) { + var targetOrder = toGroup.order; + toGroup.order = fromGroup.order; + fromGroup.order = targetOrder; + }, + groupOrder: 'order', selectable: true, multiselect: false, + itemsAlwaysDraggable: false, editable: { updateTime: false, @@ -16186,6 +16289,12 @@ return /******/ (function(modules) { // webpackBootstrap remove: false }, + groupEditable: { + order: false, + add: false, + remove: false + }, + snap: TimeStep.snap, onAdd: function onAdd(item, callback) { @@ -16203,6 +16312,15 @@ return /******/ (function(modules) { // webpackBootstrap onMoving: function onMoving(item, callback) { callback(item); }, + onAddGroup: function onAddGroup(item, callback) { + callback(item); + }, + onMoveGroup: function onMoveGroup(item, callback) { + callback(item); + }, + onRemoveGroup: function onRemoveGroup(item, callback) { + callback(item); + }, margin: { item: { @@ -16267,6 +16385,7 @@ return /******/ (function(modules) { // webpackBootstrap this.stackDirty = true; // if true, all items will be restacked on next redraw this.touchParams = {}; // stores properties while dragging + this.groupTouchParams = {}; // create the HTML DOM this._create(); @@ -16349,6 +16468,12 @@ return /******/ (function(modules) { // webpackBootstrap // add item on doubletap this.hammer.on('doubletap', this._onAddItem.bind(this)); + this.groupHammer = new Hammer(this.body.dom.leftContainer); + this.groupHammer.on('panstart', this._onGroupDragStart.bind(this)); + this.groupHammer.on('panmove', this._onGroupDrag.bind(this)); + this.groupHammer.on('panend', this._onGroupDragEnd.bind(this)); + this.groupHammer.get('pan').set({ threshold: 5, direction: 30 }); + // attach to the DOM this.show(); }; @@ -16420,7 +16545,7 @@ return /******/ (function(modules) { // webpackBootstrap ItemSet.prototype.setOptions = function (options) { if (options) { // copy all options that we know - var fields = ['type', 'align', 'order', 'stack', 'selectable', 'multiselect', 'groupOrder', 'dataAttributes', 'template', 'groupTemplate', 'hide', 'snap']; + var fields = ['type', 'align', 'order', 'stack', 'selectable', 'multiselect', 'itemsAlwaysDraggable', 'multiselectPerGroup', 'groupOrder', 'dataAttributes', 'template', 'groupTemplate', 'hide', 'snap', 'groupOrderSwap']; util.selectiveExtend(fields, this.options, options); if ('orientation' in options) { @@ -16460,6 +16585,16 @@ return /******/ (function(modules) { // webpackBootstrap } } + if ('groupEditable' in options) { + if (typeof options.groupEditable === 'boolean') { + this.options.groupEditable.order = options.groupEditable; + this.options.groupEditable.add = options.groupEditable; + this.options.groupEditable.remove = options.groupEditable; + } else if (typeof options.groupEditable === 'object') { + util.selectiveExtend(['order', 'add', 'remove'], this.options.groupEditable, options.groupEditable); + } + } + // callback functions var addCallback = (function (name) { var fn = options[name]; @@ -16470,7 +16605,7 @@ return /******/ (function(modules) { // webpackBootstrap this.options[name] = fn; } }).bind(this); - ['onAdd', 'onUpdate', 'onRemove', 'onMove', 'onMoving'].forEach(addCallback); + ['onAdd', 'onUpdate', 'onRemove', 'onMove', 'onMoving', 'onAddGroup', 'onMoveGroup', 'onRemoveGroup'].forEach(addCallback); // force the itemSet to refresh: options like orientation and margins may be changed this.markDirty(); @@ -16819,6 +16954,8 @@ return /******/ (function(modules) { // webpackBootstrap // update the group holding all ungrouped items this._updateUngrouped(); } + + this.body.emitter.emit('_change', { queue: true }); }; /** @@ -16876,7 +17013,7 @@ return /******/ (function(modules) { // webpackBootstrap // update the order of all items in each group this._order(); - this.body.emitter.emit('change', { queue: true }); + this.body.emitter.emit('_change', { queue: true }); }; /** @@ -16981,7 +17118,7 @@ return /******/ (function(modules) { // webpackBootstrap this._order(); this.stackDirty = true; // force re-stacking of all items next redraw - this.body.emitter.emit('change', { queue: true }); + this.body.emitter.emit('_change', { queue: true }); }; /** @@ -17011,7 +17148,7 @@ return /******/ (function(modules) { // webpackBootstrap // update order this._order(); this.stackDirty = true; // force re-stacking of all items next redraw - this.body.emitter.emit('change', { queue: true }); + this.body.emitter.emit('_change', { queue: true }); } }; @@ -17080,7 +17217,7 @@ return /******/ (function(modules) { // webpackBootstrap } }); - this.body.emitter.emit('change', { queue: true }); + this.body.emitter.emit('_change', { queue: true }); }; /** @@ -17101,7 +17238,7 @@ return /******/ (function(modules) { // webpackBootstrap this.markDirty(); - this.body.emitter.emit('change', { queue: true }); + this.body.emitter.emit('_change', { queue: true }); }; /** @@ -17232,6 +17369,18 @@ return /******/ (function(modules) { // webpackBootstrap this.touchParams.itemProps = null; }; + /** + * Given an group id, returns the index it has. + * + * @param {Number} groupID + * @private + */ + ItemSet.prototype._getGroupIndex = function (groupId) { + for (var i = 0; i < this.groupIds.length; i++) { + if (groupId == this.groupIds[i]) return i; + } + }; + /** * Start dragging the selected events * @param {Event} event @@ -17242,7 +17391,7 @@ return /******/ (function(modules) { // webpackBootstrap var me = this; var props; - if (item && item.selected) { + if (item && (item.selected || this.options.itemsAlwaysDraggable)) { if (!this.options.editable.updateTime && !this.options.editable.updateGroup && !item.editable) { return; @@ -17261,7 +17410,7 @@ return /******/ (function(modules) { // webpackBootstrap item: dragLeftItem, initialX: event.center.x, dragLeft: true, - data: util.extend({}, item.data) // clone the items data + data: this._cloneItemData(item.data) }; this.touchParams.itemProps = [props]; @@ -17270,21 +17419,27 @@ return /******/ (function(modules) { // webpackBootstrap item: dragRightItem, initialX: event.center.x, dragRight: true, - data: util.extend({}, item.data) // clone the items data + data: this._cloneItemData(item.data) }; this.touchParams.itemProps = [props]; } else { - this.touchParams.itemProps = this.getSelection().map(function (id) { + this.touchParams.selectedItem = item; + + var baseGroupIndex = this._getGroupIndex(item.data.group); + + var itemsToDrag = this.options.itemsAlwaysDraggable && !item.selected ? [item.id] : this.getSelection(); + + this.touchParams.itemProps = itemsToDrag.map((function (id) { var item = me.items[id]; - var props = { + var groupIndex = me._getGroupIndex(item.data.group); + return { item: item, initialX: event.center.x, - data: util.extend({}, item.data) // clone the items data + groupOffset: baseGroupIndex - groupIndex, + data: this._cloneItemData(item.data) }; - - return props; - }); + }).bind(this)); } event.stopPropagation(); @@ -17306,7 +17461,7 @@ return /******/ (function(modules) { // webpackBootstrap var time = this.body.util.toTime(x); var scale = this.body.util.getScale(); var step = this.body.util.getStep(); - var start = snap ? snap(time, scale, step) : start; + var start = snap ? snap(time, scale, step) : time; var end = start; var itemData = { @@ -17326,14 +17481,14 @@ return /******/ (function(modules) { // webpackBootstrap var newItem = new RangeItem(itemData, this.conversion, this.options); newItem.id = id; // TODO: not so nice setting id afterwards - newItem.data = itemData; + newItem.data = this._cloneItemData(itemData); this._addItem(newItem); var props = { item: newItem, dragRight: true, initialX: event.center.x, - data: util.extend({}, itemData) + data: newItem.data }; this.touchParams.itemProps = [props]; @@ -17355,15 +17510,29 @@ return /******/ (function(modules) { // webpackBootstrap var scale = this.body.util.getScale(); var step = this.body.util.getStep(); + //only calculate the new group for the item that's actually dragged + var selectedItem = this.touchParams.selectedItem; + var updateGroupAllowed = me.options.editable.updateGroup; + var newGroupBase = null; + if (updateGroupAllowed && selectedItem) { + if (selectedItem.data.group != undefined) { + // drag from one group to another + var group = me.groupFromTarget(event); + if (group) { + //we know the offset for all items, so the new group for all items + //will be relative to this one. + newGroupBase = this._getGroupIndex(group.groupId); + } + } + } + // move - this.touchParams.itemProps.forEach(function (props) { - var newProps = {}; + this.touchParams.itemProps.forEach((function (props) { var current = me.body.util.toTime(event.center.x - xOffset); var initial = me.body.util.toTime(props.initialX - xOffset); - var offset = current - initial; - - var itemData = util.extend({}, props.item.data); // clone the data + var offset = current - initial; // ms + var itemData = this._cloneItemData(props.item.data); // clone the data if (props.item.editable === false) { return; } @@ -17376,6 +17545,7 @@ return /******/ (function(modules) { // webpackBootstrap if (itemData.start != undefined) { var initialStart = util.convert(props.data.start, 'Date'); var start = new Date(initialStart.valueOf() + offset); + // TODO: pass a Moment instead of a Date to snap(). (Breaking change) itemData.start = snap ? snap(start, scale, step) : start; } } else if (props.dragRight) { @@ -17383,6 +17553,7 @@ return /******/ (function(modules) { // webpackBootstrap if (itemData.end != undefined) { var initialEnd = util.convert(props.data.end, 'Date'); var end = new Date(initialEnd.valueOf() + offset); + // TODO: pass a Moment instead of a Date to snap(). (Breaking change) itemData.end = snap ? snap(end, scale, step) : end; } } else { @@ -17395,9 +17566,11 @@ return /******/ (function(modules) { // webpackBootstrap var initialEnd = util.convert(props.data.end, 'Date'); var duration = initialEnd.valueOf() - initialStart.valueOf(); + // TODO: pass a Moment instead of a Date to snap(). (Breaking change) itemData.start = snap ? snap(start, scale, step) : start; itemData.end = new Date(itemData.start.valueOf() + duration); } else { + // TODO: pass a Moment instead of a Date to snap(). (Breaking change) itemData.start = snap ? snap(start, scale, step) : start; } } @@ -17406,26 +17579,29 @@ return /******/ (function(modules) { // webpackBootstrap var updateGroupAllowed = me.options.editable.updateGroup || props.item.editable === true; - if (updateGroupAllowed && (!props.dragLeft && !props.dragRight)) { + if (updateGroupAllowed && !props.dragLeft && !props.dragRight && newGroupBase != null) { if (itemData.group != undefined) { - // drag from one group to another - var group = me.groupFromTarget(event); - if (group) { - itemData.group = group.groupId; - } + var newOffset = newGroupBase - props.groupOffset; + + //make sure we stay in bounds + newOffset = Math.max(0, newOffset); + newOffset = Math.min(me.groupIds.length - 1, newOffset); + + itemData.group = me.groupIds[newOffset]; } } // confirm moving the item - me.options.onMoving(itemData, function (itemData) { + itemData = this._cloneItemData(itemData); // convert start and end to the correct type + me.options.onMoving(itemData, (function (itemData) { if (itemData) { - props.item.setData(itemData); + props.item.setData(this._cloneItemData(itemData, 'Date')); } - }); - }); + }).bind(this)); + }).bind(this)); this.stackDirty = true; // force re-stacking of all items next redraw - this.body.emitter.emit('change'); + this.body.emitter.emit('_change'); } }; @@ -17462,7 +17638,7 @@ return /******/ (function(modules) { // webpackBootstrap var itemProps = this.touchParams.itemProps; this.touchParams.itemProps = null; - itemProps.forEach(function (props) { + itemProps.forEach((function (props) { var id = props.item.id; var exists = me.itemsData.get(id, me.itemOptions) != null; @@ -17476,11 +17652,11 @@ return /******/ (function(modules) { // webpackBootstrap // force re-stacking of all items next redraw me.stackDirty = true; - me.body.emitter.emit('change'); + me.body.emitter.emit('_change'); }); } else { // update existing item - var itemData = util.extend({}, props.item.data); // clone the data + var itemData = this._cloneItemData(props.item.data); // convert start and end to the correct type me.options.onMove(itemData, function (itemData) { if (itemData) { // apply changes @@ -17491,11 +17667,182 @@ return /******/ (function(modules) { // webpackBootstrap props.item.setData(props.data); me.stackDirty = true; // force re-stacking of all items next redraw - me.body.emitter.emit('change'); + me.body.emitter.emit('_change'); } }); } + }).bind(this)); + } + }; + + ItemSet.prototype._onGroupDragStart = function (event) { + if (this.options.groupEditable.order) { + this.groupTouchParams.group = this.groupFromTarget(event); + + if (this.groupTouchParams.group) { + event.stopPropagation(); + + this.groupTouchParams.originalOrder = this.groupsData.getIds({ + order: this.options.groupOrder + }); + } + } + }; + + ItemSet.prototype._onGroupDrag = function (event) { + if (this.options.groupEditable.order && this.groupTouchParams.group) { + event.stopPropagation(); + + // drag from one group to another + var group = this.groupFromTarget(event); + + // try to avoid toggling when groups differ in height + if (group && group.height != this.groupTouchParams.group.height) { + var movingUp = group.top < this.groupTouchParams.group.top; + var clientY = event.center ? event.center.y : event.clientY; + var targetGroupTop = util.getAbsoluteTop(group.dom.foreground); + var draggedGroupHeight = this.groupTouchParams.group.height; + if (movingUp) { + // skip swapping the groups when the dragged group is not below clientY afterwards + if (targetGroupTop + draggedGroupHeight < clientY) { + return; + } + } else { + var targetGroupHeight = group.height; + // skip swapping the groups when the dragged group is not below clientY afterwards + if (targetGroupTop + targetGroupHeight - draggedGroupHeight > clientY) { + return; + } + } + } + + if (group && group != this.groupTouchParams.group) { + var groupsData = this.groupsData; + var targetGroup = groupsData.get(group.groupId); + var draggedGroup = groupsData.get(this.groupTouchParams.group.groupId); + + // switch groups + if (draggedGroup && targetGroup) { + this.options.groupOrderSwap(draggedGroup, targetGroup, this.groupsData); + this.groupsData.update(draggedGroup); + this.groupsData.update(targetGroup); + } + + // fetch current order of groups + var newOrder = this.groupsData.getIds({ + order: this.options.groupOrder + }); + + // in case of changes since _onGroupDragStart + if (!util.equalArray(newOrder, this.groupTouchParams.originalOrder)) { + var groupsData = this.groupsData; + var origOrder = this.groupTouchParams.originalOrder; + var draggedId = this.groupTouchParams.group.groupId; + var numGroups = Math.min(origOrder.length, newOrder.length); + var curPos = 0; + var newOffset = 0; + var orgOffset = 0; + while (curPos < numGroups) { + // as long as the groups are where they should be step down along the groups order + while (curPos + newOffset < numGroups && curPos + orgOffset < numGroups && newOrder[curPos + newOffset] == origOrder[curPos + orgOffset]) { + curPos++; + } + + // all ok + if (curPos + newOffset >= numGroups) { + break; + } + + // not all ok + // if dragged group was move upwards everything below should have an offset + if (newOrder[curPos + newOffset] == draggedId) { + newOffset = 1; + continue; + } + // if dragged group was move downwards everything above should have an offset + else if (origOrder[curPos + orgOffset] == draggedId) { + orgOffset = 1; + continue; + } + // found a group (apart from dragged group) that has the wrong position -> switch with the + // group at the position where other one should be, fix index arrays and continue + else { + var slippedPosition = newOrder.indexOf(origOrder[curPos + orgOffset]); + var switchGroup = groupsData.get(newOrder[curPos + newOffset]); + var shouldBeGroup = groupsData.get(origOrder[curPos + orgOffset]); + this.options.groupOrderSwap(switchGroup, shouldBeGroup, groupsData); + groupsData.update(switchGroup); + groupsData.update(shouldBeGroup); + + var switchGroupId = newOrder[curPos + newOffset]; + newOrder[curPos + newOffset] = origOrder[curPos + orgOffset]; + newOrder[slippedPosition] = switchGroupId; + + curPos++; + } + } + } + } + } + }; + + ItemSet.prototype._onGroupDragEnd = function (event) { + if (this.options.groupEditable.order && this.groupTouchParams.group) { + event.stopPropagation(); + + // update existing group + var me = this; + var id = me.groupTouchParams.group.groupId; + var dataset = me.groupsData.getDataSet(); + var groupData = util.extend({}, dataset.get(id)); // clone the data + me.options.onMoveGroup(groupData, function (groupData) { + if (groupData) { + // apply changes + groupData[dataset._fieldId] = id; // ensure the group contains its id (can be undefined) + dataset.update(groupData); + } else { + + // fetch current order of groups + var newOrder = dataset.getIds({ + order: me.options.groupOrder + }); + + // restore original order + if (!util.equalArray(newOrder, me.groupTouchParams.originalOrder)) { + var origOrder = me.groupTouchParams.originalOrder; + var numGroups = Math.min(origOrder.length, newOrder.length); + var curPos = 0; + while (curPos < numGroups) { + // as long as the groups are where they should be step down along the groups order + while (curPos < numGroups && newOrder[curPos] == origOrder[curPos]) { + curPos++; + } + + // all ok + if (curPos >= numGroups) { + break; + } + + // found a group that has the wrong position -> switch with the + // group at the position where other one should be, fix index arrays and continue + var slippedPosition = newOrder.indexOf(origOrder[curPos]); + var switchGroup = dataset.get(newOrder[curPos]); + var shouldBeGroup = dataset.get(origOrder[curPos]); + me.options.groupOrderSwap(switchGroup, shouldBeGroup, dataset); + groupsData.update(switchGroup); + groupsData.update(shouldBeGroup); + + var switchGroupId = newOrder[curPos]; + newOrder[curPos] = origOrder[curPos]; + newOrder[slippedPosition] = switchGroupId; + + curPos++; + } + } + } }); + + me.body.emitter.emit('groupDragged', { groupId: id }); } }; @@ -17545,8 +17892,6 @@ return /******/ (function(modules) { // webpackBootstrap var snap = this.options.snap || null; var item = this.itemFromTarget(event); - event.stopPropagation(); - if (item) { // update item @@ -17565,7 +17910,7 @@ return /******/ (function(modules) { // webpackBootstrap var scale = this.body.util.getScale(); var step = this.body.util.getStep(); - var newItem = { + var newItemData = { start: snap ? snap(start, scale, step) : start, content: 'new item' }; @@ -17573,18 +17918,19 @@ return /******/ (function(modules) { // webpackBootstrap // when default type is a range, add a default end date to the new item if (this.options.type === 'range') { var end = this.body.util.toTime(x + this.props.width / 5); - newItem.end = snap ? snap(end, scale, step) : end; + newItemData.end = snap ? snap(end, scale, step) : end; } - newItem[this.itemsData._fieldId] = util.randomUUID(); + newItemData[this.itemsData._fieldId] = util.randomUUID(); var group = this.groupFromTarget(event); if (group) { - newItem.group = group.groupId; + newItemData.group = group.groupId; } // execute async handler to customize (or cancel) adding an item - this.options.onAdd(newItem, function (item) { + newItemData = this._cloneItemData(newItemData); // convert start and end to the correct type + this.options.onAdd(newItemData, function (item) { if (item) { me.itemsData.getDataSet().add(item); // TODO: need to trigger a redraw? @@ -17613,35 +17959,48 @@ return /******/ (function(modules) { // webpackBootstrap if (shiftKey && this.options.multiselect) { // select all items between the old selection and the tapped item + var itemGroup = this.itemsData.get(item.id).group; + + // when filtering get the group of the last selected item + var lastSelectedGroup = undefined; + if (this.options.multiselectPerGroup) { + if (selection.length > 0) { + lastSelectedGroup = this.itemsData.get(selection[0]).group; + } + } // determine the selection range - selection.push(item.id); + if (!this.options.multiselectPerGroup || lastSelectedGroup == undefined || lastSelectedGroup == itemGroup) { + selection.push(item.id); + } var range = ItemSet._getItemRange(this.itemsData.get(selection, this.itemOptions)); - // select all items within the selection range - selection = []; - for (var id in this.items) { - if (this.items.hasOwnProperty(id)) { - var _item = this.items[id]; - var start = _item.data.start; - var end = _item.data.end !== undefined ? _item.data.end : start; + if (!this.options.multiselectPerGroup || lastSelectedGroup == itemGroup) { + // select all items within the selection range + selection = []; + for (var id in this.items) { + if (this.items.hasOwnProperty(id)) { + var _item = this.items[id]; + var start = _item.data.start; + var end = _item.data.end !== undefined ? _item.data.end : start; - if (start >= range.min && end <= range.max && !(_item instanceof BackgroundItem)) { - selection.push(_item.id); // do not use id but item.id, id itself is stringified + if (start >= range.min && end <= range.max && (!this.options.multiselectPerGroup || lastSelectedGroup == this.itemsData.get(_item.id).group) && !(_item instanceof BackgroundItem)) { + selection.push(_item.id); // do not use id but item.id, id itself is stringified + } } } } } else { - // add/remove this item from the current selection - var index = selection.indexOf(item.id); - if (index == -1) { - // item is not yet selected -> select it - selection.push(item.id); - } else { - // item is already selected -> deselect it - selection.splice(index, 1); + // add/remove this item from the current selection + var index = selection.indexOf(item.id); + if (index == -1) { + // item is not yet selected -> select it + selection.push(item.id); + } else { + // item is already selected -> deselect it + selection.splice(index, 1); + } } - } this.setSelection(selection); @@ -17751,17 +18110,754 @@ return /******/ (function(modules) { // webpackBootstrap return null; }; + /** + * Clone the data of an item, and "normalize" it: convert the start and end date + * to the type (Date, Moment, ...) configured in the DataSet. If not configured, + * start and end are converted to Date. + * @param {Object} itemData, typically `item.data` + * @param {string} [type] Optional Date type. If not provided, the type from the DataSet is taken + * @return {Object} The cloned object + * @private + */ + ItemSet.prototype._cloneItemData = function (itemData, type) { + var clone = util.extend({}, itemData); + + if (!type) { + // convert start and end date to the type (Date, Moment, ...) configured in the DataSet + type = this.itemsData.getDataSet()._options.type; + } + + if (clone.start != undefined) { + clone.start = util.convert(clone.start, type && type.start || 'Date'); + } + if (clone.end != undefined) { + clone.end = util.convert(clone.end, type && type.end || 'Date'); + } + + return clone; + }; + module.exports = ItemSet; /***/ }, -/* 34 */ +/* 29 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; - var util = __webpack_require__(7); - var stack = __webpack_require__(35); - var RangeItem = __webpack_require__(36); + var moment = __webpack_require__(2); + var DateUtil = __webpack_require__(26); + var util = __webpack_require__(1); + + /** + * @constructor TimeStep + * The class TimeStep is an iterator for dates. You provide a start date and an + * end date. The class itself determines the best scale (step size) based on the + * provided start Date, end Date, and minimumStep. + * + * If minimumStep is provided, the step size is chosen as close as possible + * to the minimumStep but larger than minimumStep. If minimumStep is not + * provided, the scale is set to 1 DAY. + * The minimumStep should correspond with the onscreen size of about 6 characters + * + * Alternatively, you can set a scale by hand. + * After creation, you can initialize the class by executing first(). Then you + * can iterate from the start date to the end date via next(). You can check if + * the end date is reached with the function hasNext(). After each step, you can + * retrieve the current date via getCurrent(). + * The TimeStep has scales ranging from milliseconds, seconds, minutes, hours, + * days, to years. + * + * Version: 1.2 + * + * @param {Date} [start] The start date, for example new Date(2010, 9, 21) + * or new Date(2010, 9, 21, 23, 45, 00) + * @param {Date} [end] The end date + * @param {Number} [minimumStep] Optional. Minimum step size in milliseconds + */ + function TimeStep(start, end, minimumStep, hiddenDates) { + this.moment = moment; + + // variables + this.current = this.moment(); + this._start = this.moment(); + this._end = this.moment(); + + this.autoScale = true; + this.scale = 'day'; + this.step = 1; + + // initialize the range + this.setRange(start, end, minimumStep); + + // hidden Dates options + this.switchedDay = false; + this.switchedMonth = false; + this.switchedYear = false; + if (Array.isArray(hiddenDates)) { + this.hiddenDates = hiddenDates; + } else if (hiddenDates != undefined) { + this.hiddenDates = [hiddenDates]; + } else { + this.hiddenDates = []; + } + + this.format = TimeStep.FORMAT; // default formatting + } + + // Time formatting + TimeStep.FORMAT = { + minorLabels: { + millisecond: 'SSS', + second: 's', + minute: 'HH:mm', + hour: 'HH:mm', + weekday: 'ddd D', + day: 'D', + month: 'MMM', + year: 'YYYY' + }, + majorLabels: { + millisecond: 'HH:mm:ss', + second: 'D MMMM HH:mm', + minute: 'ddd D MMMM', + hour: 'ddd D MMMM', + weekday: 'MMMM YYYY', + day: 'MMMM YYYY', + month: 'YYYY', + year: '' + } + }; + + /** + * Set custom constructor function for moment. Can be used to set dates + * to UTC or to set a utcOffset. + * @param {function} moment + */ + TimeStep.prototype.setMoment = function (moment) { + this.moment = moment; + + // update the date properties, can have a new utcOffset + this.current = this.moment(this.current); + this._start = this.moment(this._start); + this._end = this.moment(this._end); + }; + + /** + * Set custom formatting for the minor an major labels of the TimeStep. + * Both `minorLabels` and `majorLabels` are an Object with properties: + * 'millisecond', 'second', 'minute', 'hour', 'weekday', 'day', 'month', 'year'. + * @param {{minorLabels: Object, majorLabels: Object}} format + */ + TimeStep.prototype.setFormat = function (format) { + var defaultFormat = util.deepExtend({}, TimeStep.FORMAT); + this.format = util.deepExtend(defaultFormat, format); + }; + + /** + * Set a new range + * If minimumStep is provided, the step size is chosen as close as possible + * to the minimumStep but larger than minimumStep. If minimumStep is not + * provided, the scale is set to 1 DAY. + * The minimumStep should correspond with the onscreen size of about 6 characters + * @param {Date} [start] The start date and time. + * @param {Date} [end] The end date and time. + * @param {int} [minimumStep] Optional. Minimum step size in milliseconds + */ + TimeStep.prototype.setRange = function (start, end, minimumStep) { + if (!(start instanceof Date) || !(end instanceof Date)) { + throw "No legal start or end date in method setRange"; + } + + this._start = start != undefined ? this.moment(start.valueOf()) : new Date(); + this._end = end != undefined ? this.moment(end.valueOf()) : new Date(); + + if (this.autoScale) { + this.setMinimumStep(minimumStep); + } + }; + + /** + * Set the range iterator to the start date. + */ + TimeStep.prototype.start = function () { + this.current = this._start.clone(); + this.roundToMinor(); + }; + + /** + * Round the current date to the first minor date value + * This must be executed once when the current date is set to start Date + */ + TimeStep.prototype.roundToMinor = function () { + // round to floor + // IMPORTANT: we have no breaks in this switch! (this is no bug) + // noinspection FallThroughInSwitchStatementJS + switch (this.scale) { + case 'year': + this.current.year(this.step * Math.floor(this.current.year() / this.step)); + this.current.month(0); + case 'month': + this.current.date(1); + case 'day': // intentional fall through + case 'weekday': + this.current.hours(0); + case 'hour': + this.current.minutes(0); + case 'minute': + this.current.seconds(0); + case 'second': + this.current.milliseconds(0); + //case 'millisecond': // nothing to do for milliseconds + } + + if (this.step != 1) { + // round down to the first minor value that is a multiple of the current step size + switch (this.scale) { + case 'millisecond': + this.current.subtract(this.current.milliseconds() % this.step, 'milliseconds');break; + case 'second': + this.current.subtract(this.current.seconds() % this.step, 'seconds');break; + case 'minute': + this.current.subtract(this.current.minutes() % this.step, 'minutes');break; + case 'hour': + this.current.subtract(this.current.hours() % this.step, 'hours');break; + case 'weekday': // intentional fall through + case 'day': + this.current.subtract((this.current.date() - 1) % this.step, 'day');break; + case 'month': + this.current.subtract(this.current.month() % this.step, 'month');break; + case 'year': + this.current.subtract(this.current.year() % this.step, 'year');break; + default: + break; + } + } + }; + + /** + * Check if the there is a next step + * @return {boolean} true if the current date has not passed the end date + */ + TimeStep.prototype.hasNext = function () { + return this.current.valueOf() <= this._end.valueOf(); + }; + + /** + * Do the next step + */ + TimeStep.prototype.next = function () { + var prev = this.current.valueOf(); + + // 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.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; + } + } + + if (this.step != 1) { + // round down to the correct major value + switch (this.scale) { + case 'millisecond': + if (this.current.milliseconds() < this.step) this.current.milliseconds(0);break; + case 'second': + if (this.current.seconds() < this.step) this.current.seconds(0);break; + case 'minute': + if (this.current.minutes() < this.step) this.current.minutes(0);break; + case 'hour': + if (this.current.hours() < this.step) this.current.hours(0);break; + case 'weekday': // intentional fall through + case 'day': + if (this.current.date() < this.step + 1) this.current.date(1);break; + case 'month': + if (this.current.month() < this.step) this.current.month(0);break; + case 'year': + break; // nothing to do for year + default: + break; + } + } + + // safety mechanism: if current time is still unchanged, move to the end + if (this.current.valueOf() == prev) { + this.current = this._end.clone(); + } + + DateUtil.stepOverHiddenDates(this.moment, this, prev); + }; + + /** + * Get the current datetime + * @return {Moment} current The current date + */ + TimeStep.prototype.getCurrent = function () { + return this.current; + }; + + /** + * Set a custom scale. Autoscaling will be disabled. + * For example setScale('minute', 5) will result + * in minor steps of 5 minutes, and major steps of an hour. + * + * @param {{scale: string, step: number}} params + * An object containing two properties: + * - A string 'scale'. Choose from 'millisecond', 'second', + * 'minute', 'hour', 'weekday', 'day', 'month', 'year'. + * - A number 'step'. A step size, by default 1. + * Choose for example 1, 2, 5, or 10. + */ + TimeStep.prototype.setScale = function (params) { + if (params && typeof params.scale == 'string') { + this.scale = params.scale; + this.step = params.step > 0 ? params.step : 1; + this.autoScale = false; + } + }; + + /** + * Enable or disable autoscaling + * @param {boolean} enable If true, autoascaling is set true + */ + TimeStep.prototype.setAutoScale = function (enable) { + this.autoScale = enable; + }; + + /** + * Automatically determine the scale that bests fits the provided minimum step + * @param {Number} [minimumStep] The minimum step size in milliseconds + */ + TimeStep.prototype.setMinimumStep = function (minimumStep) { + if (minimumStep == undefined) { + return; + } + + //var b = asc + ds; + + var stepYear = 1000 * 60 * 60 * 24 * 30 * 12; + var stepMonth = 1000 * 60 * 60 * 24 * 30; + var stepDay = 1000 * 60 * 60 * 24; + var stepHour = 1000 * 60 * 60; + var stepMinute = 1000 * 60; + var stepSecond = 1000; + var stepMillisecond = 1; + + // find the smallest step that is larger than the provided minimumStep + if (stepYear * 1000 > minimumStep) { + this.scale = 'year';this.step = 1000; + } + if (stepYear * 500 > minimumStep) { + this.scale = 'year';this.step = 500; + } + if (stepYear * 100 > minimumStep) { + this.scale = 'year';this.step = 100; + } + if (stepYear * 50 > minimumStep) { + this.scale = 'year';this.step = 50; + } + if (stepYear * 10 > minimumStep) { + this.scale = 'year';this.step = 10; + } + if (stepYear * 5 > minimumStep) { + this.scale = 'year';this.step = 5; + } + if (stepYear > minimumStep) { + this.scale = 'year';this.step = 1; + } + if (stepMonth * 3 > minimumStep) { + this.scale = 'month';this.step = 3; + } + if (stepMonth > minimumStep) { + this.scale = 'month';this.step = 1; + } + if (stepDay * 5 > minimumStep) { + this.scale = 'day';this.step = 5; + } + if (stepDay * 2 > minimumStep) { + this.scale = 'day';this.step = 2; + } + if (stepDay > minimumStep) { + this.scale = 'day';this.step = 1; + } + if (stepDay / 2 > minimumStep) { + this.scale = 'weekday';this.step = 1; + } + if (stepHour * 4 > minimumStep) { + this.scale = 'hour';this.step = 4; + } + if (stepHour > minimumStep) { + this.scale = 'hour';this.step = 1; + } + if (stepMinute * 15 > minimumStep) { + this.scale = 'minute';this.step = 15; + } + if (stepMinute * 10 > minimumStep) { + this.scale = 'minute';this.step = 10; + } + if (stepMinute * 5 > minimumStep) { + this.scale = 'minute';this.step = 5; + } + if (stepMinute > minimumStep) { + this.scale = 'minute';this.step = 1; + } + if (stepSecond * 15 > minimumStep) { + this.scale = 'second';this.step = 15; + } + if (stepSecond * 10 > minimumStep) { + this.scale = 'second';this.step = 10; + } + if (stepSecond * 5 > minimumStep) { + this.scale = 'second';this.step = 5; + } + if (stepSecond > minimumStep) { + this.scale = 'second';this.step = 1; + } + if (stepMillisecond * 200 > minimumStep) { + this.scale = 'millisecond';this.step = 200; + } + if (stepMillisecond * 100 > minimumStep) { + this.scale = 'millisecond';this.step = 100; + } + if (stepMillisecond * 50 > minimumStep) { + this.scale = 'millisecond';this.step = 50; + } + if (stepMillisecond * 10 > minimumStep) { + this.scale = 'millisecond';this.step = 10; + } + if (stepMillisecond * 5 > minimumStep) { + this.scale = 'millisecond';this.step = 5; + } + if (stepMillisecond > minimumStep) { + this.scale = 'millisecond';this.step = 1; + } + }; + + /** + * Snap a date to a rounded value. + * The snap intervals are dependent on the current scale and step. + * Static function + * @param {Date} date the date to be snapped. + * @param {string} scale Current scale, can be 'millisecond', 'second', + * 'minute', 'hour', 'weekday, 'day', 'month', 'year'. + * @param {number} step Current step (1, 2, 4, 5, ... + * @return {Date} snappedDate + */ + TimeStep.snap = function (date, scale, step) { + var clone = moment(date); + + if (scale == 'year') { + var year = clone.year() + Math.round(clone.month() / 12); + clone.year(Math.round(year / step) * step); + clone.month(0); + clone.date(0); + clone.hours(0); + clone.minutes(0); + clone.seconds(0); + clone.milliseconds(0); + } else if (scale == 'month') { + if (clone.date() > 15) { + clone.date(1); + clone.add(1, 'month'); + // important: first set Date to 1, after that change the month. + } else { + clone.date(1); + } + + clone.hours(0); + clone.minutes(0); + clone.seconds(0); + clone.milliseconds(0); + } else if (scale == 'day') { + //noinspection FallthroughInSwitchStatementJS + switch (step) { + case 5: + case 2: + clone.hours(Math.round(clone.hours() / 24) * 24);break; + default: + clone.hours(Math.round(clone.hours() / 12) * 12);break; + } + clone.minutes(0); + clone.seconds(0); + clone.milliseconds(0); + } else if (scale == 'weekday') { + //noinspection FallthroughInSwitchStatementJS + switch (step) { + case 5: + case 2: + clone.hours(Math.round(clone.hours() / 12) * 12);break; + default: + clone.hours(Math.round(clone.hours() / 6) * 6);break; + } + clone.minutes(0); + clone.seconds(0); + clone.milliseconds(0); + } else if (scale == 'hour') { + switch (step) { + case 4: + clone.minutes(Math.round(clone.minutes() / 60) * 60);break; + default: + clone.minutes(Math.round(clone.minutes() / 30) * 30);break; + } + clone.seconds(0); + clone.milliseconds(0); + } else if (scale == 'minute') { + //noinspection FallthroughInSwitchStatementJS + switch (step) { + case 15: + case 10: + clone.minutes(Math.round(clone.minutes() / 5) * 5); + clone.seconds(0); + break; + case 5: + clone.seconds(Math.round(clone.seconds() / 60) * 60);break; + default: + clone.seconds(Math.round(clone.seconds() / 30) * 30);break; + } + clone.milliseconds(0); + } else if (scale == 'second') { + //noinspection FallthroughInSwitchStatementJS + switch (step) { + case 15: + case 10: + clone.seconds(Math.round(clone.seconds() / 5) * 5); + clone.milliseconds(0); + break; + case 5: + clone.milliseconds(Math.round(clone.milliseconds() / 1000) * 1000);break; + default: + clone.milliseconds(Math.round(clone.milliseconds() / 500) * 500);break; + } + } else if (scale == 'millisecond') { + var _step = step > 5 ? step / 2 : 1; + clone.milliseconds(Math.round(clone.milliseconds() / _step) * _step); + } + + return clone; + }; + + /** + * Check if the current value is a major value (for example when the step + * is DAY, a major value is each first day of the MONTH) + * @return {boolean} true if current date is major, else false. + */ + TimeStep.prototype.isMajor = function () { + if (this.switchedYear == true) { + this.switchedYear = false; + switch (this.scale) { + case 'year': + case 'month': + case 'weekday': + case 'day': + case 'hour': + case 'minute': + case 'second': + case 'millisecond': + return true; + default: + return false; + } + } else if (this.switchedMonth == true) { + this.switchedMonth = false; + switch (this.scale) { + case 'weekday': + case 'day': + case 'hour': + case 'minute': + case 'second': + case 'millisecond': + return true; + default: + return false; + } + } else if (this.switchedDay == true) { + this.switchedDay = false; + switch (this.scale) { + case 'millisecond': + case 'second': + case 'minute': + case 'hour': + return true; + default: + return false; + } + } + + var date = this.moment(this.current); + switch (this.scale) { + case 'millisecond': + return date.milliseconds() == 0; + case 'second': + return date.seconds() == 0; + case 'minute': + return date.hours() == 0 && date.minutes() == 0; + case 'hour': + return date.hours() == 0; + case 'weekday': // intentional fall through + case 'day': + return date.date() == 1; + case 'month': + return date.month() == 0; + case 'year': + return false; + default: + return false; + } + }; + + /** + * Returns formatted text for the minor axislabel, depending on the current + * date and the scale. For example when scale is MINUTE, the current time is + * formatted as "hh:mm". + * @param {Date} [date] custom date. if not provided, current date is taken + */ + TimeStep.prototype.getLabelMinor = function (date) { + if (date == undefined) { + date = this.current; + } + + var format = this.format.minorLabels[this.scale]; + return format && format.length > 0 ? this.moment(date).format(format) : ''; + }; + + /** + * Returns formatted text for the major axis label, depending on the current + * date and the scale. For example when scale is MINUTE, the major scale is + * hours, and the hour will be formatted as "hh". + * @param {Date} [date] custom date. if not provided, current date is taken + */ + TimeStep.prototype.getLabelMajor = function (date) { + if (date == undefined) { + date = this.current; + } + + var format = this.format.majorLabels[this.scale]; + return format && format.length > 0 ? this.moment(date).format(format) : ''; + }; + + TimeStep.prototype.getClassName = function () { + var _moment = this.moment; + var m = this.moment(this.current); + var current = m.locale ? m.locale('en') : m.lang('en'); // old versions of moment have .lang() function + var step = this.step; + + function even(value) { + return value / step % 2 == 0 ? ' vis-even' : ' vis-odd'; + } + + function today(date) { + if (date.isSame(new Date(), 'day')) { + return ' vis-today'; + } + if (date.isSame(_moment().add(1, 'day'), 'day')) { + return ' vis-tomorrow'; + } + if (date.isSame(_moment().add(-1, 'day'), 'day')) { + return ' vis-yesterday'; + } + return ''; + } + + function currentWeek(date) { + return date.isSame(new Date(), 'week') ? ' vis-current-week' : ''; + } + + function currentMonth(date) { + return date.isSame(new Date(), 'month') ? ' vis-current-month' : ''; + } + + function currentYear(date) { + return date.isSame(new Date(), 'year') ? ' vis-current-year' : ''; + } + + switch (this.scale) { + case 'millisecond': + return even(current.milliseconds()).trim(); + + case 'second': + return even(current.seconds()).trim(); + + case 'minute': + return even(current.minutes()).trim(); + + case 'hour': + var hours = current.hours(); + if (this.step == 4) { + hours = hours + '-h' + (hours + 4); + } + return 'vis-h' + hours + today(current) + even(current.hours()); + + case 'weekday': + return 'vis-' + current.format('dddd').toLowerCase() + today(current) + currentWeek(current) + even(current.date()); + + case 'day': + var day = current.date(); + var month = current.format('MMMM').toLowerCase(); + return 'vis-day' + day + ' vis-' + month + currentMonth(current) + even(day - 1); + + case 'month': + return 'vis-' + current.format('MMMM').toLowerCase() + currentMonth(current) + even(current.month()); + + case 'year': + var year = current.year(); + return 'vis-year' + year + currentYear(current) + even(year); + + default: + return ''; + } + }; + + module.exports = TimeStep; + +/***/ }, +/* 30 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + var util = __webpack_require__(1); + var stack = __webpack_require__(31); + var RangeItem = __webpack_require__(32); /** * @constructor Group @@ -17793,7 +18889,7 @@ return /******/ (function(modules) { // webpackBootstrap }; this.checkRangedItems = false; // needed to refresh the ranged items if the window is programatically changed with NO overlap. var me = this; - this.itemSet.body.emitter.on('checkRangedItems', function () { + this.itemSet.body.emitter.on("checkRangedItems", function () { me.checkRangedItems = true; }); @@ -17808,7 +18904,11 @@ return /******/ (function(modules) { // webpackBootstrap */ Group.prototype._create = function () { var label = document.createElement('div'); - label.className = 'vis-label'; + if (this.itemSet.options.groupEditable.order) { + label.className = 'vis-label draggable'; + } else { + label.className = 'vis-label'; + } this.dom.label = label; var inner = document.createElement('div'); @@ -17929,6 +19029,9 @@ return /******/ (function(modules) { // webpackBootstrap restack = true; } + // recalculate the height of the subgroups + this._calculateSubGroupHeights(); + // reposition visible items vertically if (typeof this.itemSet.options.order === 'function') { // a custom order function @@ -17996,6 +19099,25 @@ return /******/ (function(modules) { // webpackBootstrap return resized; }; + /** + * recalculate the height of the subgroups + * @private + */ + Group.prototype._calculateSubGroupHeights = function () { + if (Object.keys(this.subgroups).length > 0) { + var me = this; + + this.resetSubgroups(); + + util.forEach(this.visibleItems, function (item) { + if (item.data.subgroup !== undefined) { + me.subgroups[item.data.subgroup].height = Math.max(me.subgroups[item.data.subgroup].height, item.height); + me.subgroups[item.data.subgroup].visible = true; + } + }); + } + }; + /** * recalculate the height of the group * @param {{item: {horizontal: number, vertical: number}, axis: number}} margin @@ -18006,20 +19128,12 @@ return /******/ (function(modules) { // webpackBootstrap // recalculate the height of the group var height; var visibleItems = this.visibleItems; - //var visibleSubgroups = []; - //this.visibleSubgroups = 0; - this.resetSubgroups(); - var me = this; if (visibleItems.length > 0) { var min = visibleItems[0].top; var max = visibleItems[0].top + visibleItems[0].height; util.forEach(visibleItems, function (item) { min = Math.min(min, item.top); max = Math.max(max, item.top + item.height); - if (item.data.subgroup !== undefined) { - me.subgroups[item.data.subgroup].height = Math.max(me.subgroups[item.data.subgroup].height, item.height); - me.subgroups[item.data.subgroup].visible = true; - } }); if (min > margin.axis) { // there is an empty gap between the lowest item and the axis @@ -18361,7 +19475,7 @@ return /******/ (function(modules) { // webpackBootstrap module.exports = Group; /***/ }, -/* 35 */ +/* 31 */ /***/ function(module, exports) { // Utility functions for ordering and stacking of items @@ -18485,13 +19599,13 @@ return /******/ (function(modules) { // webpackBootstrap }; /***/ }, -/* 36 */ +/* 32 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; - var Hammer = __webpack_require__(3); - var Item = __webpack_require__(2); + var Hammer = __webpack_require__(20); + var Item = __webpack_require__(33); /** * @constructor RangeItem @@ -18678,10 +19792,10 @@ return /******/ (function(modules) { // webpackBootstrap // a width which will not change when moving the Timeline // So no re-stacking needed, which is nicer for the eye; } else { - this.left = start; - this.width = boxWidth; - contentWidth = Math.min(end - start, this.props.content.width); - } + this.left = start; + this.width = boxWidth; + contentWidth = Math.min(end - start, this.props.content.width); + } this.dom.box.style.left = this.left + 'px'; this.dom.box.style.width = boxWidth + 'px'; @@ -18709,12 +19823,12 @@ return /******/ (function(modules) { // webpackBootstrap contentLeft = -contentWidth; // ensure it's not visible anymore } } else { - if (start < 0) { - contentLeft = -start; - } else { - contentLeft = 0; + if (start < 0) { + contentLeft = -start; + } else { + contentLeft = 0; + } } - } this.dom.content.style.left = contentLeft + 'px'; } }; @@ -18781,703 +19895,314 @@ return /******/ (function(modules) { // webpackBootstrap module.exports = RangeItem; /***/ }, -/* 37 */ +/* 33 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; - var moment = __webpack_require__(8); - var DateUtil = __webpack_require__(31); - var util = __webpack_require__(7); + var Hammer = __webpack_require__(20); + var util = __webpack_require__(1); /** - * @constructor TimeStep - * The class TimeStep is an iterator for dates. You provide a start date and an - * end date. The class itself determines the best scale (step size) based on the - * provided start Date, end Date, and minimumStep. - * - * If minimumStep is provided, the step size is chosen as close as possible - * to the minimumStep but larger than minimumStep. If minimumStep is not - * provided, the scale is set to 1 DAY. - * The minimumStep should correspond with the onscreen size of about 6 characters - * - * Alternatively, you can set a scale by hand. - * After creation, you can initialize the class by executing first(). Then you - * can iterate from the start date to the end date via next(). You can check if - * the end date is reached with the function hasNext(). After each step, you can - * retrieve the current date via getCurrent(). - * The TimeStep has scales ranging from milliseconds, seconds, minutes, hours, - * days, to years. - * - * Version: 1.2 - * - * @param {Date} [start] The start date, for example new Date(2010, 9, 21) - * or new Date(2010, 9, 21, 23, 45, 00) - * @param {Date} [end] The end date - * @param {Number} [minimumStep] Optional. Minimum step size in milliseconds + * @constructor Item + * @param {Object} data Object containing (optional) parameters type, + * start, end, content, group, className. + * @param {{toScreen: function, toTime: function}} conversion + * Conversion functions from time to screen and vice versa + * @param {Object} options Configuration options + * // TODO: describe available options */ - function TimeStep(start, end, minimumStep, hiddenDates) { - // variables - this.current = new Date(); - this._start = new Date(); - this._end = new Date(); + function Item(data, conversion, options) { + this.id = null; + this.parent = null; + this.data = data; + this.dom = null; + this.conversion = conversion || {}; + this.options = options || {}; - this.autoScale = true; - this.scale = 'day'; - this.step = 1; + this.selected = false; + this.displayed = false; + this.dirty = true; - // initialize the range - this.setRange(start, end, minimumStep); + this.top = null; + this.left = null; + this.width = null; + this.height = null; - // hidden Dates options - this.switchedDay = false; - this.switchedMonth = false; - this.switchedYear = false; - this.hiddenDates = hiddenDates; - if (hiddenDates === undefined) { - this.hiddenDates = []; + this.editable = null; + if (this.data && this.data.hasOwnProperty('editable') && typeof this.data.editable === 'boolean') { + this.editable = data.editable; } - - this.format = TimeStep.FORMAT; // default formatting } - // Time formatting - TimeStep.FORMAT = { - minorLabels: { - millisecond: 'SSS', - second: 's', - minute: 'HH:mm', - hour: 'HH:mm', - weekday: 'ddd D', - day: 'D', - month: 'MMM', - year: 'YYYY' - }, - majorLabels: { - millisecond: 'HH:mm:ss', - second: 'D MMMM HH:mm', - minute: 'ddd D MMMM', - hour: 'ddd D MMMM', - weekday: 'MMMM YYYY', - day: 'MMMM YYYY', - month: 'YYYY', - year: '' - } + Item.prototype.stack = true; + + /** + * Select current item + */ + Item.prototype.select = function () { + this.selected = true; + this.dirty = true; + if (this.displayed) this.redraw(); }; /** - * Set custom formatting for the minor an major labels of the TimeStep. - * Both `minorLabels` and `majorLabels` are an Object with properties: - * 'millisecond', 'second', 'minute', 'hour', 'weekday', 'day', 'month', 'year'. - * @param {{minorLabels: Object, majorLabels: Object}} format + * Unselect current item */ - TimeStep.prototype.setFormat = function (format) { - var defaultFormat = util.deepExtend({}, TimeStep.FORMAT); - this.format = util.deepExtend(defaultFormat, format); + Item.prototype.unselect = function () { + this.selected = false; + this.dirty = true; + if (this.displayed) this.redraw(); }; /** - * Set a new range - * If minimumStep is provided, the step size is chosen as close as possible - * to the minimumStep but larger than minimumStep. If minimumStep is not - * provided, the scale is set to 1 DAY. - * The minimumStep should correspond with the onscreen size of about 6 characters - * @param {Date} [start] The start date and time. - * @param {Date} [end] The end date and time. - * @param {int} [minimumStep] Optional. Minimum step size in milliseconds + * Set data for the item. Existing data will be updated. The id should not + * be changed. When the item is displayed, it will be redrawn immediately. + * @param {Object} data */ - TimeStep.prototype.setRange = function (start, end, minimumStep) { - if (!(start instanceof Date) || !(end instanceof Date)) { - throw 'No legal start or end date in method setRange'; + Item.prototype.setData = function (data) { + var groupChanged = data.group != undefined && this.data.group != data.group; + if (groupChanged) { + this.parent.itemSet._moveToGroup(this, data.group); } - this._start = start != undefined ? new Date(start.valueOf()) : new Date(); - this._end = end != undefined ? new Date(end.valueOf()) : new Date(); - - if (this.autoScale) { - this.setMinimumStep(minimumStep); - } - }; - - /** - * Set the range iterator to the start date. - */ - TimeStep.prototype.first = function () { - this.current = new Date(this._start.valueOf()); - this.roundToMinor(); - }; - - /** - * Round the current date to the first minor date value - * This must be executed once when the current date is set to start Date - */ - TimeStep.prototype.roundToMinor = function () { - // round to floor - // IMPORTANT: we have no breaks in this switch! (this is no bug) - // noinspection FallThroughInSwitchStatementJS - switch (this.scale) { - case 'year': - this.current.setFullYear(this.step * Math.floor(this.current.getFullYear() / this.step)); - this.current.setMonth(0); - case 'month': - this.current.setDate(1); - case 'day': // intentional fall through - case 'weekday': - this.current.setHours(0); - case 'hour': - this.current.setMinutes(0); - case 'minute': - this.current.setSeconds(0); - case 'second': - this.current.setMilliseconds(0); - //case 'millisecond': // nothing to do for milliseconds + if (data.hasOwnProperty('editable') && typeof data.editable === 'boolean') { + this.editable = data.editable; } - if (this.step != 1) { - // round down to the first minor value that is a multiple of the current step size - switch (this.scale) { - case 'millisecond': - this.current.setMilliseconds(this.current.getMilliseconds() - this.current.getMilliseconds() % this.step);break; - case 'second': - this.current.setSeconds(this.current.getSeconds() - this.current.getSeconds() % this.step);break; - case 'minute': - this.current.setMinutes(this.current.getMinutes() - this.current.getMinutes() % this.step);break; - case 'hour': - this.current.setHours(this.current.getHours() - this.current.getHours() % this.step);break; - case 'weekday': // intentional fall through - case 'day': - this.current.setDate(this.current.getDate() - 1 - (this.current.getDate() - 1) % this.step + 1);break; - case 'month': - this.current.setMonth(this.current.getMonth() - this.current.getMonth() % this.step);break; - case 'year': - this.current.setFullYear(this.current.getFullYear() - this.current.getFullYear() % this.step);break; - default: - break; - } - } + this.data = data; + this.dirty = true; + if (this.displayed) this.redraw(); }; /** - * Check if the there is a next step - * @return {boolean} true if the current date has not passed the end date + * Set a parent for the item + * @param {ItemSet | Group} parent */ - TimeStep.prototype.hasNext = function () { - return this.current.valueOf() <= this._end.valueOf(); - }; - - /** - * Do the next step - */ - TimeStep.prototype.next = function () { - var prev = this.current.valueOf(); - - // Two cases, needed to prevent issues with switching daylight savings - // (end of March and end of October) - if (this.current.getMonth() < 6) { - switch (this.scale) { - case 'millisecond': - - this.current = new Date(this.current.valueOf() + this.step);break; - case 'second': - this.current = new Date(this.current.valueOf() + this.step * 1000);break; - case 'minute': - this.current = new Date(this.current.valueOf() + this.step * 1000 * 60);break; - case 'hour': - this.current = new Date(this.current.valueOf() + this.step * 1000 * 60 * 60); - // in case of skipping an hour for daylight savings, adjust the hour again (else you get: 0h 5h 9h ... instead of 0h 4h 8h ...) - var h = this.current.getHours(); - this.current.setHours(h - h % this.step); - break; - case 'weekday': // intentional fall through - case 'day': - this.current.setDate(this.current.getDate() + this.step);break; - case 'month': - this.current.setMonth(this.current.getMonth() + this.step);break; - case 'year': - this.current.setFullYear(this.current.getFullYear() + this.step);break; - default: - break; + Item.prototype.setParent = function (parent) { + if (this.displayed) { + this.hide(); + this.parent = parent; + if (this.parent) { + this.show(); } } else { - switch (this.scale) { - case 'millisecond': - this.current = new Date(this.current.valueOf() + this.step);break; - case 'second': - this.current.setSeconds(this.current.getSeconds() + this.step);break; - case 'minute': - this.current.setMinutes(this.current.getMinutes() + this.step);break; - case 'hour': - this.current.setHours(this.current.getHours() + this.step);break; - case 'weekday': // intentional fall through - case 'day': - this.current.setDate(this.current.getDate() + this.step);break; - case 'month': - this.current.setMonth(this.current.getMonth() + this.step);break; - case 'year': - this.current.setFullYear(this.current.getFullYear() + this.step);break; - default: - break; + this.parent = parent; + } + }; + + /** + * Check whether this item is visible inside given range + * @returns {{start: Number, end: Number}} range with a timestamp for start and end + * @returns {boolean} True if visible + */ + Item.prototype.isVisible = function (range) { + // Should be implemented by Item implementations + return false; + }; + + /** + * Show the Item in the DOM (when not already visible) + * @return {Boolean} changed + */ + Item.prototype.show = function () { + return false; + }; + + /** + * Hide the Item from the DOM (when visible) + * @return {Boolean} changed + */ + Item.prototype.hide = function () { + return false; + }; + + /** + * Repaint the item + */ + Item.prototype.redraw = function () { + // should be implemented by the item + }; + + /** + * Reposition the Item horizontally + */ + Item.prototype.repositionX = function () { + // should be implemented by the item + }; + + /** + * Reposition the Item vertically + */ + Item.prototype.repositionY = function () { + // should be implemented by the item + }; + + /** + * Repaint a delete button on the top right of the item when the item is selected + * @param {HTMLElement} anchor + * @protected + */ + Item.prototype._repaintDeleteButton = function (anchor) { + var editable = (this.options.editable.remove || this.data.editable === true) && this.data.editable !== false; + + if (this.selected && editable && !this.dom.deleteButton) { + // create and show button + var me = this; + + var deleteButton = document.createElement('div'); + deleteButton.className = 'vis-delete'; + deleteButton.title = 'Delete this item'; + + // TODO: be able to destroy the delete button + new Hammer(deleteButton).on('tap', function (event) { + event.stopPropagation(); + me.parent.removeFromDataSet(me); + }); + + anchor.appendChild(deleteButton); + this.dom.deleteButton = deleteButton; + } else if (!this.selected && this.dom.deleteButton) { + // remove button + if (this.dom.deleteButton.parentNode) { + this.dom.deleteButton.parentNode.removeChild(this.dom.deleteButton); } - } - - if (this.step != 1) { - // round down to the correct major value - switch (this.scale) { - case 'millisecond': - if (this.current.getMilliseconds() < this.step) this.current.setMilliseconds(0);break; - case 'second': - if (this.current.getSeconds() < this.step) this.current.setSeconds(0);break; - case 'minute': - if (this.current.getMinutes() < this.step) this.current.setMinutes(0);break; - case 'hour': - if (this.current.getHours() < this.step) this.current.setHours(0);break; - case 'weekday': // intentional fall through - case 'day': - if (this.current.getDate() < this.step + 1) this.current.setDate(1);break; - case 'month': - if (this.current.getMonth() < this.step) this.current.setMonth(0);break; - case 'year': - break; // nothing to do for year - default: - break; - } - } - - // safety mechanism: if current time is still unchanged, move to the end - if (this.current.valueOf() == prev) { - this.current = new Date(this._end.valueOf()); - } - - DateUtil.stepOverHiddenDates(this, prev); - }; - - /** - * Get the current datetime - * @return {Date} current The current date - */ - TimeStep.prototype.getCurrent = function () { - return this.current; - }; - - /** - * Set a custom scale. Autoscaling will be disabled. - * For example setScale('minute', 5) will result - * in minor steps of 5 minutes, and major steps of an hour. - * - * @param {{scale: string, step: number}} params - * An object containing two properties: - * - A string 'scale'. Choose from 'millisecond', 'second', - * 'minute', 'hour', 'weekday', 'day', 'month', 'year'. - * - A number 'step'. A step size, by default 1. - * Choose for example 1, 2, 5, or 10. - */ - TimeStep.prototype.setScale = function (params) { - if (params && typeof params.scale == 'string') { - this.scale = params.scale; - this.step = params.step > 0 ? params.step : 1; - this.autoScale = false; + this.dom.deleteButton = null; } }; /** - * Enable or disable autoscaling - * @param {boolean} enable If true, autoascaling is set true + * Set HTML contents for the item + * @param {Element} element HTML element to fill with the contents + * @private */ - TimeStep.prototype.setAutoScale = function (enable) { - this.autoScale = enable; - }; - - /** - * Automatically determine the scale that bests fits the provided minimum step - * @param {Number} [minimumStep] The minimum step size in milliseconds - */ - TimeStep.prototype.setMinimumStep = function (minimumStep) { - if (minimumStep == undefined) { - return; + Item.prototype._updateContents = function (element) { + var content; + if (this.options.template) { + var itemData = this.parent.itemSet.itemsData.get(this.id); // get a clone of the data from the dataset + content = this.options.template(itemData); + } else { + content = this.data.content; } - //var b = asc + ds; - - var stepYear = 1000 * 60 * 60 * 24 * 30 * 12; - var stepMonth = 1000 * 60 * 60 * 24 * 30; - var stepDay = 1000 * 60 * 60 * 24; - var stepHour = 1000 * 60 * 60; - var stepMinute = 1000 * 60; - var stepSecond = 1000; - var stepMillisecond = 1; - - // find the smallest step that is larger than the provided minimumStep - if (stepYear * 1000 > minimumStep) { - this.scale = 'year';this.step = 1000; - } - if (stepYear * 500 > minimumStep) { - this.scale = 'year';this.step = 500; - } - if (stepYear * 100 > minimumStep) { - this.scale = 'year';this.step = 100; - } - if (stepYear * 50 > minimumStep) { - this.scale = 'year';this.step = 50; - } - if (stepYear * 10 > minimumStep) { - this.scale = 'year';this.step = 10; - } - if (stepYear * 5 > minimumStep) { - this.scale = 'year';this.step = 5; - } - if (stepYear > minimumStep) { - this.scale = 'year';this.step = 1; - } - if (stepMonth * 3 > minimumStep) { - this.scale = 'month';this.step = 3; - } - if (stepMonth > minimumStep) { - this.scale = 'month';this.step = 1; - } - if (stepDay * 5 > minimumStep) { - this.scale = 'day';this.step = 5; - } - if (stepDay * 2 > minimumStep) { - this.scale = 'day';this.step = 2; - } - if (stepDay > minimumStep) { - this.scale = 'day';this.step = 1; - } - if (stepDay / 2 > minimumStep) { - this.scale = 'weekday';this.step = 1; - } - if (stepHour * 4 > minimumStep) { - this.scale = 'hour';this.step = 4; - } - if (stepHour > minimumStep) { - this.scale = 'hour';this.step = 1; - } - if (stepMinute * 15 > minimumStep) { - this.scale = 'minute';this.step = 15; - } - if (stepMinute * 10 > minimumStep) { - this.scale = 'minute';this.step = 10; - } - if (stepMinute * 5 > minimumStep) { - this.scale = 'minute';this.step = 5; - } - if (stepMinute > minimumStep) { - this.scale = 'minute';this.step = 1; - } - if (stepSecond * 15 > minimumStep) { - this.scale = 'second';this.step = 15; - } - if (stepSecond * 10 > minimumStep) { - this.scale = 'second';this.step = 10; - } - if (stepSecond * 5 > minimumStep) { - this.scale = 'second';this.step = 5; - } - if (stepSecond > minimumStep) { - this.scale = 'second';this.step = 1; - } - if (stepMillisecond * 200 > minimumStep) { - this.scale = 'millisecond';this.step = 200; - } - if (stepMillisecond * 100 > minimumStep) { - this.scale = 'millisecond';this.step = 100; - } - if (stepMillisecond * 50 > minimumStep) { - this.scale = 'millisecond';this.step = 50; - } - if (stepMillisecond * 10 > minimumStep) { - this.scale = 'millisecond';this.step = 10; - } - if (stepMillisecond * 5 > minimumStep) { - this.scale = 'millisecond';this.step = 5; - } - if (stepMillisecond > minimumStep) { - this.scale = 'millisecond';this.step = 1; - } - }; - - /** - * Snap a date to a rounded value. - * The snap intervals are dependent on the current scale and step. - * Static function - * @param {Date} date the date to be snapped. - * @param {string} scale Current scale, can be 'millisecond', 'second', - * 'minute', 'hour', 'weekday, 'day', 'month', 'year'. - * @param {number} step Current step (1, 2, 4, 5, ... - * @return {Date} snappedDate - */ - TimeStep.snap = function (date, scale, step) { - var clone = new Date(date.valueOf()); - - if (scale == 'year') { - var year = clone.getFullYear() + Math.round(clone.getMonth() / 12); - clone.setFullYear(Math.round(year / step) * step); - clone.setMonth(0); - clone.setDate(0); - clone.setHours(0); - clone.setMinutes(0); - clone.setSeconds(0); - clone.setMilliseconds(0); - } else if (scale == 'month') { - if (clone.getDate() > 15) { - clone.setDate(1); - clone.setMonth(clone.getMonth() + 1); - // important: first set Date to 1, after that change the month. + var changed = this._contentToString(this.content) !== this._contentToString(content); + if (changed) { + // only replace the content when changed + if (content instanceof Element) { + element.innerHTML = ''; + element.appendChild(content); + } else if (content != undefined) { + element.innerHTML = content; } else { - clone.setDate(1); - } - - clone.setHours(0); - clone.setMinutes(0); - clone.setSeconds(0); - clone.setMilliseconds(0); - } else if (scale == 'day') { - //noinspection FallthroughInSwitchStatementJS - switch (step) { - case 5: - case 2: - clone.setHours(Math.round(clone.getHours() / 24) * 24);break; - default: - clone.setHours(Math.round(clone.getHours() / 12) * 12);break; - } - clone.setMinutes(0); - clone.setSeconds(0); - clone.setMilliseconds(0); - } else if (scale == 'weekday') { - //noinspection FallthroughInSwitchStatementJS - switch (step) { - case 5: - case 2: - clone.setHours(Math.round(clone.getHours() / 12) * 12);break; - default: - clone.setHours(Math.round(clone.getHours() / 6) * 6);break; - } - clone.setMinutes(0); - clone.setSeconds(0); - clone.setMilliseconds(0); - } else if (scale == 'hour') { - switch (step) { - case 4: - clone.setMinutes(Math.round(clone.getMinutes() / 60) * 60);break; - default: - clone.setMinutes(Math.round(clone.getMinutes() / 30) * 30);break; - } - clone.setSeconds(0); - clone.setMilliseconds(0); - } else if (scale == 'minute') { - //noinspection FallthroughInSwitchStatementJS - switch (step) { - case 15: - case 10: - clone.setMinutes(Math.round(clone.getMinutes() / 5) * 5); - clone.setSeconds(0); - break; - case 5: - clone.setSeconds(Math.round(clone.getSeconds() / 60) * 60);break; - default: - clone.setSeconds(Math.round(clone.getSeconds() / 30) * 30);break; - } - clone.setMilliseconds(0); - } else if (scale == 'second') { - //noinspection FallthroughInSwitchStatementJS - switch (step) { - case 15: - case 10: - clone.setSeconds(Math.round(clone.getSeconds() / 5) * 5); - clone.setMilliseconds(0); - break; - case 5: - clone.setMilliseconds(Math.round(clone.getMilliseconds() / 1000) * 1000);break; - default: - clone.setMilliseconds(Math.round(clone.getMilliseconds() / 500) * 500);break; - } - } else if (scale == 'millisecond') { - var _step = step > 5 ? step / 2 : 1; - clone.setMilliseconds(Math.round(clone.getMilliseconds() / _step) * _step); - } - - return clone; - }; - - /** - * Check if the current value is a major value (for example when the step - * is DAY, a major value is each first day of the MONTH) - * @return {boolean} true if current date is major, else false. - */ - TimeStep.prototype.isMajor = function () { - if (this.switchedYear == true) { - this.switchedYear = false; - switch (this.scale) { - case 'year': - case 'month': - case 'weekday': - case 'day': - case 'hour': - case 'minute': - case 'second': - case 'millisecond': - return true; - default: - return false; - } - } else if (this.switchedMonth == true) { - this.switchedMonth = false; - switch (this.scale) { - case 'weekday': - case 'day': - case 'hour': - case 'minute': - case 'second': - case 'millisecond': - return true; - default: - return false; - } - } else if (this.switchedDay == true) { - this.switchedDay = false; - switch (this.scale) { - case 'millisecond': - case 'second': - case 'minute': - case 'hour': - return true; - default: - return false; - } - } - - switch (this.scale) { - case 'millisecond': - return this.current.getMilliseconds() == 0; - case 'second': - return this.current.getSeconds() == 0; - case 'minute': - return this.current.getHours() == 0 && this.current.getMinutes() == 0; - case 'hour': - return this.current.getHours() == 0; - case 'weekday': // intentional fall through - case 'day': - return this.current.getDate() == 1; - case 'month': - return this.current.getMonth() == 0; - case 'year': - return false; - default: - return false; - } - }; - - /** - * Returns formatted text for the minor axislabel, depending on the current - * date and the scale. For example when scale is MINUTE, the current time is - * formatted as "hh:mm". - * @param {Date} [date] custom date. if not provided, current date is taken - */ - TimeStep.prototype.getLabelMinor = function (date) { - if (date == undefined) { - date = this.current; - } - - var format = this.format.minorLabels[this.scale]; - return format && format.length > 0 ? moment(date).format(format) : ''; - }; - - /** - * Returns formatted text for the major axis label, depending on the current - * date and the scale. For example when scale is MINUTE, the major scale is - * hours, and the hour will be formatted as "hh". - * @param {Date} [date] custom date. if not provided, current date is taken - */ - TimeStep.prototype.getLabelMajor = function (date) { - if (date == undefined) { - date = this.current; - } - - var format = this.format.majorLabels[this.scale]; - return format && format.length > 0 ? moment(date).format(format) : ''; - }; - - TimeStep.prototype.getClassName = function () { - var m = moment(this.current); - var date = m.locale ? m.locale('en') : m.lang('en'); // old versions of moment have .lang() function - var step = this.step; - - function even(value) { - return value / step % 2 == 0 ? ' vis-even' : ' vis-odd'; - } - - function today(date) { - if (date.isSame(new Date(), 'day')) { - return ' vis-today'; - } - if (date.isSame(moment().add(1, 'day'), 'day')) { - return ' vis-tomorrow'; - } - if (date.isSame(moment().add(-1, 'day'), 'day')) { - return ' vis-yesterday'; - } - return ''; - } - - function currentWeek(date) { - return date.isSame(new Date(), 'week') ? ' vis-current-week' : ''; - } - - function currentMonth(date) { - return date.isSame(new Date(), 'month') ? ' vis-current-month' : ''; - } - - function currentYear(date) { - return date.isSame(new Date(), 'year') ? ' vis-current-year' : ''; - } - - switch (this.scale) { - case 'millisecond': - return even(date.milliseconds()).trim(); - - case 'second': - return even(date.seconds()).trim(); - - case 'minute': - return even(date.minutes()).trim(); - - case 'hour': - var hours = date.hours(); - if (this.step == 4) { - hours = hours + '-h' + (hours + 4); + if (!(this.data.type == 'background' && this.data.content === undefined)) { + throw new Error('Property "content" missing in item ' + this.id); } - return 'vis-h' + hours + today(date) + even(date.hours()); + } - case 'weekday': - return 'vis-' + date.format('dddd').toLowerCase() + today(date) + currentWeek(date) + even(date.date()); - - case 'day': - var day = date.date(); - var month = date.format('MMMM').toLowerCase(); - return 'vis-day' + day + ' vis-' + month + currentMonth(date) + even(day - 1); - - case 'month': - return 'vis-' + date.format('MMMM').toLowerCase() + currentMonth(date) + even(date.month()); - - case 'year': - var year = date.year(); - return 'vis-year' + year + currentYear(date) + even(year); - - default: - return ''; + this.content = content; } }; - module.exports = TimeStep; + /** + * Set HTML contents for the item + * @param {Element} element HTML element to fill with the contents + * @private + */ + Item.prototype._updateTitle = function (element) { + if (this.data.title != null) { + element.title = this.data.title || ''; + } else { + element.removeAttribute('vis-title'); + } + }; + + /** + * Process dataAttributes timeline option and set as data- attributes on dom.content + * @param {Element} element HTML element to which the attributes will be attached + * @private + */ + Item.prototype._updateDataAttributes = function (element) { + if (this.options.dataAttributes && this.options.dataAttributes.length > 0) { + var attributes = []; + + if (Array.isArray(this.options.dataAttributes)) { + attributes = this.options.dataAttributes; + } else if (this.options.dataAttributes == 'all') { + attributes = Object.keys(this.data); + } else { + return; + } + + for (var i = 0; i < attributes.length; i++) { + var name = attributes[i]; + var value = this.data[name]; + + if (value != null) { + element.setAttribute('data-' + name, value); + } else { + element.removeAttribute('data-' + name); + } + } + } + }; + + /** + * Update custom styles of the element + * @param element + * @private + */ + Item.prototype._updateStyle = function (element) { + // remove old styles + if (this.style) { + util.removeCssText(element, this.style); + this.style = null; + } + + // append new styles + if (this.data.style) { + util.addCssText(element, this.data.style); + this.style = this.data.style; + } + }; + + /** + * Stringify the items contents + * @param {string | Element | undefined} content + * @returns {string | undefined} + * @private + */ + Item.prototype._contentToString = function (content) { + if (typeof content === 'string') return content; + if (content && 'outerHTML' in content) return content.outerHTML; + return content; + }; + + /** + * Return the width of the item left from its start date + * @return {number} + */ + Item.prototype.getWidthLeft = function () { + return 0; + }; + + /** + * Return the width of the item right from the max of its start and end date + * @return {number} + */ + Item.prototype.getWidthRight = function () { + return 0; + }; + + module.exports = Item; /***/ }, -/* 38 */ +/* 34 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; - var util = __webpack_require__(7); - var Group = __webpack_require__(34); + var util = __webpack_require__(1); + var Group = __webpack_require__(30); /** * @constructor BackgroundGroup @@ -19535,13 +20260,13 @@ return /******/ (function(modules) { // webpackBootstrap module.exports = BackgroundGroup; /***/ }, -/* 39 */ +/* 35 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; - var Item = __webpack_require__(2); - var util = __webpack_require__(7); + var Item = __webpack_require__(33); + var util = __webpack_require__(1); /** * @constructor BoxItem @@ -19775,15 +20500,221 @@ return /******/ (function(modules) { // webpackBootstrap module.exports = BoxItem; /***/ }, -/* 40 */ +/* 36 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; - var Hammer = __webpack_require__(3); - var Item = __webpack_require__(2); - var BackgroundGroup = __webpack_require__(38); - var RangeItem = __webpack_require__(36); + var Item = __webpack_require__(33); + + /** + * @constructor PointItem + * @extends Item + * @param {Object} data Object containing parameters start + * content, className. + * @param {{toScreen: function, toTime: function}} conversion + * Conversion functions from time to screen and vice versa + * @param {Object} [options] Configuration options + * // TODO: describe available options + */ + function PointItem(data, conversion, options) { + this.props = { + dot: { + top: 0, + width: 0, + height: 0 + }, + content: { + height: 0, + marginLeft: 0 + } + }; + + // validate data + if (data) { + if (data.start == undefined) { + throw new Error('Property "start" missing in item ' + data); + } + } + + Item.call(this, data, conversion, options); + } + + PointItem.prototype = new Item(null, null, null); + + /** + * Check whether this item is visible inside given range + * @returns {{start: Number, end: Number}} range with a timestamp for start and end + * @returns {boolean} True if visible + */ + PointItem.prototype.isVisible = function (range) { + // determine visibility + // TODO: account for the real width of the item. Right now we just add 1/4 to the window + var interval = (range.end - range.start) / 4; + return this.data.start > range.start - interval && this.data.start < range.end + interval; + }; + + /** + * Repaint the item + */ + PointItem.prototype.redraw = function () { + var dom = this.dom; + if (!dom) { + // create DOM + this.dom = {}; + dom = this.dom; + + // background box + dom.point = document.createElement('div'); + // className is updated in redraw() + + // contents box, right from the dot + dom.content = document.createElement('div'); + dom.content.className = 'vis-item-content'; + dom.point.appendChild(dom.content); + + // dot at start + dom.dot = document.createElement('div'); + dom.point.appendChild(dom.dot); + + // attach this item as attribute + dom.point['timeline-item'] = this; + + this.dirty = true; + } + + // append DOM to parent DOM + if (!this.parent) { + throw new Error('Cannot redraw item: no parent attached'); + } + if (!dom.point.parentNode) { + var foreground = this.parent.dom.foreground; + if (!foreground) { + throw new Error('Cannot redraw item: parent has no foreground container element'); + } + foreground.appendChild(dom.point); + } + this.displayed = true; + + // Update DOM when item is marked dirty. An item is marked dirty when: + // - the item is not yet rendered + // - the item's data is changed + // - the item is selected/deselected + if (this.dirty) { + this._updateContents(this.dom.content); + this._updateTitle(this.dom.point); + 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; + + // update class + var className = (this.data.className ? ' ' + this.data.className : '') + (this.selected ? ' vis-selected' : '') + (editable ? ' vis-editable' : ' vis-readonly'); + dom.point.className = 'vis-item vis-point' + className; + dom.dot.className = 'vis-item vis-dot' + className; + + // recalculate size of dot and contents + this.props.dot.width = dom.dot.offsetWidth; + this.props.dot.height = dom.dot.offsetHeight; + this.props.content.height = dom.content.offsetHeight; + + // resize contents + dom.content.style.marginLeft = 2 * this.props.dot.width + 'px'; + //dom.content.style.marginRight = ... + 'px'; // TODO: margin right + + // recalculate size + this.width = dom.point.offsetWidth; + this.height = dom.point.offsetHeight; + + // reposition the dot + dom.dot.style.top = (this.height - this.props.dot.height) / 2 + 'px'; + dom.dot.style.left = this.props.dot.width / 2 + 'px'; + + this.dirty = false; + } + + this._repaintDeleteButton(dom.point); + }; + + /** + * Show the item in the DOM (when not already visible). The items DOM will + * be created when needed. + */ + PointItem.prototype.show = function () { + if (!this.displayed) { + this.redraw(); + } + }; + + /** + * Hide the item from the DOM (when visible) + */ + PointItem.prototype.hide = function () { + if (this.displayed) { + if (this.dom.point.parentNode) { + this.dom.point.parentNode.removeChild(this.dom.point); + } + + this.displayed = false; + } + }; + + /** + * Reposition the item horizontally + * @Override + */ + PointItem.prototype.repositionX = function () { + var start = this.conversion.toScreen(this.data.start); + + this.left = start - this.props.dot.width; + + // reposition point + this.dom.point.style.left = this.left + 'px'; + }; + + /** + * Reposition the item vertically + * @Override + */ + PointItem.prototype.repositionY = function () { + var orientation = this.options.orientation.item; + var point = this.dom.point; + + if (orientation == 'top') { + point.style.top = this.top + 'px'; + } else { + point.style.top = this.parent.height - this.top - this.height + 'px'; + } + }; + + /** + * Return the width of the item left from its start date + * @return {number} + */ + PointItem.prototype.getWidthLeft = function () { + return this.props.dot.width; + }; + + /** + * Return the width of the item right from its start date + * @return {number} + */ + PointItem.prototype.getWidthRight = function () { + return this.width - this.props.dot.width; + }; + + module.exports = PointItem; + +/***/ }, +/* 37 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + var Hammer = __webpack_require__(20); + var Item = __webpack_require__(33); + var BackgroundGroup = __webpack_require__(34); + var RangeItem = __webpack_require__(32); /** * @constructor BackgroundItem @@ -19957,55 +20888,55 @@ return /******/ (function(modules) { // webpackBootstrap } // and when the orientation is bottom: else { - var newTop = this.parent.top; - var totalHeight = 0; - for (var subgroup in subgroups) { - if (subgroups.hasOwnProperty(subgroup)) { - if (subgroups[subgroup].visible == true) { - var newHeight = subgroups[subgroup].height + margin.item.vertical; - totalHeight += newHeight; - if (subgroups[subgroup].index > subgroupIndex) { - newTop += newHeight; + var newTop = this.parent.top; + var totalHeight = 0; + for (var subgroup in subgroups) { + if (subgroups.hasOwnProperty(subgroup)) { + if (subgroups[subgroup].visible == true) { + var newHeight = subgroups[subgroup].height + margin.item.vertical; + totalHeight += newHeight; + if (subgroups[subgroup].index > subgroupIndex) { + newTop += newHeight; + } } } } + height = this.parent.subgroups[itemSubgroup].height + margin.item.vertical; + this.dom.box.style.top = this.parent.height - totalHeight + newTop + 'px'; + this.dom.box.style.bottom = ''; } - height = this.parent.subgroups[itemSubgroup].height + margin.item.vertical; - this.dom.box.style.top = this.parent.height - totalHeight + newTop + 'px'; - this.dom.box.style.bottom = ''; - } } // and in the case of no subgroups: else { - // we want backgrounds with groups to only show in groups. - if (this.parent instanceof BackgroundGroup) { - // if the item is not in a group: - height = Math.max(this.parent.height, this.parent.itemSet.body.domProps.center.height, this.parent.itemSet.body.domProps.centerContainer.height); - this.dom.box.style.top = onTop ? '0' : ''; - this.dom.box.style.bottom = onTop ? '' : '0'; - } else { - height = this.parent.height; - // same alignment for items when orientation is top or bottom - this.dom.box.style.top = this.parent.top + 'px'; - this.dom.box.style.bottom = ''; + // we want backgrounds with groups to only show in groups. + if (this.parent instanceof BackgroundGroup) { + // if the item is not in a group: + height = Math.max(this.parent.height, this.parent.itemSet.body.domProps.center.height, this.parent.itemSet.body.domProps.centerContainer.height); + this.dom.box.style.top = onTop ? '0' : ''; + this.dom.box.style.bottom = onTop ? '' : '0'; + } else { + height = this.parent.height; + // same alignment for items when orientation is top or bottom + this.dom.box.style.top = this.parent.top + 'px'; + this.dom.box.style.bottom = ''; + } } - } this.dom.box.style.height = height + 'px'; }; module.exports = BackgroundItem; /***/ }, -/* 41 */ +/* 38 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; - var util = __webpack_require__(7); - var Component = __webpack_require__(27); - var TimeStep = __webpack_require__(37); - var DateUtil = __webpack_require__(31); - var moment = __webpack_require__(8); + var util = __webpack_require__(1); + var Component = __webpack_require__(25); + var TimeStep = __webpack_require__(29); + var DateUtil = __webpack_require__(26); + var moment = __webpack_require__(2); /** * A horizontal time axis @@ -20042,7 +20973,9 @@ return /******/ (function(modules) { // webpackBootstrap }, // axis orientation: 'top' or 'bottom' showMinorLabels: true, showMajorLabels: true, + maxMinorChars: 7, format: TimeStep.FORMAT, + moment: moment, timeAxis: null }; this.options = util.extend({}, this.defaultOptions); @@ -20068,7 +21001,7 @@ return /******/ (function(modules) { // webpackBootstrap TimeAxis.prototype.setOptions = function (options) { if (options) { // copy all options that we know - util.selectiveExtend(['showMinorLabels', 'showMajorLabels', 'hiddenDates', 'timeAxis'], this.options, options); + util.selectiveExtend(['showMinorLabels', 'showMajorLabels', 'maxMinorChars', 'hiddenDates', 'timeAxis', 'moment'], this.options, options); // deep copy the format options util.selectiveDeepExtend(['format'], this.options, options); @@ -20186,11 +21119,12 @@ return /******/ (function(modules) { // webpackBootstrap // calculate range and step (step such that we have space for 7 characters per label) var start = util.convert(this.body.range.start, 'Number'); var end = util.convert(this.body.range.end, 'Number'); - var timeLabelsize = this.body.util.toTime((this.props.minorCharWidth || 10) * 7).valueOf(); - var minimumStep = timeLabelsize - DateUtil.getHiddenDurationBefore(this.body.hiddenDates, this.body.range, timeLabelsize); + var timeLabelsize = this.body.util.toTime((this.props.minorCharWidth || 10) * this.options.maxMinorChars).valueOf(); + var minimumStep = timeLabelsize - DateUtil.getHiddenDurationBefore(this.options.moment, this.body.hiddenDates, this.body.range, timeLabelsize); minimumStep -= this.body.util.toTime(0).valueOf(); var step = new TimeStep(new Date(start), new Date(end), minimumStep, this.body.hiddenDates); + step.setMoment(this.options.moment); if (this.options.format) { step.setFormat(this.options.format); } @@ -20214,19 +21148,21 @@ return /******/ (function(modules) { // webpackBootstrap var next; var x; var xNext; - var isMajor; - var width; + var isMajor, nextIsMajor; + var width = 0, + prevWidth; var line; var labelMinor; var xFirstMajorLabel = undefined; - var max = 0; + var count = 0; + var MAX = 1000; var className; - step.first(); + step.start(); next = step.getCurrent(); xNext = this.body.util.toScreen(next); - while (step.hasNext() && max < 1000) { - max++; + while (step.hasNext() && count < MAX) { + count++; isMajor = step.isMajor(); className = step.getClassName(); @@ -20237,13 +21173,16 @@ return /******/ (function(modules) { // webpackBootstrap step.next(); next = step.getCurrent(); + nextIsMajor = step.isMajor(); xNext = this.body.util.toScreen(next); + prevWidth = width; width = xNext - x; - var labelFits = labelMinor.length * this.props.minorCharWidth < width; + var showMinorGrid = width >= prevWidth * 0.4; // prevent displaying of the 31th of the month on a scale of 5 days - if (this.options.showMinorLabels && labelFits) { - this._repaintMinorText(x, labelMinor, orientation, className); + if (this.options.showMinorLabels && showMinorGrid) { + var label = this._repaintMinorText(x, labelMinor, orientation, className); + label.style.width = width + 'px'; // set width to prevent overflow } if (isMajor && this.options.showMajorLabels) { @@ -20251,20 +21190,27 @@ return /******/ (function(modules) { // webpackBootstrap if (xFirstMajorLabel == undefined) { xFirstMajorLabel = x; } - this._repaintMajorText(x, step.getLabelMajor(), orientation, className); + label = this._repaintMajorText(x, step.getLabelMajor(), orientation, className); } line = this._repaintMajorLine(x, width, orientation, className); } else { - if (labelFits) { + // minor line + if (showMinorGrid) { line = this._repaintMinorLine(x, width, orientation, className); } else { if (line) { + // adjust the width of the previous grid line.style.width = parseInt(line.style.width) + width + 'px'; } } } } + if (count === MAX && !warnedForOverflow) { + console.warn('Something is wrong with the Timeline scale. Limited drawing of grid lines to ' + MAX + ' lines.'); + warnedForOverflow = true; + } + // create a major label on the left when needed if (this.options.showMajorLabels) { var leftTime = this.body.util.toTime(0), @@ -20453,18 +21399,20 @@ return /******/ (function(modules) { // webpackBootstrap this.props.majorCharWidth = this.dom.measureCharMajor.clientWidth; }; + var warnedForOverflow = false; + module.exports = TimeAxis; /***/ }, -/* 42 */ +/* 39 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; - var keycharm = __webpack_require__(43); - var Emitter = __webpack_require__(19); - var Hammer = __webpack_require__(3); - var util = __webpack_require__(7); + var keycharm = __webpack_require__(40); + var Emitter = __webpack_require__(12); + var Hammer = __webpack_require__(20); + var util = __webpack_require__(1); /** * Turn an element into an clickToUse element. @@ -20615,7 +21563,7 @@ return /******/ (function(modules) { // webpackBootstrap module.exports = Activator; /***/ }, -/* 43 */ +/* 40 */ /***/ function(module, exports, __webpack_require__) { var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;"use strict"; @@ -20814,16 +21762,16 @@ return /******/ (function(modules) { // webpackBootstrap /***/ }, -/* 44 */ +/* 41 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; - var Hammer = __webpack_require__(3); - var util = __webpack_require__(7); - var Component = __webpack_require__(27); - var moment = __webpack_require__(8); - var locales = __webpack_require__(28); + var Hammer = __webpack_require__(20); + var util = __webpack_require__(1); + var Component = __webpack_require__(25); + var moment = __webpack_require__(2); + var locales = __webpack_require__(42); /** * A custom time bar @@ -20841,9 +21789,11 @@ return /******/ (function(modules) { // webpackBootstrap // default options this.defaultOptions = { + moment: moment, locales: locales, locale: 'en', - id: undefined + id: undefined, + title: undefined }; this.options = util.extend({}, this.defaultOptions); @@ -20873,7 +21823,7 @@ return /******/ (function(modules) { // webpackBootstrap CustomTime.prototype.setOptions = function (options) { if (options) { // copy all options that we know - util.selectiveExtend(['locale', 'locales', 'id'], this.options, options); + util.selectiveExtend(['moment', 'locale', 'locales', 'id'], this.options, options); } }; @@ -20904,10 +21854,6 @@ return /******/ (function(modules) { // webpackBootstrap this.hammer.on('panmove', this._onDrag.bind(this)); this.hammer.on('panend', this._onDragEnd.bind(this)); this.hammer.get('pan').set({ threshold: 5, direction: 30 }); // 30 is ALL_DIRECTIONS in hammer. - // TODO: cleanup - //this.hammer.on('pan', function (event) { - // event.preventDefault(); - //}); }; /** @@ -20946,8 +21892,13 @@ return /******/ (function(modules) { // webpackBootstrap } locale = this.options.locales['en']; // fall back on english when not available } - var title = locale.time + ': ' + moment(this.customTime).format('dddd, MMMM Do YYYY, H:mm:ss'); - title = title.charAt(0).toUpperCase() + title.substring(1); + + var title = this.options.title; + // To hide the title completely use empty string ''. + if (title === undefined) { + title = locale.time + ': ' + this.options.moment(this.customTime).format('dddd, MMMM Do YYYY, H:mm:ss'); + title = title.charAt(0).toUpperCase() + title.substring(1); + } this.bar.style.left = x + 'px'; this.bar.title = title; @@ -20982,6 +21933,14 @@ return /******/ (function(modules) { // webpackBootstrap return new Date(this.customTime.valueOf()); }; + /** + * Set custom title. + * @param {Date | number | string} title + */ + CustomTime.prototype.setCustomTitle = function (title) { + this.options.title = title; + }; + /** * Start moving horizontally * @param {Event} event @@ -21054,7 +22013,206 @@ return /******/ (function(modules) { // webpackBootstrap module.exports = CustomTime; /***/ }, -/* 45 */ +/* 42 */ +/***/ function(module, exports) { + + // English + 'use strict'; + + exports['en'] = { + current: 'current', + time: 'time' + }; + exports['en_EN'] = exports['en']; + exports['en_US'] = exports['en']; + + // Dutch + exports['nl'] = { + current: 'huidige', + time: 'tijd' + }; + exports['nl_NL'] = exports['nl']; + exports['nl_BE'] = exports['nl']; + +/***/ }, +/* 43 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + var util = __webpack_require__(1); + var Component = __webpack_require__(25); + var moment = __webpack_require__(2); + var locales = __webpack_require__(42); + + /** + * A current time bar + * @param {{range: Range, dom: Object, domProps: Object}} body + * @param {Object} [options] Available parameters: + * {Boolean} [showCurrentTime] + * @constructor CurrentTime + * @extends Component + */ + function CurrentTime(body, options) { + this.body = body; + + // default options + this.defaultOptions = { + showCurrentTime: true, + + moment: moment, + locales: locales, + locale: 'en' + }; + this.options = util.extend({}, this.defaultOptions); + this.offset = 0; + + this._create(); + + this.setOptions(options); + } + + CurrentTime.prototype = new Component(); + + /** + * Create the HTML DOM for the current time bar + * @private + */ + CurrentTime.prototype._create = function () { + var bar = document.createElement('div'); + bar.className = 'vis-current-time'; + bar.style.position = 'absolute'; + bar.style.top = '0px'; + bar.style.height = '100%'; + + this.bar = bar; + }; + + /** + * Destroy the CurrentTime bar + */ + CurrentTime.prototype.destroy = function () { + this.options.showCurrentTime = false; + this.redraw(); // will remove the bar from the DOM and stop refreshing + + this.body = null; + }; + + /** + * Set options for the component. Options will be merged in current options. + * @param {Object} options Available parameters: + * {boolean} [showCurrentTime] + */ + CurrentTime.prototype.setOptions = function (options) { + if (options) { + // copy all options that we know + util.selectiveExtend(['showCurrentTime', 'moment', 'locale', 'locales'], this.options, options); + } + }; + + /** + * Repaint the component + * @return {boolean} Returns true if the component is resized + */ + CurrentTime.prototype.redraw = function () { + if (this.options.showCurrentTime) { + var parent = this.body.dom.backgroundVertical; + if (this.bar.parentNode != parent) { + // attach to the dom + if (this.bar.parentNode) { + this.bar.parentNode.removeChild(this.bar); + } + parent.appendChild(this.bar); + + this.start(); + } + + var now = this.options.moment(new Date().valueOf() + this.offset); + var x = this.body.util.toScreen(now); + + var locale = this.options.locales[this.options.locale]; + if (!locale) { + if (!this.warned) { + console.log('WARNING: options.locales[\'' + this.options.locale + '\'] not found. See http://visjs.org/docs/timeline/#Localization'); + this.warned = true; + } + locale = this.options.locales['en']; // fall back on english when not available + } + var title = locale.current + ' ' + locale.time + ': ' + now.format('dddd, MMMM Do YYYY, H:mm:ss'); + title = title.charAt(0).toUpperCase() + title.substring(1); + + this.bar.style.left = x + 'px'; + this.bar.title = title; + } else { + // remove the line from the DOM + if (this.bar.parentNode) { + this.bar.parentNode.removeChild(this.bar); + } + this.stop(); + } + + return false; + }; + + /** + * Start auto refreshing the current time bar + */ + CurrentTime.prototype.start = function () { + var me = this; + + function update() { + me.stop(); + + // determine interval to refresh + var scale = me.body.range.conversion(me.body.domProps.center.width).scale; + var interval = 1 / scale / 10; + if (interval < 30) interval = 30; + if (interval > 1000) interval = 1000; + + me.redraw(); + + // start a renderTimer to adjust for the new time + me.currentTimeTimer = setTimeout(update, interval); + } + + update(); + }; + + /** + * Stop auto refreshing the current time bar + */ + CurrentTime.prototype.stop = function () { + if (this.currentTimeTimer !== undefined) { + clearTimeout(this.currentTimeTimer); + delete this.currentTimeTimer; + } + }; + + /** + * Set a current time. This can be used for example to ensure that a client's + * time is synchronized with a shared server time. + * @param {Date | String | Number} time A Date, unix timestamp, or + * ISO date string. + */ + CurrentTime.prototype.setCurrentTime = function (time) { + var t = util.convert(time, 'Date').valueOf(); + var now = new Date().valueOf(); + this.offset = t - now; + this.redraw(); + }; + + /** + * Get the current time. + * @return {Date} Returns the current time. + */ + CurrentTime.prototype.getCurrentTime = function () { + return new Date(new Date().valueOf() + this.offset); + }; + + module.exports = CurrentTime; + +/***/ }, +/* 44 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; @@ -21069,12 +22227,10 @@ return /******/ (function(modules) { // webpackBootstrap function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } - var _ColorPicker = __webpack_require__(46); + var _ColorPicker = __webpack_require__(45); var _ColorPicker2 = _interopRequireDefault(_ColorPicker); - var util = __webpack_require__(7); - /** * The way this works is for all properties of this.possible options, you can supply the property name in any form to list the options. * Boolean options are recognised as Boolean @@ -21089,6 +22245,7 @@ return /******/ (function(modules) { // webpackBootstrap * @param configureOptions | the fully configured and predefined options set found in allOptions.js * @param pixelRatio | canvas pixel ratio */ + var util = __webpack_require__(1); var Configurator = (function () { function Configurator(parentModule, defaultContainer, configureOptions) { @@ -21102,6 +22259,8 @@ return /******/ (function(modules) { // webpackBootstrap this.allowCreation = false; this.options = {}; + this.initialized = false; + this.popupCounter = 0; this.defaultOptions = { enabled: false, filter: true, @@ -21113,21 +22272,28 @@ return /******/ (function(modules) { // webpackBootstrap this.configureOptions = configureOptions; this.moduleOptions = {}; this.domElements = []; + this.popupDiv = {}; + this.popupLimit = 5; + this.popupHistory = {}; this.colorPicker = new _ColorPicker2['default'](pixelRatio); this.wrapper = undefined; } + /** + * refresh all options. + * Because all modules parse their options by themselves, we just use their options. We copy them here. + * + * @param options + */ + _createClass(Configurator, [{ key: 'setOptions', - - /** - * refresh all options. - * Because all modules parse their options by themselves, we just use their options. We copy them here. - * - * @param options - */ value: function setOptions(options) { if (options !== undefined) { + // reset the popup history because the indices may have been changed. + this.popupHistory = {}; + this._removePopup(); + var enabled = true; if (typeof options === 'string') { this.options.filter = options; @@ -21173,13 +22339,13 @@ return /******/ (function(modules) { // webpackBootstrap this._create(); } } - }, { - key: '_create', /** * Create all DOM elements * @private */ + }, { + key: '_create', value: function _create() { var _this = this; @@ -21210,7 +22376,7 @@ return /******/ (function(modules) { // webpackBootstrap // a header for the category this._makeHeader(option); - // get the suboptions + // get the sub options this._handleObject(this.configureOptions[option], [option]); } counter++; @@ -21220,20 +22386,20 @@ return /******/ (function(modules) { // webpackBootstrap if (this.options.showButton === true) { (function () { var generateButton = document.createElement('div'); - generateButton.className = 'vis-network-configuration button'; + generateButton.className = 'vis-configuration vis-config-button'; generateButton.innerHTML = 'generate options'; generateButton.onclick = function () { _this._printOptions(); }; generateButton.onmouseover = function () { - generateButton.className = 'vis-network-configuration button hover'; + generateButton.className = 'vis-configuration vis-config-button hover'; }; generateButton.onmouseout = function () { - generateButton.className = 'vis-network-configuration button'; + generateButton.className = 'vis-configuration vis-config-button'; }; _this.optionsContainer = document.createElement('div'); - _this.optionsContainer.className = 'vis-network-configuration vis-option-container'; + _this.optionsContainer.className = 'vis-configuration vis-config-option-container'; _this.domElements.push(_this.optionsContainer); _this.domElements.push(generateButton); @@ -21241,30 +22407,32 @@ return /******/ (function(modules) { // webpackBootstrap } this._push(); - this.colorPicker.insertTo(this.container); + //~ this.colorPicker.insertTo(this.container); } - }, { - key: '_push', /** * draw all DOM elements on the screen * @private */ + }, { + key: '_push', value: function _push() { this.wrapper = document.createElement('div'); - this.wrapper.className = 'vis-network-configuration-wrapper'; + this.wrapper.className = 'vis-configuration-wrapper'; this.container.appendChild(this.wrapper); for (var i = 0; i < this.domElements.length; i++) { this.wrapper.appendChild(this.domElements[i]); } + + this._showPopupIfNeeded(); } - }, { - key: '_clean', /** * delete all DOM elements * @private */ + }, { + key: '_clean', value: function _clean() { for (var i = 0; i < this.domElements.length; i++) { this.wrapper.removeChild(this.domElements[i]); @@ -21275,9 +22443,9 @@ return /******/ (function(modules) { // webpackBootstrap this.wrapper = undefined; } this.domElements = []; + + this._removePopup(); } - }, { - key: '_getValue', /** * get the value from the actualOptions if it exists @@ -21285,6 +22453,8 @@ return /******/ (function(modules) { // webpackBootstrap * @returns {*} * @private */ + }, { + key: '_getValue', value: function _getValue(path) { var base = this.moduleOptions; for (var i = 0; i < path.length; i++) { @@ -21297,8 +22467,6 @@ return /******/ (function(modules) { // webpackBootstrap } return base; } - }, { - key: '_makeItem', /** * all option elements are wrapped in an item @@ -21306,6 +22474,8 @@ return /******/ (function(modules) { // webpackBootstrap * @param domElements * @private */ + }, { + key: '_makeItem', value: function _makeItem(path) { var _arguments = arguments, _this2 = this; @@ -21313,9 +22483,9 @@ return /******/ (function(modules) { // webpackBootstrap if (this.allowCreation === true) { var _len, domElements, _key; - (function () { + var _ret2 = (function () { var item = document.createElement('div'); - item.className = 'vis-network-configuration item s' + path.length; + item.className = 'vis-configuration vis-config-item vis-config-s' + path.length; for (_len = _arguments.length, domElements = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { domElements[_key - 1] = _arguments[_key]; @@ -21325,25 +22495,29 @@ return /******/ (function(modules) { // webpackBootstrap item.appendChild(element); }); _this2.domElements.push(item); + return { + v: _this2.domElements.length + }; })(); + + if (typeof _ret2 === 'object') return _ret2.v; } + return 0; } - }, { - key: '_makeHeader', /** * header for major subjects * @param name * @private */ + }, { + key: '_makeHeader', value: function _makeHeader(name) { var div = document.createElement('div'); - div.className = 'vis-network-configuration header'; + div.className = 'vis-configuration vis-config-header'; div.innerHTML = name; this._makeItem([], div); } - }, { - key: '_makeLabel', /** * make a label, if it is an object label, it gets different styling. @@ -21353,11 +22527,13 @@ return /******/ (function(modules) { // webpackBootstrap * @returns {HTMLElement} * @private */ + }, { + key: '_makeLabel', value: function _makeLabel(name, path) { var objectLabel = arguments.length <= 2 || arguments[2] === undefined ? false : arguments[2]; var div = document.createElement('div'); - div.className = 'vis-network-configuration label s' + path.length; + div.className = 'vis-configuration vis-config-label vis-config-s' + path.length; if (objectLabel === true) { div.innerHTML = '' + name + ':'; } else { @@ -21365,8 +22541,6 @@ return /******/ (function(modules) { // webpackBootstrap } return div; } - }, { - key: '_makeDropdown', /** * make a dropdown list for multiple possible string optoins @@ -21375,9 +22549,11 @@ return /******/ (function(modules) { // webpackBootstrap * @param path * @private */ + }, { + key: '_makeDropdown', value: function _makeDropdown(arr, value, path) { var select = document.createElement('select'); - select.className = 'vis-network-configuration select'; + select.className = 'vis-configuration vis-config-select'; var selectedValue = 0; if (value !== undefined) { if (arr.indexOf(value) !== -1) { @@ -21403,8 +22579,6 @@ return /******/ (function(modules) { // webpackBootstrap var label = this._makeLabel(path[path.length - 1], path); this._makeItem(path, label, select); } - }, { - key: '_makeRange', /** * make a range object for numeric options @@ -21413,13 +22587,15 @@ return /******/ (function(modules) { // webpackBootstrap * @param path * @private */ + }, { + key: '_makeRange', value: function _makeRange(arr, value, path) { var defaultValue = arr[0]; var min = arr[1]; var max = arr[2]; var step = arr[3]; var range = document.createElement('input'); - range.className = 'vis-network-configuration range'; + range.className = 'vis-configuration vis-config-range'; try { range.type = 'range'; // not supported on IE9 range.min = min; @@ -21427,14 +22603,25 @@ return /******/ (function(modules) { // webpackBootstrap } catch (err) {} range.step = step; + // set up the popup settings in case they are needed. + var popupString = ''; + var popupValue = 0; + if (value !== undefined) { - if (value < 0 && value * 2 < min) { - range.min = value * 2; - } else if (value * 0.1 < min) { - range.min = value / 10; + var factor = 1.20; + if (value < 0 && value * factor < min) { + range.min = Math.ceil(value * factor); + popupValue = range.min; + popupString = 'range increased'; + } else if (value / factor < min) { + range.min = Math.ceil(value / factor); + popupValue = range.min; + popupString = 'range increased'; } - if (value * 2 > max && max !== 1) { - range.max = value * 2; + if (value * factor > max && max !== 1) { + range.max = Math.ceil(value * factor); + popupValue = range.max; + popupString = 'range increased'; } range.value = value; } else { @@ -21442,7 +22629,7 @@ return /******/ (function(modules) { // webpackBootstrap } var input = document.createElement('input'); - input.className = 'vis-network-configuration rangeinput'; + input.className = 'vis-configuration vis-config-rangeinput'; input.value = range.value; var me = this; @@ -21454,10 +22641,77 @@ return /******/ (function(modules) { // webpackBootstrap }; var label = this._makeLabel(path[path.length - 1], path); - this._makeItem(path, label, range, input); + var itemIndex = this._makeItem(path, label, range, input); + + // if a popup is needed AND it has not been shown for this value, show it. + if (popupString !== '' && this.popupHistory[itemIndex] !== popupValue) { + this.popupHistory[itemIndex] = popupValue; + this._setupPopup(popupString, itemIndex); + } } + + /** + * prepare the popup + * @param string + * @param index + * @private + */ }, { - key: '_makeCheckbox', + key: '_setupPopup', + value: function _setupPopup(string, index) { + var _this3 = this; + + if (this.initialized === true && this.allowCreation === true && this.popupCounter < this.popupLimit) { + var div = document.createElement("div"); + div.id = "vis-configuration-popup"; + div.className = "vis-configuration-popup"; + div.innerHTML = string; + div.onclick = function () { + _this3._removePopup(); + }; + this.popupCounter += 1; + this.popupDiv = { html: div, index: index }; + } + } + + /** + * remove the popup from the dom + * @private + */ + }, { + key: '_removePopup', + value: function _removePopup() { + if (this.popupDiv.html !== undefined) { + this.popupDiv.html.parentNode.removeChild(this.popupDiv.html); + clearTimeout(this.popupDiv.hideTimeout); + clearTimeout(this.popupDiv.deleteTimeout); + this.popupDiv = {}; + } + } + + /** + * Show the popup if it is needed. + * @private + */ + }, { + key: '_showPopupIfNeeded', + value: function _showPopupIfNeeded() { + var _this4 = this; + + if (this.popupDiv.html !== undefined) { + var correspondingElement = this.domElements[this.popupDiv.index]; + var rect = correspondingElement.getBoundingClientRect(); + this.popupDiv.html.style.left = rect.left + "px"; + this.popupDiv.html.style.top = rect.top - 30 + "px"; // 30 is the height; + document.body.appendChild(this.popupDiv.html); + this.popupDiv.hideTimeout = setTimeout(function () { + _this4.popupDiv.html.style.opacity = 0; + }, 1500); + this.popupDiv.deleteTimeout = setTimeout(function () { + _this4._removePopup(); + }, 1800); + } + } /** * make a checkbox for boolean options. @@ -21466,10 +22720,12 @@ return /******/ (function(modules) { // webpackBootstrap * @param path * @private */ + }, { + key: '_makeCheckbox', value: function _makeCheckbox(defaultValue, value, path) { var checkbox = document.createElement('input'); checkbox.type = 'checkbox'; - checkbox.className = 'vis-network-configuration checkbox'; + checkbox.className = 'vis-configuration vis-config-checkbox'; checkbox.checked = defaultValue; if (value !== undefined) { checkbox.checked = value; @@ -21492,8 +22748,6 @@ return /******/ (function(modules) { // webpackBootstrap var label = this._makeLabel(path[path.length - 1], path); this._makeItem(path, label, checkbox); } - }, { - key: '_makeTextInput', /** * make a text input field for string options. @@ -21502,10 +22756,12 @@ return /******/ (function(modules) { // webpackBootstrap * @param path * @private */ + }, { + key: '_makeTextInput', value: function _makeTextInput(defaultValue, value, path) { var checkbox = document.createElement('input'); checkbox.type = 'text'; - checkbox.className = 'vis-network-configuration text'; + checkbox.className = 'vis-configuration vis-config-text'; checkbox.value = value; if (value !== defaultValue) { this.changedOptions.push({ path: path, value: value }); @@ -21519,8 +22775,6 @@ return /******/ (function(modules) { // webpackBootstrap var label = this._makeLabel(path[path.length - 1], path); this._makeItem(path, label, checkbox); } - }, { - key: '_makeColorField', /** * make a color field with a color picker for color fields @@ -21529,30 +22783,30 @@ return /******/ (function(modules) { // webpackBootstrap * @param path * @private */ + }, { + key: '_makeColorField', value: function _makeColorField(arr, value, path) { - var _this3 = this; + var _this5 = this; var defaultColor = arr[1]; var div = document.createElement('div'); value = value === undefined ? defaultColor : value; if (value !== 'none') { - div.className = 'vis-network-configuration colorBlock'; + div.className = 'vis-configuration vis-config-colorBlock'; div.style.backgroundColor = value; } else { - div.className = 'vis-network-configuration colorBlock none'; + div.className = 'vis-configuration vis-config-colorBlock none'; } value = value === undefined ? defaultColor : value; div.onclick = function () { - _this3._showColorPicker(value, div, path); + _this5._showColorPicker(value, div, path); }; var label = this._makeLabel(path[path.length - 1], path); this._makeItem(path, label, div); } - }, { - key: '_showColorPicker', /** * used by the color buttons to call the color picker. @@ -21562,23 +22816,31 @@ return /******/ (function(modules) { // webpackBootstrap * @param path * @private */ + }, { + key: '_showColorPicker', value: function _showColorPicker(value, div, path) { - var _this4 = this; + var _this6 = this; + + // clear the callback from this div + div.onclick = function () {}; + + this.colorPicker.insertTo(div); + this.colorPicker.show(); - var rect = div.getBoundingClientRect(); - var bodyRect = document.body.getBoundingClientRect(); - var pickerX = rect.left + rect.width + 5; - var pickerY = rect.top - bodyRect.top + rect.height * 0.5; - this.colorPicker.show(pickerX, pickerY); this.colorPicker.setColor(value); - this.colorPicker.setCallback(function (color) { + this.colorPicker.setUpdateCallback(function (color) { var colorString = 'rgba(' + color.r + ',' + color.g + ',' + color.b + ',' + color.a + ')'; div.style.backgroundColor = colorString; - _this4._update(colorString, path); + _this6._update(colorString, path); + }); + + // on close of the colorpicker, restore the callback. + this.colorPicker.setCloseCallback(function () { + div.onclick = function () { + _this6._showColorPicker(value, div, path); + }; }); } - }, { - key: '_handleObject', /** * parse an object and draw the correct items @@ -21586,6 +22848,8 @@ return /******/ (function(modules) { // webpackBootstrap * @param path * @private */ + }, { + key: '_handleObject', value: function _handleObject(obj) { var path = arguments.length <= 1 || arguments[1] === undefined ? [] : arguments[1]; var checkOnly = arguments.length <= 2 || arguments[2] === undefined ? false : arguments[2]; @@ -21656,8 +22920,6 @@ return /******/ (function(modules) { // webpackBootstrap } return visibleInSet; } - }, { - key: '_handleArray', /** * handle the array type of option @@ -21667,6 +22929,8 @@ return /******/ (function(modules) { // webpackBootstrap * @param path * @private */ + }, { + key: '_handleArray', value: function _handleArray(arr, value, path) { if (typeof arr[0] === 'string' && arr[0] === 'color') { this._makeColorField(arr, value, path); @@ -21685,8 +22949,6 @@ return /******/ (function(modules) { // webpackBootstrap } } } - }, { - key: '_update', /** * called to update the network with the new settings. @@ -21694,13 +22956,15 @@ return /******/ (function(modules) { // webpackBootstrap * @param path * @private */ + }, { + key: '_update', value: function _update(value, path) { var options = this._constructOptions(value, path); if (this.parent.body && this.parent.body.emitter && this.parent.body.emitter.emit) { - this.parent.body.emitter.emit('configChange', options); + this.parent.body.emitter.emit("configChange", options); } - + this.initialized = true; this.parent.setOptions(options); } }, { @@ -21752,7 +23016,7 @@ return /******/ (function(modules) { // webpackBootstrap module.exports = exports['default']; /***/ }, -/* 46 */ +/* 45 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; @@ -21765,9 +23029,9 @@ return /******/ (function(modules) { // webpackBootstrap function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } - var Hammer = __webpack_require__(3); - var hammerUtil = __webpack_require__(30); - var util = __webpack_require__(7); + var Hammer = __webpack_require__(20); + var hammerUtil = __webpack_require__(24); + var util = __webpack_require__(1); var ColorPicker = (function () { function ColorPicker() { @@ -21787,18 +23051,19 @@ return /******/ (function(modules) { // webpackBootstrap // bound by this.updateCallback = function () {}; + this.closeCallback = function () {}; // create all DOM elements this._create(); } + /** + * this inserts the colorPicker into a div from the DOM + * @param container + */ + _createClass(ColorPicker, [{ key: 'insertTo', - - /** - * this inserts the colorPicker into a div from the DOM - * @param container - */ value: function insertTo(container) { if (this.hammer !== undefined) { this.hammer.destroy(); @@ -21810,18 +23075,32 @@ return /******/ (function(modules) { // webpackBootstrap this._setSize(); } - }, { - key: 'setCallback', /** * the callback is executed on apply and save. Bind it to the application * @param callback */ - value: function setCallback(callback) { + }, { + key: 'setUpdateCallback', + value: function setUpdateCallback(callback) { if (typeof callback === 'function') { this.updateCallback = callback; } else { - throw new Error('Function attempted to set as colorPicker callback is not a function.'); + throw new Error("Function attempted to set as colorPicker update callback is not a function."); + } + } + + /** + * the callback is executed on apply and save. Bind it to the application + * @param callback + */ + }, { + key: 'setCloseCallback', + value: function setCloseCallback(callback) { + if (typeof callback === 'function') { + this.closeCallback = callback; + } else { + throw new Error("Function attempted to set as colorPicker closing callback is not a function."); } } }, { @@ -21832,8 +23111,6 @@ return /******/ (function(modules) { // webpackBootstrap return htmlColors[color]; } } - }, { - key: 'setColor', /** * Set the color of the colorPicker @@ -21847,6 +23124,8 @@ return /******/ (function(modules) { // webpackBootstrap * @param color * @param setInitial */ + }, { + key: 'setColor', value: function setColor(color) { var setInitial = arguments.length <= 1 || arguments[1] === undefined ? true : arguments[1]; @@ -21885,28 +23164,28 @@ return /******/ (function(modules) { // webpackBootstrap // set color if (rgba === undefined) { - throw new Error('Unknown color passed to the colorPicker. Supported are strings: rgb, hex, rgba. Object: rgb ({r:r,g:g,b:b,[a:a]}). Supplied: ' + JSON.stringify(color)); + throw new Error("Unknown color passed to the colorPicker. Supported are strings: rgb, hex, rgba. Object: rgb ({r:r,g:g,b:b,[a:a]}). Supplied: " + JSON.stringify(color)); } else { this._setColor(rgba, setInitial); } } - }, { - key: 'show', /** - * this shows the color picker at a location. The hue circle is constructed once and stored. - * @param x - * @param y + * this shows the color picker. + * The hue circle is constructed once and stored. */ - value: function show(x, y) { + }, { + key: 'show', + value: function show() { + if (this.closeCallback !== undefined) { + this.closeCallback(); + this.closeCallback = undefined; + } + this.applied = false; this.frame.style.display = 'block'; - this.frame.style.top = y + 'px'; - this.frame.style.left = x + 'px'; this._generateHueCircle(); } - }, { - key: '_hide', // ------------------------------------------ PRIVATE ----------------------------- // @@ -21916,7 +23195,11 @@ return /******/ (function(modules) { // webpackBootstrap * @param storePrevious * @private */ + }, { + key: '_hide', value: function _hide() { + var _this = this; + var storePrevious = arguments.length <= 0 || arguments[0] === undefined ? true : arguments[0]; // store the previous color for next time; @@ -21929,47 +23212,54 @@ return /******/ (function(modules) { // webpackBootstrap } this.frame.style.display = 'none'; + + // call the closing callback, restoring the onclick method. + // this is in a setTimeout because it will trigger the show again before the click is done. + setTimeout(function () { + if (_this.closeCallback !== undefined) { + _this.closeCallback(); + _this.closeCallback = undefined; + } + }, 0); } - }, { - key: '_save', /** * bound to the save button. Saves and hides. * @private */ + }, { + key: '_save', value: function _save() { this.updateCallback(this.color); this.applied = false; this._hide(); } - }, { - key: '_apply', /** * Bound to apply button. Saves but does not close. Is undone by the cancel button. * @private */ + }, { + key: '_apply', value: function _apply() { this.applied = true; this.updateCallback(this.color); this._updatePicker(this.color); } - }, { - key: '_loadLast', /** * load the color from the previous session. * @private */ + }, { + key: '_loadLast', value: function _loadLast() { if (this.previousColor !== undefined) { this.setColor(this.previousColor, false); } else { - alert('There is no last color to load...'); + alert("There is no last color to load..."); } } - }, { - key: '_setColor', /** * set the color, place the picker @@ -21977,6 +23267,8 @@ return /******/ (function(modules) { // webpackBootstrap * @param setInitial * @private */ + }, { + key: '_setColor', value: function _setColor(rgba) { var setInitial = arguments.length <= 1 || arguments[1] === undefined ? true : arguments[1]; @@ -21998,26 +23290,26 @@ return /******/ (function(modules) { // webpackBootstrap this._updatePicker(rgba); } - }, { - key: '_setOpacity', /** * bound to opacity control * @param value * @private */ + }, { + key: '_setOpacity', value: function _setOpacity(value) { this.color.a = value / 100; this._updatePicker(this.color); } - }, { - key: '_setBrightness', /** * bound to brightness control * @param value * @private */ + }, { + key: '_setBrightness', value: function _setBrightness(value) { var hsv = util.RGBToHSV(this.color.r, this.color.g, this.color.b); hsv.v = value / 100; @@ -22026,14 +23318,14 @@ return /******/ (function(modules) { // webpackBootstrap this.color = rgba; this._updatePicker(); } - }, { - key: '_updatePicker', /** - * update the colorpicker. A black circle overlays the hue circle to mimic the brightness decreasing. + * update the color picker. A black circle overlays the hue circle to mimic the brightness decreasing. * @param rgba * @private */ + }, { + key: '_updatePicker', value: function _updatePicker() { var rgba = arguments.length <= 0 || arguments[0] === undefined ? this.color : arguments[0]; @@ -22060,13 +23352,13 @@ return /******/ (function(modules) { // webpackBootstrap this.initialColorDiv.style.backgroundColor = 'rgba(' + this.initialColor.r + ',' + this.initialColor.g + ',' + this.initialColor.b + ',' + this.initialColor.a + ')'; this.newColorDiv.style.backgroundColor = 'rgba(' + this.color.r + ',' + this.color.g + ',' + this.color.b + ',' + this.color.a + ')'; } - }, { - key: '_setSize', /** * used by create to set the size of the canvas. * @private */ + }, { + key: '_setSize', value: function _setSize() { this.colorPickerCanvas.style.width = '100%'; this.colorPickerCanvas.style.height = '100%'; @@ -22074,14 +23366,14 @@ return /******/ (function(modules) { // webpackBootstrap this.colorPickerCanvas.width = 289 * this.pixelRatio; this.colorPickerCanvas.height = 289 * this.pixelRatio; } - }, { - key: '_create', /** * create all dom elements * TODO: cleanup, lots of similar dom elements * @private */ + }, { + key: '_create', value: function _create() { this.frame = document.createElement('div'); this.frame.className = 'vis-color-picker'; @@ -22102,10 +23394,10 @@ return /******/ (function(modules) { // webpackBootstrap noCanvas.innerHTML = 'Error: your browser does not support HTML canvas'; this.colorPickerCanvas.appendChild(noCanvas); } else { - var ctx = this.colorPickerCanvas.getContext('2d'); + var ctx = this.colorPickerCanvas.getContext("2d"); this.pixelRatio = (window.devicePixelRatio || 1) / (ctx.webkitBackingStorePixelRatio || ctx.mozBackingStorePixelRatio || ctx.msBackingStorePixelRatio || ctx.oBackingStorePixelRatio || ctx.backingStorePixelRatio || 1); - this.colorPickerCanvas.getContext('2d').setTransform(this.pixelRatio, 0, 0, this.pixelRatio, 0, 0); + this.colorPickerCanvas.getContext("2d").setTransform(this.pixelRatio, 0, 0, this.pixelRatio, 0, 0); } this.colorPickerDiv.className = 'vis-color'; @@ -22154,39 +23446,39 @@ return /******/ (function(modules) { // webpackBootstrap me._setBrightness(this.value); }; - this.brightnessLabel = document.createElement('div'); - this.brightnessLabel.className = 'vis-label vis-brightness'; + this.brightnessLabel = document.createElement("div"); + this.brightnessLabel.className = "vis-label vis-brightness"; this.brightnessLabel.innerHTML = 'brightness:'; - this.opacityLabel = document.createElement('div'); - this.opacityLabel.className = 'vis-label vis-opacity'; + this.opacityLabel = document.createElement("div"); + this.opacityLabel.className = "vis-label vis-opacity"; this.opacityLabel.innerHTML = 'opacity:'; - this.newColorDiv = document.createElement('div'); - this.newColorDiv.className = 'vis-new-color'; + this.newColorDiv = document.createElement("div"); + this.newColorDiv.className = "vis-new-color"; this.newColorDiv.innerHTML = 'new'; - this.initialColorDiv = document.createElement('div'); - this.initialColorDiv.className = 'vis-initial-color'; + this.initialColorDiv = document.createElement("div"); + this.initialColorDiv.className = "vis-initial-color"; this.initialColorDiv.innerHTML = 'initial'; - this.cancelButton = document.createElement('div'); - this.cancelButton.className = 'vis-button vis-cancel'; + this.cancelButton = document.createElement("div"); + this.cancelButton.className = "vis-button vis-cancel"; this.cancelButton.innerHTML = 'cancel'; this.cancelButton.onclick = this._hide.bind(this, false); - this.applyButton = document.createElement('div'); - this.applyButton.className = 'vis-button vis-apply'; + this.applyButton = document.createElement("div"); + this.applyButton.className = "vis-button vis-apply"; this.applyButton.innerHTML = 'apply'; this.applyButton.onclick = this._apply.bind(this); - this.saveButton = document.createElement('div'); - this.saveButton.className = 'vis-button vis-save'; + this.saveButton = document.createElement("div"); + this.saveButton.className = "vis-button vis-save"; this.saveButton.innerHTML = 'save'; this.saveButton.onclick = this._save.bind(this); - this.loadButton = document.createElement('div'); - this.loadButton.className = 'vis-button vis-load'; + this.loadButton = document.createElement("div"); + this.loadButton.className = "vis-button vis-load"; this.loadButton.innerHTML = 'load last'; this.loadButton.onclick = this._loadLast.bind(this); @@ -22204,15 +23496,15 @@ return /******/ (function(modules) { // webpackBootstrap this.frame.appendChild(this.saveButton); this.frame.appendChild(this.loadButton); } - }, { - key: '_bindHammer', /** * bind hammer to the color picker * @private */ + }, { + key: '_bindHammer', value: function _bindHammer() { - var _this = this; + var _this2 = this; this.drag = {}; this.pinch = {}; @@ -22220,28 +23512,28 @@ return /******/ (function(modules) { // webpackBootstrap this.hammer.get('pinch').set({ enable: true }); hammerUtil.onTouch(this.hammer, function (event) { - _this._moveSelector(event); + _this2._moveSelector(event); }); this.hammer.on('tap', function (event) { - _this._moveSelector(event); + _this2._moveSelector(event); }); this.hammer.on('panstart', function (event) { - _this._moveSelector(event); + _this2._moveSelector(event); }); this.hammer.on('panmove', function (event) { - _this._moveSelector(event); + _this2._moveSelector(event); }); this.hammer.on('panend', function (event) { - _this._moveSelector(event); + _this2._moveSelector(event); }); } - }, { - key: '_generateHueCircle', /** * generate the hue circle. This is relatively heavy (200ms) and is done only once on the first time it is shown. * @private */ + }, { + key: '_generateHueCircle', value: function _generateHueCircle() { if (this.generated === false) { var ctx = this.colorPickerCanvas.getContext('2d'); @@ -22283,8 +23575,6 @@ return /******/ (function(modules) { // webpackBootstrap } this.generated = true; } - }, { - key: '_moveSelector', /** * move the selector. This is called by hammer functions. @@ -22292,6 +23582,8 @@ return /******/ (function(modules) { // webpackBootstrap * @param event * @private */ + }, { + key: '_moveSelector', value: function _moveSelector(event) { var rect = this.colorPickerDiv.getBoundingClientRect(); var left = event.center.x - rect.left; @@ -22336,7 +23628,7 @@ return /******/ (function(modules) { // webpackBootstrap module.exports = exports['default']; /***/ }, -/* 47 */ +/* 46 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; @@ -22349,7 +23641,7 @@ return /******/ (function(modules) { // webpackBootstrap function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } - var util = __webpack_require__(7); + var util = __webpack_require__(1); var errorFound = false; var allOptions = undefined; @@ -22363,15 +23655,15 @@ return /******/ (function(modules) { // webpackBootstrap _classCallCheck(this, Validator); } + /** + * Main function to be called + * @param options + * @param subObject + * @returns {boolean} + */ + _createClass(Validator, null, [{ key: 'validate', - - /** - * Main function to be called - * @param options - * @param subObject - * @returns {boolean} - */ value: function validate(options, referenceOptions, subObject) { errorFound = false; allOptions = referenceOptions; @@ -22382,8 +23674,6 @@ return /******/ (function(modules) { // webpackBootstrap Validator.parse(options, usedOptions, []); return errorFound; } - }, { - key: 'parse', /** * Will traverse an object recursively and check every value @@ -22391,6 +23681,8 @@ return /******/ (function(modules) { // webpackBootstrap * @param referenceOptions * @param path */ + }, { + key: 'parse', value: function parse(options, referenceOptions, path) { for (var option in options) { if (options.hasOwnProperty(option)) { @@ -22398,8 +23690,6 @@ return /******/ (function(modules) { // webpackBootstrap } } } - }, { - key: 'check', /** * Check every value. If the value is an object, call the parse function on that object. @@ -22408,6 +23698,8 @@ return /******/ (function(modules) { // webpackBootstrap * @param referenceOptions * @param path */ + }, { + key: 'check', value: function check(option, options, referenceOptions, path) { if (referenceOptions[option] === undefined && referenceOptions.__any__ === undefined) { Validator.getSuggestion(option, referenceOptions, path); @@ -22429,8 +23721,6 @@ return /******/ (function(modules) { // webpackBootstrap } } } - }, { - key: 'checkFields', /** * @@ -22441,6 +23731,8 @@ return /******/ (function(modules) { // webpackBootstrap * @param {String} refOptionType | This is the type object from the reference options * @param {Array} path | where in the object is the option */ + }, { + key: 'checkFields', value: function checkFields(option, options, referenceOptions, referenceOption, refOptionObj, path) { var optionType = Validator.getType(options[option]); var refOptionType = refOptionObj[optionType]; @@ -22450,11 +23742,11 @@ return /******/ (function(modules) { // webpackBootstrap if (refOptionType.indexOf(options[option]) === -1) { console.log('%cInvalid option detected in "' + option + '".' + ' Allowed values are:' + Validator.print(refOptionType) + ' not "' + options[option] + '". ' + Validator.printLocation(path, option), printStyle); errorFound = true; - } else if (optionType === 'object' && referenceOption !== '__any__') { + } else if (optionType === 'object' && referenceOption !== "__any__") { path = util.copyAndExtendArray(path, option); Validator.parse(options[option], referenceOptions[referenceOption], path); } - } else if (optionType === 'object' && referenceOption !== '__any__') { + } else if (optionType === 'object' && referenceOption !== "__any__") { path = util.copyAndExtendArray(path, option); Validator.parse(options[option], referenceOptions[referenceOption], path); } @@ -22527,8 +23819,6 @@ return /******/ (function(modules) { // webpackBootstrap errorFound = true; } - }, { - key: 'findInOptions', /** * traverse the options in search for a match. @@ -22538,6 +23828,8 @@ return /******/ (function(modules) { // webpackBootstrap * @param recursive * @returns {{closestMatch: string, path: Array, distance: number}} */ + }, { + key: 'findInOptions', value: function findInOptions(option, options, path) { var recursive = arguments.length <= 3 || arguments[3] === undefined ? false : arguments[3]; @@ -22597,10 +23889,8 @@ return /******/ (function(modules) { // webpackBootstrap }, { key: 'print', value: function print(options) { - return JSON.stringify(options).replace(/(\")|(\[)|(\])|(,"__type__")/g, '').replace(/(\,)/g, ', '); + return JSON.stringify(options).replace(/(\")|(\[)|(\])|(,"__type__")/g, "").replace(/(\,)/g, ', '); } - }, { - key: 'levenshteinDistance', // Compute the edit distance between the two given strings // http://en.wikibooks.org/wiki/Algorithm_Implementation/Strings/Levenshtein_distance#JavaScript @@ -22610,6 +23900,8 @@ return /******/ (function(modules) { // webpackBootstrap The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ + }, { + key: 'levenshteinDistance', value: function levenshteinDistance(a, b) { if (a.length === 0) return b.length; if (b.length === 0) return a.length; @@ -22652,7 +23944,7 @@ return /******/ (function(modules) { // webpackBootstrap exports.printStyle = printStyle; /***/ }, -/* 48 */ +/* 47 */ /***/ function(module, exports) { /** @@ -22688,6 +23980,7 @@ return /******/ (function(modules) { // webpackBootstrap //globals : align: { string: string }, autoResize: { boolean: boolean }, + throttleRedraw: { number: number }, clickToUse: { boolean: boolean }, dataAttributes: { string: string, array: array }, editable: { @@ -22723,9 +24016,23 @@ return /******/ (function(modules) { // webpackBootstrap }, __type__: { object: object } }, + moment: { 'function': 'function' }, groupOrder: { string: string, 'function': 'function' }, + groupEditable: { + add: { boolean: boolean, 'undefined': 'undefined' }, + remove: { boolean: boolean, 'undefined': 'undefined' }, + order: { boolean: boolean, 'undefined': 'undefined' }, + __type__: { boolean: boolean, object: object } + }, + groupOrderSwap: { 'function': 'function' }, height: { string: string, number: number }, - hiddenDates: { object: object, array: array }, + hiddenDates: { + start: { date: date, number: number, string: string, moment: moment }, + end: { date: date, number: number, string: string, moment: moment }, + repeat: { string: string }, + __type__: { object: object, array: array } + }, + itemsAlwaysDraggable: { boolean: boolean }, locale: { string: string }, locales: { __any__: { any: any }, @@ -22742,15 +24049,20 @@ return /******/ (function(modules) { // webpackBootstrap }, max: { date: date, number: number, string: string, moment: moment }, maxHeight: { number: number, string: string }, + maxMinorChars: { number: number }, min: { date: date, number: number, string: string, moment: moment }, minHeight: { number: number, string: string }, moveable: { boolean: boolean }, multiselect: { boolean: boolean }, + multiselectPerGroup: { boolean: boolean }, onAdd: { 'function': 'function' }, onUpdate: { 'function': 'function' }, onMove: { 'function': 'function' }, onMoving: { 'function': 'function' }, onRemove: { 'function': 'function' }, + onAddGroup: { 'function': 'function' }, + onMoveGroup: { 'function': 'function' }, + onRemoveGroup: { 'function': 'function' }, order: { 'function': 'function' }, orientation: { axis: { string: string, 'undefined': 'undefined' }, @@ -22785,6 +24097,7 @@ return /******/ (function(modules) { // webpackBootstrap global: { align: ['center', 'left', 'right'], autoResize: true, + throttleRedraw: [10, 0, 1000, 10], clickToUse: false, // dataAttributes: ['all'], // FIXME: can be 'all' or string[] editable: { @@ -22818,6 +24131,7 @@ return /******/ (function(modules) { // webpackBootstrap }, //groupOrder: {string, 'function': 'function'}, + groupsDraggable: false, height: '', //hiddenDates: {object, array}, locale: '', @@ -22830,10 +24144,12 @@ return /******/ (function(modules) { // webpackBootstrap }, max: '', maxHeight: '', + maxMinorChars: [7, 0, 20, 1], min: '', minHeight: '', moveable: false, multiselect: false, + multiselectPerGroup: false, //onAdd: {'function': 'function'}, //onUpdate: {'function': 'function'}, //onMove: {'function': 'function'}, @@ -22869,28 +24185,29 @@ return /******/ (function(modules) { // webpackBootstrap exports.configureOptions = configureOptions; /***/ }, -/* 49 */ +/* 48 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; - var Emitter = __webpack_require__(19); - var Hammer = __webpack_require__(3); - var util = __webpack_require__(7); - var DataSet = __webpack_require__(14); - var DataView = __webpack_require__(16); - var Range = __webpack_require__(29); - var Core = __webpack_require__(32); - var TimeAxis = __webpack_require__(41); - var CurrentTime = __webpack_require__(26); - var CustomTime = __webpack_require__(44); - var LineGraph = __webpack_require__(50); + var Emitter = __webpack_require__(12); + var Hammer = __webpack_require__(20); + var moment = __webpack_require__(2); + var util = __webpack_require__(1); + var DataSet = __webpack_require__(8); + var DataView = __webpack_require__(10); + var Range = __webpack_require__(23); + var Core = __webpack_require__(27); + var TimeAxis = __webpack_require__(38); + var CurrentTime = __webpack_require__(43); + var CustomTime = __webpack_require__(41); + var LineGraph = __webpack_require__(49); - var Configurator = __webpack_require__(45); - var Validator = __webpack_require__(47)['default']; - var printStyle = __webpack_require__(47).printStyle; - var allOptions = __webpack_require__(58).allOptions; - var configureOptions = __webpack_require__(58).configureOptions; + var Configurator = __webpack_require__(44); + var Validator = __webpack_require__(46)['default']; + var printStyle = __webpack_require__(46).printStyle; + var allOptions = __webpack_require__(57).allOptions; + var configureOptions = __webpack_require__(57).configureOptions; /** * Create a timeline visualization @@ -22902,7 +24219,7 @@ return /******/ (function(modules) { // webpackBootstrap */ function Graph2d(container, items, groups, options) { // if the third element is options, the forth is groups (optionally); - if (!(Array.isArray(groups) || groups instanceof DataSet) && groups instanceof Object) { + if (!(Array.isArray(groups) || groups instanceof DataSet || groups instanceof DataView) && groups instanceof Object) { var forthArgument = options; options = groups; groups = forthArgument; @@ -22920,6 +24237,8 @@ return /******/ (function(modules) { // webpackBootstrap item: 'bottom' // not relevant for Graph2d }, + moment: moment, + width: null, height: null, maxHeight: null, @@ -22966,6 +24285,7 @@ return /******/ (function(modules) { // webpackBootstrap // item set this.linegraph = new LineGraph(this.body); + this.components.push(this.linegraph); this.itemsData = null; // DataSet @@ -22994,9 +24314,10 @@ return /******/ (function(modules) { // webpackBootstrap // create itemset if (items) { this.setItems(items); - } else { - this._redraw(); } + + // draw for the first time + this._redraw(); } // Extend the functionality from Core @@ -23043,7 +24364,6 @@ return /******/ (function(modules) { // webpackBootstrap if (this.options.start != undefined || this.options.end != undefined) { var start = this.options.start != undefined ? this.options.start : null; var end = this.options.end != undefined ? this.options.end : null; - this.setWindow(start, end, { animation: false }); } else { this.fit({ animation: false }); @@ -23087,7 +24407,7 @@ return /******/ (function(modules) { // webpackBootstrap if (this.linegraph.groups[groupId] !== undefined) { return this.linegraph.groups[groupId].getLegend(width, height); } else { - return 'cannot find group:' + groupId; + return "cannot find group:'" + groupId + "'"; } }; @@ -23205,21 +24525,22 @@ return /******/ (function(modules) { // webpackBootstrap module.exports = Graph2d; /***/ }, -/* 50 */ +/* 49 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; - var util = __webpack_require__(7); - var DOMutil = __webpack_require__(13); - var DataSet = __webpack_require__(14); - var DataView = __webpack_require__(16); - var Component = __webpack_require__(27); - var DataAxis = __webpack_require__(51); - var GraphGroup = __webpack_require__(53); - var Legend = __webpack_require__(57); - var BarFunctions = __webpack_require__(56); - var LineFunctions = __webpack_require__(54); + var util = __webpack_require__(1); + var DOMutil = __webpack_require__(7); + var DataSet = __webpack_require__(8); + var DataView = __webpack_require__(10); + var Component = __webpack_require__(25); + var DataAxis = __webpack_require__(50); + var GraphGroup = __webpack_require__(52); + var Legend = __webpack_require__(56); + var Bars = __webpack_require__(53); + var Lines = __webpack_require__(55); + var Points = __webpack_require__(54); var UNGROUPED = '__ungrouped__'; // reserved group id for ungrouped items @@ -23243,7 +24564,7 @@ return /******/ (function(modules) { // webpackBootstrap graphHeight: '400px', shaded: { enabled: false, - orientation: 'bottom' // top, bottom + orientation: 'bottom' // top, bottom, zero }, style: 'line', // line, bar barChart: { @@ -23261,46 +24582,14 @@ return /******/ (function(modules) { // webpackBootstrap size: 6, style: 'square' // square, circle }, - dataAxis: { - showMinorLabels: true, - showMajorLabels: true, - icons: false, - width: '40px', - visible: true, - alignZeros: true, - left: { - range: { min: undefined, max: undefined }, - format: function format(value) { - return value; - }, - title: { text: undefined, style: undefined } - }, - right: { - range: { min: undefined, max: undefined }, - format: function format(value) { - return value; - }, - title: { text: undefined, style: undefined } - } - }, - legend: { - enabled: false, - icons: true, - left: { - visible: true, - position: 'top-left' // top/bottom - left,right - }, - right: { - visible: true, - position: 'top-right' // top/bottom - left,right - } - }, + dataAxis: {}, //Defaults are done on DataAxis level + legend: {}, //Defaults are done on Legend level groups: { visibility: {} } }; - // options is shared by this ItemSet and all its items + // options is shared by this lineGraph and all its items this.options = util.extend({}, this.defaultOptions); this.dom = {}; this.props = {}; @@ -23309,6 +24598,7 @@ return /******/ (function(modules) { // webpackBootstrap this.abortedGraphUpdate = false; this.updateSVGheight = false; this.updateSVGheightOnResize = false; + this.forceGraphUpdate = true; var me = this; this.itemsData = null; // DataSet @@ -23348,17 +24638,18 @@ return /******/ (function(modules) { // webpackBootstrap this.svgElements = {}; this.setOptions(options); this.groupsUsingDefaultStyles = [0]; - this.COUNTER = 0; this.body.emitter.on('rangechanged', function () { me.lastStart = me.body.range.start; me.svg.style.left = util.option.asSize(-me.props.width); - me.redraw.call(me, true); + + me.forceGraphUpdate = true; + //Is this local redraw necessary? (Core also does a change event!) + me.redraw.call(me); }); // create the HTML DOM this._create(); this.framework = { svg: this.svg, svgElements: this.svgElements, options: this.options, groups: this.groups }; - this.body.emitter.emit('change'); } LineGraph.prototype = new Component(); @@ -23400,11 +24691,11 @@ return /******/ (function(modules) { // webpackBootstrap LineGraph.prototype.setOptions = function (options) { if (options) { var fields = ['sampling', 'defaultGroup', 'stack', 'height', 'graphHeight', 'yAxisOrientation', 'style', 'barChart', 'dataAxis', 'sort', 'groups']; - if (options.graphHeight === undefined && options.height !== undefined && this.body.domProps.centerContainer.height !== undefined) { + if (options.graphHeight === undefined && options.height !== undefined) { this.updateSVGheight = true; this.updateSVGheightOnResize = true; } else if (this.body.domProps.centerContainer.height !== undefined && options.graphHeight !== undefined) { - if (parseInt((options.graphHeight + '').replace('px', '')) < this.body.domProps.centerContainer.height) { + if (parseInt((options.graphHeight + '').replace("px", '')) < this.body.domProps.centerContainer.height) { this.updateSVGheight = true; } } @@ -23450,7 +24741,9 @@ return /******/ (function(modules) { // webpackBootstrap // this is used to redraw the graph if the visibility of the groups is changed. if (this.dom.frame) { - this.redraw(true); + //not on initial run? + this.forceGraphUpdate = true; + this.body.emitter.emit("_change", { queue: true }); } }; @@ -23515,9 +24808,6 @@ return /******/ (function(modules) { // webpackBootstrap ids = this.itemsData.getIds(); this._onAdd(ids); } - this._updateUngrouped(); - //this._updateGraph(); - this.redraw(true); }; /** @@ -23537,7 +24827,9 @@ return /******/ (function(modules) { // webpackBootstrap // remove all drawn groups ids = this.groupsData.getIds(); this.groupsData = null; - this._onRemoveGroups(ids); // note: this will cause a redraw + for (var i = 0; i < ids.length; i++) { + this._removeGroup(ids[i]); + } } // replace the dataset @@ -23560,19 +24852,10 @@ return /******/ (function(modules) { // webpackBootstrap ids = this.groupsData.getIds(); this._onAddGroups(ids); } - this._onUpdate(); }; - /** - * Update the data - * @param [ids] - * @private - */ LineGraph.prototype._onUpdate = function (ids) { - this._updateUngrouped(); this._updateAllGroupData(); - //this._updateGraph(); - this.redraw(true); }; LineGraph.prototype._onAdd = function (ids) { this._onUpdate(ids); @@ -23581,13 +24864,7 @@ return /******/ (function(modules) { // webpackBootstrap this._onUpdate(ids); }; LineGraph.prototype._onUpdateGroups = function (groupIds) { - for (var i = 0; i < groupIds.length; i++) { - var group = this.groupsData.get(groupIds[i]); - this._updateGroup(group, groupIds[i]); - } - - //this._updateGraph(); - this.redraw(true); + this._updateAllGroupData(); }; LineGraph.prototype._onAddGroups = function (groupIds) { this._onUpdateGroups(groupIds); @@ -23600,22 +24877,30 @@ return /******/ (function(modules) { // webpackBootstrap */ LineGraph.prototype._onRemoveGroups = function (groupIds) { for (var i = 0; i < groupIds.length; i++) { - if (this.groups.hasOwnProperty(groupIds[i])) { - if (this.groups[groupIds[i]].options.yAxisOrientation == 'right') { - this.yAxisRight.removeGroup(groupIds[i]); - this.legendRight.removeGroup(groupIds[i]); - this.legendRight.redraw(); - } else { - this.yAxisLeft.removeGroup(groupIds[i]); - this.legendLeft.removeGroup(groupIds[i]); - this.legendLeft.redraw(); - } - delete this.groups[groupIds[i]]; - } + this._removeGroup(groupIds[i]); + } + this.forceGraphUpdate = true; + this.body.emitter.emit("_change", { queue: true }); + }; + + /** + * this cleans the group out off the legends and the dataaxis + * @param groupId + * @private + */ + LineGraph.prototype._removeGroup = function (groupId) { + if (this.groups.hasOwnProperty(groupId)) { + if (this.groups[groupId].options.yAxisOrientation == 'right') { + this.yAxisRight.removeGroup(groupId); + this.legendRight.removeGroup(groupId); + this.legendRight.redraw(); + } else { + this.yAxisLeft.removeGroup(groupId); + this.legendLeft.removeGroup(groupId); + this.legendLeft.redraw(); + } + delete this.groups[groupId]; } - this._updateUngrouped(); - //this._updateGraph(); - this.redraw(true); }; /** @@ -23640,9 +24925,15 @@ return /******/ (function(modules) { // webpackBootstrap if (this.groups[groupId].options.yAxisOrientation == 'right') { this.yAxisRight.updateGroup(groupId, this.groups[groupId]); this.legendRight.updateGroup(groupId, this.groups[groupId]); + //If yAxisOrientation changed, clean out the group from the other axis. + this.yAxisLeft.removeGroup(groupId); + this.legendLeft.removeGroup(groupId); } else { this.yAxisLeft.updateGroup(groupId, this.groups[groupId]); this.legendLeft.updateGroup(groupId, this.groups[groupId]); + //If yAxisOrientation changed, clean out the group from the other axis. + this.yAxisRight.removeGroup(groupId); + this.legendRight.removeGroup(groupId); } } this.legendLeft.redraw(); @@ -23657,92 +24948,82 @@ return /******/ (function(modules) { // webpackBootstrap LineGraph.prototype._updateAllGroupData = function () { if (this.itemsData != null) { var groupsContent = {}; - var groupId; - for (groupId in this.groups) { - if (this.groups.hasOwnProperty(groupId)) { - groupsContent[groupId] = []; + var items = this.itemsData.get(); + //pre-Determine array sizes, for more efficient memory claim + var groupCounts = {}; + for (var i = 0; i < items.length; i++) { + var item = items[i]; + var groupId = item.group; + if (groupId === null || groupId === undefined) { + groupId = UNGROUPED; } + groupCounts.hasOwnProperty(groupId) ? groupCounts[groupId]++ : groupCounts[groupId] = 1; } - for (var itemId in this.itemsData._data) { - if (this.itemsData._data.hasOwnProperty(itemId)) { - var item = this.itemsData._data[itemId]; - if (groupsContent[item.group] === undefined) { - throw new Error('Cannot find referenced group ' + item.group + '. Possible reason: items added before groups? Groups need to be added before items, as items refer to groups.'); - } - item.x = util.convert(item.x, 'Date'); - groupsContent[item.group].push(item); + //Now insert data into the arrays. + for (var i = 0; i < items.length; i++) { + var item = items[i]; + var groupId = item.group; + if (groupId === null || groupId === undefined) { + groupId = UNGROUPED; } - } - for (groupId in this.groups) { - if (this.groups.hasOwnProperty(groupId)) { - this.groups[groupId].setItems(groupsContent[groupId]); + if (!groupsContent.hasOwnProperty(groupId)) { + groupsContent[groupId] = new Array(groupCounts[groupId]); } - } - } - }; + //Copy data (because of unmodifiable DataView input. + var extended = util.bridgeObject(item); + extended.x = util.convert(item.x, 'Date'); + extended.orginalY = item.y; //real Y + extended.y = Number(item.y); - /** - * Create or delete the group holding all ungrouped items. This group is used when - * there are no groups specified. This anonymous group is called 'graph'. - * @protected - */ - LineGraph.prototype._updateUngrouped = function () { - if (this.itemsData && this.itemsData != null) { - var ungroupedCounter = 0; - for (var itemId in this.itemsData._data) { - if (this.itemsData._data.hasOwnProperty(itemId)) { - var item = this.itemsData._data[itemId]; - if (item != undefined) { - if (item.hasOwnProperty('group')) { - if (item.group === undefined) { - item.group = UNGROUPED; - } - } else { - item.group = UNGROUPED; + var index = groupsContent[groupId].length - groupCounts[groupId]--; + groupsContent[groupId][index] = extended; + } + + //Make sure all groups are present, to allow removal of old groups + for (var groupId in this.groups) { + if (this.groups.hasOwnProperty(groupId)) { + if (!groupsContent.hasOwnProperty(groupId)) { + groupsContent[groupId] = new Array(0); + } + } + } + + //Update legendas, style and axis + for (var groupId in groupsContent) { + if (groupsContent.hasOwnProperty(groupId)) { + if (groupsContent[groupId].length == 0) { + if (this.groups.hasOwnProperty(groupId)) { + this._removeGroup(groupId); } - ungroupedCounter = item.group == UNGROUPED ? ungroupedCounter + 1 : ungroupedCounter; + } else { + var group = undefined; + if (this.groupsData != undefined) { + group = this.groupsData.get(groupId); + } + if (group == undefined) { + group = { id: groupId, content: this.options.defaultGroup + groupId }; + } + this._updateGroup(group, groupId); + this.groups[groupId].setItems(groupsContent[groupId]); } } } - - if (ungroupedCounter == 0) { - delete this.groups[UNGROUPED]; - this.legendLeft.removeGroup(UNGROUPED); - this.legendRight.removeGroup(UNGROUPED); - this.yAxisLeft.removeGroup(UNGROUPED); - this.yAxisRight.removeGroup(UNGROUPED); - } else { - var group = { id: UNGROUPED, content: this.options.defaultGroup }; - this._updateGroup(group, UNGROUPED); - } - } else { - delete this.groups[UNGROUPED]; - this.legendLeft.removeGroup(UNGROUPED); - this.legendRight.removeGroup(UNGROUPED); - this.yAxisLeft.removeGroup(UNGROUPED); - this.yAxisRight.removeGroup(UNGROUPED); + this.forceGraphUpdate = true; + this.body.emitter.emit("_change", { queue: true }); } - - this.legendLeft.redraw(); - this.legendRight.redraw(); }; /** * Redraw the component, mandatory function * @return {boolean} Returns true if the component is resized */ - LineGraph.prototype.redraw = function (forceGraphUpdate) { + LineGraph.prototype.redraw = function () { var resized = false; // calculate actual size and position this.props.width = this.dom.frame.offsetWidth; this.props.height = this.body.domProps.centerContainer.height - this.body.domProps.border.top - this.body.domProps.border.bottom; - // update the graph if there is no lastWidth or with, used for the initial draw - if (this.lastWidth === undefined && this.props.width) { - forceGraphUpdate = true; - } - // check if this component is resized resized = this._isResized() || resized; @@ -23758,7 +25039,7 @@ return /******/ (function(modules) { // webpackBootstrap this.svg.style.left = util.option.asSize(-this.props.width); // if the height of the graph is set as proportional, change the height of the svg - if ((this.options.height + '').indexOf('%') != -1 || this.updateSVGheightOnResize == true) { + if ((this.options.height + '').indexOf("%") != -1 || this.updateSVGheightOnResize == true) { this.updateSVGheight = true; } } @@ -23775,8 +25056,9 @@ return /******/ (function(modules) { // webpackBootstrap } // zoomed is here to ensure that animations are shown correctly. - if (resized == true || zoomed == true || this.abortedGraphUpdate == true || forceGraphUpdate == true) { + if (resized == true || zoomed == true || this.abortedGraphUpdate == true || this.forceGraphUpdate == true) { resized = this._updateGraph() || resized; + this.forceGraphUpdate = false; } else { // move the whole svg while dragging if (this.lastStart != 0) { @@ -23789,12 +25071,36 @@ return /******/ (function(modules) { // webpackBootstrap } } } - this.legendLeft.redraw(); this.legendRight.redraw(); return resized; }; + LineGraph.prototype._getSortedGroupIds = function () { + // getting group Ids + var grouplist = []; + for (var groupId in this.groups) { + if (this.groups.hasOwnProperty(groupId)) { + var group = this.groups[groupId]; + if (group.visible == true && (this.options.groups.visibility[groupId] === undefined || this.options.groups.visibility[groupId] == true)) { + grouplist.push({ id: groupId, zIndex: group.options.zIndex }); + } + } + } + util.insertSort(grouplist, function (a, b) { + var az = a.zIndex; + var bz = b.zIndex; + if (az === undefined) az = 0; + if (bz === undefined) bz = 0; + return az == bz ? 0 : az < bz ? -1 : 1; + }); + var groupIds = new Array(grouplist.length); + for (var i = 0; i < grouplist.length; i++) { + groupIds[i] = grouplist[i].id; + } + return groupIds; + }; + /** * Update and redraw the graph. * @@ -23804,26 +25110,17 @@ return /******/ (function(modules) { // webpackBootstrap DOMutil.prepareElements(this.svgElements); if (this.props.width != 0 && this.itemsData != null) { var group, i; - var preprocessedGroupData = {}; - var processedGroupData = {}; var groupRanges = {}; var changeCalled = false; + // this is the range of the SVG canvas + var minDate = this.body.util.toGlobalTime(-this.body.domProps.root.width); + var maxDate = this.body.util.toGlobalTime(2 * this.body.domProps.root.width); // getting group Ids - var groupIds = []; - for (var groupId in this.groups) { - if (this.groups.hasOwnProperty(groupId)) { - group = this.groups[groupId]; - if (group.visible == true && (this.options.groups.visibility[groupId] === undefined || this.options.groups.visibility[groupId] == true)) { - groupIds.push(groupId); - } - } - } + var groupIds = this._getSortedGroupIds(); if (groupIds.length > 0) { - // this is the range of the SVG canvas - var minDate = this.body.util.toGlobalTime(-this.body.domProps.root.width); - var maxDate = this.body.util.toGlobalTime(2 * this.body.domProps.root.width); var groupsData = {}; + // fill groups data, this only loads the data we require based on the timewindow this._getRelevantData(groupIds, groupsData, minDate, maxDate); @@ -23832,44 +25129,102 @@ return /******/ (function(modules) { // webpackBootstrap // we transform the X coordinates to detect collisions for (i = 0; i < groupIds.length; i++) { - preprocessedGroupData[groupIds[i]] = this._convertXcoordinates(groupsData[groupIds[i]]); + this._convertXcoordinates(groupsData[groupIds[i]]); } // now all needed data has been collected we start the processing. - this._getYRanges(groupIds, preprocessedGroupData, groupRanges); + this._getYRanges(groupIds, groupsData, groupRanges); // update the Y axis first, we use this data to draw at the correct Y points - // changeCalled is required to clean the SVG on a change emit. changeCalled = this._updateYAxis(groupIds, groupRanges); - var MAX_CYCLES = 5; - if (changeCalled == true && this.COUNTER < MAX_CYCLES) { + + // at changeCalled, abort this update cycle as the graph needs another update with new Width input from the Redraw container. + // Cleanup SVG elements on abort. + if (changeCalled == true) { DOMutil.cleanupElements(this.svgElements); this.abortedGraphUpdate = true; - this.COUNTER++; - this.body.emitter.emit('change'); return true; - } else { - if (this.COUNTER > MAX_CYCLES) { - console.log('WARNING: there may be an infinite loop in the _updateGraph emitter cycle.'); - } - this.COUNTER = 0; - this.abortedGraphUpdate = false; + } + this.abortedGraphUpdate = false; - // With the yAxis scaled correctly, use this to get the Y values of the points. - for (i = 0; i < groupIds.length; i++) { - group = this.groups[groupIds[i]]; - processedGroupData[groupIds[i]] = this._convertYcoordinates(groupsData[groupIds[i]], group); - } - - // draw the groups - for (i = 0; i < groupIds.length; i++) { - group = this.groups[groupIds[i]]; - if (group.options.style != 'bar') { - // bar needs to be drawn enmasse - group.draw(processedGroupData[groupIds[i]], group, this.framework); + // With the yAxis scaled correctly, use this to get the Y values of the points. + var below = undefined; + for (i = 0; i < groupIds.length; i++) { + group = this.groups[groupIds[i]]; + if (this.options.stack === true && this.options.style === 'line') { + if (group.options.excludeFromStacking == undefined || !group.options.excludeFromStacking) { + if (below != undefined) { + this._stack(groupsData[group.id], groupsData[below.id]); + if (group.options.shaded.enabled == true && group.options.shaded.orientation !== "group") { + if (group.options.shaded.orientation == "top" && below.options.shaded.orientation !== "group") { + below.options.shaded.orientation = "group"; + below.options.shaded.groupId = group.id; + } else { + group.options.shaded.orientation = "group"; + group.options.shaded.groupId = below.id; + } + } + } + below = group; + } + } + this._convertYcoordinates(groupsData[groupIds[i]], group); + } + + //Precalculate paths and draw shading if appropriate. This will make sure the shading is always behind any lines. + var paths = {}; + for (i = 0; i < groupIds.length; i++) { + group = this.groups[groupIds[i]]; + if (group.options.style === 'line' && group.options.shaded.enabled == true) { + var dataset = groupsData[groupIds[i]]; + if (dataset == null || dataset.length == 0) { + continue; + } + if (!paths.hasOwnProperty(groupIds[i])) { + paths[groupIds[i]] = Lines.calcPath(dataset, group); + } + if (group.options.shaded.orientation === "group") { + var subGroupId = group.options.shaded.groupId; + if (groupIds.indexOf(subGroupId) === -1) { + console.log(group.id + ": Unknown shading group target given:" + subGroupId); + continue; + } + if (!paths.hasOwnProperty(subGroupId)) { + paths[subGroupId] = Lines.calcPath(groupsData[subGroupId], this.groups[subGroupId]); + } + Lines.drawShading(paths[groupIds[i]], group, paths[subGroupId], this.framework); + } else { + Lines.drawShading(paths[groupIds[i]], group, undefined, this.framework); + } + } + } + + // draw the groups, calculating paths if still necessary. + Bars.draw(groupIds, groupsData, this.framework); + for (i = 0; i < groupIds.length; i++) { + group = this.groups[groupIds[i]]; + if (groupsData[groupIds[i]].length > 0) { + switch (group.options.style) { + case "line": + if (!paths.hasOwnProperty(groupIds[i])) { + paths[groupIds[i]] = Lines.calcPath(groupsData[groupIds[i]], group); + } + Lines.draw(paths[groupIds[i]], group, this.framework); + //explicit no break; + case "point": + //explicit no break; + case "points": + if (group.options.style == "point" || group.options.style == "points" || group.options.drawPoints.enabled == true) { + Points.draw(groupsData[groupIds[i]], group, this.framework); + } + break; + case "bar": + // bar needs to be drawn enmasse + //explicit no break + default: + //do nothing... } } - BarFunctions.draw(groupIds, processedGroupData, this.framework); } } } @@ -23879,6 +25234,49 @@ return /******/ (function(modules) { // webpackBootstrap return false; }; + LineGraph.prototype._stack = function (data, subData) { + var index, dx, dy, subPrevPoint, subNextPoint; + index = 0; + // for each data point we look for a matching on in the set below + for (var j = 0; j < data.length; j++) { + subPrevPoint = undefined; + subNextPoint = undefined; + // we look for time matches or a before-after point + for (var k = index; k < subData.length; k++) { + // if times match exactly + if (subData[k].x === data[j].x) { + subPrevPoint = subData[k]; + subNextPoint = subData[k]; + index = k; + break; + } else if (subData[k].x > data[j].x) { + // overshoot + subNextPoint = subData[k]; + if (k == 0) { + subPrevPoint = subNextPoint; + } else { + subPrevPoint = subData[k - 1]; + } + index = k; + break; + } + } + // in case the last data point has been used, we assume it stays like this. + if (subNextPoint === undefined) { + subPrevPoint = subData[subData.length - 1]; + subNextPoint = subData[subData.length - 1]; + } + // linear interpolation + dx = subNextPoint.x - subPrevPoint.x; + dy = subNextPoint.y - subPrevPoint.y; + if (dx == 0) { + data[j].y = data[j].orginalY + subNextPoint.y; + } else { + data[j].y = data[j].orginalY + dy / dx * (data[j].x - subPrevPoint.x) + subPrevPoint.y; // ax + b where b is data[j].y + } + } + }; + /** * first select and preprocess the data from the datasets. * the groups have their preselection of data, we now loop over this data to see @@ -23897,31 +25295,26 @@ return /******/ (function(modules) { // webpackBootstrap if (groupIds.length > 0) { for (i = 0; i < groupIds.length; i++) { group = this.groups[groupIds[i]]; - groupsData[groupIds[i]] = []; - var dataContainer = groupsData[groupIds[i]]; + var itemsData = group.getItems(); // optimization for sorted data if (group.options.sort == true) { - var guess = Math.max(0, util.binarySearchValue(group.itemsData, minDate, 'x', 'before')); - for (j = guess; j < group.itemsData.length; j++) { - item = group.itemsData[j]; - if (item !== undefined) { - if (item.x > maxDate) { - dataContainer.push(item); - break; - } else { - dataContainer.push(item); - } - } + var dateComparator = function dateComparator(a, b) { + return a.getTime() == b.getTime() ? 0 : a < b ? -1 : 1; + }; + var first = Math.max(0, util.binarySearchValue(itemsData, minDate, 'x', 'before', dateComparator)); + var last = Math.min(itemsData.length, util.binarySearchValue(itemsData, maxDate, 'x', 'after', dateComparator) + 1); + if (last <= 0) { + last = itemsData.length; } + var dataContainer = new Array(last - first); + for (j = first; j < last; j++) { + item = group.itemsData[j]; + dataContainer[j - first] = item; + } + groupsData[groupIds[i]] = dataContainer; } else { - for (j = 0; j < group.itemsData.length; j++) { - item = group.itemsData[j]; - if (item !== undefined) { - if (item.x > minDate && item.x < maxDate) { - dataContainer.push(item); - } - } - } + // If unsorted data, all data is relevant, just returning entire structure + groupsData[groupIds[i]] = group.itemsData; } } } @@ -23950,11 +25343,12 @@ return /******/ (function(modules) { // webpackBootstrap var pointsPerPixel = amountOfPoints / xDistance; increment = Math.min(Math.ceil(0.2 * amountOfPoints), Math.max(1, Math.round(pointsPerPixel))); - var sampledData = []; + var sampledData = new Array(amountOfPoints); for (var j = 0; j < amountOfPoints; j += increment) { - sampledData.push(dataContainer[j]); + var idx = Math.round(j / increment); + sampledData[idx] = dataContainer[j]; } - groupsData[groupIds[i]] = sampledData; + groupsData[groupIds[i]] = sampledData.splice(0, Math.round(amountOfPoints / increment)); } } } @@ -23983,9 +25377,9 @@ return /******/ (function(modules) { // webpackBootstrap // 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.getData(groupData)); + combinedDataLeft = combinedDataLeft.concat(group.getItems()); } else { - combinedDataRight = combinedDataRight.concat(group.getData(groupData)); + combinedDataRight = combinedDataRight.concat(group.getItems()); } } else { groupRanges[groupIds[i]] = group.getYRange(groupData, groupIds[i]); @@ -23994,11 +25388,8 @@ return /******/ (function(modules) { // webpackBootstrap } // if bar graphs are stacked, their range need to be handled differently and accumulated over all groups. - BarFunctions.getStackedYRange(combinedDataLeft, groupRanges, groupIds, '__barStackLeft', 'left'); - BarFunctions.getStackedYRange(combinedDataRight, groupRanges, groupIds, '__barStackRight', 'right'); - // if line graphs are stacked, their range need to be handled differently and accumulated over all groups. - //LineFunctions.getStackedYRange(combinedDataLeft , groupRanges, groupIds, '__lineStackLeft' , 'left' ); - //LineFunctions.getStackedYRange(combinedDataRight, groupRanges, groupIds, '__lineStackRight', 'right'); + Bars.getStackedYRange(combinedDataLeft, groupRanges, groupIds, '__barStackLeft', 'left'); + Bars.getStackedYRange(combinedDataRight, groupRanges, groupIds, '__barStackRight', 'right'); } }; @@ -24072,6 +25463,8 @@ return /******/ (function(modules) { // webpackBootstrap this.yAxisRight.drawIcons = false; } this.yAxisRight.master = !yAxisLeftUsed; + this.yAxisRight.masterAxis = this.yAxisLeft; + if (this.yAxisRight.master == false) { if (yAxisRightUsed == true) { this.yAxisLeft.lineOffset = this.yAxisRight.width; @@ -24080,9 +25473,6 @@ return /******/ (function(modules) { // webpackBootstrap } resized = this.yAxisLeft.redraw() || resized; - this.yAxisRight.stepPixels = this.yAxisLeft.stepPixels; - this.yAxisRight.zeroCrossing = this.yAxisLeft.zeroCrossing; - this.yAxisRight.amountOfSteps = this.yAxisLeft.amountOfSteps; resized = this.yAxisRight.redraw() || resized; } else { resized = this.yAxisRight.redraw() || resized; @@ -24133,17 +25523,11 @@ return /******/ (function(modules) { // webpackBootstrap * @private */ LineGraph.prototype._convertXcoordinates = function (datapoints) { - var extractedData = []; - var xValue, yValue; var toScreen = this.body.util.toScreen; - for (var i = 0; i < datapoints.length; i++) { - xValue = toScreen(datapoints[i].x) + this.props.width; - yValue = datapoints[i].y; - extractedData.push({ x: xValue, y: yValue }); + datapoints[i].screen_x = toScreen(datapoints[i].x) + this.props.width; + datapoints[i].screen_y = datapoints[i].y; //starting point for range calculations } - - return extractedData; }; /** @@ -24157,40 +25541,29 @@ return /******/ (function(modules) { // webpackBootstrap * @private */ LineGraph.prototype._convertYcoordinates = function (datapoints, group) { - var extractedData = []; - var xValue, yValue; - var toScreen = this.body.util.toScreen; var axis = this.yAxisLeft; var svgHeight = Number(this.svg.style.height.replace('px', '')); if (group.options.yAxisOrientation == 'right') { axis = this.yAxisRight; } - for (var i = 0; i < datapoints.length; i++) { - var labelValue = datapoints[i].label ? datapoints[i].label : null; - xValue = toScreen(datapoints[i].x) + this.props.width; - yValue = Math.round(axis.convertValue(datapoints[i].y)); - extractedData.push({ x: xValue, y: yValue, label: labelValue }); + datapoints[i].screen_y = Math.round(axis.convertValue(datapoints[i].y)); } - group.setZeroPosition(Math.min(svgHeight, axis.convertValue(0))); - - return extractedData; }; module.exports = LineGraph; /***/ }, -/* 51 */ +/* 50 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; - var util = __webpack_require__(7); - var DOMutil = __webpack_require__(13); - var Component = __webpack_require__(27); - var DataStep = __webpack_require__(52); - + var util = __webpack_require__(1); + var DOMutil = __webpack_require__(7); + var Component = __webpack_require__(25); + var DataScale = __webpack_require__(51); /** * A horizontal time axis * @param {Object} [options] See DataAxis.setOptions for the available @@ -24207,7 +25580,7 @@ return /******/ (function(modules) { // webpackBootstrap orientation: 'left', // supported: 'left', 'right' showMinorLabels: true, showMajorLabels: true, - icons: true, + icons: false, majorLinesOffset: 7, minorLinesOffset: 4, labelOffsetX: 10, @@ -24219,14 +25592,14 @@ return /******/ (function(modules) { // webpackBootstrap left: { range: { min: undefined, max: undefined }, format: function format(value) { - return value; + return '' + Number.parseFloat(value.toPrecision(3)); }, title: { text: undefined, style: undefined } }, right: { range: { min: undefined, max: undefined }, format: function format(value) { - return value; + return '' + Number.parseFloat(value.toPrecision(3)); }, title: { text: undefined, style: undefined } } @@ -24242,16 +25615,16 @@ return /******/ (function(modules) { // webpackBootstrap }; this.dom = {}; - + this.scale = undefined; this.range = { start: 0, end: 0 }; this.options = util.extend({}, this.defaultOptions); this.conversionFactor = 1; this.setOptions(options); - this.width = Number(('' + this.options.width).replace('px', '')); + this.width = Number(('' + this.options.width).replace("px", "")); this.minWidth = this.width; - this.height = this.linegraphSVG.offsetHeight; + this.height = this.linegraphSVG.getBoundingClientRect().height; this.hidden = false; this.stepPixels = 25; @@ -24260,6 +25633,7 @@ return /******/ (function(modules) { // webpackBootstrap this.lineOffset = 0; this.master = true; + this.masterAxis = null; this.svgElements = {}; this.iconsRemoved = false; @@ -24268,9 +25642,10 @@ return /******/ (function(modules) { // webpackBootstrap // create the HTML DOM this._create(); + this.framework = { svg: this.svg, svgElements: this.svgElements, options: this.options, groups: this.groups }; var me = this; - this.body.emitter.on('verticalDrag', function () { + this.body.emitter.on("verticalDrag", function () { me.dom.lineContainer.style.top = me.body.domProps.scrollTop + 'px'; }); } @@ -24285,6 +25660,9 @@ return /******/ (function(modules) { // webpackBootstrap }; DataAxis.prototype.updateGroup = function (label, graphOptions) { + if (!this.groups.hasOwnProperty(label)) { + this.amountOfGroups += 1; + } this.groups[label] = graphOptions; }; @@ -24302,10 +25680,9 @@ return /******/ (function(modules) { // webpackBootstrap redraw = true; } var fields = ['orientation', 'showMinorLabels', 'showMajorLabels', 'icons', 'majorLinesOffset', 'minorLinesOffset', 'labelOffsetX', 'labelOffsetY', 'iconWidth', 'width', 'visible', 'left', 'right', 'alignZeros']; - util.selectiveExtend(fields, this.options, options); - - this.minWidth = Number(('' + this.options.width).replace('px', '')); + util.selectiveDeepExtend(fields, this.options, options); + this.minWidth = Number(('' + this.options.width).replace("px", "")); if (redraw === true && this.dom.frame) { this.hide(); this.show(); @@ -24327,12 +25704,12 @@ return /******/ (function(modules) { // webpackBootstrap this.dom.lineContainer.style.position = 'relative'; // create svg element for graph drawing. - this.svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg'); - this.svg.style.position = 'absolute'; + this.svg = document.createElementNS('http://www.w3.org/2000/svg', "svg"); + this.svg.style.position = "absolute"; this.svg.style.top = '0px'; this.svg.style.height = '100%'; this.svg.style.width = '100%'; - this.svg.style.display = 'block'; + this.svg.style.display = "block"; this.dom.frame.appendChild(this.svg); }; @@ -24359,7 +25736,7 @@ return /******/ (function(modules) { // webpackBootstrap for (var i = 0; i < groupArray.length; i++) { var groupId = groupArray[i]; if (this.groups[groupId].visible === true && (this.linegraphOptions.visibility[groupId] === undefined || this.linegraphOptions.visibility[groupId] === true)) { - this.groups[groupId].drawIcon(x, y, this.svgElements, this.svg, iconWidth, iconHeight); + this.groups[groupId].getLegend(iconWidth, iconHeight, this.framework, x, y); y += iconHeight + iconOffset; } } @@ -24415,11 +25792,6 @@ return /******/ (function(modules) { // webpackBootstrap * @param end */ DataAxis.prototype.setRange = function (start, end) { - if (this.master === false && this.options.alignZeros === true && this.zeroCrossing != -1) { - if (start > 0) { - start = 0; - } - } this.range.start = start; this.range.end = end; }; @@ -24446,11 +25818,11 @@ return /******/ (function(modules) { // webpackBootstrap this.hide(); } else { this.show(); - this.height = Number(this.linegraphSVG.style.height.replace('px', '')); + this.height = Number(this.linegraphSVG.style.height.replace("px", "")); // svg offsetheight did not work in firefox and explorer... this.dom.lineContainer.style.height = this.height + 'px'; - this.width = this.options.visible === true ? Number(('' + this.options.width).replace('px', '')) : 0; + this.width = this.options.visible === true ? Number(('' + this.options.width).replace("px", "")) : 0; var props = this.props; var frame = this.dom.frame; @@ -24480,7 +25852,7 @@ return /******/ (function(modules) { // webpackBootstrap frame.style.left = '0'; frame.style.bottom = ''; frame.style.width = this.width + 'px'; - frame.style.height = this.height + 'px'; + frame.style.height = this.height + "px"; this.props.width = this.body.domProps.left.width; this.props.height = this.body.domProps.left.height; } else { @@ -24489,7 +25861,7 @@ return /******/ (function(modules) { // webpackBootstrap frame.style.bottom = '0'; frame.style.left = '0'; frame.style.width = this.width + 'px'; - frame.style.height = this.height + 'px'; + frame.style.height = this.height + "px"; this.props.width = this.body.domProps.right.width; this.props.height = this.body.domProps.right.height; } @@ -24513,95 +25885,55 @@ return /******/ (function(modules) { // webpackBootstrap * @private */ DataAxis.prototype._redrawLabels = function () { + var _this = this; + var resized = false; DOMutil.prepareElements(this.DOMelements.lines); DOMutil.prepareElements(this.DOMelements.labels); var orientation = this.options['orientation']; + var customRange = this.options[orientation].range != undefined ? this.options[orientation].range : {}; - // get the range for the slaved axis - var step; - if (this.master === false) { - var stepSize, rangeStart, rangeEnd, minimumStep; - if (this.zeroCrossing !== -1 && this.options.alignZeros === true) { - if (this.range.end > 0) { - stepSize = this.range.end / this.zeroCrossing; // size of one step - rangeStart = this.range.end - this.amountOfSteps * stepSize; - rangeEnd = this.range.end; - } else { - // all of the range (including start) has to be done before the zero crossing. - stepSize = -1 * this.range.start / (this.amountOfSteps - this.zeroCrossing); // absolute size of a step - rangeStart = this.range.start; - rangeEnd = this.range.start + stepSize * this.amountOfSteps; - } - } else { - rangeStart = this.range.start; - rangeEnd = this.range.end; - } - minimumStep = this.stepPixels; - } else { - // calculate range and step (step such that we have space for 7 characters per label) - minimumStep = this.props.majorCharHeight; - rangeStart = this.range.start; - rangeEnd = this.range.end; + //Override range with manual options: + var autoScaleEnd = true; + if (customRange.max != undefined) { + this.range.end = customRange.max; + autoScaleEnd = false; + } + var autoScaleStart = true; + if (customRange.min != undefined) { + this.range.start = customRange.min; + autoScaleStart = false; } - this.step = step = new DataStep(rangeStart, rangeEnd, minimumStep, this.dom.frame.offsetHeight, this.options[this.options.orientation].range, this.options[this.options.orientation].format, this.master === false && this.options.alignZeros // does the step have to align zeros? only if not master and the options is on - ); + this.scale = new DataScale(this.range.start, this.range.end, autoScaleStart, autoScaleEnd, this.dom.frame.offsetHeight, this.props.majorCharHeight, this.options.alignZeros, this.options[orientation].format); - // the slave axis needs to use the same horizontal lines as the master axis. - if (this.master === true) { - this.stepPixels = this.dom.frame.offsetHeight / step.marginRange * step.step; - this.amountOfSteps = Math.ceil(this.dom.frame.offsetHeight / this.stepPixels); - } else { - // align with zero - if (this.options.alignZeros === true && this.zeroCrossing !== -1) { - // distance is the amount of steps away from the zero crossing we are. - var distance = (step.current - this.zeroCrossing * step.step) / step.step; - this.step.shift(distance); - } + if (this.master === false && this.masterAxis != undefined) { + this.scale.followScale(this.masterAxis.scale); } - // value at the bottom of the SVG - this.valueAtBottom = step.marginEnd; - + //Is updated in side-effect of _redrawLabel(): this.maxLabelSize = 0; - var y = 0; // init value - var stepIndex = 0; // init value - var isMajor = false; // init value - while (stepIndex < this.amountOfSteps) { - y = Math.round(stepIndex * this.stepPixels); - isMajor = step.isMajor(); - if (stepIndex > 0 && stepIndex !== this.amountOfSteps) { - if (this.options['showMinorLabels'] && isMajor === false || this.master === false && this.options['showMinorLabels'] === true) { - this._redrawLabel(y - 2, step.getCurrent(), orientation, 'vis-y-axis vis-minor', this.props.minorCharHeight); + var lines = this.scale.getLines(); + lines.forEach(function (line) { + var y = line.y; + var isMajor = line.major; + if (_this.options['showMinorLabels'] && isMajor === false) { + _this._redrawLabel(y - 2, line.val, orientation, 'vis-y-axis vis-minor', _this.props.minorCharHeight); + } + if (isMajor) { + if (y >= 0) { + _this._redrawLabel(y - 2, line.val, orientation, 'vis-y-axis vis-major', _this.props.majorCharHeight); } - - if (isMajor && this.options['showMajorLabels'] && this.master === true || this.options['showMinorLabels'] === false && this.master === false && isMajor === true) { - if (y >= 0) { - this._redrawLabel(y - 2, step.getCurrent(), orientation, 'vis-y-axis vis-major', this.props.majorCharHeight); - } - this._redrawLine(y, orientation, 'vis-grid vis-horizontal vis-major', this.options.majorLinesOffset, this.props.majorLineWidth); + } + if (_this.master === true) { + if (isMajor) { + _this._redrawLine(y, orientation, 'vis-grid vis-horizontal vis-major', _this.options.majorLinesOffset, _this.props.majorLineWidth); } else { - this._redrawLine(y, orientation, 'vis-grid vis-horizontal vis-minor', this.options.minorLinesOffset, this.props.minorLineWidth); + _this._redrawLine(y, orientation, 'vis-grid vis-horizontal vis-minor', _this.options.minorLinesOffset, _this.props.minorLineWidth); } } - - // get zero crossing - if (this.master === true && step.current === 0) { - this.zeroCrossing = stepIndex; - } - - step.next(); - stepIndex += 1; - } - - // get zero crossing if it's the last step - if (this.master === true && step.current === 0) { - this.zeroCrossing = stepIndex; - } - - this.conversionFactor = this.stepPixels / step.step; + }); // Note that title is rotated, so we're using the height, not width! var titleWidth = 0; @@ -24613,7 +25945,7 @@ return /******/ (function(modules) { // webpackBootstrap // this will resize the yAxis to accommodate the labels. if (this.maxLabelSize > this.width - offset && this.options.visible === true) { this.width = this.maxLabelSize + offset; - this.options.width = this.width + 'px'; + this.options.width = this.width + "px"; DOMutil.cleanupElements(this.DOMelements.lines); DOMutil.cleanupElements(this.DOMelements.labels); this.redraw(); @@ -24621,29 +25953,27 @@ return /******/ (function(modules) { // webpackBootstrap } // this will resize the yAxis if it is too big for the labels. else if (this.maxLabelSize < this.width - offset && this.options.visible === true && this.width > this.minWidth) { - this.width = Math.max(this.minWidth, this.maxLabelSize + offset); - this.options.width = this.width + 'px'; - DOMutil.cleanupElements(this.DOMelements.lines); - DOMutil.cleanupElements(this.DOMelements.labels); - this.redraw(); - resized = true; - } else { - DOMutil.cleanupElements(this.DOMelements.lines); - DOMutil.cleanupElements(this.DOMelements.labels); - resized = false; - } + this.width = Math.max(this.minWidth, this.maxLabelSize + offset); + this.options.width = this.width + "px"; + DOMutil.cleanupElements(this.DOMelements.lines); + DOMutil.cleanupElements(this.DOMelements.labels); + this.redraw(); + resized = true; + } else { + DOMutil.cleanupElements(this.DOMelements.lines); + DOMutil.cleanupElements(this.DOMelements.labels); + resized = false; + } return resized; }; DataAxis.prototype.convertValue = function (value) { - var invertedValue = this.valueAtBottom - value; - var convertedValue = invertedValue * this.conversionFactor; - return convertedValue; + return this.scale.convertValue(value); }; DataAxis.prototype.screenToValue = function (x) { - return this.valueAtBottom - x / this.conversionFactor; + return this.scale.screenToValue(x); }; /** @@ -24662,10 +25992,10 @@ return /******/ (function(modules) { // webpackBootstrap label.innerHTML = text; if (orientation === 'left') { label.style.left = '-' + this.options.labelOffsetX + 'px'; - label.style.textAlign = 'right'; + label.style.textAlign = "right"; } else { label.style.right = '-' + this.options.labelOffsetX + 'px'; - label.style.textAlign = 'left'; + label.style.textAlign = "left"; } label.style.top = y - 0.5 * characterHeight + this.options.labelOffsetY + 'px'; @@ -24785,97 +26115,78 @@ return /******/ (function(modules) { // webpackBootstrap module.exports = DataAxis; /***/ }, -/* 52 */ +/* 51 */ /***/ function(module, exports) { /** - * @constructor DataStep - * The class DataStep is an iterator for data for the lineGraph. You provide a start data point and an - * end data point. The class itself determines the best scale (step size) based on the - * provided start Date, end Date, and minimumStep. - * - * If minimumStep is provided, the step size is chosen as close as possible - * to the minimumStep but larger than minimumStep. If minimumStep is not - * provided, the scale is set to 1 DAY. - * The minimumStep should correspond with the onscreen size of about 6 characters - * - * Alternatively, you can set a scale by hand. - * After creation, you can initialize the class by executing first(). Then you - * can iterate from the start date to the end date via next(). You can check if - * the end date is reached with the function hasNext(). After each step, you can - * retrieve the current date via getCurrent(). - * The DataStep has scales ranging from milliseconds, seconds, minutes, hours, - * days, to years. - * - * Version: 1.2 - * - * @param {Date} [start] The start date, for example new Date(2010, 9, 21) - * or new Date(2010, 9, 21, 23, 45, 00) - * @param {Date} [end] The end date - * @param {Number} [minimumStep] Optional. Minimum step size in milliseconds + * Created by ludo on 25-1-16. */ + 'use strict'; - function DataStep(start, end, minimumStep, containerHeight, customRange, formattingFunction, alignZeros) { - // variables - this.current = 0; - - this.autoScale = true; - this.stepIndex = 0; - this.step = 1; - this.scale = 1; - this.formattingFunction = formattingFunction; - - this.marginStart; - this.marginEnd; - this.deadSpace = 0; + function DataScale(start, end, autoScaleStart, autoScaleEnd, containerHeight, majorCharHeight) { + var zeroAlign = arguments.length <= 6 || arguments[6] === undefined ? false : arguments[6]; + var formattingFunction = arguments.length <= 7 || arguments[7] === undefined ? false : arguments[7]; this.majorSteps = [1, 2, 5, 10]; this.minorSteps = [0.25, 0.5, 1, 2]; + this.customLines = null; - this.alignZeros = alignZeros; + this.containerHeight = containerHeight; + this.majorCharHeight = majorCharHeight; + this._start = start; + this._end = end; - this.setRange(start, end, minimumStep, containerHeight, customRange); + this.scale = 1; + this.minorStepIdx = -1; + this.magnitudefactor = 1; + this.determineScale(); + + this.zeroAlign = zeroAlign; + this.autoScaleStart = autoScaleStart; + this.autoScaleEnd = autoScaleEnd; + + this.formattingFunction = formattingFunction; + + if (autoScaleStart || autoScaleEnd) { + var me = this; + var roundToMinor = function roundToMinor(value) { + var rounded = value - value % (me.magnitudefactor * me.minorSteps[me.minorStepIdx]); + if (value % (me.magnitudefactor * me.minorSteps[me.minorStepIdx]) > 0.5 * (me.magnitudefactor * me.minorSteps[me.minorStepIdx])) { + return rounded + me.magnitudefactor * me.minorSteps[me.minorStepIdx]; + } else { + return rounded; + } + }; + if (autoScaleStart) { + this._start -= this.magnitudefactor * 2 * this.minorSteps[this.minorStepIdx]; + this._start = roundToMinor(this._start); + } + + if (autoScaleEnd) { + this._end += this.magnitudefactor * this.minorSteps[this.minorStepIdx]; + this._end = roundToMinor(this._end); + } + this.determineScale(); + } } - /** - * Set a new range - * If minimumStep is provided, the step size is chosen as close as possible - * to the minimumStep but larger than minimumStep. If minimumStep is not - * provided, the scale is set to 1 DAY. - * The minimumStep should correspond with the onscreen size of about 6 characters - * @param {Number} [start] The start date and time. - * @param {Number} [end] The end date and time. - * @param {Number} [minimumStep] Optional. Minimum step size in milliseconds - */ - DataStep.prototype.setRange = function (start, end, minimumStep, containerHeight, customRange) { - this._start = customRange.min === undefined ? start : customRange.min; - this._end = customRange.max === undefined ? end : customRange.max; - if (this._start === this._end) { - this._start = customRange.min === undefined ? this._start - 0.75 : this._start; - this._end = customRange.max === undefined ? this._end + 1 : this._end;; - } - - if (this.autoScale === true) { - this.setMinimumStep(minimumStep, containerHeight); - } - - this.setFirst(customRange); + DataScale.prototype.setCharHeight = function (majorCharHeight) { + this.majorCharHeight = majorCharHeight; }; - /** - * Automatically determine the scale that bests fits the provided minimum step - * @param {Number} [minimumStep] The minimum step size in pixels - */ - DataStep.prototype.setMinimumStep = function (minimumStep, containerHeight) { - // round to floor - var range = this._end - this._start; - var safeRange = range * 1.2; - var minimumStepValue = minimumStep * (safeRange / containerHeight); - var orderOfMagnitude = Math.round(Math.log(safeRange) / Math.LN10); + DataScale.prototype.setHeight = function (containerHeight) { + this.containerHeight = containerHeight; + }; - var minorStepIdx = -1; - var magnitudefactor = Math.pow(10, orderOfMagnitude); + DataScale.prototype.determineScale = function () { + var range = this._end - this._start; + this.scale = this.containerHeight / range; + var minimumStepValue = this.majorCharHeight / this.scale; + var orderOfMagnitude = Math.round(Math.log(range) / Math.LN10); + + this.minorStepIdx = -1; + this.magnitudefactor = Math.pow(10, orderOfMagnitude); var start = 0; if (orderOfMagnitude < 0) { @@ -24883,13 +26194,13 @@ return /******/ (function(modules) { // webpackBootstrap } var solutionFound = false; - for (var i = start; Math.abs(i) <= Math.abs(orderOfMagnitude); i++) { - magnitudefactor = Math.pow(10, i); + for (var l = start; Math.abs(l) <= Math.abs(orderOfMagnitude); l++) { + this.magnitudefactor = Math.pow(10, l); for (var j = 0; j < this.minorSteps.length; j++) { - var stepSize = magnitudefactor * this.minorSteps[j]; + var stepSize = this.magnitudefactor * this.minorSteps[j]; if (stepSize >= minimumStepValue) { solutionFound = true; - minorStepIdx = j; + this.minorStepIdx = j; break; } } @@ -24897,83 +26208,22 @@ return /******/ (function(modules) { // webpackBootstrap break; } } - this.stepIndex = minorStepIdx; - this.scale = magnitudefactor; - this.step = magnitudefactor * this.minorSteps[minorStepIdx]; }; - /** - * Round the current date to the first minor date value - * This must be executed once when the current date is set to start Date - */ - DataStep.prototype.setFirst = function (customRange) { - if (customRange === undefined) { - customRange = {}; - } - - var niceStart = customRange.min === undefined ? this._start - this.scale * 2 * this.minorSteps[this.stepIndex] : customRange.min; - var niceEnd = customRange.max === undefined ? this._end + this.scale * this.minorSteps[this.stepIndex] : customRange.max; - - this.marginEnd = customRange.max === undefined ? this.roundToMinor(niceEnd) : customRange.max; - this.marginStart = customRange.min === undefined ? this.roundToMinor(niceStart) : customRange.min; - - // if we need to align the zero's we need to make sure that there is a zero to use. - if (this.alignZeros === true && (this.marginEnd - this.marginStart) % this.step != 0) { - this.marginEnd += this.marginEnd % this.step; - } - - this.deadSpace = this.roundToMinor(niceEnd) - niceEnd + this.roundToMinor(niceStart) - niceStart; - this.marginRange = this.marginEnd - this.marginStart; - - this.current = this.marginEnd; + DataScale.prototype.is_major = function (value) { + return value % (this.magnitudefactor * this.majorSteps[this.minorStepIdx]) === 0; }; - DataStep.prototype.roundToMinor = function (value) { - var rounded = value - value % (this.scale * this.minorSteps[this.stepIndex]); - if (value % (this.scale * this.minorSteps[this.stepIndex]) > 0.5 * (this.scale * this.minorSteps[this.stepIndex])) { - return rounded + this.scale * this.minorSteps[this.stepIndex]; - } else { - return rounded; - } + DataScale.prototype.getStep = function () { + return this.magnitudefactor * this.minorSteps[this.minorStepIdx]; }; - /** - * Check if the there is a next step - * @return {boolean} true if the current date has not passed the end date - */ - DataStep.prototype.hasNext = function () { - return this.current >= this.marginStart; + DataScale.prototype.getFirstMajor = function () { + var majorStep = this.magnitudefactor * this.majorSteps[this.minorStepIdx]; + return this.convertValue(this._start + (majorStep - this._start % majorStep) % majorStep); }; - /** - * Do the next step - */ - DataStep.prototype.next = function () { - var prev = this.current; - this.current -= this.step; - - // safety mechanism: if current time is still unchanged, move to the end - if (this.current === prev) { - this.current = this._end; - } - }; - - /** - * Do the next step - */ - DataStep.prototype.previous = function () { - this.current += this.step; - this.marginEnd += this.step; - this.marginRange = this.marginEnd - this.marginStart; - }; - - /** - * Get the current datetime - * @return {String} current The current date - */ - DataStep.prototype.getCurrent = function () { - // prevent round-off errors when close to zero - var current = Math.abs(this.current) < this.step / 2 ? 0 : this.current; + DataScale.prototype.formatValue = function (current) { var returnValue = current.toPrecision(5); if (typeof this.formattingFunction === 'function') { returnValue = this.formattingFunction(current); @@ -24988,40 +26238,135 @@ return /******/ (function(modules) { // webpackBootstrap } }; - /** - * Check if the current value is a major value (for example when the step - * is DAY, a major value is each first day of the MONTH) - * @return {boolean} true if current date is major, else false. - */ - DataStep.prototype.isMajor = function () { - return this.current % (this.scale * this.majorSteps[this.stepIndex]) === 0; + DataScale.prototype.getLines = function () { + var lines = []; + var step = this.getStep(); + var bottomOffset = (step - this._start % step) % step; + for (var i = this._start + bottomOffset; this._end - i > 0.00001; i += step) { + if (i != this._start) { + //Skip the bottom line + lines.push({ major: this.is_major(i), y: this.convertValue(i), val: this.formatValue(i) }); + } + } + return lines; }; - DataStep.prototype.shift = function (steps) { - if (steps < 0) { - for (var i = 0; i < -steps; i++) { - this.previous(); + DataScale.prototype.followScale = function (other) { + var oldStepIdx = this.minorStepIdx; + var oldStart = this._start; + var oldEnd = this._end; + + var me = this; + var increaseMagnitude = function increaseMagnitude() { + me.magnitudefactor *= 2; + }; + var decreaseMagnitude = function decreaseMagnitude() { + me.magnitudefactor /= 2; + }; + + if (other.minorStepIdx <= 1 && this.minorStepIdx <= 1 || other.minorStepIdx > 1 && this.minorStepIdx > 1) { + //easy, no need to change stepIdx nor multiplication factor + } else if (other.minorStepIdx < this.minorStepIdx) { + //I'm 5, they are 4 per major. + this.minorStepIdx = 1; + if (oldStepIdx == 2) { + increaseMagnitude(); + } else { + increaseMagnitude(); + increaseMagnitude(); + } + } else { + //I'm 4, they are 5 per major + this.minorStepIdx = 2; + if (oldStepIdx == 1) { + decreaseMagnitude(); + } else { + decreaseMagnitude(); + decreaseMagnitude(); + } } - } else if (steps > 0) { - for (var i = 0; i < steps; i++) { - this.next(); + + //Get masters stats: + var lines = other.getLines(); + var otherZero = other.convertValue(0); + var otherStep = other.getStep() * other.scale; + + var done = false; + var count = 0; + //Loop until magnitude is correct for given constrains. + while (!done && count++ < 5) { + + //Get my stats: + this.scale = otherStep / (this.minorSteps[this.minorStepIdx] * this.magnitudefactor); + var newRange = this.containerHeight / this.scale; + + //For the case the magnitudefactor has changed: + this._start = oldStart; + this._end = this._start + newRange; + + var myOriginalZero = this._end * this.scale; + var majorStep = this.magnitudefactor * this.majorSteps[this.minorStepIdx]; + var majorOffset = this.getFirstMajor() - other.getFirstMajor(); + + if (this.zeroAlign) { + var zeroOffset = otherZero - myOriginalZero; + this._end += zeroOffset / this.scale; + this._start = this._end - newRange; + } else { + if (!this.autoScaleStart) { + this._start += majorStep - majorOffset / this.scale; + this._end = this._start + newRange; + } else { + this._start -= majorOffset / this.scale; + this._end = this._start + newRange; + } } + if (!this.autoScaleEnd && this._end > oldEnd + 0.00001) { + //Need to decrease magnitude to prevent scale overshoot! (end) + decreaseMagnitude(); + done = false; + continue; + } + if (!this.autoScaleStart && this._start < oldStart - 0.00001) { + if (this.zeroAlign && oldStart >= 0) { + console.warn("Can't adhere to given 'min' range, due to zeroalign"); + } else { + //Need to decrease magnitude to prevent scale overshoot! (start) + decreaseMagnitude(); + done = false; + continue; + } + } + if (this.autoScaleStart && this.autoScaleEnd && newRange < oldEnd - oldStart) { + increaseMagnitude(); + done = false; + continue; + } + done = true; } }; - module.exports = DataStep; + DataScale.prototype.convertValue = function (value) { + return this.containerHeight - (value - this._start) * this.scale; + }; + + DataScale.prototype.screenToValue = function (pixels) { + return (this.containerHeight - pixels) / this.scale + this._start; + }; + + module.exports = DataScale; /***/ }, -/* 53 */ +/* 52 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; - var util = __webpack_require__(7); - var DOMutil = __webpack_require__(13); - var Line = __webpack_require__(54); - var Bar = __webpack_require__(56); - var Points = __webpack_require__(55); + var util = __webpack_require__(1); + var DOMutil = __webpack_require__(7); + var Bars = __webpack_require__(53); + var Lines = __webpack_require__(55); + var Points = __webpack_require__(54); /** * /** @@ -25035,7 +26380,7 @@ return /******/ (function(modules) { // webpackBootstrap */ function GraphGroup(group, groupId, options, groupsUsingDefaultStyles) { this.id = groupId; - var fields = ['sampling', 'style', 'sort', 'yAxisOrientation', 'barChart', 'drawPoints', 'shaded', 'interpolation']; + var fields = ['sampling', 'style', 'sort', 'yAxisOrientation', 'barChart', 'drawPoints', 'shaded', 'interpolation', 'zIndex', 'excludeFromStacking', 'excludeFromLegend']; this.options = util.selectiveBridgeObject(fields, options); this.usingDefaultStyle = group.className === undefined; this.groupsUsingDefaultStyles = groupsUsingDefaultStyles; @@ -25056,21 +26401,21 @@ return /******/ (function(modules) { // webpackBootstrap if (items != null) { this.itemsData = items; if (this.options.sort == true) { - this.itemsData.sort(function (a, b) { - return a.x - b.x; + util.insertSort(this.itemsData, function (a, b) { + return a.x > b.x ? 1 : -1; }); } - // typecast all items to numbers. Takes around 10ms for 500.000 items - for (var i = 0; i < this.itemsData.length; i++) { - this.itemsData[i].y = Number(this.itemsData[i].y); - } } else { this.itemsData = []; } }; + GraphGroup.prototype.getItems = function () { + return this.itemsData; + }; + /** - * this is used for plotting barcharts, this way, we only have to calculate it once. + * this is used for barcharts and shading, this way, we only have to calculate it once. * @param pos */ GraphGroup.prototype.setZeroPosition = function (pos) { @@ -25083,7 +26428,7 @@ return /******/ (function(modules) { // webpackBootstrap */ GraphGroup.prototype.setOptions = function (options) { if (options !== undefined) { - var fields = ['sampling', 'style', 'sort', 'yAxisOrientation', 'barChart']; + var fields = ['sampling', 'style', 'sort', 'yAxisOrientation', 'barChart', 'zIndex', 'excludeFromStacking', 'excludeFromLegend']; util.selectiveDeepExtend(fields, this.options, options); // if the group's drawPoints is a function delegate the callback to the onRender property @@ -25112,14 +26457,6 @@ return /******/ (function(modules) { // webpackBootstrap } } } - - if (this.options.style == 'line') { - this.type = new Line(this.id, this.options); - } else if (this.options.style == 'bar') { - this.type = new Bar(this.id, this.options); - } else if (this.options.style == 'points') { - this.type = new Points(this.id, this.options); - } }; /** @@ -25135,65 +26472,6 @@ return /******/ (function(modules) { // webpackBootstrap this.setOptions(group.options); }; - /** - * draw the icon for the legend. - * - * @param x - * @param y - * @param JSONcontainer - * @param SVGcontainer - * @param iconWidth - * @param iconHeight - */ - GraphGroup.prototype.drawIcon = function (x, y, JSONcontainer, SVGcontainer, iconWidth, iconHeight) { - var fillHeight = iconHeight * 0.5; - var path, fillPath; - - var outline = DOMutil.getSVGElement('rect', JSONcontainer, SVGcontainer); - outline.setAttributeNS(null, 'x', x); - outline.setAttributeNS(null, 'y', y - fillHeight); - outline.setAttributeNS(null, 'width', iconWidth); - outline.setAttributeNS(null, 'height', 2 * fillHeight); - outline.setAttributeNS(null, 'class', 'vis-outline'); - - if (this.options.style == 'line') { - path = DOMutil.getSVGElement('path', JSONcontainer, SVGcontainer); - path.setAttributeNS(null, 'class', this.className); - if (this.style !== undefined) { - path.setAttributeNS(null, 'style', this.style); - } - - path.setAttributeNS(null, 'd', 'M' + x + ',' + y + ' L' + (x + iconWidth) + ',' + y + ''); - if (this.options.shaded.enabled == true) { - fillPath = DOMutil.getSVGElement('path', JSONcontainer, SVGcontainer); - if (this.options.shaded.orientation == 'top') { - fillPath.setAttributeNS(null, 'd', 'M' + x + ', ' + (y - fillHeight) + 'L' + x + ',' + y + ' L' + (x + iconWidth) + ',' + y + ' L' + (x + iconWidth) + ',' + (y - fillHeight)); - } else { - fillPath.setAttributeNS(null, 'd', 'M' + x + ',' + y + ' ' + 'L' + x + ',' + (y + fillHeight) + ' ' + 'L' + (x + iconWidth) + ',' + (y + fillHeight) + 'L' + (x + iconWidth) + ',' + y); - } - fillPath.setAttributeNS(null, 'class', this.className + ' vis-icon-fill'); - } - - if (this.options.drawPoints.enabled == true) { - var groupTemplate = { - style: this.options.drawPoints.style, - size: this.options.drawPoints.size, - className: this.className - }; - DOMutil.drawPoint(x + 0.5 * iconWidth, y, groupTemplate, JSONcontainer, SVGcontainer); - } - } else { - var barWidth = Math.round(0.3 * iconWidth); - var bar1Height = Math.round(0.4 * iconHeight); - var bar2Height = Math.round(0.75 * iconHeight); - - var offset = Math.round((iconWidth - 2 * barWidth) / 3); - - DOMutil.drawBar(x + 0.5 * barWidth + offset, y + fillHeight - bar1Height - 1, barWidth, bar1Height, this.className + ' vis-bar', JSONcontainer, SVGcontainer, this.style); - DOMutil.drawBar(x + 1.5 * barWidth + offset + 2, y + fillHeight - bar2Height - 1, barWidth, bar2Height, this.className + ' vis-bar', JSONcontainer, SVGcontainer, this.style); - } - }; - /** * return the legend entree for this group. * @@ -25201,434 +26479,87 @@ return /******/ (function(modules) { // webpackBootstrap * @param iconHeight * @returns {{icon: HTMLElement, label: (group.content|*|string), orientation: (.options.yAxisOrientation|*)}} */ - GraphGroup.prototype.getLegend = function (iconWidth, iconHeight) { - var svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg'); - this.drawIcon(0, 0.5 * iconHeight, [], svg, iconWidth, iconHeight); - return { icon: svg, label: this.content, orientation: this.options.yAxisOrientation }; + GraphGroup.prototype.getLegend = function (iconWidth, iconHeight, framework, x, y) { + if (framework == undefined || framework == null) { + var svg = document.createElementNS('http://www.w3.org/2000/svg', "svg"); + framework = { svg: svg, svgElements: {}, options: this.options, groups: [this] }; + } + if (x == undefined || x == null) { + x = 0; + } + if (y == undefined || y == null) { + y = 0.5 * iconHeight; + } + switch (this.options.style) { + case "line": + Lines.drawIcon(this, x, y, iconWidth, iconHeight, framework); + break; + case "points": //explicit no break + case "point": + Points.drawIcon(this, x, y, iconWidth, iconHeight, framework); + break; + case "bar": + Bars.drawIcon(this, x, y, iconWidth, iconHeight, framework); + break; + } + return { icon: framework.svg, label: this.content, orientation: this.options.yAxisOrientation }; }; GraphGroup.prototype.getYRange = function (groupData) { - return this.type.getYRange(groupData); - }; - - GraphGroup.prototype.getData = function (groupData) { - return this.type.getData(groupData); - }; - - GraphGroup.prototype.draw = function (dataset, group, framework) { - this.type.draw(dataset, group, framework); + var yMin = groupData[0].y; + var yMax = groupData[0].y; + for (var j = 0; j < groupData.length; j++) { + yMin = yMin > groupData[j].y ? groupData[j].y : yMin; + yMax = yMax < groupData[j].y ? groupData[j].y : yMax; + } + return { min: yMin, max: yMax, yAxisOrientation: this.options.yAxisOrientation }; }; module.exports = GraphGroup; /***/ }, -/* 54 */ +/* 53 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; - var DOMutil = __webpack_require__(13); - var Points = __webpack_require__(55); + var DOMutil = __webpack_require__(7); + var Points = __webpack_require__(54); - function Line(groupId, options) { - this.groupId = groupId; - this.options = options; - } + function Bargraph(groupId, options) {} - Line.prototype.getData = function (groupData) { - var combinedData = []; - for (var j = 0; j < groupData.length; j++) { - combinedData.push({ - x: groupData[j].x, - y: groupData[j].y, - groupId: this.groupId - }); - } - return combinedData; - }; + Bargraph.drawIcon = function (group, x, y, iconWidth, iconHeight, framework) { + var fillHeight = iconHeight * 0.5; + var path, fillPath; - Line.prototype.getYRange = function (groupData) { - var yMin = groupData[0].y; - var yMax = groupData[0].y; - for (var j = 0; j < groupData.length; j++) { - yMin = yMin > groupData[j].y ? groupData[j].y : yMin; - yMax = yMax < groupData[j].y ? groupData[j].y : yMax; - } - return { min: yMin, max: yMax, yAxisOrientation: this.options.yAxisOrientation }; - }; + var outline = DOMutil.getSVGElement("rect", framework.svgElements, framework.svg); + outline.setAttributeNS(null, "x", x); + outline.setAttributeNS(null, "y", y - fillHeight); + outline.setAttributeNS(null, "width", iconWidth); + outline.setAttributeNS(null, "height", 2 * fillHeight); + outline.setAttributeNS(null, "class", "vis-outline"); - Line.getStackedYRange = function (combinedData, groupRanges, groupIds, groupLabel, orientation) { - if (combinedData.length > 0) { - // sort by time and by group - combinedData.sort(function (a, b) { - if (a.x === b.x) { - return a.groupId < b.groupId ? -1 : 1; - } else { - return a.x - b.x; - } - }); - var intersections = {}; + var barWidth = Math.round(0.3 * iconWidth); + var originalWidth = group.options.barChart.width; + var scale = originalWidth / barWidth; + var bar1Height = Math.round(0.4 * iconHeight); + var bar2Height = Math.round(0.75 * iconHeight); - Line._getDataIntersections(intersections, combinedData); - groupRanges[groupLabel] = Line._getStackedYRange(intersections, combinedData); - groupRanges[groupLabel].yAxisOrientation = orientation; - groupIds.push(groupLabel); - } - }; + var offset = Math.round((iconWidth - 2 * barWidth) / 3); - Line._getStackedYRange = function (intersections, combinedData) { - var key; - var yMin = combinedData[0].y; - var yMax = combinedData[0].y; - for (var i = 0; i < combinedData.length; i++) { - key = combinedData[i].x; - if (intersections[key] === undefined) { - yMin = yMin > combinedData[i].y ? combinedData[i].y : yMin; - yMax = yMax < combinedData[i].y ? combinedData[i].y : yMax; - } else { - if (combinedData[i].y < 0) { - intersections[key].accumulatedNegative += combinedData[i].y; - } else { - intersections[key].accumulatedPositive += combinedData[i].y; - } - } - } - for (var xpos in intersections) { - if (intersections.hasOwnProperty(xpos)) { - yMin = yMin > intersections[xpos].accumulatedNegative ? intersections[xpos].accumulatedNegative : yMin; - yMin = yMin > intersections[xpos].accumulatedPositive ? intersections[xpos].accumulatedPositive : yMin; - yMax = yMax < intersections[xpos].accumulatedNegative ? intersections[xpos].accumulatedNegative : yMax; - yMax = yMax < intersections[xpos].accumulatedPositive ? intersections[xpos].accumulatedPositive : yMax; - } - } + DOMutil.drawBar(x + 0.5 * barWidth + offset, y + fillHeight - bar1Height - 1, barWidth, bar1Height, group.className + ' vis-bar', framework.svgElements, framework.svg, group.style); + DOMutil.drawBar(x + 1.5 * barWidth + offset + 2, y + fillHeight - bar2Height - 1, barWidth, bar2Height, group.className + ' vis-bar', framework.svgElements, framework.svg, group.style); - return { min: yMin, max: yMax }; - }; - - /** - * Fill the intersections object with counters of how many datapoints share the same x coordinates - * @param intersections - * @param combinedData - * @private - */ - Line._getDataIntersections = function (intersections, combinedData) { - // get intersections - var coreDistance; - for (var i = 0; i < combinedData.length; i++) { - if (i + 1 < combinedData.length) { - coreDistance = Math.abs(combinedData[i + 1].x - combinedData[i].x); - } - if (i > 0) { - coreDistance = Math.min(coreDistance, Math.abs(combinedData[i - 1].x - combinedData[i].x)); - } - if (coreDistance === 0) { - if (intersections[combinedData[i].x] === undefined) { - intersections[combinedData[i].x] = { amount: 0, resolved: 0, accumulatedPositive: 0, accumulatedNegative: 0 }; - } - intersections[combinedData[i].x].amount += 1; - } - } - }; - - /** - * draw a line graph - * - * @param dataset - * @param group - */ - Line.prototype.draw = function (dataset, group, framework) { - if (dataset != null) { - if (dataset.length > 0) { - var path, d; - var svgHeight = Number(framework.svg.style.height.replace('px', '')); - path = DOMutil.getSVGElement('path', framework.svgElements, framework.svg); - path.setAttributeNS(null, 'class', group.className); - if (group.style !== undefined) { - path.setAttributeNS(null, 'style', group.style); - } - - // construct path from dataset - if (group.options.interpolation.enabled == true) { - d = Line._catmullRom(dataset, group); - } else { - d = Line._linear(dataset); - } - - // append with points for fill and finalize the path - if (group.options.shaded.enabled == true) { - var fillPath = DOMutil.getSVGElement('path', framework.svgElements, framework.svg); - var dFill; - if (group.options.shaded.orientation == 'top') { - dFill = 'M' + dataset[0].x + ',' + 0 + ' ' + d + 'L' + dataset[dataset.length - 1].x + ',' + 0; - } else { - dFill = 'M' + dataset[0].x + ',' + svgHeight + ' ' + d + 'L' + dataset[dataset.length - 1].x + ',' + svgHeight; - } - fillPath.setAttributeNS(null, 'class', group.className + ' vis-fill'); - if (group.options.shaded.style !== undefined) { - fillPath.setAttributeNS(null, 'style', group.options.shaded.style); - } - fillPath.setAttributeNS(null, 'd', dFill); - } - // copy properties to path for drawing. - path.setAttributeNS(null, 'd', 'M' + d); - - // draw points - if (group.options.drawPoints.enabled == true) { - Points.draw(dataset, group, framework); - } - } - } - }; - - /** - * This uses an uniform parametrization of the interpolation algorithm: - * 'On the Parameterization of Catmull-Rom Curves' by Cem Yuksel et al. - * @param data - * @returns {string} - * @private - */ - Line._catmullRomUniform = function (data) { - // catmull rom - var p0, p1, p2, p3, bp1, bp2; - var d = Math.round(data[0].x) + ',' + Math.round(data[0].y) + ' '; - var normalization = 1 / 6; - var length = data.length; - for (var i = 0; i < length - 1; i++) { - - p0 = i == 0 ? data[0] : data[i - 1]; - p1 = data[i]; - p2 = data[i + 1]; - p3 = i + 2 < length ? data[i + 2] : p2; - - // Catmull-Rom to Cubic Bezier conversion matrix - // 0 1 0 0 - // -1/6 1 1/6 0 - // 0 1/6 1 -1/6 - // 0 0 1 0 - - // bp0 = { x: p1.x, y: p1.y }; - bp1 = { x: (-p0.x + 6 * p1.x + p2.x) * normalization, y: (-p0.y + 6 * p1.y + p2.y) * normalization }; - bp2 = { x: (p1.x + 6 * p2.x - p3.x) * normalization, y: (p1.y + 6 * p2.y - p3.y) * normalization }; - // bp0 = { x: p2.x, y: p2.y }; - - d += 'C' + bp1.x + ',' + bp1.y + ' ' + bp2.x + ',' + bp2.y + ' ' + p2.x + ',' + p2.y + ' '; - } - - return d; - }; - - /** - * This uses either the chordal or centripetal parameterization of the catmull-rom algorithm. - * By default, the centripetal parameterization is used because this gives the nicest results. - * These parameterizations are relatively heavy because the distance between 4 points have to be calculated. - * - * One optimization can be used to reuse distances since this is a sliding window approach. - * @param data - * @param group - * @returns {string} - * @private - */ - Line._catmullRom = function (data, group) { - var alpha = group.options.interpolation.alpha; - if (alpha == 0 || alpha === undefined) { - return this._catmullRomUniform(data); - } else { - var p0, p1, p2, p3, bp1, bp2, d1, d2, d3, A, B, N, M; - var d3powA, d2powA, d3pow2A, d2pow2A, d1pow2A, d1powA; - var d = Math.round(data[0].x) + ',' + Math.round(data[0].y) + ' '; - var length = data.length; - for (var i = 0; i < length - 1; i++) { - - p0 = i == 0 ? data[0] : data[i - 1]; - p1 = data[i]; - p2 = data[i + 1]; - p3 = i + 2 < length ? data[i + 2] : p2; - - d1 = Math.sqrt(Math.pow(p0.x - p1.x, 2) + Math.pow(p0.y - p1.y, 2)); - d2 = Math.sqrt(Math.pow(p1.x - p2.x, 2) + Math.pow(p1.y - p2.y, 2)); - d3 = Math.sqrt(Math.pow(p2.x - p3.x, 2) + Math.pow(p2.y - p3.y, 2)); - - // Catmull-Rom to Cubic Bezier conversion matrix - - // A = 2d1^2a + 3d1^a * d2^a + d3^2a - // B = 2d3^2a + 3d3^a * d2^a + d2^2a - - // [ 0 1 0 0 ] - // [ -d2^2a /N A/N d1^2a /N 0 ] - // [ 0 d3^2a /M B/M -d2^2a /M ] - // [ 0 0 1 0 ] - - d3powA = Math.pow(d3, alpha); - d3pow2A = Math.pow(d3, 2 * alpha); - d2powA = Math.pow(d2, alpha); - d2pow2A = Math.pow(d2, 2 * alpha); - d1powA = Math.pow(d1, alpha); - d1pow2A = Math.pow(d1, 2 * alpha); - - A = 2 * d1pow2A + 3 * d1powA * d2powA + d2pow2A; - B = 2 * d3pow2A + 3 * d3powA * d2powA + d2pow2A; - N = 3 * d1powA * (d1powA + d2powA); - if (N > 0) { - N = 1 / N; - } - M = 3 * d3powA * (d3powA + d2powA); - if (M > 0) { - M = 1 / M; - } - - bp1 = { x: (-d2pow2A * p0.x + A * p1.x + d1pow2A * p2.x) * N, - y: (-d2pow2A * p0.y + A * p1.y + d1pow2A * p2.y) * N }; - - bp2 = { x: (d3pow2A * p1.x + B * p2.x - d2pow2A * p3.x) * M, - y: (d3pow2A * p1.y + B * p2.y - d2pow2A * p3.y) * M }; - - if (bp1.x == 0 && bp1.y == 0) { - bp1 = p1; - } - if (bp2.x == 0 && bp2.y == 0) { - bp2 = p2; - } - d += 'C' + bp1.x + ',' + bp1.y + ' ' + bp2.x + ',' + bp2.y + ' ' + p2.x + ',' + p2.y + ' '; - } - - return d; - } - }; - - /** - * this generates the SVG path for a linear drawing between datapoints. - * @param data - * @returns {string} - * @private - */ - Line._linear = function (data) { - // linear - var d = ''; - for (var i = 0; i < data.length; i++) { - if (i == 0) { - d += data[i].x + ',' + data[i].y; - } else { - d += ' ' + data[i].x + ',' + data[i].y; - } - } - return d; - }; - - module.exports = Line; - -/***/ }, -/* 55 */ -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - var DOMutil = __webpack_require__(13); - - function Points(groupId, options) { - this.groupId = groupId; - this.options = options; - } - - Points.prototype.getYRange = function (groupData) { - var yMin = groupData[0].y; - var yMax = groupData[0].y; - for (var j = 0; j < groupData.length; j++) { - yMin = yMin > groupData[j].y ? groupData[j].y : yMin; - yMax = yMax < groupData[j].y ? groupData[j].y : yMax; - } - return { min: yMin, max: yMax, yAxisOrientation: this.options.yAxisOrientation }; - }; - - Points.prototype.draw = function (dataset, group, framework, offset) { - Points.draw(dataset, group, framework, offset); - }; - - /** - * draw the data points - * - * @param {Array} dataset - * @param {Object} JSONcontainer - * @param {Object} svg | SVG DOM element - * @param {GraphGroup} group - * @param {Number} [offset] - */ - Points.draw = function (dataset, group, framework, offset) { - offset = offset || 0; - var callback = getCallback(); - - for (var i = 0; i < dataset.length; i++) { - if (!callback) { - // draw the point the simple way. - DOMutil.drawPoint(dataset[i].x + offset, dataset[i].y, getGroupTemplate(), framework.svgElements, framework.svg, dataset[i].label); - } else { - var callbackResult = callback(dataset[i], group, framework); // result might be true, false or an object - if (callbackResult === true || typeof callbackResult === 'object') { - DOMutil.drawPoint(dataset[i].x + offset, dataset[i].y, getGroupTemplate(callbackResult), framework.svgElements, framework.svg, dataset[i].label); - } - } - } - - function getGroupTemplate(callbackResult) { - callbackResult = typeof callbackResult === 'undefined' ? {} : callbackResult; - return { - style: callbackResult.style || group.options.drawPoints.style, - size: callbackResult.size || group.options.drawPoints.size, - className: callbackResult.className || group.className + if (group.options.drawPoints.enabled == true) { + var groupTemplate = { + style: group.options.drawPoints.style, + styles: group.options.drawPoints.styles, + size: group.options.drawPoints.size / scale, + className: group.className }; + DOMutil.drawPoint(x + 0.5 * barWidth + offset, y + fillHeight - bar1Height - 1, groupTemplate, framework.svgElements, framework.svg); + DOMutil.drawPoint(x + 1.5 * barWidth + offset + 2, y + fillHeight - bar2Height - 1, groupTemplate, framework.svgElements, framework.svg); } - - function getCallback() { - var callback = undefined; - // check for the graph2d onRender - if (framework.options.drawPoints.onRender && typeof framework.options.drawPoints.onRender == 'function') { - callback = framework.options.drawPoints.onRender; - } - - // override it with the group onRender if defined - if (group.group.options && group.group.options.drawPoints && group.group.options.drawPoints.onRender && typeof group.group.options.drawPoints.onRender == 'function') { - callback = group.group.options.drawPoints.onRender; - } - - return callback; - } - }; - - module.exports = Points; - -/***/ }, -/* 56 */ -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - var DOMutil = __webpack_require__(13); - var Points = __webpack_require__(55); - - function Bargraph(groupId, options) { - this.groupId = groupId; - this.options = options; - } - - Bargraph.prototype.getYRange = function (groupData) { - var yMin = groupData[0].y; - var yMax = groupData[0].y; - for (var j = 0; j < groupData.length; j++) { - yMin = yMin > groupData[j].y ? groupData[j].y : yMin; - yMax = yMax < groupData[j].y ? groupData[j].y : yMax; - } - return { min: yMin, max: yMax, yAxisOrientation: this.options.yAxisOrientation }; - }; - - Bargraph.prototype.getData = function (groupData) { - var combinedData = []; - for (var j = 0; j < groupData.length; j++) { - combinedData.push({ - x: groupData[j].x, - y: groupData[j].y, - groupId: this.groupId - }); - } - return combinedData; }; /** @@ -25653,6 +26584,8 @@ return /******/ (function(modules) { // webpackBootstrap if (group.visible === true && (framework.options.groups.visibility[groupIds[i]] === undefined || framework.options.groups.visibility[groupIds[i]] === true)) { for (j = 0; j < processedGroupData[groupIds[i]].length; j++) { combinedData.push({ + screen_x: processedGroupData[groupIds[i]][j].screen_x, + screen_y: processedGroupData[groupIds[i]][j].screen_y, x: processedGroupData[groupIds[i]][j].x, y: processedGroupData[groupIds[i]][j].y, groupId: groupIds[i], @@ -25670,10 +26603,10 @@ return /******/ (function(modules) { // webpackBootstrap // sort by time and by group combinedData.sort(function (a, b) { - if (a.x === b.x) { + if (a.screen_x === b.screen_x) { return a.groupId < b.groupId ? -1 : 1; } else { - return a.x - b.x; + return a.screen_x - b.screen_x; } }); @@ -25683,52 +26616,49 @@ return /******/ (function(modules) { // webpackBootstrap // plot barchart for (i = 0; i < combinedData.length; i++) { group = framework.groups[combinedData[i].groupId]; - var minWidth = 0.1 * group.options.barChart.width; + var minWidth = group.options.barChart.minWidth != undefined ? group.options.barChart.minWidth : 0.1 * group.options.barChart.width; - key = combinedData[i].x; + key = combinedData[i].screen_x; var heightOffset = 0; if (intersections[key] === undefined) { if (i + 1 < combinedData.length) { - coreDistance = Math.abs(combinedData[i + 1].x - key); - } - if (i > 0) { - coreDistance = Math.min(coreDistance, Math.abs(combinedData[i - 1].x - key)); + coreDistance = Math.abs(combinedData[i + 1].screen_x - key); } drawData = Bargraph._getSafeDrawData(coreDistance, group, minWidth); } else { var nextKey = i + (intersections[key].amount - intersections[key].resolved); var prevKey = i - (intersections[key].resolved + 1); if (nextKey < combinedData.length) { - coreDistance = Math.abs(combinedData[nextKey].x - key); - } - if (prevKey > 0) { - coreDistance = Math.min(coreDistance, Math.abs(combinedData[prevKey].x - key)); + coreDistance = Math.abs(combinedData[nextKey].screen_x - key); } drawData = Bargraph._getSafeDrawData(coreDistance, group, minWidth); intersections[key].resolved += 1; - if (group.options.stack === true) { - if (combinedData[i].y < group.zeroPosition) { + if (group.options.stack === true && group.options.excludeFromStacking !== true) { + if (combinedData[i].screen_y < group.zeroPosition) { heightOffset = intersections[key].accumulatedNegative; - intersections[key].accumulatedNegative += group.zeroPosition - combinedData[i].y; + intersections[key].accumulatedNegative += group.zeroPosition - combinedData[i].screen_y; } else { heightOffset = intersections[key].accumulatedPositive; - intersections[key].accumulatedPositive += group.zeroPosition - combinedData[i].y; + intersections[key].accumulatedPositive += group.zeroPosition - combinedData[i].screen_y; } } else if (group.options.barChart.sideBySide === true) { drawData.width = drawData.width / intersections[key].amount; drawData.offset += intersections[key].resolved * drawData.width - 0.5 * drawData.width * (intersections[key].amount + 1); - if (group.options.barChart.align === 'left') { - drawData.offset -= 0.5 * drawData.width; - } else if (group.options.barChart.align === 'right') { - drawData.offset += 0.5 * drawData.width; - } } } - DOMutil.drawBar(combinedData[i].x + drawData.offset, combinedData[i].y - heightOffset, drawData.width, group.zeroPosition - combinedData[i].y, group.className + ' vis-bar', framework.svgElements, framework.svg, group.style); + 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); // draw points if (group.options.drawPoints.enabled === true) { - Points.draw([combinedData[i]], group, framework, drawData.offset); + var pointData = { + screen_x: combinedData[i].screen_x, + screen_y: combinedData[i].screen_y - heightOffset, + x: combinedData[i].x, + y: combinedData[i].y, + groupId: combinedData[i].groupId, + label: combinedData[i].label + }; + Points.draw([pointData], group, framework, drawData.offset); //DOMutil.drawPoint(combinedData[i].x + drawData.offset, combinedData[i].y, group, framework.svgElements, framework.svg); } } @@ -25745,16 +26675,21 @@ return /******/ (function(modules) { // webpackBootstrap var coreDistance; for (var i = 0; i < combinedData.length; i++) { if (i + 1 < combinedData.length) { - coreDistance = Math.abs(combinedData[i + 1].x - combinedData[i].x); + coreDistance = Math.abs(combinedData[i + 1].screen_x - combinedData[i].screen_x); } if (i > 0) { - coreDistance = Math.min(coreDistance, Math.abs(combinedData[i - 1].x - combinedData[i].x)); + coreDistance = Math.min(coreDistance, Math.abs(combinedData[i - 1].screen_x - combinedData[i].screen_x)); } if (coreDistance === 0) { - if (intersections[combinedData[i].x] === undefined) { - intersections[combinedData[i].x] = { amount: 0, resolved: 0, accumulatedPositive: 0, accumulatedNegative: 0 }; + if (intersections[combinedData[i].screen_x] === undefined) { + intersections[combinedData[i].screen_x] = { + amount: 0, + resolved: 0, + accumulatedPositive: 0, + accumulatedNegative: 0 + }; } - intersections[combinedData[i].x].amount += 1; + intersections[combinedData[i].screen_x].amount += 1; } } }; @@ -25797,10 +26732,10 @@ return /******/ (function(modules) { // webpackBootstrap if (combinedData.length > 0) { // sort by time and by group combinedData.sort(function (a, b) { - if (a.x === b.x) { + if (a.screen_x === b.screen_x) { return a.groupId < b.groupId ? -1 : 1; } else { - return a.x - b.x; + return a.screen_x - b.screen_x; } }); var intersections = {}; @@ -25814,18 +26749,18 @@ return /******/ (function(modules) { // webpackBootstrap Bargraph._getStackedYRange = function (intersections, combinedData) { var key; - var yMin = combinedData[0].y; - var yMax = combinedData[0].y; + var yMin = combinedData[0].screen_y; + var yMax = combinedData[0].screen_y; for (var i = 0; i < combinedData.length; i++) { - key = combinedData[i].x; + key = combinedData[i].screen_x; if (intersections[key] === undefined) { - yMin = yMin > combinedData[i].y ? combinedData[i].y : yMin; - yMax = yMax < combinedData[i].y ? combinedData[i].y : yMax; + yMin = yMin > combinedData[i].screen_y ? combinedData[i].screen_y : yMin; + yMax = yMax < combinedData[i].screen_y ? combinedData[i].screen_y : yMax; } else { - if (combinedData[i].y < 0) { - intersections[key].accumulatedNegative += combinedData[i].y; + if (combinedData[i].screen_y < 0) { + intersections[key].accumulatedNegative += combinedData[i].screen_y; } else { - intersections[key].accumulatedPositive += combinedData[i].y; + intersections[key].accumulatedPositive += combinedData[i].screen_y; } } } @@ -25844,14 +26779,380 @@ return /******/ (function(modules) { // webpackBootstrap module.exports = Bargraph; /***/ }, -/* 57 */ +/* 54 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; - var util = __webpack_require__(7); - var DOMutil = __webpack_require__(13); - var Component = __webpack_require__(27); + var DOMutil = __webpack_require__(7); + + function Points(groupId, options) {} + + /** + * draw the data points + * + * @param {Array} dataset + * @param {Object} JSONcontainer + * @param {Object} svg | SVG DOM element + * @param {GraphGroup} group + * @param {Number} [offset] + */ + Points.draw = function (dataset, group, framework, offset) { + offset = offset || 0; + var callback = getCallback(framework, group); + + for (var i = 0; i < dataset.length; i++) { + if (!callback) { + // draw the point the simple way. + DOMutil.drawPoint(dataset[i].screen_x + offset, dataset[i].screen_y, getGroupTemplate(group), framework.svgElements, framework.svg, dataset[i].label); + } else { + var callbackResult = callback(dataset[i], group); // result might be true, false or an object + if (callbackResult === true || typeof callbackResult === 'object') { + DOMutil.drawPoint(dataset[i].screen_x + offset, dataset[i].screen_y, getGroupTemplate(group, callbackResult), framework.svgElements, framework.svg, dataset[i].label); + } + } + } + }; + + Points.drawIcon = function (group, x, y, iconWidth, iconHeight, framework) { + var fillHeight = iconHeight * 0.5; + var path, fillPath; + + var outline = DOMutil.getSVGElement("rect", framework.svgElements, framework.svg); + outline.setAttributeNS(null, "x", x); + outline.setAttributeNS(null, "y", y - fillHeight); + outline.setAttributeNS(null, "width", iconWidth); + outline.setAttributeNS(null, "height", 2 * fillHeight); + outline.setAttributeNS(null, "class", "vis-outline"); + + //Don't call callback on icon + DOMutil.drawPoint(x + 0.5 * iconWidth, y, getGroupTemplate(group), framework.svgElements, framework.svg); + }; + + function getGroupTemplate(group, callbackResult) { + callbackResult = typeof callbackResult === 'undefined' ? {} : callbackResult; + return { + style: callbackResult.style || group.options.drawPoints.style, + styles: callbackResult.styles || group.options.drawPoints.styles, + size: callbackResult.size || group.options.drawPoints.size, + className: callbackResult.className || group.className + }; + } + + function getCallback(framework, group) { + var callback = undefined; + // check for the graph2d onRender + if (framework.options && framework.options.drawPoints && framework.options.drawPoints.onRender && typeof framework.options.drawPoints.onRender == 'function') { + callback = framework.options.drawPoints.onRender; + } + + // override it with the group onRender if defined + if (group.group.options && group.group.options.drawPoints && group.group.options.drawPoints.onRender && typeof group.group.options.drawPoints.onRender == 'function') { + callback = group.group.options.drawPoints.onRender; + } + return callback; + } + + module.exports = Points; + +/***/ }, +/* 55 */ +/***/ function(module, exports, __webpack_require__) { + + "use strict"; + + var DOMutil = __webpack_require__(7); + + function Line(groupId, options) {} + + Line.calcPath = function (dataset, group) { + if (dataset != null) { + if (dataset.length > 0) { + var d = []; + + // construct path from dataset + if (group.options.interpolation.enabled == true) { + d = Line._catmullRom(dataset, group); + } else { + d = Line._linear(dataset); + } + return d; + } + } + }; + + Line.drawIcon = function (group, x, y, iconWidth, iconHeight, framework) { + var fillHeight = iconHeight * 0.5; + var path, fillPath; + + var outline = DOMutil.getSVGElement("rect", framework.svgElements, framework.svg); + outline.setAttributeNS(null, "x", x); + outline.setAttributeNS(null, "y", y - fillHeight); + outline.setAttributeNS(null, "width", iconWidth); + outline.setAttributeNS(null, "height", 2 * fillHeight); + outline.setAttributeNS(null, "class", "vis-outline"); + + path = DOMutil.getSVGElement("path", framework.svgElements, framework.svg); + path.setAttributeNS(null, "class", group.className); + if (group.style !== undefined) { + path.setAttributeNS(null, "style", group.style); + } + + path.setAttributeNS(null, "d", "M" + x + "," + y + " L" + (x + iconWidth) + "," + y + ""); + if (group.options.shaded.enabled == true) { + fillPath = DOMutil.getSVGElement("path", framework.svgElements, framework.svg); + if (group.options.shaded.orientation == 'top') { + fillPath.setAttributeNS(null, "d", "M" + x + ", " + (y - fillHeight) + "L" + x + "," + y + " L" + (x + iconWidth) + "," + y + " L" + (x + iconWidth) + "," + (y - fillHeight)); + } else { + fillPath.setAttributeNS(null, "d", "M" + x + "," + y + " " + "L" + x + "," + (y + fillHeight) + " " + "L" + (x + iconWidth) + "," + (y + fillHeight) + "L" + (x + iconWidth) + "," + y); + } + fillPath.setAttributeNS(null, "class", group.className + " vis-icon-fill"); + if (group.options.shaded.style !== undefined && group.options.shaded.style !== "") { + fillPath.setAttributeNS(null, "style", group.options.shaded.style); + } + } + + if (group.options.drawPoints.enabled == true) { + var groupTemplate = { + style: group.options.drawPoints.style, + styles: group.options.drawPoints.styles, + size: group.options.drawPoints.size, + className: group.className + }; + DOMutil.drawPoint(x + 0.5 * iconWidth, y, groupTemplate, framework.svgElements, framework.svg); + } + }; + + Line.drawShading = function (pathArray, group, subPathArray, framework) { + // append shading to the path + if (group.options.shaded.enabled == true) { + var svgHeight = Number(framework.svg.style.height.replace('px', '')); + var fillPath = DOMutil.getSVGElement('path', framework.svgElements, framework.svg); + var type = "L"; + if (group.options.interpolation.enabled == true) { + type = "C"; + } + var dFill; + var zero = 0; + if (group.options.shaded.orientation == 'top') { + zero = 0; + } else if (group.options.shaded.orientation == 'bottom') { + zero = svgHeight; + } else { + zero = Math.min(Math.max(0, group.zeroPosition), svgHeight); + } + if (group.options.shaded.orientation == 'group' && subPathArray != null && subPathArray != undefined) { + dFill = 'M' + pathArray[0][0] + "," + pathArray[0][1] + " " + this.serializePath(pathArray, type, false) + ' L' + subPathArray[subPathArray.length - 1][0] + "," + subPathArray[subPathArray.length - 1][1] + " " + this.serializePath(subPathArray, type, true) + subPathArray[0][0] + "," + subPathArray[0][1] + " Z"; + } else { + dFill = 'M' + pathArray[0][0] + "," + pathArray[0][1] + " " + this.serializePath(pathArray, type, false) + ' V' + zero + ' H' + pathArray[0][0] + " Z"; + } + + fillPath.setAttributeNS(null, 'class', group.className + ' vis-fill'); + if (group.options.shaded.style !== undefined) { + fillPath.setAttributeNS(null, 'style', group.options.shaded.style); + } + fillPath.setAttributeNS(null, 'd', dFill); + } + }; + + /** + * draw a line graph + * + * @param dataset + * @param group + */ + Line.draw = function (pathArray, group, framework) { + if (pathArray != null && pathArray != undefined) { + var path = DOMutil.getSVGElement('path', framework.svgElements, framework.svg); + path.setAttributeNS(null, "class", group.className); + if (group.style !== undefined) { + path.setAttributeNS(null, "style", group.style); + } + + var type = "L"; + if (group.options.interpolation.enabled == true) { + type = "C"; + } + // copy properties to path for drawing. + path.setAttributeNS(null, 'd', 'M' + pathArray[0][0] + "," + pathArray[0][1] + " " + this.serializePath(pathArray, type, false)); + } + }; + + Line.serializePath = function (pathArray, type, inverse) { + if (pathArray.length < 2) { + //Too little data to create a path. + return ""; + } + var d = type; + if (inverse) { + for (var i = pathArray.length - 2; i > 0; i--) { + d += pathArray[i][0] + "," + pathArray[i][1] + " "; + } + } else { + for (var i = 1; i < pathArray.length; i++) { + d += pathArray[i][0] + "," + pathArray[i][1] + " "; + } + } + return d; + }; + + /** + * This uses an uniform parametrization of the interpolation algorithm: + * 'On the Parameterization of Catmull-Rom Curves' by Cem Yuksel et al. + * @param data + * @returns {string} + * @private + */ + Line._catmullRomUniform = function (data) { + // catmull rom + var p0, p1, p2, p3, bp1, bp2; + var d = []; + d.push([Math.round(data[0].screen_x), Math.round(data[0].screen_y)]); + var normalization = 1 / 6; + var length = data.length; + for (var i = 0; i < length - 1; i++) { + + p0 = i == 0 ? data[0] : data[i - 1]; + p1 = data[i]; + p2 = data[i + 1]; + p3 = i + 2 < length ? data[i + 2] : p2; + + // Catmull-Rom to Cubic Bezier conversion matrix + // 0 1 0 0 + // -1/6 1 1/6 0 + // 0 1/6 1 -1/6 + // 0 0 1 0 + + // bp0 = { x: p1.x, y: p1.y }; + bp1 = { + screen_x: (-p0.screen_x + 6 * p1.screen_x + p2.screen_x) * normalization, + screen_y: (-p0.screen_y + 6 * p1.screen_y + p2.screen_y) * normalization + }; + bp2 = { + screen_x: (p1.screen_x + 6 * p2.screen_x - p3.screen_x) * normalization, + screen_y: (p1.screen_y + 6 * p2.screen_y - p3.screen_y) * normalization + }; + // bp0 = { x: p2.x, y: p2.y }; + + d.push([bp1.screen_x, bp1.screen_y]); + d.push([bp2.screen_x, bp2.screen_y]); + d.push([p2.screen_x, p2.screen_y]); + } + + return d; + }; + + /** + * This uses either the chordal or centripetal parameterization of the catmull-rom algorithm. + * By default, the centripetal parameterization is used because this gives the nicest results. + * These parameterizations are relatively heavy because the distance between 4 points have to be calculated. + * + * One optimization can be used to reuse distances since this is a sliding window approach. + * @param data + * @param group + * @returns {string} + * @private + */ + Line._catmullRom = function (data, group) { + var alpha = group.options.interpolation.alpha; + if (alpha == 0 || alpha === undefined) { + return this._catmullRomUniform(data); + } else { + var p0, p1, p2, p3, bp1, bp2, d1, d2, d3, A, B, N, M; + var d3powA, d2powA, d3pow2A, d2pow2A, d1pow2A, d1powA; + var d = []; + d.push([Math.round(data[0].screen_x), Math.round(data[0].screen_y)]); + var length = data.length; + for (var i = 0; i < length - 1; i++) { + + p0 = i == 0 ? data[0] : data[i - 1]; + p1 = data[i]; + p2 = data[i + 1]; + p3 = i + 2 < length ? data[i + 2] : p2; + + d1 = Math.sqrt(Math.pow(p0.screen_x - p1.screen_x, 2) + Math.pow(p0.screen_y - p1.screen_y, 2)); + d2 = Math.sqrt(Math.pow(p1.screen_x - p2.screen_x, 2) + Math.pow(p1.screen_y - p2.screen_y, 2)); + d3 = Math.sqrt(Math.pow(p2.screen_x - p3.screen_x, 2) + Math.pow(p2.screen_y - p3.screen_y, 2)); + + // Catmull-Rom to Cubic Bezier conversion matrix + + // A = 2d1^2a + 3d1^a * d2^a + d3^2a + // B = 2d3^2a + 3d3^a * d2^a + d2^2a + + // [ 0 1 0 0 ] + // [ -d2^2a /N A/N d1^2a /N 0 ] + // [ 0 d3^2a /M B/M -d2^2a /M ] + // [ 0 0 1 0 ] + + d3powA = Math.pow(d3, alpha); + d3pow2A = Math.pow(d3, 2 * alpha); + d2powA = Math.pow(d2, alpha); + d2pow2A = Math.pow(d2, 2 * alpha); + d1powA = Math.pow(d1, alpha); + d1pow2A = Math.pow(d1, 2 * alpha); + + A = 2 * d1pow2A + 3 * d1powA * d2powA + d2pow2A; + B = 2 * d3pow2A + 3 * d3powA * d2powA + d2pow2A; + N = 3 * d1powA * (d1powA + d2powA); + if (N > 0) { + N = 1 / N; + } + M = 3 * d3powA * (d3powA + d2powA); + if (M > 0) { + M = 1 / M; + } + + bp1 = { + screen_x: (-d2pow2A * p0.screen_x + A * p1.screen_x + d1pow2A * p2.screen_x) * N, + screen_y: (-d2pow2A * p0.screen_y + A * p1.screen_y + d1pow2A * p2.screen_y) * N + }; + + bp2 = { + screen_x: (d3pow2A * p1.screen_x + B * p2.screen_x - d2pow2A * p3.screen_x) * M, + screen_y: (d3pow2A * p1.screen_y + B * p2.screen_y - d2pow2A * p3.screen_y) * M + }; + + if (bp1.screen_x == 0 && bp1.screen_y == 0) { + bp1 = p1; + } + if (bp2.screen_x == 0 && bp2.screen_y == 0) { + bp2 = p2; + } + d.push([bp1.screen_x, bp1.screen_y]); + d.push([bp2.screen_x, bp2.screen_y]); + d.push([p2.screen_x, p2.screen_y]); + } + + return d; + } + }; + + /** + * this generates the SVG path for a linear drawing between datapoints. + * @param data + * @returns {string} + * @private + */ + Line._linear = function (data) { + // linear + var d = []; + for (var i = 0; i < data.length; i++) { + d.push([data[i].screen_x, data[i].screen_y]); + } + return d; + }; + + module.exports = Line; + +/***/ }, +/* 56 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + var util = __webpack_require__(1); + var DOMutil = __webpack_require__(7); + var Component = __webpack_require__(25); /** * Legend for Graph2d @@ -25859,7 +27160,7 @@ return /******/ (function(modules) { // webpackBootstrap function Legend(body, options, side, linegraphOptions) { this.body = body; this.defaultOptions = { - enabled: true, + enabled: false, icons: true, iconSize: 20, iconSpacing: 6, @@ -25869,9 +27170,10 @@ return /******/ (function(modules) { // webpackBootstrap }, right: { visible: true, - position: 'top-left' // top/bottom - left,center,right + position: 'top-right' // top/bottom - left,center,right } }; + this.side = side; this.options = util.extend({}, this.defaultOptions); this.linegraphOptions = linegraphOptions; @@ -25881,6 +27183,7 @@ return /******/ (function(modules) { // webpackBootstrap this.groups = {}; this.amountOfGroups = 0; this._create(); + this.framework = { svg: this.svg, svgElements: this.svgElements, options: this.options, groups: this.groups }; this.setOptions(options); } @@ -25894,10 +27197,13 @@ return /******/ (function(modules) { // webpackBootstrap Legend.prototype.addGroup = function (label, graphOptions) { - if (!this.groups.hasOwnProperty(label)) { - this.groups[label] = graphOptions; + // Include a group only if the group option 'excludeFromLegend: false' is not set. + if (graphOptions.options.excludeFromLegend != true) { + if (!this.groups.hasOwnProperty(label)) { + this.groups[label] = graphOptions; + } + this.amountOfGroups += 1; } - this.amountOfGroups += 1; }; Legend.prototype.updateGroup = function (label, graphOptions) { @@ -25914,16 +27220,16 @@ return /******/ (function(modules) { // webpackBootstrap Legend.prototype._create = function () { this.dom.frame = document.createElement('div'); this.dom.frame.className = 'vis-legend'; - this.dom.frame.style.position = 'absolute'; - this.dom.frame.style.top = '10px'; - this.dom.frame.style.display = 'block'; + this.dom.frame.style.position = "absolute"; + this.dom.frame.style.top = "10px"; + this.dom.frame.style.display = "block"; this.dom.textArea = document.createElement('div'); this.dom.textArea.className = 'vis-legend-text'; - this.dom.textArea.style.position = 'relative'; - this.dom.textArea.style.top = '0px'; + this.dom.textArea.style.position = "relative"; + this.dom.textArea.style.top = "0px"; - this.svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg'); + this.svg = document.createElementNS('http://www.w3.org/2000/svg', "svg"); this.svg.style.position = 'absolute'; this.svg.style.top = 0 + 'px'; this.svg.style.width = this.options.iconSize + 5 + 'px'; @@ -25979,16 +27285,16 @@ return /******/ (function(modules) { // webpackBootstrap this.show(); if (this.options[this.side].position == 'top-left' || this.options[this.side].position == 'bottom-left') { this.dom.frame.style.left = '4px'; - this.dom.frame.style.textAlign = 'left'; - this.dom.textArea.style.textAlign = 'left'; + this.dom.frame.style.textAlign = "left"; + this.dom.textArea.style.textAlign = "left"; this.dom.textArea.style.left = this.options.iconSize + 15 + 'px'; this.dom.textArea.style.right = ''; this.svg.style.left = 0 + 'px'; this.svg.style.right = ''; } else { this.dom.frame.style.right = '4px'; - this.dom.frame.style.textAlign = 'right'; - this.dom.textArea.style.textAlign = 'right'; + this.dom.frame.style.textAlign = "right"; + this.dom.textArea.style.textAlign = "right"; this.dom.textArea.style.right = this.options.iconSize + 15 + 'px'; this.dom.textArea.style.left = ''; this.svg.style.right = 0 + 'px'; @@ -25996,11 +27302,11 @@ return /******/ (function(modules) { // webpackBootstrap } if (this.options[this.side].position == 'top-left' || this.options[this.side].position == 'top-right') { - this.dom.frame.style.top = 4 - Number(this.body.dom.center.style.top.replace('px', '')) + 'px'; + this.dom.frame.style.top = 4 - Number(this.body.dom.center.style.top.replace("px", "")) + 'px'; this.dom.frame.style.bottom = ''; } else { var scrollableHeight = this.body.domProps.center.height - this.body.domProps.centerContainer.height; - this.dom.frame.style.bottom = 4 + scrollableHeight + Number(this.body.dom.center.style.top.replace('px', '')) + 'px'; + this.dom.frame.style.bottom = 4 + scrollableHeight + Number(this.body.dom.center.style.top.replace("px", "")) + 'px'; this.dom.frame.style.top = ''; } @@ -26033,7 +27339,9 @@ return /******/ (function(modules) { // webpackBootstrap return a < b ? -1 : 1; }); - DOMutil.prepareElements(this.svgElements); + // this resets the elements so the order is maintained + DOMutil.resetElements(this.svgElements); + var padding = window.getComputedStyle(this.dom.frame).paddingTop; var iconOffset = Number(padding.replace('px', '')); var x = iconOffset; @@ -26046,19 +27354,17 @@ return /******/ (function(modules) { // webpackBootstrap for (var i = 0; i < groupArray.length; i++) { var groupId = groupArray[i]; if (this.groups[groupId].visible == true && (this.linegraphOptions.visibility[groupId] === undefined || this.linegraphOptions.visibility[groupId] == true)) { - this.groups[groupId].drawIcon(x, y, this.svgElements, this.svg, iconWidth, iconHeight); + this.groups[groupId].getLegend(iconWidth, iconHeight, this.framework, x, y); y += iconHeight + this.options.iconSpacing; } } - - DOMutil.cleanupElements(this.svgElements); } }; module.exports = Legend; /***/ }, -/* 58 */ +/* 57 */ /***/ function(module, exports) { /** @@ -26100,12 +27406,14 @@ return /******/ (function(modules) { // webpackBootstrap graphHeight: { string: string, number: number }, shaded: { enabled: { boolean: boolean }, - orientation: { string: ['bottom', 'top'] }, // top, bottom + orientation: { string: ['bottom', 'top', 'zero', 'group'] }, // top, bottom, zero, group + groupId: { object: object }, __type__: { boolean: boolean, object: object } }, style: { string: ['line', 'bar', 'points'] }, // line, bar barChart: { width: { number: number }, + minWidth: { number: number }, sideBySide: { boolean: boolean }, align: { string: ['left', 'center', 'right'] }, __type__: { object: object } @@ -26165,6 +27473,7 @@ return /******/ (function(modules) { // webpackBootstrap }, autoResize: { boolean: boolean }, + throttleRedraw: { number: number }, clickToUse: { boolean: boolean }, end: { number: number, date: date, string: string, moment: moment }, format: { @@ -26192,8 +27501,14 @@ return /******/ (function(modules) { // webpackBootstrap }, __type__: { object: object } }, + moment: { 'function': 'function' }, height: { string: string, number: number }, - hiddenDates: { object: object, array: array }, + hiddenDates: { + start: { date: date, number: number, string: string, moment: moment }, + end: { date: date, number: number, string: string, moment: moment }, + repeat: { string: string }, + __type__: { object: object, array: array } + }, locale: { string: string }, locales: { __any__: { any: any }, @@ -26201,6 +27516,7 @@ return /******/ (function(modules) { // webpackBootstrap }, max: { date: date, number: number, string: string, moment: moment }, maxHeight: { number: number, string: string }, + maxMinorChars: { number: number }, min: { date: date, number: number, string: string, moment: moment }, minHeight: { number: number, string: string }, moveable: { boolean: boolean }, @@ -26220,6 +27536,7 @@ return /******/ (function(modules) { // webpackBootstrap zoomKey: { string: ['ctrlKey', 'altKey', 'metaKey', ''] }, zoomMax: { number: number }, zoomMin: { number: number }, + zIndex: { number: number }, __type__: { object: object } }; @@ -26231,11 +27548,12 @@ return /******/ (function(modules) { // webpackBootstrap stack: false, shaded: { enabled: false, - orientation: ['top', 'bottom'] // top, bottom + orientation: ['zero', 'top', 'bottom', 'group'] // zero, top, bottom }, style: ['line', 'bar', 'points'], // line, bar barChart: { width: [50, 5, 100, 5], + minWidth: [50, 5, 100, 5], sideBySide: false, align: ['left', 'center', 'right'] // left, center, right }, @@ -26280,6 +27598,7 @@ return /******/ (function(modules) { // webpackBootstrap }, autoResize: true, + throttleRedraw: [10, 0, 1000, 10], clickToUse: false, end: '', format: { @@ -26309,6 +27628,7 @@ return /******/ (function(modules) { // webpackBootstrap locale: '', max: '', maxHeight: '', + maxMinorChars: [7, 0, 20, 1], min: '', minHeight: '', moveable: true, @@ -26321,7 +27641,8 @@ return /******/ (function(modules) { // webpackBootstrap zoomable: true, zoomKey: ['ctrlKey', 'altKey', 'metaKey', ''], zoomMax: [315360000000000, 10, 315360000000000, 1], - zoomMin: [10, 10, 315360000000000, 1] + zoomMin: [10, 10, 315360000000000, 1], + zIndex: 0 } }; @@ -26329,7 +27650,7 @@ return /******/ (function(modules) { // webpackBootstrap exports.configureOptions = configureOptions; /***/ }, -/* 59 */ +/* 58 */ /***/ function(module, exports, __webpack_require__) { // Load custom shapes into CanvasRenderingContext2D @@ -26337,76 +27658,67 @@ return /******/ (function(modules) { // webpackBootstrap function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } - var _modulesGroups = __webpack_require__(60); + var _modulesGroups = __webpack_require__(59); var _modulesGroups2 = _interopRequireDefault(_modulesGroups); - var _modulesNodesHandler = __webpack_require__(61); + var _modulesNodesHandler = __webpack_require__(60); var _modulesNodesHandler2 = _interopRequireDefault(_modulesNodesHandler); - var _modulesEdgesHandler = __webpack_require__(81); + var _modulesEdgesHandler = __webpack_require__(80); var _modulesEdgesHandler2 = _interopRequireDefault(_modulesEdgesHandler); - var _modulesPhysicsEngine = __webpack_require__(88); + var _modulesPhysicsEngine = __webpack_require__(89); var _modulesPhysicsEngine2 = _interopRequireDefault(_modulesPhysicsEngine); - var _modulesClustering = __webpack_require__(97); + var _modulesClustering = __webpack_require__(98); var _modulesClustering2 = _interopRequireDefault(_modulesClustering); - var _modulesCanvasRenderer = __webpack_require__(99); + var _modulesCanvasRenderer = __webpack_require__(101); var _modulesCanvasRenderer2 = _interopRequireDefault(_modulesCanvasRenderer); - var _modulesCanvas = __webpack_require__(100); + var _modulesCanvas = __webpack_require__(102); var _modulesCanvas2 = _interopRequireDefault(_modulesCanvas); - var _modulesView = __webpack_require__(101); + var _modulesView = __webpack_require__(103); var _modulesView2 = _interopRequireDefault(_modulesView); - var _modulesInteractionHandler = __webpack_require__(102); + var _modulesInteractionHandler = __webpack_require__(104); var _modulesInteractionHandler2 = _interopRequireDefault(_modulesInteractionHandler); - var _modulesSelectionHandler = __webpack_require__(105); + var _modulesSelectionHandler = __webpack_require__(107); var _modulesSelectionHandler2 = _interopRequireDefault(_modulesSelectionHandler); - var _modulesLayoutEngine = __webpack_require__(106); + var _modulesLayoutEngine = __webpack_require__(108); var _modulesLayoutEngine2 = _interopRequireDefault(_modulesLayoutEngine); - var _modulesManipulationSystem = __webpack_require__(107); + var _modulesManipulationSystem = __webpack_require__(109); var _modulesManipulationSystem2 = _interopRequireDefault(_modulesManipulationSystem); - var _sharedConfigurator = __webpack_require__(45); + var _sharedConfigurator = __webpack_require__(44); var _sharedConfigurator2 = _interopRequireDefault(_sharedConfigurator); - var _sharedValidator = __webpack_require__(47); + var _sharedValidator = __webpack_require__(46); var _sharedValidator2 = _interopRequireDefault(_sharedValidator); - var _optionsJs = __webpack_require__(108); + var _optionsJs = __webpack_require__(110); - __webpack_require__(109); + var _modulesKamadaKawaiJs = __webpack_require__(111); - var Emitter = __webpack_require__(19); - var Hammer = __webpack_require__(3); - var util = __webpack_require__(7); - var DataSet = __webpack_require__(14); - var DataView = __webpack_require__(16); - var dotparser = __webpack_require__(110); - var gephiParser = __webpack_require__(111); - var Images = __webpack_require__(112); - var Activator = __webpack_require__(42); - var locales = __webpack_require__(113); + var _modulesKamadaKawaiJs2 = _interopRequireDefault(_modulesKamadaKawaiJs); /** * @constructor Network @@ -26419,6 +27731,19 @@ return /******/ (function(modules) { // webpackBootstrap * {Array} edges * @param {Object} options Options */ + __webpack_require__(113); + + var Emitter = __webpack_require__(12); + var Hammer = __webpack_require__(20); + var util = __webpack_require__(1); + var DataSet = __webpack_require__(8); + var DataView = __webpack_require__(10); + var dotparser = __webpack_require__(114); + var gephiParser = __webpack_require__(115); + var Images = __webpack_require__(116); + var Activator = __webpack_require__(39); + var locales = __webpack_require__(117); + function Network(container, data, options) { var _this = this; @@ -26471,6 +27796,7 @@ return /******/ (function(modules) { // webpackBootstrap createEdge: function createEdge() {}, getPointer: function getPointer() {} }, + modules: {}, view: { scale: 1, translation: { x: 0, y: 0 } @@ -26482,7 +27808,7 @@ return /******/ (function(modules) { // webpackBootstrap // setting up all modules this.images = new Images(function () { - return _this.body.emitter.emit('_requestRedraw'); + return _this.body.emitter.emit("_requestRedraw"); }); // object with images this.groups = new _modulesGroups2['default'](); // object with groups this.canvas = new _modulesCanvas2['default'](this.body); // DOM handler @@ -26498,6 +27824,9 @@ return /******/ (function(modules) { // webpackBootstrap this.nodesHandler = new _modulesNodesHandler2['default'](this.body, this.images, this.groups, this.layoutEngine); // Handle adding, deleting and updating of nodes as well as global options this.edgesHandler = new _modulesEdgesHandler2['default'](this.body, this.images, this.groups); // Handle adding, deleting and updating of edges as well as global options + this.body.modules["kamadaKawai"] = new _modulesKamadaKawaiJs2['default'](this.body, 150, 0.05); // Layouting algorithm. + this.body.modules["clustering"] = this.clustering; + // create the DOM elements this.canvas._create(); @@ -26519,7 +27848,6 @@ return /******/ (function(modules) { // webpackBootstrap var _this2 = this; if (options !== undefined) { - var errorFound = _sharedValidator2['default'].validate(options, _optionsJs.allOptions); if (errorFound === true) { console.log('%cErrors have been found in the supplied options object.', _sharedValidator.printStyle); @@ -26547,7 +27875,7 @@ return /******/ (function(modules) { // webpackBootstrap // reload the settings of the nodes to apply changes in groups that are not referenced by pointer. if (options.groups !== undefined) { - this.body.emitter.emit('refreshNodes'); + this.body.emitter.emit("refreshNodes"); } // these two do not have options at the moment, here for completeness //this.view.setOptions(options.view); @@ -26588,7 +27916,7 @@ return /******/ (function(modules) { // webpackBootstrap if (this.activator === undefined) { this.activator = new Activator(this.canvas.frame); this.activator.on('change', function () { - _this2.body.emitter.emit('activate'); + _this2.body.emitter.emit("activate"); }); } } else { @@ -26596,15 +27924,15 @@ return /******/ (function(modules) { // webpackBootstrap this.activator.destroy(); delete this.activator; } - this.body.emitter.emit('activate'); + this.body.emitter.emit("activate"); } } else { - this.body.emitter.emit('activate'); + this.body.emitter.emit("activate"); } this.canvas.setSize(); // start the physics simulation. Can be safely called multiple times. - this.body.emitter.emit('startSimulation'); + this.body.emitter.emit("startSimulation"); } }; @@ -26621,7 +27949,7 @@ return /******/ (function(modules) { // webpackBootstrap for (var nodeId in nodes) { if (nodes.hasOwnProperty(nodeId)) { if (nodes[nodeId].options.hidden === false) { - this.body.nodeIndices.push(nodeId); + this.body.nodeIndices.push(nodes[nodeId].id); } } } @@ -26629,7 +27957,7 @@ return /******/ (function(modules) { // webpackBootstrap for (var edgeId in edges) { if (edges.hasOwnProperty(edgeId)) { if (edges[edgeId].options.hidden === false) { - this.body.edgeIndices.push(edgeId); + this.body.edgeIndices.push(edges[edgeId].id); } } } @@ -26642,23 +27970,22 @@ return /******/ (function(modules) { // webpackBootstrap var _this3 = this; // this event will trigger a rebuilding of the cache everything. Used when nodes or edges have been added or removed. - this.body.emitter.on('_dataChanged', function () { + this.body.emitter.on("_dataChanged", function () { // update shortcut lists _this3._updateVisibleIndices(); - _this3.physics.updatePhysicsData(); - _this3.body.emitter.emit('_requestRedraw'); + _this3.body.emitter.emit("_requestRedraw"); // call the dataUpdated event because the only difference between the two is the updating of the indices - _this3.body.emitter.emit('_dataUpdated'); + _this3.body.emitter.emit("_dataUpdated"); }); // this is called when options of EXISTING nodes or edges have changed. - this.body.emitter.on('_dataUpdated', function () { + this.body.emitter.on("_dataUpdated", function () { // update values _this3._updateValueRange(_this3.body.nodes); _this3._updateValueRange(_this3.body.edges); // start simulation (can be called safely, even if already running) - _this3.body.emitter.emit('startSimulation'); - _this3.body.emitter.emit('_requestRedraw'); + _this3.body.emitter.emit("startSimulation"); + _this3.body.emitter.emit("_requestRedraw"); }); }; @@ -26674,8 +28001,8 @@ return /******/ (function(modules) { // webpackBootstrap */ Network.prototype.setData = function (data) { // reset the physics engine. - this.body.emitter.emit('resetPhysics'); - this.body.emitter.emit('_resetData'); + this.body.emitter.emit("resetPhysics"); + this.body.emitter.emit("_resetData"); // unselect all to ensure no selections from old data are carried over. this.selectionHandler.unselectAll(); @@ -26705,10 +28032,13 @@ return /******/ (function(modules) { // webpackBootstrap } // emit change in data - this.body.emitter.emit('_dataChanged'); + this.body.emitter.emit("_dataChanged"); + + // emit data loaded + this.body.emitter.emit("_dataLoaded"); // find a stable position or start animating to a stable position - this.body.emitter.emit('initPhysics'); + this.body.emitter.emit("initPhysics"); }; /** @@ -26718,7 +28048,7 @@ return /******/ (function(modules) { // webpackBootstrap * network = null; */ Network.prototype.destroy = function () { - this.body.emitter.emit('destroy'); + this.body.emitter.emit("destroy"); // clear events this.body.emitter.off(); this.off(); @@ -26843,7 +28173,7 @@ return /******/ (function(modules) { // webpackBootstrap return this.manipulation.editNode.apply(this.manipulation, arguments); }; Network.prototype.editNodeMode = function () { - console.log('Depricated: Please use editNode instead of editNodeMode.');return this.manipulation.editNode.apply(this.manipulation, arguments); + console.log("Deprecated: Please use editNode instead of editNodeMode.");return this.manipulation.editNode.apply(this.manipulation, arguments); }; Network.prototype.addEdgeMode = function () { return this.manipulation.addEdgeMode.apply(this.manipulation, arguments); @@ -26860,6 +28190,9 @@ return /******/ (function(modules) { // webpackBootstrap Network.prototype.storePositions = function () { return this.nodesHandler.storePositions.apply(this.nodesHandler, arguments); }; + Network.prototype.moveNode = function () { + return this.nodesHandler.moveNode.apply(this.nodesHandler, arguments); + }; Network.prototype.getBoundingBox = function () { return this.nodesHandler.getBoundingBox.apply(this.nodesHandler, arguments); }; @@ -26885,6 +28218,9 @@ return /******/ (function(modules) { // webpackBootstrap Network.prototype.getSelection = function () { return this.selectionHandler.getSelection.apply(this.selectionHandler, arguments); }; + Network.prototype.setSelection = function () { + return this.selectionHandler.setSelection.apply(this.selectionHandler, arguments); + }; Network.prototype.getSelectedNodes = function () { return this.selectionHandler.getSelectedNodes.apply(this.selectionHandler, arguments); }; @@ -26912,7 +28248,8 @@ return /******/ (function(modules) { // webpackBootstrap return this.selectionHandler.selectEdges.apply(this.selectionHandler, arguments); }; Network.prototype.unselectAll = function () { - return this.selectionHandler.unselectAll.apply(this.selectionHandler, arguments); + this.selectionHandler.unselectAll.apply(this.selectionHandler, arguments); + this.redraw(); }; Network.prototype.redraw = function () { return this.renderer.redraw.apply(this.renderer, arguments); @@ -26946,7 +28283,7 @@ return /******/ (function(modules) { // webpackBootstrap module.exports = Network; /***/ }, -/* 60 */ +/* 59 */ /***/ function(module, exports, __webpack_require__) { "use strict"; @@ -26959,7 +28296,7 @@ return /******/ (function(modules) { // webpackBootstrap function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - var util = __webpack_require__(7); + var util = __webpack_require__(1); /** * @class Groups @@ -27010,7 +28347,7 @@ return /******/ (function(modules) { // webpackBootstrap _createClass(Groups, [{ key: "setOptions", value: function setOptions(options) { - var optionFields = ["useDefaultGroups"]; + var optionFields = ['useDefaultGroups']; if (options !== undefined) { for (var groupName in options) { @@ -27023,18 +28360,16 @@ return /******/ (function(modules) { // webpackBootstrap } } } - }, { - key: "clear", /** * Clear all groups */ + }, { + key: "clear", value: function clear() { this.groups = {}; this.groupsArray = []; } - }, { - key: "get", /** * get group options of a groupname. If groupname is not found, a new group @@ -27042,6 +28377,8 @@ return /******/ (function(modules) { // webpackBootstrap * @param {*} groupname Can be a number, string, Date, etc. * @return {Object} group The created group, containing all group options */ + }, { + key: "get", value: function get(groupname) { var group = this.groups[groupname]; if (group === undefined) { @@ -27064,8 +28401,6 @@ return /******/ (function(modules) { // webpackBootstrap return group; } - }, { - key: "add", /** * Add a custom group style @@ -27074,6 +28409,8 @@ return /******/ (function(modules) { // webpackBootstrap * backgroundColor, etc. * @return {Object} group The created group object */ + }, { + key: "add", value: function add(groupName, style) { this.groups[groupName] = style; this.groupsArray.push(groupName); @@ -27088,7 +28425,7 @@ return /******/ (function(modules) { // webpackBootstrap module.exports = exports["default"]; /***/ }, -/* 61 */ +/* 60 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; @@ -27103,17 +28440,17 @@ return /******/ (function(modules) { // webpackBootstrap function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } - var _componentsNode = __webpack_require__(62); + var _componentsNode = __webpack_require__(61); var _componentsNode2 = _interopRequireDefault(_componentsNode); - var _componentsSharedLabel = __webpack_require__(63); + var _componentsSharedLabel = __webpack_require__(62); var _componentsSharedLabel2 = _interopRequireDefault(_componentsSharedLabel); - var util = __webpack_require__(7); - var DataSet = __webpack_require__(14); - var DataView = __webpack_require__(16); + var util = __webpack_require__(1); + var DataSet = __webpack_require__(8); + var DataView = __webpack_require__(10); var NodesHandler = (function () { function NodesHandler(body, images, groups, layoutEngine) { @@ -27206,13 +28543,17 @@ return /******/ (function(modules) { // webpackBootstrap }, shadow: { enabled: false, + color: 'rgba(0,0,0,0.5)', size: 10, x: 5, y: 5 }, shape: 'ellipse', shapeProperties: { - borderDashes: false + borderDashes: false, // only for borders + borderRadius: 6, // only for box shape + useImageSize: false, // only for image and circularImage shapes + useBorderWithImage: false // only for image shape }, size: 25, title: undefined, @@ -27234,6 +28575,9 @@ return /******/ (function(modules) { // webpackBootstrap this.body.emitter.on('refreshNodes', this.refresh.bind(this)); this.body.emitter.on('refresh', this.refresh.bind(this)); this.body.emitter.on('destroy', function () { + util.forEach(_this2.nodesListeners, function (callback, event) { + if (_this2.body.data.nodes) _this2.body.data.nodes.off(event, callback); + }); delete _this2.body.functions.createNode; delete _this2.nodesListeners.add; delete _this2.nodesListeners.update; @@ -27256,7 +28600,7 @@ return /******/ (function(modules) { // webpackBootstrap } } - // update the shape size in all nodes + // update the font in all nodes if (options.font !== undefined) { _componentsSharedLabel2['default'].parseOptions(this.options.font, options); for (var nodeId in this.body.nodes) { @@ -27282,14 +28626,14 @@ return /******/ (function(modules) { // webpackBootstrap } } } - }, { - key: 'setData', /** * Set a data set with nodes for the network * @param {Array | DataSet | DataView} nodes The data containing the nodes. * @private */ + }, { + key: 'setData', value: function setData(nodes) { var _this3 = this; @@ -27333,17 +28677,17 @@ return /******/ (function(modules) { // webpackBootstrap } if (doNotEmit === false) { - this.body.emitter.emit('_dataChanged'); + this.body.emitter.emit("_dataChanged"); } } - }, { - key: 'add', /** * Add nodes * @param {Number[] | String[]} ids * @private */ + }, { + key: 'add', value: function add(ids) { var doNotEmit = arguments.length <= 1 || arguments[1] === undefined ? false : arguments[1]; @@ -27360,17 +28704,17 @@ return /******/ (function(modules) { // webpackBootstrap this.layoutEngine.positionInitially(newNodes); if (doNotEmit === false) { - this.body.emitter.emit('_dataChanged'); + this.body.emitter.emit("_dataChanged"); } } - }, { - key: 'update', /** * Update existing nodes, or create them when not yet existing * @param {Number[] | String[]} ids * @private */ + }, { + key: 'update', value: function update(ids, changedData) { var nodes = this.body.nodes; var dataChanged = false; @@ -27389,19 +28733,19 @@ return /******/ (function(modules) { // webpackBootstrap } } if (dataChanged === true) { - this.body.emitter.emit('_dataChanged'); + this.body.emitter.emit("_dataChanged"); } else { - this.body.emitter.emit('_dataUpdated'); + this.body.emitter.emit("_dataUpdated"); } } - }, { - key: 'remove', /** * Remove existing nodes. If nodes do not exist, the method will just ignore it. * @param {Number[] | String[]} ids * @private */ + }, { + key: 'remove', value: function remove(ids) { var nodes = this.body.nodes; @@ -27410,16 +28754,16 @@ return /******/ (function(modules) { // webpackBootstrap delete nodes[id]; } - this.body.emitter.emit('_dataChanged'); + this.body.emitter.emit("_dataChanged"); } - }, { - key: 'create', /** * create a node * @param properties * @param constructorClass */ + }, { + key: 'create', value: function create(properties) { var constructorClass = arguments.length <= 1 || arguments[1] === undefined ? _componentsNode2['default'] : arguments[1]; @@ -27428,6 +28772,8 @@ return /******/ (function(modules) { // webpackBootstrap }, { key: 'refresh', value: function refresh() { + var clearPositions = arguments.length <= 0 || arguments[0] === undefined ? false : arguments[0]; + var nodes = this.body.nodes; for (var nodeId in nodes) { var node = undefined; @@ -27436,19 +28782,22 @@ return /******/ (function(modules) { // webpackBootstrap } var data = this.body.data.nodes._data[nodeId]; if (node !== undefined && data !== undefined) { - node.setOptions({ fixed: false, x: null, y: null }); + if (clearPositions === true) { + node.setOptions({ x: null, y: null }); + } + node.setOptions({ fixed: false }); node.setOptions(data); } } } - }, { - key: 'getPositions', /** * Returns the positions of the nodes. * @param ids --> optional, can be array of nodeIds, can be string * @returns {{}} */ + }, { + key: 'getPositions', value: function getPositions(ids) { var dataArray = {}; if (ids !== undefined) { @@ -27466,21 +28815,19 @@ return /******/ (function(modules) { // webpackBootstrap } } } else { - for (var nodeId in this.body.nodes) { - if (this.body.nodes.hasOwnProperty(nodeId)) { - var node = this.body.nodes[nodeId]; - dataArray[nodeId] = { x: Math.round(node.x), y: Math.round(node.y) }; - } + for (var i = 0; i < this.body.nodeIndices.length; i++) { + var node = this.body.nodes[this.body.nodeIndices[i]]; + dataArray[this.body.nodeIndices[i]] = { x: Math.round(node.x), y: Math.round(node.y) }; } } return dataArray; } - }, { - key: 'storePositions', /** * Load the XY positions of the nodes into the dataset. */ + }, { + key: 'storePositions', value: function storePositions() { // todo: add support for clusters and hierarchical. var dataArray = []; @@ -27490,33 +28837,33 @@ return /******/ (function(modules) { // webpackBootstrap if (dataset._data.hasOwnProperty(nodeId)) { var node = this.body.nodes[nodeId]; if (dataset._data[nodeId].x != Math.round(node.x) || dataset._data[nodeId].y != Math.round(node.y)) { - dataArray.push({ id: nodeId, x: Math.round(node.x), y: Math.round(node.y) }); + dataArray.push({ id: node.id, x: Math.round(node.x), y: Math.round(node.y) }); } } } dataset.update(dataArray); } - }, { - key: 'getBoundingBox', /** * get the bounding box of a node. * @param nodeId * @returns {j|*} */ + }, { + key: 'getBoundingBox', value: function getBoundingBox(nodeId) { if (this.body.nodes[nodeId] !== undefined) { return this.body.nodes[nodeId].shape.boundingBox; } } - }, { - key: 'getConnectedNodes', /** * Get the Ids of nodes connected to this node. * @param nodeId * @returns {Array} */ + }, { + key: 'getConnectedNodes', value: function getConnectedNodes(nodeId) { var nodeList = []; if (this.body.nodes[nodeId] !== undefined) { @@ -27524,13 +28871,13 @@ return /******/ (function(modules) { // webpackBootstrap var nodeObj = {}; // used to quickly check if node already exists for (var i = 0; i < node.edges.length; i++) { var edge = node.edges[i]; - if (edge.toId == nodeId) { + if (edge.toId == node.id) { // these are double equals since ids can be numeric or string if (nodeObj[edge.fromId] === undefined) { nodeList.push(edge.fromId); nodeObj[edge.fromId] = true; } - } else if (edge.fromId == nodeId) { + } else if (edge.fromId == node.id) { // these are double equals since ids can be numeric or string if (nodeObj[edge.toId] === undefined) { nodeList.push(edge.toId); @@ -27541,14 +28888,14 @@ return /******/ (function(modules) { // webpackBootstrap } return nodeList; } - }, { - key: 'getConnectedEdges', /** * Get the ids of the edges connected to this node. * @param nodeId * @returns {*} */ + }, { + key: 'getConnectedEdges', value: function getConnectedEdges(nodeId) { var edgeList = []; if (this.body.nodes[nodeId] !== undefined) { @@ -27557,10 +28904,32 @@ return /******/ (function(modules) { // webpackBootstrap edgeList.push(node.edges[i].id); } } else { - console.log('NodeId provided for getConnectedEdges does not exist. Provided: ', nodeId); + console.log("NodeId provided for getConnectedEdges does not exist. Provided: ", nodeId); } return edgeList; } + + /** + * Move a node. + * @param String nodeId + * @param Number x + * @param Number y + */ + }, { + key: 'moveNode', + value: function moveNode(nodeId, x, y) { + var _this4 = this; + + if (this.body.nodes[nodeId] !== undefined) { + this.body.nodes[nodeId].x = Number(x); + this.body.nodes[nodeId].y = Number(y); + setTimeout(function () { + _this4.body.emitter.emit("startSimulation"); + }, 0); + } else { + console.log("Node id supplied to moveNode does not exist. Provided: ", nodeId); + } + } }]); return NodesHandler; @@ -27570,7 +28939,7 @@ return /******/ (function(modules) { // webpackBootstrap module.exports = exports['default']; /***/ }, -/* 62 */ +/* 61 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; @@ -27585,71 +28954,71 @@ return /******/ (function(modules) { // webpackBootstrap function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } - var _sharedLabel = __webpack_require__(63); + var _sharedLabel = __webpack_require__(62); var _sharedLabel2 = _interopRequireDefault(_sharedLabel); - var _nodesShapesBox = __webpack_require__(64); + var _nodesShapesBox = __webpack_require__(63); var _nodesShapesBox2 = _interopRequireDefault(_nodesShapesBox); - var _nodesShapesCircle = __webpack_require__(66); + var _nodesShapesCircle = __webpack_require__(65); var _nodesShapesCircle2 = _interopRequireDefault(_nodesShapesCircle); - var _nodesShapesCircularImage = __webpack_require__(68); + var _nodesShapesCircularImage = __webpack_require__(67); var _nodesShapesCircularImage2 = _interopRequireDefault(_nodesShapesCircularImage); - var _nodesShapesDatabase = __webpack_require__(69); + var _nodesShapesDatabase = __webpack_require__(68); var _nodesShapesDatabase2 = _interopRequireDefault(_nodesShapesDatabase); - var _nodesShapesDiamond = __webpack_require__(70); + var _nodesShapesDiamond = __webpack_require__(69); var _nodesShapesDiamond2 = _interopRequireDefault(_nodesShapesDiamond); - var _nodesShapesDot = __webpack_require__(72); + var _nodesShapesDot = __webpack_require__(71); var _nodesShapesDot2 = _interopRequireDefault(_nodesShapesDot); - var _nodesShapesEllipse = __webpack_require__(73); + var _nodesShapesEllipse = __webpack_require__(72); var _nodesShapesEllipse2 = _interopRequireDefault(_nodesShapesEllipse); - var _nodesShapesIcon = __webpack_require__(74); + var _nodesShapesIcon = __webpack_require__(73); var _nodesShapesIcon2 = _interopRequireDefault(_nodesShapesIcon); - var _nodesShapesImage = __webpack_require__(75); + var _nodesShapesImage = __webpack_require__(74); var _nodesShapesImage2 = _interopRequireDefault(_nodesShapesImage); - var _nodesShapesSquare = __webpack_require__(76); + var _nodesShapesSquare = __webpack_require__(75); var _nodesShapesSquare2 = _interopRequireDefault(_nodesShapesSquare); - var _nodesShapesStar = __webpack_require__(77); + var _nodesShapesStar = __webpack_require__(76); var _nodesShapesStar2 = _interopRequireDefault(_nodesShapesStar); - var _nodesShapesText = __webpack_require__(78); + var _nodesShapesText = __webpack_require__(77); var _nodesShapesText2 = _interopRequireDefault(_nodesShapesText); - var _nodesShapesTriangle = __webpack_require__(79); + var _nodesShapesTriangle = __webpack_require__(78); var _nodesShapesTriangle2 = _interopRequireDefault(_nodesShapesTriangle); - var _nodesShapesTriangleDown = __webpack_require__(80); + var _nodesShapesTriangleDown = __webpack_require__(79); var _nodesShapesTriangleDown2 = _interopRequireDefault(_nodesShapesTriangleDown); - var _sharedValidator = __webpack_require__(47); + var _sharedValidator = __webpack_require__(46); var _sharedValidator2 = _interopRequireDefault(_sharedValidator); - var util = __webpack_require__(7); + var util = __webpack_require__(1); /** * @class Node @@ -27682,6 +29051,7 @@ return /******/ (function(modules) { // webpackBootstrap _classCallCheck(this, Node); this.options = util.bridgeObject(globalOptions); + this.globalOptions = globalOptions; this.body = body; this.edges = []; // all edges connected to this node @@ -27704,50 +29074,41 @@ return /******/ (function(modules) { // webpackBootstrap this.setOptions(options); } + /** + * Attach a edge to the node + * @param {Edge} edge + */ + _createClass(Node, [{ key: 'attachEdge', - - /** - * Attach a edge to the node - * @param {Edge} edge - */ value: function attachEdge(edge) { if (this.edges.indexOf(edge) === -1) { this.edges.push(edge); } } - }, { - key: 'detachEdge', /** * Detach a edge from the node * @param {Edge} edge */ + }, { + key: 'detachEdge', value: function detachEdge(edge) { var index = this.edges.indexOf(edge); if (index != -1) { this.edges.splice(index, 1); } } - }, { - key: 'togglePhysics', - - /** - * Enable or disable the physics. - * @param status - */ - value: function togglePhysics(status) { - this.options.physics = status; - } - }, { - key: 'setOptions', /** * Set or overwrite options for the node * @param {Object} options an object with options * @param {Object} constants and object with default, global options */ + }, { + key: 'setOptions', value: function setOptions(options) { + var currentShape = this.options.shape; if (!options) { return; } @@ -27757,7 +29118,7 @@ return /******/ (function(modules) { // webpackBootstrap } if (this.id === undefined) { - throw 'Node must have an id'; + throw "Node must have an id"; } // set these options locally @@ -27792,28 +29153,34 @@ return /******/ (function(modules) { // webpackBootstrap } // this transforms all shorthands into fully defined options - Node.parseOptions(this.options, options, true); + Node.parseOptions(this.options, options, true, this.globalOptions); // load the images if (this.options.image !== undefined) { if (this.imagelist) { this.imageObj = this.imagelist.load(this.options.image, this.options.brokenImage, this.id); } else { - throw 'No imagelist provided'; + throw "No imagelist provided"; } } - this.updateShape(); this.updateLabelModule(); - - // reset the size of the node, this can be changed - this._reset(); + this.updateShape(currentShape); if (options.hidden !== undefined || options.physics !== undefined) { return true; } return false; } + + /** + * This process all possible shorthands in the new options and makes sure that the parentOptions are fully defined. + * Static so it can also be used by the handler. + * @param parentOptions + * @param newOptions + * @param allowDeletion + * @param globalOptions + */ }, { key: 'updateLabelModule', value: function updateLabelModule() { @@ -27827,101 +29194,103 @@ return /******/ (function(modules) { // webpackBootstrap } }, { key: 'updateShape', - value: function updateShape() { - // choose draw method depending on the shape - switch (this.options.shape) { - case 'box': - this.shape = new _nodesShapesBox2['default'](this.options, this.body, this.labelModule); - break; - case 'circle': - this.shape = new _nodesShapesCircle2['default'](this.options, this.body, this.labelModule); - break; - case 'circularImage': - this.shape = new _nodesShapesCircularImage2['default'](this.options, this.body, this.labelModule, this.imageObj); - break; - case 'database': - this.shape = new _nodesShapesDatabase2['default'](this.options, this.body, this.labelModule); - break; - case 'diamond': - this.shape = new _nodesShapesDiamond2['default'](this.options, this.body, this.labelModule); - break; - case 'dot': - this.shape = new _nodesShapesDot2['default'](this.options, this.body, this.labelModule); - break; - case 'ellipse': - this.shape = new _nodesShapesEllipse2['default'](this.options, this.body, this.labelModule); - break; - case 'icon': - this.shape = new _nodesShapesIcon2['default'](this.options, this.body, this.labelModule); - break; - case 'image': - this.shape = new _nodesShapesImage2['default'](this.options, this.body, this.labelModule, this.imageObj); - break; - case 'square': - this.shape = new _nodesShapesSquare2['default'](this.options, this.body, this.labelModule); - break; - case 'star': - this.shape = new _nodesShapesStar2['default'](this.options, this.body, this.labelModule); - break; - case 'text': - this.shape = new _nodesShapesText2['default'](this.options, this.body, this.labelModule); - break; - case 'triangle': - this.shape = new _nodesShapesTriangle2['default'](this.options, this.body, this.labelModule); - break; - case 'triangleDown': - this.shape = new _nodesShapesTriangleDown2['default'](this.options, this.body, this.labelModule); - break; - default: - this.shape = new _nodesShapesEllipse2['default'](this.options, this.body, this.labelModule); - break; + value: function updateShape(currentShape) { + if (currentShape === this.options.shape && this.shape) { + this.shape.setOptions(this.options, this.imageObj); + } else { + // choose draw method depending on the shape + switch (this.options.shape) { + case 'box': + this.shape = new _nodesShapesBox2['default'](this.options, this.body, this.labelModule); + break; + case 'circle': + this.shape = new _nodesShapesCircle2['default'](this.options, this.body, this.labelModule); + break; + case 'circularImage': + this.shape = new _nodesShapesCircularImage2['default'](this.options, this.body, this.labelModule, this.imageObj); + break; + case 'database': + this.shape = new _nodesShapesDatabase2['default'](this.options, this.body, this.labelModule); + break; + case 'diamond': + this.shape = new _nodesShapesDiamond2['default'](this.options, this.body, this.labelModule); + break; + case 'dot': + this.shape = new _nodesShapesDot2['default'](this.options, this.body, this.labelModule); + break; + case 'ellipse': + this.shape = new _nodesShapesEllipse2['default'](this.options, this.body, this.labelModule); + break; + case 'icon': + this.shape = new _nodesShapesIcon2['default'](this.options, this.body, this.labelModule); + break; + case 'image': + this.shape = new _nodesShapesImage2['default'](this.options, this.body, this.labelModule, this.imageObj); + break; + case 'square': + this.shape = new _nodesShapesSquare2['default'](this.options, this.body, this.labelModule); + break; + case 'star': + this.shape = new _nodesShapesStar2['default'](this.options, this.body, this.labelModule); + break; + case 'text': + this.shape = new _nodesShapesText2['default'](this.options, this.body, this.labelModule); + break; + case 'triangle': + this.shape = new _nodesShapesTriangle2['default'](this.options, this.body, this.labelModule); + break; + case 'triangleDown': + this.shape = new _nodesShapesTriangleDown2['default'](this.options, this.body, this.labelModule); + break; + default: + this.shape = new _nodesShapesEllipse2['default'](this.options, this.body, this.labelModule); + break; + } } this._reset(); } - }, { - key: 'select', /** * select this node */ + }, { + key: 'select', value: function select() { this.selected = true; this._reset(); } - }, { - key: 'unselect', /** * unselect this node */ + }, { + key: 'unselect', value: function unselect() { this.selected = false; this._reset(); } - }, { - key: '_reset', /** * Reset the calculated size of the node, forces it to recalculate its size * @private */ + }, { + key: '_reset', value: function _reset() { this.shape.width = undefined; this.shape.height = undefined; } - }, { - key: 'getTitle', /** * get the title of this node. * @return {string} title The title of the node, or undefined when no title * has been set. */ + }, { + key: 'getTitle', value: function getTitle() { return this.options.title; } - }, { - key: 'distanceToBorder', /** * Calculate the distance to the border of the Node @@ -27929,41 +29298,41 @@ return /******/ (function(modules) { // webpackBootstrap * @param {Number} angle Angle in radians * @returns {number} distance Distance to the border in pixels */ + }, { + key: 'distanceToBorder', value: function distanceToBorder(ctx, angle) { return this.shape.distanceToBorder(ctx, angle); } - }, { - key: 'isFixed', /** * Check if this node has a fixed x and y position * @return {boolean} true if fixed, false if not */ + }, { + key: 'isFixed', value: function isFixed() { return this.options.fixed.x && this.options.fixed.y; } - }, { - key: 'isSelected', /** * check if this node is selecte * @return {boolean} selected True if node is selected, else false */ + }, { + key: 'isSelected', value: function isSelected() { return this.selected; } - }, { - key: 'getValue', /** * Retrieve the value of the node. Can be undefined * @return {Number} value */ + }, { + key: 'getValue', value: function getValue() { return this.options.value; } - }, { - key: 'setValueRange', /** * Adjust the value range of the node. The node will adjust it's size @@ -27971,6 +29340,8 @@ return /******/ (function(modules) { // webpackBootstrap * @param {Number} min * @param {Number} max */ + }, { + key: 'setValueRange', value: function setValueRange(min, max, total) { if (this.options.value !== undefined) { var scale = this.options.scaling.customScalingFunction(min, max, total, this.options.value); @@ -27984,85 +29355,80 @@ return /******/ (function(modules) { // webpackBootstrap this.options.size = this.baseSize; this.options.font.size = this.baseFontSize; } + + this.updateLabelModule(); } - }, { - key: 'draw', /** * Draw this node in the given canvas * The 2d context of a HTML canvas can be retrieved by canvas.getContext("2d"); * @param {CanvasRenderingContext2D} ctx */ + }, { + key: 'draw', value: function draw(ctx) { this.shape.draw(ctx, this.x, this.y, this.selected, this.hover); } - }, { - key: 'updateBoundingBox', /** * Update the bounding box of the shape */ + }, { + key: 'updateBoundingBox', value: function updateBoundingBox(ctx) { this.shape.updateBoundingBox(this.x, this.y, ctx); } - }, { - key: 'resize', /** * Recalculate the size of this node in the given canvas * The 2d context of a HTML canvas can be retrieved by canvas.getContext("2d"); * @param {CanvasRenderingContext2D} ctx */ + }, { + key: 'resize', value: function resize(ctx) { this.shape.resize(ctx, this.selected); } - }, { - key: 'isOverlappingWith', /** * Check if this object is overlapping with the provided object * @param {Object} obj an object with parameters left, top, right, bottom * @return {boolean} True if location is located on node */ + }, { + key: 'isOverlappingWith', value: function isOverlappingWith(obj) { return this.shape.left < obj.right && this.shape.left + this.shape.width > obj.left && this.shape.top < obj.bottom && this.shape.top + this.shape.height > obj.top; } - }, { - key: 'isBoundingBoxOverlappingWith', /** * Check if this object is overlapping with the provided object * @param {Object} obj an object with parameters left, top, right, bottom * @return {boolean} True if location is located on node */ + }, { + key: 'isBoundingBoxOverlappingWith', value: function isBoundingBoxOverlappingWith(obj) { return this.shape.boundingBox.left < obj.right && this.shape.boundingBox.right > obj.left && this.shape.boundingBox.top < obj.bottom && this.shape.boundingBox.bottom > obj.top; } }], [{ key: 'parseOptions', - - /** - * This process all possible shorthands in the new options and makes sure that the parentOptions are fully defined. - * Static so it can also be used by the handler. - * @param parentOptions - * @param newOptions - */ value: function parseOptions(parentOptions, newOptions) { var allowDeletion = arguments.length <= 2 || arguments[2] === undefined ? false : arguments[2]; + var globalOptions = arguments.length <= 3 || arguments[3] === undefined ? {} : arguments[3]; var fields = ['color', 'font', 'fixed', 'shadow']; util.selectiveNotDeepExtend(fields, parentOptions, newOptions, allowDeletion); // merge the shadow options into the parent. - util.mergeOptions(parentOptions, newOptions, 'shadow'); + util.mergeOptions(parentOptions, newOptions, 'shadow', allowDeletion, globalOptions); // individual shape newOptions if (newOptions.color !== undefined && newOptions.color !== null) { var parsedColor = util.parseColor(newOptions.color); util.fillIfDefined(parentOptions.color, parsedColor); } else if (allowDeletion === true && newOptions.color === null) { - parentOptions.color = undefined; - delete parentOptions.color; + parentOptions.color = util.bridgeObject(globalOptions.color); // set the object back to the global options } // handle the fixed options @@ -28081,13 +29447,15 @@ return /******/ (function(modules) { // webpackBootstrap } // handle the font options - if (newOptions.font !== undefined) { + if (newOptions.font !== undefined && newOptions.font !== null) { _sharedLabel2['default'].parseOptions(parentOptions.font, newOptions); + } else if (allowDeletion === true && newOptions.font === null) { + parentOptions.font = util.bridgeObject(globalOptions.font); // set the object back to the global options } // handle the scaling options, specifically the label part if (newOptions.scaling !== undefined) { - util.mergeOptions(parentOptions.scaling, newOptions.scaling, 'label'); + util.mergeOptions(parentOptions.scaling, newOptions.scaling, 'label', allowDeletion, globalOptions.scaling); } } }]); @@ -28099,7 +29467,7 @@ return /******/ (function(modules) { // webpackBootstrap module.exports = exports['default']; /***/ }, -/* 63 */ +/* 62 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; @@ -28114,7 +29482,7 @@ return /******/ (function(modules) { // webpackBootstrap function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } - var util = __webpack_require__(7); + var util = __webpack_require__(1); var Label = (function () { function Label(body, options) { @@ -28124,6 +29492,7 @@ return /******/ (function(modules) { // webpackBootstrap this.pointToSelf = false; this.baseSize = undefined; + this.fontOptions = {}; this.setOptions(options); this.size = { top: 0, left: 0, width: 0, height: 0, yLine: 0 }; // could be cached } @@ -28133,16 +29502,20 @@ return /******/ (function(modules) { // webpackBootstrap value: function setOptions(options) { var allowDeletion = arguments.length <= 1 || arguments[1] === undefined ? false : arguments[1]; - this.options = options; + this.nodeOptions = options; + + // We want to keep the font options seperated from the node options. + // The node options have to mirror the globals when they are not overruled. + this.fontOptions = util.deepExtend({}, options.font, true); if (options.label !== undefined) { this.labelDirty = true; } if (options.font !== undefined) { - Label.parseOptions(this.options.font, options, allowDeletion); + Label.parseOptions(this.fontOptions, options, allowDeletion); if (typeof options.font === 'string') { - this.baseSize = this.options.font.size; + this.baseSize = this.fontOptions.size; } else if (typeof options.font === 'object') { if (options.font.size !== undefined) { this.baseSize = options.font.size; @@ -28165,11 +29538,11 @@ return /******/ (function(modules) { // webpackBootstrap var baseline = arguments.length <= 4 || arguments[4] === undefined ? 'middle' : arguments[4]; // if no label, return - if (this.options.label === undefined) return; + if (this.nodeOptions.label === undefined) return; // check if we have to render the label - var viewFontSize = this.options.font.size * this.body.view.scale; - if (this.options.label && viewFontSize < this.options.scaling.label.drawThreshold - 1) return; + var viewFontSize = this.fontOptions.size * this.body.view.scale; + if (this.nodeOptions.label && viewFontSize < this.nodeOptions.scaling.label.drawThreshold - 1) return; // update the size cache if required this.calculateLabelSize(ctx, selected, x, y, baseline); @@ -28179,21 +29552,21 @@ return /******/ (function(modules) { // webpackBootstrap // draw text this._drawText(ctx, selected, x, y, baseline); } - }, { - key: '_drawBackground', /** * Draws the label background * @param {CanvasRenderingContext2D} ctx * @private */ + }, { + key: '_drawBackground', value: function _drawBackground(ctx) { - if (this.options.font.background !== undefined && this.options.font.background !== 'none') { - ctx.fillStyle = this.options.font.background; + if (this.fontOptions.background !== undefined && this.fontOptions.background !== "none") { + ctx.fillStyle = this.fontOptions.background; var lineMargin = 2; - switch (this.options.font.align) { + switch (this.fontOptions.align) { case 'middle': ctx.fillRect(-this.size.width * 0.5, -this.size.height * 0.5, this.size.width, this.size.height); break; @@ -28209,8 +29582,6 @@ return /******/ (function(modules) { // webpackBootstrap } } } - }, { - key: '_drawText', /** * @@ -28219,14 +29590,16 @@ return /******/ (function(modules) { // webpackBootstrap * @param baseline * @private */ + }, { + key: '_drawText', value: function _drawText(ctx, selected, x, y) { var baseline = arguments.length <= 4 || arguments[4] === undefined ? 'middle' : arguments[4]; - var fontSize = this.options.font.size; + var fontSize = this.fontOptions.size; var viewFontSize = fontSize * this.body.view.scale; // this ensures that there will not be HUGE letters on screen by setting an upper limit on the visible text size (regardless of zoomLevel) - if (viewFontSize >= this.options.scaling.label.maxVisible) { - fontSize = Number(this.options.scaling.label.maxVisible) / this.body.view.scale; + if (viewFontSize >= this.nodeOptions.scaling.label.maxVisible) { + fontSize = Number(this.nodeOptions.scaling.label.maxVisible) / this.body.view.scale; } var yLine = this.size.yLine; @@ -28238,28 +29611,28 @@ return /******/ (function(modules) { // webpackBootstrap var fontColor = _getColor22[0]; var strokeColor = _getColor22[1]; + // configure context for drawing the text + var _setAlignment2 = this._setAlignment(ctx, x, yLine, baseline); var _setAlignment22 = _slicedToArray(_setAlignment2, 2); x = _setAlignment22[0]; yLine = _setAlignment22[1]; - - // configure context for drawing the text - ctx.font = (selected && this.options.labelHighlightBold ? 'bold ' : '') + fontSize + 'px ' + this.options.font.face; + ctx.font = (selected && this.nodeOptions.labelHighlightBold ? 'bold ' : '') + fontSize + "px " + this.fontOptions.face; ctx.fillStyle = fontColor; ctx.textAlign = 'center'; // set the strokeWidth - if (this.options.font.strokeWidth > 0) { - ctx.lineWidth = this.options.font.strokeWidth; + if (this.fontOptions.strokeWidth > 0) { + ctx.lineWidth = this.fontOptions.strokeWidth; ctx.strokeStyle = strokeColor; ctx.lineJoin = 'round'; } // draw the text for (var i = 0; i < this.lineCount; i++) { - if (this.options.font.strokeWidth > 0) { + if (this.fontOptions.strokeWidth > 0) { ctx.strokeText(this.lines[i], x, yLine); } ctx.fillText(this.lines[i], x, yLine); @@ -28271,28 +29644,26 @@ return /******/ (function(modules) { // webpackBootstrap value: function _setAlignment(ctx, x, yLine, baseline) { // check for label alignment (for edges) // TODO: make alignment for nodes - if (this.options.font.align !== 'horizontal' && this.pointToSelf === false) { + if (this.fontOptions.align !== 'horizontal' && this.pointToSelf === false) { x = 0; yLine = 0; var lineMargin = 2; - if (this.options.font.align === 'top') { + if (this.fontOptions.align === 'top') { ctx.textBaseline = 'alphabetic'; yLine -= 2 * lineMargin; // distance from edge, required because we use alphabetic. Alphabetic has less difference between browsers - } else if (this.options.font.align === 'bottom') { - ctx.textBaseline = 'hanging'; - yLine += 2 * lineMargin; // distance from edge, required because we use hanging. Hanging has less difference between browsers - } else { - ctx.textBaseline = 'middle'; - } + } else if (this.fontOptions.align === 'bottom') { + ctx.textBaseline = 'hanging'; + yLine += 2 * lineMargin; // distance from edge, required because we use hanging. Hanging has less difference between browsers + } else { + ctx.textBaseline = 'middle'; + } } else { ctx.textBaseline = baseline; } return [x, yLine]; } - }, { - key: '_getColor', /** * fade in when relative scale is between threshold and threshold - 1. @@ -28302,18 +29673,18 @@ return /******/ (function(modules) { // webpackBootstrap * @returns {*[]} * @private */ + }, { + key: '_getColor', value: function _getColor(viewFontSize) { - var fontColor = this.options.font.color || '#000000'; - var strokeColor = this.options.font.strokeColor || '#ffffff'; - if (viewFontSize <= this.options.scaling.label.drawThreshold) { - var opacity = Math.max(0, Math.min(1, 1 - (this.options.scaling.label.drawThreshold - viewFontSize))); + var fontColor = this.fontOptions.color || '#000000'; + var strokeColor = this.fontOptions.strokeColor || '#ffffff'; + if (viewFontSize <= this.nodeOptions.scaling.label.drawThreshold) { + var opacity = Math.max(0, Math.min(1, 1 - (this.nodeOptions.scaling.label.drawThreshold - viewFontSize))); fontColor = util.overrideOpacity(fontColor, opacity); strokeColor = util.overrideOpacity(strokeColor, opacity); } return [fontColor, strokeColor]; } - }, { - key: 'getTextSize', /** * @@ -28321,18 +29692,18 @@ return /******/ (function(modules) { // webpackBootstrap * @param selected * @returns {{width: number, height: number}} */ + }, { + key: 'getTextSize', value: function getTextSize(ctx) { var selected = arguments.length <= 1 || arguments[1] === undefined ? false : arguments[1]; var size = { width: this._processLabel(ctx, selected), - height: this.options.font.size * this.lineCount, + height: this.fontOptions.size * this.lineCount, lineCount: this.lineCount }; return size; } - }, { - key: 'calculateLabelSize', /** * @@ -28342,6 +29713,8 @@ return /******/ (function(modules) { // webpackBootstrap * @param y * @param baseline */ + }, { + key: 'calculateLabelSize', value: function calculateLabelSize(ctx, selected) { var x = arguments.length <= 2 || arguments[2] === undefined ? 0 : arguments[2]; var y = arguments.length <= 3 || arguments[3] === undefined ? 0 : arguments[3]; @@ -28350,20 +29723,18 @@ return /******/ (function(modules) { // webpackBootstrap if (this.labelDirty === true) { this.size.width = this._processLabel(ctx, selected); } - this.size.height = this.options.font.size * this.lineCount; + this.size.height = this.fontOptions.size * this.lineCount; this.size.left = x - this.size.width * 0.5; this.size.top = y - this.size.height * 0.5; - this.size.yLine = y + (1 - this.lineCount) * 0.5 * this.options.font.size; - if (baseline === 'hanging') { - this.size.top += 0.5 * this.options.font.size; + this.size.yLine = y + (1 - this.lineCount) * 0.5 * this.fontOptions.size; + if (baseline === "hanging") { + this.size.top += 0.5 * this.fontOptions.size; this.size.top += 4; // distance from node, required because we use hanging. Hanging has less difference between browsers this.size.yLine += 4; // distance from node } this.labelDirty = false; } - }, { - key: '_processLabel', /** * This calculates the width as well as explodes the label string and calculates the amount of lines. @@ -28372,14 +29743,16 @@ return /******/ (function(modules) { // webpackBootstrap * @returns {number} * @private */ + }, { + key: '_processLabel', value: function _processLabel(ctx, selected) { var width = 0; var lines = ['']; var lineCount = 0; - if (this.options.label !== undefined) { - lines = String(this.options.label).split('\n'); + if (this.nodeOptions.label !== undefined) { + lines = String(this.nodeOptions.label).split('\n'); lineCount = lines.length; - ctx.font = (selected && this.options.labelHighlightBold ? 'bold ' : '') + this.options.font.size + 'px ' + this.options.font.face; + ctx.font = (selected && this.nodeOptions.labelHighlightBold ? 'bold ' : '') + this.fontOptions.size + "px " + this.fontOptions.face; width = ctx.measureText(lines[0]).width; for (var i = 1; i < lineCount; i++) { var lineWidth = ctx.measureText(lines[i]).width; @@ -28397,8 +29770,8 @@ return /******/ (function(modules) { // webpackBootstrap var allowDeletion = arguments.length <= 2 || arguments[2] === undefined ? false : arguments[2]; if (typeof newOptions.font === 'string') { - var newOptionsArray = newOptions.font.split(' '); - parentOptions.size = newOptionsArray[0].replace('px', ''); + var newOptionsArray = newOptions.font.split(" "); + parentOptions.size = newOptionsArray[0].replace("px", ''); parentOptions.face = newOptionsArray[1]; parentOptions.color = newOptionsArray[2]; } else if (typeof newOptions.font === 'object') { @@ -28415,7 +29788,7 @@ return /******/ (function(modules) { // webpackBootstrap module.exports = exports['default']; /***/ }, -/* 64 */ +/* 63 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; @@ -28426,15 +29799,15 @@ return /******/ (function(modules) { // webpackBootstrap var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); - var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; desc = parent = getter = undefined; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; + var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } - function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) subClass.__proto__ = superClass; } + function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - var _utilNodeBase = __webpack_require__(65); + var _utilNodeBase = __webpack_require__(64); var _utilNodeBase2 = _interopRequireDefault(_utilNodeBase); @@ -28475,45 +29848,51 @@ return /******/ (function(modules) { // webpackBootstrap ctx.fillStyle = selected ? this.options.color.highlight.background : hover ? this.options.color.hover.background : this.options.color.background; - var borderRadius = 6; + var borderRadius = this.options.shapeProperties.borderRadius; // only effective for box ctx.roundRect(this.left, this.top, this.width, this.height, borderRadius); - //draw dashed border if enabled - this.enableBorderDashes(ctx); // draw shadow if enabled this.enableShadow(ctx); + // draw the background ctx.fill(); - - //disable dashed border for other elements - this.disableBorderDashes(ctx); // disable shadows for other elements. this.disableShadow(ctx); - ctx.stroke(); + //draw dashed border if enabled, save and restore is required for firefox not to crash on unix. + ctx.save(); + // if borders are zero width, they will be drawn with width 1 by default. This prevents that + if (borderWidth > 0) { + this.enableBorderDashes(ctx); + //draw the border + ctx.stroke(); + //disable dashed border for other elements + this.disableBorderDashes(ctx); + } + ctx.restore(); - this.updateBoundingBox(x, y); + this.updateBoundingBox(x, y, ctx, selected); this.labelModule.draw(ctx, x, y, selected); } }, { key: 'updateBoundingBox', - value: function updateBoundingBox(x, y) { + value: function updateBoundingBox(x, y, ctx, selected) { + this.resize(ctx, selected); this.left = x - this.width * 0.5; this.top = y - this.height * 0.5; - this.boundingBox.left = this.left; - this.boundingBox.top = this.top; - this.boundingBox.bottom = this.top + this.height; - this.boundingBox.right = this.left + this.width; + var borderRadius = this.options.shapeProperties.borderRadius; // only effective for box + this.boundingBox.left = this.left - borderRadius; + this.boundingBox.top = this.top - borderRadius; + this.boundingBox.bottom = this.top + this.height + borderRadius; + this.boundingBox.right = this.left + this.width + borderRadius; } }, { key: 'distanceToBorder', value: function distanceToBorder(ctx, angle) { this.resize(ctx); - var a = this.width / 2; - var b = this.height / 2; - var w = Math.sin(angle) * a; - var h = Math.cos(angle) * b; - return a * b / Math.sqrt(w * w + h * h); + var borderWidth = this.options.borderWidth; + + return Math.min(Math.abs(this.width / 2 / Math.cos(angle)), Math.abs(this.height / 2 / Math.sin(angle))) + borderWidth; } }]); @@ -28524,18 +29903,18 @@ return /******/ (function(modules) { // webpackBootstrap module.exports = exports['default']; /***/ }, -/* 65 */ +/* 64 */ /***/ function(module, exports) { - 'use strict'; + "use strict"; - Object.defineProperty(exports, '__esModule', { + Object.defineProperty(exports, "__esModule", { value: true }); - var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); + var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); - function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } + function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var NodeBase = (function () { function NodeBase(options, body, labelModule) { @@ -28553,28 +29932,29 @@ return /******/ (function(modules) { // webpackBootstrap } _createClass(NodeBase, [{ - key: 'setOptions', + key: "setOptions", value: function setOptions(options) { this.options = options; } }, { - key: '_distanceToBorder', - value: function _distanceToBorder(angle) { - var borderWidth = 1; + key: "_distanceToBorder", + value: function _distanceToBorder(ctx, angle) { + var borderWidth = this.options.borderWidth; + this.resize(ctx); return Math.min(Math.abs(this.width / 2 / Math.cos(angle)), Math.abs(this.height / 2 / Math.sin(angle))) + borderWidth; } }, { - key: 'enableShadow', + key: "enableShadow", value: function enableShadow(ctx) { if (this.options.shadow.enabled === true) { - ctx.shadowColor = 'rgba(0,0,0,0.5)'; + ctx.shadowColor = this.options.shadow.color; ctx.shadowBlur = this.options.shadow.size; ctx.shadowOffsetX = this.options.shadow.x; ctx.shadowOffsetY = this.options.shadow.y; } } }, { - key: 'disableShadow', + key: "disableShadow", value: function disableShadow(ctx) { if (this.options.shadow.enabled === true) { ctx.shadowColor = 'rgba(0,0,0,0)'; @@ -28584,17 +29964,31 @@ return /******/ (function(modules) { // webpackBootstrap } } }, { - key: 'enableBorderDashes', + key: "enableBorderDashes", value: function enableBorderDashes(ctx) { if (this.options.shapeProperties.borderDashes !== false) { - ctx.setLineDash(this.options.shapeProperties.borderDashes); + if (ctx.setLineDash !== undefined) { + var dashes = this.options.shapeProperties.borderDashes; + if (dashes === true) { + dashes = [5, 15]; + } + ctx.setLineDash(dashes); + } else { + console.warn("setLineDash is not supported in this browser. The dashed borders cannot be used."); + this.options.shapeProperties.borderDashes = false; + } } } }, { - key: 'disableBorderDashes', + key: "disableBorderDashes", value: function disableBorderDashes(ctx) { - if (this.options.shapeProperties.borderDashes == false) { - ctx.setLineDash([0]); + if (this.options.shapeProperties.borderDashes !== false) { + if (ctx.setLineDash !== undefined) { + ctx.setLineDash([0]); + } else { + console.warn("setLineDash is not supported in this browser. The dashed borders cannot be used."); + this.options.shapeProperties.borderDashes = false; + } } } }]); @@ -28602,11 +29996,11 @@ return /******/ (function(modules) { // webpackBootstrap return NodeBase; })(); - exports['default'] = NodeBase; - module.exports = exports['default']; + exports["default"] = NodeBase; + module.exports = exports["default"]; /***/ }, -/* 66 */ +/* 65 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; @@ -28617,15 +30011,15 @@ return /******/ (function(modules) { // webpackBootstrap var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); - var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; desc = parent = getter = undefined; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; + var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } - function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) subClass.__proto__ = superClass; } + function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - var _utilCircleImageBase = __webpack_require__(67); + var _utilCircleImageBase = __webpack_require__(66); var _utilCircleImageBase2 = _interopRequireDefault(_utilCircleImageBase); @@ -28681,11 +30075,7 @@ return /******/ (function(modules) { // webpackBootstrap key: 'distanceToBorder', value: function distanceToBorder(ctx, angle) { this.resize(ctx); - var a = this.width / 2; - var b = this.height / 2; - var w = Math.sin(angle) * a; - var h = Math.cos(angle) * b; - return a * b / Math.sqrt(w * w + h * h); + return this.width * 0.5; } }]); @@ -28696,7 +30086,7 @@ return /******/ (function(modules) { // webpackBootstrap module.exports = exports['default']; /***/ }, -/* 67 */ +/* 66 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; @@ -28707,15 +30097,15 @@ return /******/ (function(modules) { // webpackBootstrap var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); - var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; desc = parent = getter = undefined; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; + var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } - function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) subClass.__proto__ = superClass; } + function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - var _utilNodeBase = __webpack_require__(65); + var _utilNodeBase = __webpack_require__(64); var _utilNodeBase2 = _interopRequireDefault(_utilNodeBase); @@ -28731,7 +30121,13 @@ return /******/ (function(modules) { // webpackBootstrap } _createClass(CircleImageBase, [{ - key: '_resizeImage', + key: 'setOptions', + value: function setOptions(options, imageObj) { + this.options = options; + if (imageObj) { + this.imageObj = imageObj; + } + } /** * This function resizes the image by the options size when the image has not yet loaded. If the image has loaded, we @@ -28739,6 +30135,8 @@ return /******/ (function(modules) { // webpackBootstrap * * @private */ + }, { + key: '_resizeImage', value: function _resizeImage() { var force = false; if (!this.imageObj.width || !this.imageObj.height) { @@ -28757,19 +30155,25 @@ return /******/ (function(modules) { // webpackBootstrap width = 0; height = 0; } - if (this.imageObj.width > this.imageObj.height) { - ratio = this.imageObj.width / this.imageObj.height; - width = this.options.size * 2 * ratio || this.imageObj.width; - height = this.options.size * 2 || this.imageObj.height; - } else { - if (this.imageObj.width && this.imageObj.height) { - // not undefined or 0 - ratio = this.imageObj.height / this.imageObj.width; + if (this.options.shapeProperties.useImageSize === false) { + if (this.imageObj.width > this.imageObj.height) { + ratio = this.imageObj.width / this.imageObj.height; + width = this.options.size * 2 * ratio || this.imageObj.width; + height = this.options.size * 2 || this.imageObj.height; } else { - ratio = 1; + if (this.imageObj.width && this.imageObj.height) { + // not undefined or 0 + ratio = this.imageObj.height / this.imageObj.width; + } else { + ratio = 1; + } + width = this.options.size * 2; + height = this.options.size * 2 * ratio; } - width = this.options.size * 2 || this.imageObj.width; - height = this.options.size * 2 * ratio || this.imageObj.height; + } else { + // when not using the size property, we use the image size + width = this.imageObj.width; + height = this.imageObj.height; } this.width = width; this.height = height; @@ -28779,29 +30183,33 @@ return /******/ (function(modules) { // webpackBootstrap }, { key: '_drawRawCircle', value: function _drawRawCircle(ctx, x, y, selected, hover, size) { - var borderWidth = this.options.borderWidth; + var neutralborderWidth = this.options.borderWidth; var selectionLineWidth = this.options.borderWidthSelected || 2 * this.options.borderWidth; + var borderWidth = (selected ? selectionLineWidth : neutralborderWidth) / this.body.view.scale; + ctx.lineWidth = Math.min(this.width, borderWidth); ctx.strokeStyle = selected ? this.options.color.highlight.border : hover ? this.options.color.hover.border : this.options.color.border; - - ctx.lineWidth = selected ? selectionLineWidth : borderWidth; - ctx.lineWidth *= this.networkScaleInv; - ctx.lineWidth = Math.min(this.width, ctx.lineWidth); ctx.fillStyle = selected ? this.options.color.highlight.background : hover ? this.options.color.hover.background : this.options.color.background; ctx.circle(x, y, size); - //draw dashed border if enabled - this.enableBorderDashes(ctx); // draw shadow if enabled this.enableShadow(ctx); + // draw the background ctx.fill(); - - //disable dashed border for other elements - this.disableBorderDashes(ctx); // disable shadows for other elements. this.disableShadow(ctx); - ctx.stroke(); + //draw dashed border if enabled, save and restore is required for firefox not to crash on unix. + ctx.save(); + // if borders are zero width, they will be drawn with width 1 by default. This prevents that + if (borderWidth > 0) { + this.enableBorderDashes(ctx); + //draw the border + ctx.stroke(); + //disable dashed border for other elements + this.disableBorderDashes(ctx); + } + ctx.restore(); } }, { key: '_drawImageAtPosition', @@ -28812,6 +30220,8 @@ return /******/ (function(modules) { // webpackBootstrap // draw shadow if enabled this.enableShadow(ctx); + + // draw image ctx.drawImage(this.imageObj, this.left, this.top, this.width, this.height); // disable shadows for other elements. @@ -28848,7 +30258,7 @@ return /******/ (function(modules) { // webpackBootstrap module.exports = exports['default']; /***/ }, -/* 68 */ +/* 67 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; @@ -28859,15 +30269,15 @@ return /******/ (function(modules) { // webpackBootstrap var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); - var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; desc = parent = getter = undefined; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; + var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } - function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) subClass.__proto__ = superClass; } + function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - var _utilCircleImageBase = __webpack_require__(67); + var _utilCircleImageBase = __webpack_require__(66); var _utilCircleImageBase2 = _interopRequireDefault(_utilCircleImageBase); @@ -28912,15 +30322,16 @@ return /******/ (function(modules) { // webpackBootstrap var size = Math.min(0.5 * this.height, 0.5 * this.width); + // draw the background circle. IMPORTANT: the stroke in this method is used by the clip method below. this._drawRawCircle(ctx, x, y, selected, hover, size); + // now we draw in the circle, we save so we can revert the clip operation after drawing. ctx.save(); - ctx.circle(x, y, size); - ctx.stroke(); + // clip is used to use the stroke in drawRawCircle as an area that we can draw in. ctx.clip(); - + // draw the image this._drawImageAtPosition(ctx); - + // restore so we can again draw on the full canvas ctx.restore(); this._drawImageLabel(ctx, x, y, selected); @@ -28942,7 +30353,7 @@ return /******/ (function(modules) { // webpackBootstrap key: 'distanceToBorder', value: function distanceToBorder(ctx, angle) { this.resize(ctx); - return this._distanceToBorder(angle); + return this.width * 0.5; } }]); @@ -28953,7 +30364,7 @@ return /******/ (function(modules) { // webpackBootstrap module.exports = exports['default']; /***/ }, -/* 69 */ +/* 68 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; @@ -28964,15 +30375,15 @@ return /******/ (function(modules) { // webpackBootstrap var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); - var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; desc = parent = getter = undefined; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; + var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } - function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) subClass.__proto__ = superClass; } + function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - var _utilNodeBase = __webpack_require__(65); + var _utilNodeBase = __webpack_require__(64); var _utilNodeBase2 = _interopRequireDefault(_utilNodeBase); @@ -29004,32 +30415,36 @@ return /******/ (function(modules) { // webpackBootstrap this.left = x - this.width / 2; this.top = y - this.height / 2; - var borderWidth = this.options.borderWidth; + var neutralborderWidth = this.options.borderWidth; var selectionLineWidth = this.options.borderWidthSelected || 2 * this.options.borderWidth; + var borderWidth = (selected ? selectionLineWidth : neutralborderWidth) / this.body.view.scale; + ctx.lineWidth = Math.min(this.width, borderWidth); ctx.strokeStyle = selected ? this.options.color.highlight.border : hover ? this.options.color.hover.border : this.options.color.border; - ctx.lineWidth = this.selected ? selectionLineWidth : borderWidth; - ctx.lineWidth *= this.networkScaleInv; - ctx.lineWidth = Math.min(this.width, ctx.lineWidth); ctx.fillStyle = selected ? this.options.color.highlight.background : hover ? this.options.color.hover.background : this.options.color.background; ctx.database(x - this.width / 2, y - this.height * 0.5, this.width, this.height); - //draw dashed border if enabled - this.enableBorderDashes(ctx); // draw shadow if enabled this.enableShadow(ctx); + // draw the background ctx.fill(); - - //disable dashed border for other elements - this.disableBorderDashes(ctx); // disable shadows for other elements. this.disableShadow(ctx); - ctx.stroke(); + //draw dashed border if enabled, save and restore is required for firefox not to crash on unix. + ctx.save(); + // if borders are zero width, they will be drawn with width 1 by default. This prevents that + if (borderWidth > 0) { + this.enableBorderDashes(ctx); + //draw the border + ctx.stroke(); + //disable dashed border for other elements + this.disableBorderDashes(ctx); + } + ctx.restore(); this.updateBoundingBox(x, y, ctx, selected); - this.labelModule.draw(ctx, x, y, selected); } }, { @@ -29048,12 +30463,7 @@ return /******/ (function(modules) { // webpackBootstrap }, { key: 'distanceToBorder', value: function distanceToBorder(ctx, angle) { - this.resize(ctx); - var a = this.width / 2; - var b = this.height / 2; - var w = Math.sin(angle) * a; - var h = Math.cos(angle) * b; - return a * b / Math.sqrt(w * w + h * h); + return this._distanceToBorder(ctx, angle); } }]); @@ -29064,7 +30474,7 @@ return /******/ (function(modules) { // webpackBootstrap module.exports = exports['default']; /***/ }, -/* 70 */ +/* 69 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; @@ -29075,15 +30485,15 @@ return /******/ (function(modules) { // webpackBootstrap var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); - var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; desc = parent = getter = undefined; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; + var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } - function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) subClass.__proto__ = superClass; } + function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - var _utilShapeBase = __webpack_require__(71); + var _utilShapeBase = __webpack_require__(70); var _utilShapeBase2 = _interopRequireDefault(_utilShapeBase); @@ -29109,7 +30519,7 @@ return /******/ (function(modules) { // webpackBootstrap }, { key: 'distanceToBorder', value: function distanceToBorder(ctx, angle) { - return this._distanceToBorder(angle); + return this._distanceToBorder(ctx, angle); } }]); @@ -29120,7 +30530,7 @@ return /******/ (function(modules) { // webpackBootstrap module.exports = exports['default']; /***/ }, -/* 71 */ +/* 70 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; @@ -29131,15 +30541,15 @@ return /******/ (function(modules) { // webpackBootstrap var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); - var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; desc = parent = getter = undefined; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; + var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } - function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) subClass.__proto__ = superClass; } + function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - var _utilNodeBase = __webpack_require__(65); + var _utilNodeBase = __webpack_require__(64); var _utilNodeBase2 = _interopRequireDefault(_utilNodeBase); @@ -29170,28 +30580,33 @@ return /******/ (function(modules) { // webpackBootstrap this.left = x - this.width / 2; this.top = y - this.height / 2; - var borderWidth = this.options.borderWidth; + var neutralborderWidth = this.options.borderWidth; var selectionLineWidth = this.options.borderWidthSelected || 2 * this.options.borderWidth; + var borderWidth = (selected ? selectionLineWidth : neutralborderWidth) / this.body.view.scale; + ctx.lineWidth = Math.min(this.width, borderWidth); ctx.strokeStyle = selected ? this.options.color.highlight.border : hover ? this.options.color.hover.border : this.options.color.border; - ctx.lineWidth = selected ? selectionLineWidth : borderWidth; - ctx.lineWidth /= this.body.view.scale; - ctx.lineWidth = Math.min(this.width, ctx.lineWidth); ctx.fillStyle = selected ? this.options.color.highlight.background : hover ? this.options.color.hover.background : this.options.color.background; ctx[shape](x, y, this.options.size); - //draw dashed border if enabled - this.enableBorderDashes(ctx); // draw shadow if enabled this.enableShadow(ctx); + // draw the background ctx.fill(); - - //disable dashed border for other elements - this.disableBorderDashes(ctx); // disable shadows for other elements. this.disableShadow(ctx); - ctx.stroke(); + //draw dashed border if enabled, save and restore is required for firefox not to crash on unix. + ctx.save(); + // if borders are zero width, they will be drawn with width 1 by default. This prevents that + if (borderWidth > 0) { + this.enableBorderDashes(ctx); + //draw the border + ctx.stroke(); + //disable dashed border for other elements + this.disableBorderDashes(ctx); + } + ctx.restore(); if (this.options.label !== undefined) { var yLabel = y + 0.5 * this.height + 3; // the + 3 is to offset it a bit below the node. @@ -29223,7 +30638,7 @@ return /******/ (function(modules) { // webpackBootstrap module.exports = exports['default']; /***/ }, -/* 72 */ +/* 71 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; @@ -29234,15 +30649,15 @@ return /******/ (function(modules) { // webpackBootstrap var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); - var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; desc = parent = getter = undefined; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; + var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } - function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) subClass.__proto__ = superClass; } + function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - var _utilShapeBase = __webpack_require__(71); + var _utilShapeBase = __webpack_require__(70); var _utilShapeBase2 = _interopRequireDefault(_utilShapeBase); @@ -29268,7 +30683,8 @@ return /******/ (function(modules) { // webpackBootstrap }, { key: 'distanceToBorder', value: function distanceToBorder(ctx, angle) { - return this.options.size + this.options.borderWidth; + this.resize(ctx); + return this.options.size; } }]); @@ -29279,7 +30695,7 @@ return /******/ (function(modules) { // webpackBootstrap module.exports = exports['default']; /***/ }, -/* 73 */ +/* 72 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; @@ -29290,15 +30706,15 @@ return /******/ (function(modules) { // webpackBootstrap var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); - var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; desc = parent = getter = undefined; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; + var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } - function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) subClass.__proto__ = superClass; } + function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - var _utilNodeBase = __webpack_require__(65); + var _utilNodeBase = __webpack_require__(64); var _utilNodeBase2 = _interopRequireDefault(_utilNodeBase); @@ -29332,30 +30748,36 @@ return /******/ (function(modules) { // webpackBootstrap this.left = x - this.width * 0.5; this.top = y - this.height * 0.5; - var borderWidth = this.options.borderWidth; + var neutralborderWidth = this.options.borderWidth; var selectionLineWidth = this.options.borderWidthSelected || 2 * this.options.borderWidth; + var borderWidth = (selected ? selectionLineWidth : neutralborderWidth) / this.body.view.scale; + ctx.lineWidth = Math.min(this.width, borderWidth); ctx.strokeStyle = selected ? this.options.color.highlight.border : hover ? this.options.color.hover.border : this.options.color.border; - ctx.lineWidth = selected ? selectionLineWidth : borderWidth; - ctx.lineWidth /= this.body.view.scale; - ctx.lineWidth = Math.min(this.width, ctx.lineWidth); - ctx.fillStyle = selected ? this.options.color.highlight.background : hover ? this.options.color.hover.background : this.options.color.background; ctx.ellipse(this.left, this.top, this.width, this.height); - //draw dashed border if enabled - this.enableBorderDashes(ctx); // draw shadow if enabled this.enableShadow(ctx); + // draw the background ctx.fill(); - - //disable dashed border for other elements - this.disableBorderDashes(ctx); // disable shadows for other elements. this.disableShadow(ctx); - ctx.stroke(); + //draw dashed border if enabled, save and restore is required for firefox not to crash on unix. + ctx.save(); + + // if borders are zero width, they will be drawn with width 1 by default. This prevents that + if (borderWidth > 0) { + this.enableBorderDashes(ctx); + //draw the border + ctx.stroke(); + //disable dashed border for other elements + this.disableBorderDashes(ctx); + } + + ctx.restore(); this.updateBoundingBox(x, y, ctx, selected); this.labelModule.draw(ctx, x, y, selected); @@ -29392,7 +30814,7 @@ return /******/ (function(modules) { // webpackBootstrap module.exports = exports['default']; /***/ }, -/* 74 */ +/* 73 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; @@ -29403,15 +30825,15 @@ return /******/ (function(modules) { // webpackBootstrap var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); - var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; desc = parent = getter = undefined; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; + var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } - function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) subClass.__proto__ = superClass; } + function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - var _utilNodeBase = __webpack_require__(65); + var _utilNodeBase = __webpack_require__(64); var _utilNodeBase2 = _interopRequireDefault(_utilNodeBase); @@ -29476,12 +30898,12 @@ return /******/ (function(modules) { // webpackBootstrap var iconSize = Number(this.options.icon.size); if (this.options.icon.code !== undefined) { - ctx.font = (selected ? 'bold ' : '') + iconSize + 'px ' + this.options.icon.face; + ctx.font = (selected ? "bold " : "") + iconSize + "px " + this.options.icon.face; // draw icon - ctx.fillStyle = this.options.icon.color || 'black'; - ctx.textAlign = 'center'; - ctx.textBaseline = 'middle'; + ctx.fillStyle = this.options.icon.color || "black"; + ctx.textAlign = "center"; + ctx.textBaseline = "middle"; // draw shadow if enabled this.enableShadow(ctx); @@ -29496,8 +30918,7 @@ return /******/ (function(modules) { // webpackBootstrap }, { key: 'distanceToBorder', value: function distanceToBorder(ctx, angle) { - this.resize(ctx); - return this._distanceToBorder(angle); + return this._distanceToBorder(ctx, angle); } }]); @@ -29508,7 +30929,7 @@ return /******/ (function(modules) { // webpackBootstrap module.exports = exports['default']; /***/ }, -/* 75 */ +/* 74 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; @@ -29519,15 +30940,15 @@ return /******/ (function(modules) { // webpackBootstrap var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); - var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; desc = parent = getter = undefined; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; + var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } - function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) subClass.__proto__ = superClass; } + function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - var _utilCircleImageBase = __webpack_require__(67); + var _utilCircleImageBase = __webpack_require__(66); var _utilCircleImageBase2 = _interopRequireDefault(_utilCircleImageBase); @@ -29553,6 +30974,39 @@ return /******/ (function(modules) { // webpackBootstrap this.left = x - this.width / 2; this.top = y - this.height / 2; + if (this.options.shapeProperties.useBorderWithImage === true) { + var neutralborderWidth = this.options.borderWidth; + var selectionLineWidth = this.options.borderWidthSelected || 2 * this.options.borderWidth; + var borderWidth = (selected ? selectionLineWidth : neutralborderWidth) / this.body.view.scale; + ctx.lineWidth = Math.min(this.width, borderWidth); + + ctx.beginPath(); + + // setup the line properties. + ctx.strokeStyle = selected ? this.options.color.highlight.border : hover ? this.options.color.hover.border : this.options.color.border; + + // set a fillstyle + ctx.fillStyle = selected ? this.options.color.highlight.background : hover ? this.options.color.hover.background : this.options.color.background; + + // draw a rectangle to form the border around. This rectangle is filled so the opacity of a picture (in future vis releases?) can be used to tint the image + ctx.rect(this.left - 0.5 * ctx.lineWidth, this.top - 0.5 * ctx.lineWidth, this.width + ctx.lineWidth, this.height + ctx.lineWidth); + ctx.fill(); + + //draw dashed border if enabled, save and restore is required for firefox not to crash on unix. + ctx.save(); + // if borders are zero width, they will be drawn with width 1 by default. This prevents that + if (borderWidth > 0) { + this.enableBorderDashes(ctx); + //draw the border + ctx.stroke(); + //disable dashed border for other elements + this.disableBorderDashes(ctx); + } + ctx.restore(); + + ctx.closePath(); + } + this._drawImageAtPosition(ctx); this._drawImageLabel(ctx, x, y, selected || hover); @@ -29580,12 +31034,7 @@ return /******/ (function(modules) { // webpackBootstrap }, { key: 'distanceToBorder', value: function distanceToBorder(ctx, angle) { - this.resize(ctx); - var a = this.width / 2; - var b = this.height / 2; - var w = Math.sin(angle) * a; - var h = Math.cos(angle) * b; - return a * b / Math.sqrt(w * w + h * h); + return this._distanceToBorder(ctx, angle); } }]); @@ -29596,7 +31045,7 @@ return /******/ (function(modules) { // webpackBootstrap module.exports = exports['default']; /***/ }, -/* 76 */ +/* 75 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; @@ -29607,15 +31056,15 @@ return /******/ (function(modules) { // webpackBootstrap var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); - var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; desc = parent = getter = undefined; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; + var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } - function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) subClass.__proto__ = superClass; } + function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - var _utilShapeBase = __webpack_require__(71); + var _utilShapeBase = __webpack_require__(70); var _utilShapeBase2 = _interopRequireDefault(_utilShapeBase); @@ -29641,8 +31090,7 @@ return /******/ (function(modules) { // webpackBootstrap }, { key: 'distanceToBorder', value: function distanceToBorder(ctx, angle) { - this.resize(); - return this._distanceToBorder(angle); + return this._distanceToBorder(ctx, angle); } }]); @@ -29653,7 +31101,7 @@ return /******/ (function(modules) { // webpackBootstrap module.exports = exports['default']; /***/ }, -/* 77 */ +/* 76 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; @@ -29664,15 +31112,15 @@ return /******/ (function(modules) { // webpackBootstrap var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); - var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; desc = parent = getter = undefined; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; + var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } - function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) subClass.__proto__ = superClass; } + function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - var _utilShapeBase = __webpack_require__(71); + var _utilShapeBase = __webpack_require__(70); var _utilShapeBase2 = _interopRequireDefault(_utilShapeBase); @@ -29698,7 +31146,7 @@ return /******/ (function(modules) { // webpackBootstrap }, { key: 'distanceToBorder', value: function distanceToBorder(ctx, angle) { - return this._distanceToBorder(angle); + return this._distanceToBorder(ctx, angle); } }]); @@ -29709,7 +31157,7 @@ return /******/ (function(modules) { // webpackBootstrap module.exports = exports['default']; /***/ }, -/* 78 */ +/* 77 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; @@ -29720,15 +31168,15 @@ return /******/ (function(modules) { // webpackBootstrap var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); - var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; desc = parent = getter = undefined; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; + var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } - function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) subClass.__proto__ = superClass; } + function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - var _utilNodeBase = __webpack_require__(65); + var _utilNodeBase = __webpack_require__(64); var _utilNodeBase2 = _interopRequireDefault(_utilNodeBase); @@ -29784,8 +31232,7 @@ return /******/ (function(modules) { // webpackBootstrap }, { key: 'distanceToBorder', value: function distanceToBorder(ctx, angle) { - this.resize(ctx); - return this._distanceToBorder(angle); + return this._distanceToBorder(ctx, angle); } }]); @@ -29796,7 +31243,7 @@ return /******/ (function(modules) { // webpackBootstrap module.exports = exports['default']; /***/ }, -/* 79 */ +/* 78 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; @@ -29807,15 +31254,15 @@ return /******/ (function(modules) { // webpackBootstrap var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); - var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; desc = parent = getter = undefined; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; + var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } - function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) subClass.__proto__ = superClass; } + function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - var _utilShapeBase = __webpack_require__(71); + var _utilShapeBase = __webpack_require__(70); var _utilShapeBase2 = _interopRequireDefault(_utilShapeBase); @@ -29841,7 +31288,7 @@ return /******/ (function(modules) { // webpackBootstrap }, { key: 'distanceToBorder', value: function distanceToBorder(ctx, angle) { - return this._distanceToBorder(angle); + return this._distanceToBorder(ctx, angle); } }]); @@ -29852,7 +31299,7 @@ return /******/ (function(modules) { // webpackBootstrap module.exports = exports['default']; /***/ }, -/* 80 */ +/* 79 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; @@ -29863,15 +31310,15 @@ return /******/ (function(modules) { // webpackBootstrap var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); - var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; desc = parent = getter = undefined; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; + var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } - function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) subClass.__proto__ = superClass; } + function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - var _utilShapeBase = __webpack_require__(71); + var _utilShapeBase = __webpack_require__(70); var _utilShapeBase2 = _interopRequireDefault(_utilShapeBase); @@ -29897,7 +31344,7 @@ return /******/ (function(modules) { // webpackBootstrap }, { key: 'distanceToBorder', value: function distanceToBorder(ctx, angle) { - return this._distanceToBorder(angle); + return this._distanceToBorder(ctx, angle); } }]); @@ -29908,7 +31355,7 @@ return /******/ (function(modules) { // webpackBootstrap module.exports = exports['default']; /***/ }, -/* 81 */ +/* 80 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; @@ -29923,17 +31370,17 @@ return /******/ (function(modules) { // webpackBootstrap function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } - var _componentsEdge = __webpack_require__(82); + var _componentsEdge = __webpack_require__(81); var _componentsEdge2 = _interopRequireDefault(_componentsEdge); - var _componentsSharedLabel = __webpack_require__(63); + var _componentsSharedLabel = __webpack_require__(62); var _componentsSharedLabel2 = _interopRequireDefault(_componentsSharedLabel); - var util = __webpack_require__(7); - var DataSet = __webpack_require__(14); - var DataView = __webpack_require__(16); + var util = __webpack_require__(1); + var DataSet = __webpack_require__(8); + var DataView = __webpack_require__(10); var EdgesHandler = (function () { function EdgesHandler(body, images, groups) { @@ -29967,6 +31414,7 @@ return /******/ (function(modules) { // webpackBootstrap middle: { enabled: false, scaleFactor: 1 }, from: { enabled: false, scaleFactor: 1 } }, + arrowStrikethrough: true, color: { color: '#848484', highlight: '#848484', @@ -30013,13 +31461,15 @@ return /******/ (function(modules) { // webpackBootstrap selfReferenceSize: 20, shadow: { enabled: false, + color: 'rgba(0,0,0,0.5)', size: 10, x: 5, y: 5 }, smooth: { enabled: true, - type: 'dynamic', + type: "dynamic", + forceDirection: 'none', roundness: 0.5 }, title: undefined, @@ -30038,7 +31488,7 @@ return /******/ (function(modules) { // webpackBootstrap var _this2 = this; // this allows external modules to force all dynamic curves to turn static. - this.body.emitter.on('_forceDisableDynamicCurves', function (type) { + this.body.emitter.on("_forceDisableDynamicCurves", function (type) { if (type === 'dynamic') { type = 'continuous'; } @@ -30048,7 +31498,7 @@ return /******/ (function(modules) { // webpackBootstrap var edge = _this2.body.edges[edgeId]; var edgeData = _this2.body.data.edges._data[edgeId]; - // only forcilby remove the smooth curve if the data has been set of the edge has the smooth curves defined. + // only forcibly remove the smooth curve if the data has been set of the edge has the smooth curves defined. // this is because a change in the global would not affect these curves. if (edgeData !== undefined) { var edgeOptions = edgeData.smooth; @@ -30066,20 +31516,23 @@ return /******/ (function(modules) { // webpackBootstrap } } if (emitChange === true) { - _this2.body.emitter.emit('_dataChanged'); + _this2.body.emitter.emit("_dataChanged"); } }); // this is called when options of EXISTING nodes or edges have changed. - this.body.emitter.on('_dataUpdated', function () { + this.body.emitter.on("_dataUpdated", function () { _this2.reconnectEdges(); _this2.markAllEdgesAsDirty(); }); // refresh the edges. Used when reverting from hierarchical layout - this.body.emitter.on('refreshEdges', this.refresh.bind(this)); - this.body.emitter.on('refresh', this.refresh.bind(this)); - this.body.emitter.on('destroy', function () { + this.body.emitter.on("refreshEdges", this.refresh.bind(this)); + this.body.emitter.on("refresh", this.refresh.bind(this)); + this.body.emitter.on("destroy", function () { + util.forEach(_this2.edgesListeners, function (callback, event) { + if (_this2.body.data.edges) _this2.body.data.edges.off(event, callback); + }); delete _this2.body.functions.createEdge; delete _this2.edgesListeners.add; delete _this2.edgesListeners.update; @@ -30094,7 +31547,7 @@ return /******/ (function(modules) { // webpackBootstrap // use the parser from the Edge class to fill in all shorthand notations _componentsEdge2['default'].parseOptions(this.options, options); - // hanlde multiple input cases for color + // handle multiple input cases for color if (options.color !== undefined) { this.markAllEdgesAsDirty(); } @@ -30126,8 +31579,6 @@ return /******/ (function(modules) { // webpackBootstrap } } } - }, { - key: 'setData', /** * Load edges by reading the data table @@ -30135,6 +31586,8 @@ return /******/ (function(modules) { // webpackBootstrap * @private * @private */ + }, { + key: 'setData', value: function setData(edges) { var _this3 = this; @@ -30177,17 +31630,17 @@ return /******/ (function(modules) { // webpackBootstrap } if (doNotEmit === false) { - this.body.emitter.emit('_dataChanged'); + this.body.emitter.emit("_dataChanged"); } } - }, { - key: 'add', /** * Add edges * @param {Number[] | String[]} ids * @private */ + }, { + key: 'add', value: function add(ids) { var doNotEmit = arguments.length <= 1 || arguments[1] === undefined ? false : arguments[1]; @@ -30202,22 +31655,22 @@ return /******/ (function(modules) { // webpackBootstrap oldEdge.disconnect(); } - var data = edgesData.get(id, { 'showInternalIds': true }); + var data = edgesData.get(id, { "showInternalIds": true }); edges[id] = this.create(data); } if (doNotEmit === false) { - this.body.emitter.emit('_dataChanged'); + this.body.emitter.emit("_dataChanged"); } } - }, { - key: 'update', /** * Update existing edges, or create them when not yet existing * @param {Number[] | String[]} ids * @private */ + }, { + key: 'update', value: function update(ids) { var edges = this.body.edges; var edgesData = this.body.data.edges; @@ -30226,7 +31679,7 @@ return /******/ (function(modules) { // webpackBootstrap var id = ids[i]; var data = edgesData.get(id); var edge = edges[id]; - if (edge === null) { + if (edge !== undefined) { // update edge edge.disconnect(); dataChanged = edge.setOptions(data) || dataChanged; // if a support node is added, data can be changed. @@ -30239,32 +31692,32 @@ return /******/ (function(modules) { // webpackBootstrap } if (dataChanged === true) { - this.body.emitter.emit('_dataChanged'); + this.body.emitter.emit("_dataChanged"); } else { - this.body.emitter.emit('_dataUpdated'); + this.body.emitter.emit("_dataUpdated"); } } - }, { - key: 'remove', /** * Remove existing edges. Non existing ids will be ignored * @param {Number[] | String[]} ids * @private */ + }, { + key: 'remove', value: function remove(ids) { var edges = this.body.edges; for (var i = 0; i < ids.length; i++) { var id = ids[i]; var edge = edges[id]; if (edge !== undefined) { - edge.edgeType.cleanup(); + edge.cleanup(); edge.disconnect(); delete edges[id]; } } - this.body.emitter.emit('_dataChanged'); + this.body.emitter.emit("_dataChanged"); } }, { key: 'refresh', @@ -30293,13 +31746,13 @@ return /******/ (function(modules) { // webpackBootstrap this.body.edges[edgeId].edgeType.colorDirty = true; } } - }, { - key: 'reconnectEdges', /** * Reconnect all edges * @private */ + }, { + key: 'reconnectEdges', value: function reconnectEdges() { var id; var nodes = this.body.nodes; @@ -30344,7 +31797,7 @@ return /******/ (function(modules) { // webpackBootstrap module.exports = exports['default']; /***/ }, -/* 82 */ +/* 81 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; @@ -30359,24 +31812,26 @@ return /******/ (function(modules) { // webpackBootstrap function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } - var _sharedLabel = __webpack_require__(63); + var _sharedLabel = __webpack_require__(62); var _sharedLabel2 = _interopRequireDefault(_sharedLabel); - var _edgesBezierEdgeDynamic = __webpack_require__(83); + var _edgesCubicBezierEdge = __webpack_require__(82); + + var _edgesCubicBezierEdge2 = _interopRequireDefault(_edgesCubicBezierEdge); + + var _edgesBezierEdgeDynamic = __webpack_require__(86); var _edgesBezierEdgeDynamic2 = _interopRequireDefault(_edgesBezierEdgeDynamic); - var _edgesBezierEdgeStatic = __webpack_require__(86); + var _edgesBezierEdgeStatic = __webpack_require__(87); var _edgesBezierEdgeStatic2 = _interopRequireDefault(_edgesBezierEdgeStatic); - var _edgesStraightEdge = __webpack_require__(87); + var _edgesStraightEdge = __webpack_require__(88); var _edgesStraightEdge2 = _interopRequireDefault(_edgesStraightEdge); - var util = __webpack_require__(7); - /** * @class Edge * @@ -30392,15 +31847,17 @@ return /******/ (function(modules) { // webpackBootstrap * @param {Object} constants An object with default values for * example for the color */ + var util = __webpack_require__(1); var Edge = (function () { function Edge(options, body, globalOptions) { _classCallCheck(this, Edge); if (body === undefined) { - throw 'No body provided'; + throw "No body provided"; } this.options = util.bridgeObject(globalOptions); + this.globalOptions = globalOptions; this.body = body; // initialize variables @@ -30427,21 +31884,21 @@ return /******/ (function(modules) { // webpackBootstrap this.setOptions(options); } + /** + * Set or overwrite options for the edge + * @param {Object} options an object with options + * @param doNotEmit + */ + _createClass(Edge, [{ key: 'setOptions', - - /** - * Set or overwrite options for the edge - * @param {Object} options an object with options - * @param doNotEmit - */ value: function setOptions(options) { if (!options) { return; } this.colorDirty = true; - Edge.parseOptions(this.options, options, true); + Edge.parseOptions(this.options, options, true, this.globalOptions); if (options.id !== undefined) { this.id = options.id; @@ -30478,6 +31935,7 @@ return /******/ (function(modules) { // webpackBootstrap } }, { key: 'updateLabelModule', + // set the object back to the global options /** * update the options in the label module @@ -30488,29 +31946,33 @@ return /******/ (function(modules) { // webpackBootstrap this.baseFontSize = this.labelModule.baseSize; } } - }, { - key: 'updateEdgeType', /** * update the edge type, set the options * @returns {boolean} */ + }, { + key: 'updateEdgeType', value: function updateEdgeType() { var dataChanged = false; var changeInType = true; + var smooth = this.options.smooth; if (this.edgeType !== undefined) { - if (this.edgeType instanceof _edgesBezierEdgeDynamic2['default'] && this.options.smooth.enabled === true && this.options.smooth.type === 'dynamic') { + if (this.edgeType instanceof _edgesBezierEdgeDynamic2['default'] && smooth.enabled === true && smooth.type === 'dynamic') { changeInType = false; } - if (this.edgeType instanceof _edgesBezierEdgeStatic2['default'] && this.options.smooth.enabled === true && this.options.smooth.type !== 'dynamic') { + if (this.edgeType instanceof _edgesCubicBezierEdge2['default'] && smooth.enabled === true && smooth.type === 'cubicBezier') { changeInType = false; } - if (this.edgeType instanceof _edgesStraightEdge2['default'] && this.options.smooth.enabled === false) { + if (this.edgeType instanceof _edgesBezierEdgeStatic2['default'] && smooth.enabled === true && smooth.type !== 'dynamic' && smooth.type !== 'cubicBezier') { + changeInType = false; + } + if (this.edgeType instanceof _edgesStraightEdge2['default'] && smooth.enabled === false) { changeInType = false; } if (changeInType === true) { - dataChanged = this.edgeType.cleanup(); + dataChanged = this.cleanup(); } } @@ -30519,6 +31981,8 @@ return /******/ (function(modules) { // webpackBootstrap if (this.options.smooth.type === 'dynamic') { dataChanged = true; this.edgeType = new _edgesBezierEdgeDynamic2['default'](this.options, this.body, this.labelModule); + } else if (this.options.smooth.type === 'cubicBezier') { + this.edgeType = new _edgesCubicBezierEdge2['default'](this.options, this.body, this.labelModule); } else { this.edgeType = new _edgesBezierEdgeStatic2['default'](this.options, this.body, this.labelModule); } @@ -30532,23 +31996,12 @@ return /******/ (function(modules) { // webpackBootstrap return dataChanged; } - }, { - key: 'togglePhysics', - - /** - * Enable or disable the physics. - * @param status - */ - value: function togglePhysics(status) { - this.options.physics = status; - this.edgeType.togglePhysics(status); - } - }, { - key: 'connect', /** * Connect an edge to its nodes */ + }, { + key: 'connect', value: function connect() { this.disconnect(); @@ -30570,12 +32023,12 @@ return /******/ (function(modules) { // webpackBootstrap this.edgeType.connect(); } - }, { - key: 'disconnect', /** * Disconnect an edge from its nodes */ + }, { + key: 'disconnect', value: function disconnect() { if (this.from) { this.from.detachEdge(this); @@ -30588,39 +32041,37 @@ return /******/ (function(modules) { // webpackBootstrap this.connected = false; } - }, { - key: 'getTitle', /** * get the title of this edge. * @return {string} title The title of the edge, or undefined when no title * has been set. */ + }, { + key: 'getTitle', value: function getTitle() { return this.title; } - }, { - key: 'isSelected', /** * check if this node is selecte * @return {boolean} selected True if node is selected, else false */ + }, { + key: 'isSelected', value: function isSelected() { return this.selected; } - }, { - key: 'getValue', /** * Retrieve the value of the edge. Can be undefined * @return {Number} value */ + }, { + key: 'getValue', value: function getValue() { return this.options.value; } - }, { - key: 'setValueRange', /** * Adjust the value range of the edge. The edge will adjust it's width @@ -30629,6 +32080,8 @@ return /******/ (function(modules) { // webpackBootstrap * @param {Number} max * @param total */ + }, { + key: 'setValueRange', value: function setValueRange(min, max, total) { if (this.options.value !== undefined) { var scale = this.options.scaling.customScalingFunction(min, max, total, this.options.value); @@ -30644,6 +32097,7 @@ return /******/ (function(modules) { // webpackBootstrap } this._setInteractionWidths(); + this.updateLabelModule(); } }, { key: '_setInteractionWidths', @@ -30660,8 +32114,6 @@ return /******/ (function(modules) { // webpackBootstrap this.edgeType.selectionWidth = this.options.selectionWidth + this.options.width; } } - }, { - key: 'draw', /** * Redraw a edge @@ -30669,22 +32121,48 @@ return /******/ (function(modules) { // webpackBootstrap * The 2d context of a HTML canvas can be retrieved by canvas.getContext("2d"); * @param {CanvasRenderingContext2D} ctx */ + }, { + key: 'draw', value: function draw(ctx) { - var via = this.edgeType.drawLine(ctx, this.selected, this.hover); - this.drawArrows(ctx, via); - this.drawLabel(ctx, via); + // get the via node from the edge type + var viaNode = this.edgeType.getViaNode(); + var arrowData = {}; + + // restore edge targets to defaults + this.edgeType.fromPoint = this.from; + this.edgeType.toPoint = this.to; + + // from and to arrows give a different end point for edges. we set them here + if (this.options.arrows.from.enabled === true) { + arrowData.from = this.edgeType.getArrowData(ctx, 'from', viaNode, this.selected, this.hover); + if (this.options.arrowStrikethrough === false) this.edgeType.fromPoint = arrowData.from.core; + } + if (this.options.arrows.to.enabled === true) { + arrowData.to = this.edgeType.getArrowData(ctx, 'to', viaNode, this.selected, this.hover); + if (this.options.arrowStrikethrough === false) this.edgeType.toPoint = arrowData.to.core; + } + + // the middle arrow depends on the line, which can depend on the to and from arrows so we do this one lastly. + if (this.options.arrows.middle.enabled === true) { + arrowData.middle = this.edgeType.getArrowData(ctx, 'middle', viaNode, this.selected, this.hover); + } + + // draw everything + this.edgeType.drawLine(ctx, this.selected, this.hover, viaNode); + this.drawArrows(ctx, arrowData); + this.drawLabel(ctx, viaNode); } }, { key: 'drawArrows', - value: function drawArrows(ctx, viaNode) { + value: function drawArrows(ctx, arrowData) { if (this.options.arrows.from.enabled === true) { - this.edgeType.drawArrowHead(ctx, 'from', viaNode, this.selected, this.hover); + this.edgeType.drawArrowHead(ctx, this.selected, this.hover, arrowData.from); } if (this.options.arrows.middle.enabled === true) { - this.edgeType.drawArrowHead(ctx, 'middle', viaNode, this.selected, this.hover); + this.edgeType.drawArrowHead(ctx, this.selected, this.hover, arrowData.middle); } if (this.options.arrows.to.enabled === true) { - this.edgeType.drawArrowHead(ctx, 'to', viaNode, this.selected, this.hover); + this.edgeType.drawArrowHead(ctx, this.selected, this.hover, arrowData.to); } } }, { @@ -30701,7 +32179,7 @@ return /******/ (function(modules) { // webpackBootstrap ctx.save(); // if the label has to be rotated: - if (this.options.font.align !== 'horizontal') { + if (this.options.font.align !== "horizontal") { this.labelModule.calculateLabelSize(ctx, selected, point.x, point.y); ctx.translate(point.x, this.labelModule.size.yLine); this._rotateForLabelAlignment(ctx); @@ -30727,14 +32205,14 @@ return /******/ (function(modules) { // webpackBootstrap } } } - }, { - key: 'isOverlappingWith', /** * Check if this object is overlapping with the provided object * @param {Object} obj an object with parameters left, top * @return {boolean} True if location is located on the edge */ + }, { + key: 'isOverlappingWith', value: function isOverlappingWith(obj) { if (this.connected) { var distMax = 10; @@ -30752,14 +32230,14 @@ return /******/ (function(modules) { // webpackBootstrap return false; } } - }, { - key: '_rotateForLabelAlignment', /** * Rotates the canvas so the text is most readable * @param {CanvasRenderingContext2D} ctx * @private */ + }, { + key: '_rotateForLabelAlignment', value: function _rotateForLabelAlignment(ctx) { var dy = this.from.y - this.to.y; var dx = this.from.x - this.to.x; @@ -30772,8 +32250,6 @@ return /******/ (function(modules) { // webpackBootstrap ctx.rotate(angleInDegrees); } - }, { - key: '_pointOnCircle', /** * Get a point on a circle @@ -30784,6 +32260,8 @@ return /******/ (function(modules) { // webpackBootstrap * @return {Object} point * @private */ + }, { + key: '_pointOnCircle', value: function _pointOnCircle(x, y, radius, percentage) { var angle = percentage * 2 * Math.PI; return { @@ -30801,24 +32279,34 @@ return /******/ (function(modules) { // webpackBootstrap value: function unselect() { this.selected = false; } + + /** + * cleans all required things on delete + * @returns {*} + */ + }, { + key: 'cleanup', + value: function cleanup() { + return this.edgeType.cleanup(); + } }], [{ key: 'parseOptions', value: function parseOptions(parentOptions, newOptions) { var allowDeletion = arguments.length <= 2 || arguments[2] === undefined ? false : arguments[2]; + var globalOptions = arguments.length <= 3 || arguments[3] === undefined ? {} : arguments[3]; - var fields = ['id', 'from', 'hidden', 'hoverWidth', 'label', 'labelHighlightBold', 'length', 'line', 'opacity', 'physics', 'selectionWidth', 'selfReferenceSize', 'to', 'title', 'value', 'width']; + var fields = ['arrowStrikethrough', 'id', 'from', 'hidden', 'hoverWidth', 'label', 'labelHighlightBold', 'length', 'line', 'opacity', 'physics', 'scaling', 'selectionWidth', 'selfReferenceSize', 'to', 'title', 'value', 'width']; // only deep extend the items in the field array. These do not have shorthand. util.selectiveDeepExtend(fields, parentOptions, newOptions, allowDeletion); - util.mergeOptions(parentOptions, newOptions, 'smooth'); - util.mergeOptions(parentOptions, newOptions, 'shadow'); + util.mergeOptions(parentOptions, newOptions, 'smooth', allowDeletion, globalOptions); + util.mergeOptions(parentOptions, newOptions, 'shadow', allowDeletion, globalOptions); if (newOptions.dashes !== undefined && newOptions.dashes !== null) { parentOptions.dashes = newOptions.dashes; } else if (allowDeletion === true && newOptions.dashes === null) { - parentOptions.dashes = undefined; - delete parentOptions.dashes; + parentOptions.dashes = Object.create(globalOptions.dashes); // this sets the pointer of the option back to the global option. } // set the scaling newOptions @@ -30829,39 +32317,39 @@ return /******/ (function(modules) { // webpackBootstrap if (newOptions.scaling.max !== undefined) { parentOptions.scaling.max = newOptions.scaling.max; } - util.mergeOptions(parentOptions.scaling, newOptions.scaling, 'label'); + util.mergeOptions(parentOptions.scaling, newOptions.scaling, 'label', allowDeletion, globalOptions.scaling); } else if (allowDeletion === true && newOptions.scaling === null) { - parentOptions.scaling = undefined; - delete parentOptions.scaling; + parentOptions.scaling = Object.create(globalOptions.scaling); // this sets the pointer of the option back to the global option. } - // hanlde multiple input cases for arrows + // handle multiple input cases for arrows if (newOptions.arrows !== undefined && newOptions.arrows !== null) { if (typeof newOptions.arrows === 'string') { var arrows = newOptions.arrows.toLowerCase(); - if (arrows.indexOf('to') != -1) { + if (arrows.indexOf("to") != -1) { parentOptions.arrows.to.enabled = true; } - if (arrows.indexOf('middle') != -1) { + if (arrows.indexOf("middle") != -1) { parentOptions.arrows.middle.enabled = true; } - if (arrows.indexOf('from') != -1) { + if (arrows.indexOf("from") != -1) { parentOptions.arrows.from.enabled = true; } } else if (typeof newOptions.arrows === 'object') { - util.mergeOptions(parentOptions.arrows, newOptions.arrows, 'to'); - util.mergeOptions(parentOptions.arrows, newOptions.arrows, 'middle'); - util.mergeOptions(parentOptions.arrows, newOptions.arrows, 'from'); + util.mergeOptions(parentOptions.arrows, newOptions.arrows, 'to', allowDeletion, globalOptions.arrows); + util.mergeOptions(parentOptions.arrows, newOptions.arrows, 'middle', allowDeletion, globalOptions.arrows); + util.mergeOptions(parentOptions.arrows, newOptions.arrows, 'from', allowDeletion, globalOptions.arrows); } else { - throw new Error('The arrow newOptions can only be an object or a string. Refer to the documentation. You used:' + JSON.stringify(newOptions.arrows)); + throw new Error("The arrow newOptions can only be an object or a string. Refer to the documentation. You used:" + JSON.stringify(newOptions.arrows)); } } else if (allowDeletion === true && newOptions.arrows === null) { - parentOptions.arrows = undefined; - delete parentOptions.arrows; + parentOptions.arrows = Object.create(globalOptions.arrows); // this sets the pointer of the option back to the global option. } - // hanlde multiple input cases for color + // handle multiple input cases for color if (newOptions.color !== undefined && newOptions.color !== null) { + // make a copy of the parent object in case this is referring to the global one (due to object create once, then update) + parentOptions.color = util.deepExtend({}, parentOptions.color, true); if (util.isString(newOptions.color)) { parentOptions.color.color = newOptions.color; parentOptions.color.highlight = newOptions.color; @@ -30890,13 +32378,14 @@ return /******/ (function(modules) { // webpackBootstrap } } } else if (allowDeletion === true && newOptions.color === null) { - parentOptions.color = undefined; - delete parentOptions.color; + parentOptions.color = util.bridgeObject(globalOptions.color); // set the object back to the global options } // handle the font settings - if (newOptions.font !== undefined) { + if (newOptions.font !== undefined && newOptions.font !== null) { _sharedLabel2['default'].parseOptions(parentOptions.font, newOptions); + } else if (allowDeletion === true && newOptions.font === null) { + parentOptions.font = util.bridgeObject(globalOptions.font); } } }]); @@ -30907,6 +32396,155 @@ return /******/ (function(modules) { // webpackBootstrap exports['default'] = Edge; module.exports = exports['default']; +/***/ }, +/* 82 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + Object.defineProperty(exports, '__esModule', { + value: true + }); + + var _slicedToArray = (function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i['return']) _i['return'](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError('Invalid attempt to destructure non-iterable instance'); } }; })(); + + var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); + + var _get = function get(_x3, _x4, _x5) { var _again = true; _function: while (_again) { var object = _x3, property = _x4, receiver = _x5; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x3 = parent; _x4 = property; _x5 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; + + function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } + + function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } + + function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + + var _utilCubicBezierEdgeBase = __webpack_require__(83); + + var _utilCubicBezierEdgeBase2 = _interopRequireDefault(_utilCubicBezierEdgeBase); + + var CubicBezierEdge = (function (_CubicBezierEdgeBase) { + _inherits(CubicBezierEdge, _CubicBezierEdgeBase); + + function CubicBezierEdge(options, body, labelModule) { + _classCallCheck(this, CubicBezierEdge); + + _get(Object.getPrototypeOf(CubicBezierEdge.prototype), 'constructor', this).call(this, options, body, labelModule); + } + + /** + * Draw a line between two nodes + * @param {CanvasRenderingContext2D} ctx + * @private + */ + + _createClass(CubicBezierEdge, [{ + key: '_line', + value: function _line(ctx, viaNodes) { + // get the coordinates of the support points. + var via1 = viaNodes[0]; + var via2 = viaNodes[1]; + + // start drawing the line. + ctx.beginPath(); + ctx.moveTo(this.fromPoint.x, this.fromPoint.y); + + // fallback to normal straight edges + if (viaNodes === undefined || via1.x === undefined) { + ctx.lineTo(this.toPoint.x, this.toPoint.y); + } else { + ctx.bezierCurveTo(via1.x, via1.y, via2.x, via2.y, this.toPoint.x, this.toPoint.y); + } + // draw shadow if enabled + this.enableShadow(ctx); + ctx.stroke(); + this.disableShadow(ctx); + } + }, { + key: '_getViaCoordinates', + value: function _getViaCoordinates() { + var dx = this.from.x - this.to.x; + var dy = this.from.y - this.to.y; + + var x1 = undefined, + y1 = undefined, + x2 = undefined, + y2 = undefined; + var roundness = this.options.smooth.roundness; + + // horizontal if x > y or if direction is forced or if direction is horizontal + if ((Math.abs(dx) > Math.abs(dy) || this.options.smooth.forceDirection === true || this.options.smooth.forceDirection === 'horizontal') && this.options.smooth.forceDirection !== 'vertical') { + y1 = this.from.y; + y2 = this.to.y; + x1 = this.from.x - roundness * dx; + x2 = this.to.x + roundness * dx; + } else { + y1 = this.from.y - roundness * dy; + y2 = this.to.y + roundness * dy; + x1 = this.from.x; + x2 = this.to.x; + } + + return [{ x: x1, y: y1 }, { x: x2, y: y2 }]; + } + }, { + key: 'getViaNode', + value: function getViaNode() { + return this._getViaCoordinates(); + } + }, { + key: '_findBorderPosition', + value: function _findBorderPosition(nearNode, ctx) { + return this._findBorderPositionBezier(nearNode, ctx); + } + }, { + key: '_getDistanceToEdge', + value: function _getDistanceToEdge(x1, y1, x2, y2, x3, y3) { + var _ref = arguments.length <= 6 || arguments[6] === undefined ? this._getViaCoordinates() : arguments[6]; + + var _ref2 = _slicedToArray(_ref, 2); + + var via1 = _ref2[0]; + var via2 = _ref2[1]; + // x3,y3 is the point + return this._getDistanceToBezierEdge(x1, y1, x2, y2, x3, y3, via1, via2); + } + + /** + * Combined function of pointOnLine and pointOnBezier. This gives the coordinates of a point on the line at a certain percentage of the way + * @param percentage + * @param via + * @returns {{x: number, y: number}} + * @private + */ + }, { + key: 'getPoint', + value: function getPoint(percentage) { + var _ref3 = arguments.length <= 1 || arguments[1] === undefined ? this._getViaCoordinates() : arguments[1]; + + var _ref32 = _slicedToArray(_ref3, 2); + + var via1 = _ref32[0]; + var via2 = _ref32[1]; + + var t = percentage; + var vec = []; + vec[0] = Math.pow(1 - t, 3); + vec[1] = 3 * t * Math.pow(1 - t, 2); + vec[2] = 3 * Math.pow(t, 2) * (1 - t); + vec[3] = Math.pow(t, 3); + var x = vec[0] * this.fromPoint.x + vec[1] * via1.x + vec[2] * via2.x + vec[3] * this.toPoint.x; + var y = vec[0] * this.fromPoint.y + vec[1] * via1.y + vec[2] * via2.y + vec[3] * this.toPoint.y; + + return { x: x, y: y }; + } + }]); + + return CubicBezierEdge; + })(_utilCubicBezierEdgeBase2['default']); + + exports['default'] = CubicBezierEdge; + module.exports = exports['default']; + /***/ }, /* 83 */ /***/ function(module, exports, __webpack_require__) { @@ -30919,157 +32557,78 @@ return /******/ (function(modules) { // webpackBootstrap var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); - var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; desc = parent = getter = undefined; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; + var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } - function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) subClass.__proto__ = superClass; } + function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - var _utilBezierEdgeBase = __webpack_require__(84); + var _BezierEdgeBase2 = __webpack_require__(84); - var _utilBezierEdgeBase2 = _interopRequireDefault(_utilBezierEdgeBase); + var _BezierEdgeBase3 = _interopRequireDefault(_BezierEdgeBase2); - var BezierEdgeDynamic = (function (_BezierEdgeBase) { - _inherits(BezierEdgeDynamic, _BezierEdgeBase); + var CubicBezierEdgeBase = (function (_BezierEdgeBase) { + _inherits(CubicBezierEdgeBase, _BezierEdgeBase); - function BezierEdgeDynamic(options, body, labelModule) { - _classCallCheck(this, BezierEdgeDynamic); + function CubicBezierEdgeBase(options, body, labelModule) { + _classCallCheck(this, CubicBezierEdgeBase); - //this.via = undefined; // Here for completeness but not allowed to defined before super() is invoked. - _get(Object.getPrototypeOf(BezierEdgeDynamic.prototype), 'constructor', this).call(this, options, body, labelModule); // --> this calls the setOptions below + _get(Object.getPrototypeOf(CubicBezierEdgeBase.prototype), 'constructor', this).call(this, options, body, labelModule); } - _createClass(BezierEdgeDynamic, [{ - key: 'setOptions', - value: function setOptions(options) { - this.options = options; - this.id = this.options.id; - this.setupSupportNode(); - this.connect(); - } - }, { - key: 'connect', - value: function connect() { - this.from = this.body.nodes[this.options.from]; - this.to = this.body.nodes[this.options.to]; - if (this.from === undefined || this.to === undefined || this.options.physics === false) { - this.via.setOptions({ physics: false }); - } else { - // fix weird behaviour where a selfreferencing node has physics enabled - if (this.from.id === this.to.id) { - this.via.setOptions({ physics: false }); - } else { - this.via.setOptions({ physics: true }); - } - } - } - }, { - key: 'cleanup', - value: function cleanup() { - if (this.via !== undefined) { - delete this.body.nodes[this.via.id]; - this.via = undefined; - return true; - } - return false; - } - }, { - key: 'togglePhysics', - value: function togglePhysics(status) { - this.via.setOptions({ physics: status }); - this.positionBezierNode(); - } - }, { - key: 'setupSupportNode', + /** + * Calculate the distance between a point (x3,y3) and a line segment from + * (x1,y1) to (x2,y2). + * http://stackoverflow.com/questions/849211/shortest-distancae-between-a-point-and-a-line-segment + * https://en.wikipedia.org/wiki/B%C3%A9zier_curve + * @param {number} x1 from x + * @param {number} y1 from y + * @param {number} x2 to x + * @param {number} y2 to y + * @param {number} x3 point to check x + * @param {number} y3 point to check y + * @private + */ - /** - * Bezier curves require an anchor point to calculate the smooth flow. These points are nodes. These nodes are invisible but - * are used for the force calculation. - * - * The changed data is not called, if needed, it is returned by the main edge constructor. - * @private - */ - value: function setupSupportNode() { - if (this.via === undefined) { - var nodeId = 'edgeId:' + this.id; - var node = this.body.functions.createNode({ - id: nodeId, - shape: 'circle', - physics: true, - hidden: true - }); - this.body.nodes[nodeId] = node; - this.via = node; - this.via.parentEdgeId = this.id; - this.positionBezierNode(); - } - } - }, { - key: 'positionBezierNode', - value: function positionBezierNode() { - if (this.via !== undefined && this.from !== undefined && this.to !== undefined) { - this.via.x = 0.5 * (this.from.x + this.to.x); - this.via.y = 0.5 * (this.from.y + this.to.y); - } else if (this.via !== undefined) { - this.via.x = 0; - this.via.y = 0; - } - } - }, { - key: '_line', - - /** - * Draw a line between two nodes - * @param {CanvasRenderingContext2D} ctx - * @private - */ - value: function _line(ctx) { - // draw a straight line - ctx.beginPath(); - ctx.moveTo(this.from.x, this.from.y); - ctx.quadraticCurveTo(this.via.x, this.via.y, this.to.x, this.to.y); - // draw shadow if enabled - this.enableShadow(ctx); - ctx.stroke(); - this.disableShadow(ctx); - return this.via; - } - }, { - key: 'getPoint', - - /** - * Combined function of pointOnLine and pointOnBezier. This gives the coordinates of a point on the line at a certain percentage of the way - * @param percentage - * @param via - * @returns {{x: number, y: number}} - * @private - */ - value: function getPoint(percentage) { - var t = percentage; - var x = Math.pow(1 - t, 2) * this.from.x + 2 * t * (1 - t) * this.via.x + Math.pow(t, 2) * this.to.x; - var y = Math.pow(1 - t, 2) * this.from.y + 2 * t * (1 - t) * this.via.y + Math.pow(t, 2) * this.to.y; - - return { x: x, y: y }; - } - }, { - key: '_findBorderPosition', - value: function _findBorderPosition(nearNode, ctx) { - return this._findBorderPositionBezier(nearNode, ctx, this.via); - } - }, { - key: '_getDistanceToEdge', - value: function _getDistanceToEdge(x1, y1, x2, y2, x3, y3) { + _createClass(CubicBezierEdgeBase, [{ + key: '_getDistanceToBezierEdge', + value: function _getDistanceToBezierEdge(x1, y1, x2, y2, x3, y3, via1, via2) { // x3,y3 is the point - return this._getDistanceToBezierEdge(x1, y1, x2, y2, x3, y3, this.via); + var minDistance = 1e9; + var distance = undefined; + var i = undefined, + t = undefined, + x = undefined, + y = undefined; + var lastX = x1; + var lastY = y1; + var vec = [0, 0, 0, 0]; + for (i = 1; i < 10; i++) { + t = 0.1 * i; + vec[0] = Math.pow(1 - t, 3); + vec[1] = 3 * t * Math.pow(1 - t, 2); + vec[2] = 3 * Math.pow(t, 2) * (1 - t); + vec[3] = Math.pow(t, 3); + x = vec[0] * x1 + vec[1] * via1.x + vec[2] * via2.x + vec[3] * x2; + y = vec[0] * y1 + vec[1] * via1.y + vec[2] * via2.y + vec[3] * y2; + if (i > 0) { + distance = this._getDistanceToLine(lastX, lastY, x, y, x3, y3); + minDistance = distance < minDistance ? distance : minDistance; + } + lastX = x; + lastY = y; + } + + return minDistance; } }]); - return BezierEdgeDynamic; - })(_utilBezierEdgeBase2['default']); + return CubicBezierEdgeBase; + })(_BezierEdgeBase3['default']); - exports['default'] = BezierEdgeDynamic; + exports['default'] = CubicBezierEdgeBase; module.exports = exports['default']; /***/ }, @@ -31084,13 +32643,13 @@ return /******/ (function(modules) { // webpackBootstrap var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); - var _get = function get(_x2, _x3, _x4) { var _again = true; _function: while (_again) { var object = _x2, property = _x3, receiver = _x4; desc = parent = getter = undefined; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x2 = parent; _x3 = property; _x4 = receiver; _again = true; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; + var _get = function get(_x2, _x3, _x4) { var _again = true; _function: while (_again) { var object = _x2, property = _x3, receiver = _x4; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x2 = parent; _x3 = property; _x4 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } - function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) subClass.__proto__ = superClass; } + function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var _EdgeBase2 = __webpack_require__(85); @@ -31105,22 +32664,22 @@ return /******/ (function(modules) { // webpackBootstrap _get(Object.getPrototypeOf(BezierEdgeBase.prototype), 'constructor', this).call(this, options, body, labelModule); } + /** + * This function uses binary search to look for the point where the bezier curve crosses the border of the node. + * + * @param nearNode + * @param ctx + * @param viaNode + * @param nearNode + * @param ctx + * @param viaNode + * @param nearNode + * @param ctx + * @param viaNode + */ + _createClass(BezierEdgeBase, [{ key: '_findBorderPositionBezier', - - /** - * This function uses binary search to look for the point where the bezier curve crosses the border of the node. - * - * @param nearNode - * @param ctx - * @param viaNode - * @param nearNode - * @param ctx - * @param viaNode - * @param nearNode - * @param ctx - * @param viaNode - */ value: function _findBorderPositionBezier(nearNode, ctx) { var viaNode = arguments.length <= 2 || arguments[2] === undefined ? this._getViaCoordinates() : arguments[2]; @@ -31148,19 +32707,19 @@ return /******/ (function(modules) { // webpackBootstrap if (Math.abs(difference) < threshold) { break; // found } else if (difference < 0) { - // distance to nodes is larger than distance to border --> t needs to be bigger if we're looking at the to node. - if (from === false) { - low = middle; + // distance to nodes is larger than distance to border --> t needs to be bigger if we're looking at the to node. + if (from === false) { + low = middle; + } else { + high = middle; + } } else { - high = middle; + if (from === false) { + high = middle; + } else { + low = middle; + } } - } else { - if (from === false) { - high = middle; - } else { - low = middle; - } - } iteration++; } @@ -31168,27 +32727,23 @@ return /******/ (function(modules) { // webpackBootstrap return pos; } - }, { - key: '_getDistanceToBezierEdge', /** * Calculate the distance between a point (x3,y3) and a line segment from * (x1,y1) to (x2,y2). * http://stackoverflow.com/questions/849211/shortest-distancae-between-a-point-and-a-line-segment - * @param {number} x1 - * @param {number} y1 - * @param {number} x2 - * @param {number} y2 - * @param {number} x3 - * @param {number} y3 + * @param {number} x1 from x + * @param {number} y1 from y + * @param {number} x2 to x + * @param {number} y2 to y + * @param {number} x3 point to check x + * @param {number} y3 point to check y * @private */ + }, { + key: '_getDistanceToBezierEdge', value: function _getDistanceToBezierEdge(x1, y1, x2, y2, x3, y3, via) { // x3,y3 is the point - var xVia = undefined, - yVia = undefined; - xVia = via.x; - yVia = via.y; var minDistance = 1e9; var distance = undefined; var i = undefined, @@ -31199,8 +32754,8 @@ return /******/ (function(modules) { // webpackBootstrap var lastY = y1; for (i = 1; i < 10; i++) { t = 0.1 * i; - x = Math.pow(1 - t, 2) * x1 + 2 * t * (1 - t) * xVia + Math.pow(t, 2) * x2; - y = Math.pow(1 - t, 2) * y1 + 2 * t * (1 - t) * yVia + Math.pow(t, 2) * y2; + x = Math.pow(1 - t, 2) * x1 + 2 * t * (1 - t) * via.x + Math.pow(t, 2) * x2; + y = Math.pow(1 - t, 2) * y1 + 2 * t * (1 - t) * via.y + Math.pow(t, 2) * y2; if (i > 0) { distance = this._getDistanceToLine(lastX, lastY, x, y, x3, y3); minDistance = distance < minDistance ? distance : minDistance; @@ -31235,7 +32790,7 @@ return /******/ (function(modules) { // webpackBootstrap function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } - var util = __webpack_require__(7); + var util = __webpack_require__(1); var EdgeBase = (function () { function EdgeBase(options, body, labelModule) { @@ -31243,11 +32798,14 @@ return /******/ (function(modules) { // webpackBootstrap this.body = body; this.labelModule = labelModule; + this.options = {}; this.setOptions(options); this.colorDirty = true; this.color = {}; this.selectionWidth = 2; this.hoverWidth = 1.5; + this.fromPoint = this.from; + this.toPoint = this.to; } _createClass(EdgeBase, [{ @@ -31269,16 +32827,6 @@ return /******/ (function(modules) { // webpackBootstrap this.to = this.body.nodes[this.options.to]; this.id = this.options.id; } - }, { - key: 'togglePhysics', - - /** - * overloadable if the shape has to toggle the via node to disabled - * @param status - */ - value: function togglePhysics(status) {} - }, { - key: 'drawLine', /** * Redraw a edge as a line @@ -31287,25 +32835,25 @@ return /******/ (function(modules) { // webpackBootstrap * @param {CanvasRenderingContext2D} ctx * @private */ - value: function drawLine(ctx, selected, hover) { + }, { + key: 'drawLine', + value: function drawLine(ctx, selected, hover, viaNode) { // set style ctx.strokeStyle = this.getColor(ctx, selected, hover); ctx.lineWidth = this.getLineWidth(selected, hover); - var via = undefined; + if (this.options.dashes !== false) { - via = this._drawDashedLine(ctx); + this._drawDashedLine(ctx, viaNode); } else { - via = this._drawLine(ctx); + this._drawLine(ctx, viaNode); } - return via; } }, { key: '_drawLine', - value: function _drawLine(ctx) { - var via = undefined; + value: function _drawLine(ctx, viaNode, fromPoint, toPoint) { if (this.from != this.to) { // draw line - via = this._line(ctx); + this._line(ctx, viaNode, fromPoint, toPoint); } else { var _getCircleData2 = this._getCircleData(ctx); @@ -31317,12 +32865,10 @@ return /******/ (function(modules) { // webpackBootstrap this._circle(ctx, x, y, radius); } - return via; } }, { key: '_drawDashedLine', - value: function _drawDashedLine(ctx) { - var via = undefined; + value: function _drawDashedLine(ctx, viaNode, fromPoint, toPoint) { ctx.lineCap = 'round'; var pattern = [5, 5]; if (Array.isArray(this.options.dashes) === true) { @@ -31340,7 +32886,7 @@ return /******/ (function(modules) { // webpackBootstrap // draw the line if (this.from != this.to) { // draw line - via = this._line(ctx); + this._line(ctx, viaNode); } else { var _getCircleData3 = this._getCircleData(ctx); @@ -31359,7 +32905,6 @@ return /******/ (function(modules) { // webpackBootstrap ctx.restore(); } else { // unsupporting smooth lines - if (this.from != this.to) { // draw line ctx.dashedLine(this.from.x, this.from.y, this.to.x, this.to.y, pattern); @@ -31382,7 +32927,6 @@ return /******/ (function(modules) { // webpackBootstrap // disable shadows for other elements. this.disableShadow(ctx); } - return via; } }, { key: 'findBorderPosition', @@ -31439,8 +32983,6 @@ return /******/ (function(modules) { // webpackBootstrap } return [x, y, radius]; } - }, { - key: '_pointOnCircle', /** * Get a point on a circle @@ -31451,6 +32993,8 @@ return /******/ (function(modules) { // webpackBootstrap * @return {Object} point * @private */ + }, { + key: '_pointOnCircle', value: function _pointOnCircle(x, y, radius, percentage) { var angle = percentage * 2 * Math.PI; return { @@ -31458,8 +33002,6 @@ return /******/ (function(modules) { // webpackBootstrap y: y - radius * Math.sin(angle) }; } - }, { - key: '_findBorderPositionCircle', /** * This function uses binary search to look for the point where the circle crosses the border of the node. @@ -31469,6 +33011,8 @@ return /******/ (function(modules) { // webpackBootstrap * @returns {*} * @private */ + }, { + key: '_findBorderPositionCircle', value: function _findBorderPositionCircle(node, ctx, options) { var x = options.x; var y = options.y; @@ -31498,27 +33042,25 @@ return /******/ (function(modules) { // webpackBootstrap if (Math.abs(difference) < threshold) { break; // found } else if (difference > 0) { - // distance to nodes is larger than distance to border --> t needs to be bigger if we're looking at the to node. - if (direction > 0) { - low = middle; + // distance to nodes is larger than distance to border --> t needs to be bigger if we're looking at the to node. + if (direction > 0) { + low = middle; + } else { + high = middle; + } } else { - high = middle; + if (direction > 0) { + high = middle; + } else { + low = middle; + } } - } else { - if (direction > 0) { - high = middle; - } else { - low = middle; - } - } iteration++; } pos.t = middle; return pos; } - }, { - key: 'getLineWidth', /** * Get the line width of the edge. Depends on width and whether one of the @@ -31526,6 +33068,8 @@ return /******/ (function(modules) { // webpackBootstrap * @return {Number} width * @private */ + }, { + key: 'getLineWidth', value: function getLineWidth(selected, hover) { if (selected === true) { return Math.max(this.selectionWidth, 0.3 / this.body.view.scale); @@ -31566,7 +33110,7 @@ return /******/ (function(modules) { // webpackBootstrap } if (this.colorDirty === true) { - if (colorOptions.inherit === 'to') { + if (colorOptions.inherit === "to") { this.color.highlight = this.to.options.color.highlight.border; this.color.hover = this.to.options.color.hover.border; this.color.color = util.overrideOpacity(this.to.options.color.border, colorOptions.opacity); @@ -31594,8 +33138,6 @@ return /******/ (function(modules) { // webpackBootstrap return this.color.color; } } - }, { - key: '_circle', /** * Draw a line from a node to itself, a circle @@ -31605,6 +33147,8 @@ return /******/ (function(modules) { // webpackBootstrap * @param {Number} radius * @private */ + }, { + key: '_circle', value: function _circle(ctx, x, y, radius) { // draw shadow if enabled this.enableShadow(ctx); @@ -31617,8 +33161,6 @@ return /******/ (function(modules) { // webpackBootstrap // disable shadows for other elements. this.disableShadow(ctx); } - }, { - key: 'getDistanceToEdge', /** * Calculate the distance between a point (x3,y3) and a line segment from @@ -31632,6 +33174,8 @@ return /******/ (function(modules) { // webpackBootstrap * @param {number} y3 * @private */ + }, { + key: 'getDistanceToEdge', value: function getDistanceToEdge(x1, y1, x2, y2, x3, y3, via) { // x3,y3 is the point var returnValue = 0; @@ -31684,8 +33228,6 @@ return /******/ (function(modules) { // webpackBootstrap return Math.sqrt(dx * dx + dy * dy); } - }, { - key: 'drawArrowHead', /** * @@ -31693,20 +33235,17 @@ return /******/ (function(modules) { // webpackBootstrap * @param position * @param viaNode */ - value: function drawArrowHead(ctx, position, viaNode, selected, hover) { - // set style - ctx.strokeStyle = this.getColor(ctx, selected, hover); - ctx.fillStyle = ctx.strokeStyle; - ctx.lineWidth = this.getLineWidth(selected, hover); - + }, { + key: 'getArrowData', + value: function getArrowData(ctx, position, viaNode, selected, hover) { // set lets var angle = undefined; - var length = undefined; - var arrowPos = undefined; + var arrowPoint = undefined; var node1 = undefined; var node2 = undefined; var guideOffset = undefined; var scaleFactor = undefined; + var lineWidth = this.getLineWidth(selected, hover); if (position === 'from') { node1 = this.from; @@ -31729,70 +33268,76 @@ return /******/ (function(modules) { // webpackBootstrap if (position !== 'middle') { // draw arrow head if (this.options.smooth.enabled === true) { - arrowPos = this.findBorderPosition(node1, ctx, { via: viaNode }); - var guidePos = this.getPoint(Math.max(0.0, Math.min(1.0, arrowPos.t + guideOffset)), viaNode); - angle = Math.atan2(arrowPos.y - guidePos.y, arrowPos.x - guidePos.x); + arrowPoint = this.findBorderPosition(node1, ctx, { via: viaNode }); + var guidePos = this.getPoint(Math.max(0.0, Math.min(1.0, arrowPoint.t + guideOffset)), viaNode); + angle = Math.atan2(arrowPoint.y - guidePos.y, arrowPoint.x - guidePos.x); } else { angle = Math.atan2(node1.y - node2.y, node1.x - node2.x); - arrowPos = this.findBorderPosition(node1, ctx); + arrowPoint = this.findBorderPosition(node1, ctx); } } else { angle = Math.atan2(node1.y - node2.y, node1.x - node2.x); - arrowPos = this.getPoint(0.6, viaNode); // this is 0.6 to account for the size of the arrow. + arrowPoint = this.getPoint(0.5, viaNode); // this is 0.6 to account for the size of the arrow. } - // draw arrow at the end of the line - length = (10 + 5 * this.options.width) * scaleFactor; - ctx.arrow(arrowPos.x, arrowPos.y, angle, length); - - // draw shadow if enabled - this.enableShadow(ctx); - ctx.fill(); - - // disable shadows for other elements. - this.disableShadow(ctx); - ctx.stroke(); } else { - // draw circle - var _angle = undefined, - point = undefined; + var _getCircleData7 = this._getCircleData(ctx); - var _getCircleData7 = this._getCircleData(ctx); + var _getCircleData72 = _slicedToArray(_getCircleData7, 3); - var _getCircleData72 = _slicedToArray(_getCircleData7, 3); + var x = _getCircleData72[0]; + var y = _getCircleData72[1]; + var radius = _getCircleData72[2]; - var x = _getCircleData72[0]; - var y = _getCircleData72[1]; - var radius = _getCircleData72[2]; - - if (position === 'from') { - point = this.findBorderPosition(this.from, ctx, { x: x, y: y, low: 0.25, high: 0.6, direction: -1 }); - _angle = point.t * -2 * Math.PI + 1.5 * Math.PI + 0.1 * Math.PI; - } else if (position === 'to') { - point = this.findBorderPosition(this.from, ctx, { x: x, y: y, low: 0.6, high: 1.0, direction: 1 }); - _angle = point.t * -2 * Math.PI + 1.5 * Math.PI - 1.1 * Math.PI; - } else { - point = this._pointOnCircle(x, y, radius, 0.175); - _angle = 3.9269908169872414; // === 0.175 * -2 * Math.PI + 1.5 * Math.PI + 0.1 * Math.PI; + if (position === 'from') { + arrowPoint = this.findBorderPosition(this.from, ctx, { x: x, y: y, low: 0.25, high: 0.6, direction: -1 }); + angle = arrowPoint.t * -2 * Math.PI + 1.5 * Math.PI + 0.1 * Math.PI; + } else if (position === 'to') { + arrowPoint = this.findBorderPosition(this.from, ctx, { x: x, y: y, low: 0.6, high: 1.0, direction: 1 }); + angle = arrowPoint.t * -2 * Math.PI + 1.5 * Math.PI - 1.1 * Math.PI; + } else { + arrowPoint = this._pointOnCircle(x, y, radius, 0.175); + angle = 3.9269908169872414; // === 0.175 * -2 * Math.PI + 1.5 * Math.PI + 0.1 * Math.PI; + } } - // draw the arrowhead - var _length = (10 + 5 * this.options.width) * scaleFactor; - ctx.arrow(point.x, point.y, _angle, _length); + var length = 15 * scaleFactor + 3 * lineWidth; // 3* lineWidth is the width of the edge. - // draw shadow if enabled - this.enableShadow(ctx); - ctx.fill(); + var xi = arrowPoint.x - length * 0.9 * Math.cos(angle); + var yi = arrowPoint.y - length * 0.9 * Math.sin(angle); + var arrowCore = { x: xi, y: yi }; - // disable shadows for other elements. - this.disableShadow(ctx); - ctx.stroke(); - } + return { point: arrowPoint, core: arrowCore, angle: angle, length: length }; + } + + /** + * + * @param ctx + * @param selected + * @param hover + * @param arrowData + */ + }, { + key: 'drawArrowHead', + value: function drawArrowHead(ctx, selected, hover, arrowData) { + // set style + ctx.strokeStyle = this.getColor(ctx, selected, hover); + ctx.fillStyle = ctx.strokeStyle; + ctx.lineWidth = this.getLineWidth(selected, hover); + + // draw arrow at the end of the line + ctx.arrow(arrowData.point.x, arrowData.point.y, arrowData.angle, arrowData.length); + + // draw shadow if enabled + this.enableShadow(ctx); + ctx.fill(); + // disable shadows for other elements. + this.disableShadow(ctx); } }, { key: 'enableShadow', value: function enableShadow(ctx) { if (this.options.shadow.enabled === true) { - ctx.shadowColor = 'rgba(0,0,0,0.5)'; + ctx.shadowColor = this.options.shadow.color; ctx.shadowBlur = this.options.shadow.size; ctx.shadowOffsetX = this.options.shadow.x; ctx.shadowOffsetY = this.options.shadow.y; @@ -31816,8 +33361,209 @@ return /******/ (function(modules) { // webpackBootstrap exports['default'] = EdgeBase; module.exports = exports['default']; + // draw circle + /***/ }, /* 86 */ +/***/ function(module, exports, __webpack_require__) { + + "use strict"; + + Object.defineProperty(exports, "__esModule", { + value: true + }); + + var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); + + var _get = function get(_x2, _x3, _x4) { var _again = true; _function: while (_again) { var object = _x2, property = _x3, receiver = _x4; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x2 = parent; _x3 = property; _x4 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; + + function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + + function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + + function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + + var _utilBezierEdgeBase = __webpack_require__(84); + + var _utilBezierEdgeBase2 = _interopRequireDefault(_utilBezierEdgeBase); + + var BezierEdgeDynamic = (function (_BezierEdgeBase) { + _inherits(BezierEdgeDynamic, _BezierEdgeBase); + + function BezierEdgeDynamic(options, body, labelModule) { + var _this = this; + + _classCallCheck(this, BezierEdgeDynamic); + + //this.via = undefined; // Here for completeness but not allowed to defined before super() is invoked. + _get(Object.getPrototypeOf(BezierEdgeDynamic.prototype), "constructor", this).call(this, options, body, labelModule); // --> this calls the setOptions below + this._boundFunction = function () { + _this.positionBezierNode(); + }; + this.body.emitter.on("_repositionBezierNodes", this._boundFunction); + } + + _createClass(BezierEdgeDynamic, [{ + key: "setOptions", + value: function setOptions(options) { + // check if the physics has changed. + var physicsChange = false; + if (this.options.physics !== options.physics) { + physicsChange = true; + } + + // set the options and the to and from nodes + this.options = options; + this.id = this.options.id; + this.from = this.body.nodes[this.options.from]; + this.to = this.body.nodes[this.options.to]; + + // setup the support node and connect + this.setupSupportNode(); + this.connect(); + + // when we change the physics state of the edge, we reposition the support node. + if (physicsChange === true) { + this.via.setOptions({ physics: this.options.physics }); + this.positionBezierNode(); + } + } + }, { + key: "connect", + value: function connect() { + this.from = this.body.nodes[this.options.from]; + this.to = this.body.nodes[this.options.to]; + if (this.from === undefined || this.to === undefined || this.options.physics === false) { + this.via.setOptions({ physics: false }); + } else { + // fix weird behaviour where a self referencing node has physics enabled + if (this.from.id === this.to.id) { + this.via.setOptions({ physics: false }); + } else { + this.via.setOptions({ physics: true }); + } + } + } + + /** + * remove the support nodes + * @returns {boolean} + */ + }, { + key: "cleanup", + value: function cleanup() { + this.body.emitter.off("_repositionBezierNodes", this._boundFunction); + if (this.via !== undefined) { + delete this.body.nodes[this.via.id]; + this.via = undefined; + return true; + } + return false; + } + + /** + * Bezier curves require an anchor point to calculate the smooth flow. These points are nodes. These nodes are invisible but + * are used for the force calculation. + * + * The changed data is not called, if needed, it is returned by the main edge constructor. + * @private + */ + }, { + key: "setupSupportNode", + value: function setupSupportNode() { + if (this.via === undefined) { + var nodeId = "edgeId:" + this.id; + var node = this.body.functions.createNode({ + id: nodeId, + shape: 'circle', + physics: true, + hidden: true + }); + this.body.nodes[nodeId] = node; + this.via = node; + this.via.parentEdgeId = this.id; + this.positionBezierNode(); + } + } + }, { + key: "positionBezierNode", + value: function positionBezierNode() { + if (this.via !== undefined && this.from !== undefined && this.to !== undefined) { + this.via.x = 0.5 * (this.from.x + this.to.x); + this.via.y = 0.5 * (this.from.y + this.to.y); + } else if (this.via !== undefined) { + this.via.x = 0; + this.via.y = 0; + } + } + + /** + * Draw a line between two nodes + * @param {CanvasRenderingContext2D} ctx + * @private + */ + }, { + key: "_line", + value: function _line(ctx, viaNode) { + // draw a straight line + ctx.beginPath(); + ctx.moveTo(this.fromPoint.x, this.fromPoint.y); + // fallback to normal straight edges + if (viaNode.x === undefined) { + ctx.lineTo(this.toPoint.x, this.toPoint.y); + } else { + ctx.quadraticCurveTo(viaNode.x, viaNode.y, this.toPoint.x, this.toPoint.y); + } + // draw shadow if enabled + this.enableShadow(ctx); + ctx.stroke(); + this.disableShadow(ctx); + } + }, { + key: "getViaNode", + value: function getViaNode() { + return this.via; + } + + /** + * Combined function of pointOnLine and pointOnBezier. This gives the coordinates of a point on the line at a certain percentage of the way + * @param percentage + * @param viaNode + * @returns {{x: number, y: number}} + * @private + */ + }, { + key: "getPoint", + value: function getPoint(percentage) { + var viaNode = arguments.length <= 1 || arguments[1] === undefined ? this.via : arguments[1]; + + var t = percentage; + var x = Math.pow(1 - t, 2) * this.fromPoint.x + 2 * t * (1 - t) * viaNode.x + Math.pow(t, 2) * this.toPoint.x; + var y = Math.pow(1 - t, 2) * this.fromPoint.y + 2 * t * (1 - t) * viaNode.y + Math.pow(t, 2) * this.toPoint.y; + + return { x: x, y: y }; + } + }, { + key: "_findBorderPosition", + value: function _findBorderPosition(nearNode, ctx) { + return this._findBorderPositionBezier(nearNode, ctx, this.via); + } + }, { + key: "_getDistanceToEdge", + value: function _getDistanceToEdge(x1, y1, x2, y2, x3, y3) { + // x3,y3 is the point + return this._getDistanceToBezierEdge(x1, y1, x2, y2, x3, y3, this.via); + } + }]); + + return BezierEdgeDynamic; + })(_utilBezierEdgeBase2["default"]); + + exports["default"] = BezierEdgeDynamic; + module.exports = exports["default"]; + +/***/ }, +/* 87 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; @@ -31828,13 +33574,13 @@ return /******/ (function(modules) { // webpackBootstrap var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); - var _get = function get(_x4, _x5, _x6) { var _again = true; _function: while (_again) { var object = _x4, property = _x5, receiver = _x6; desc = parent = getter = undefined; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x4 = parent; _x5 = property; _x6 = receiver; _again = true; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; + var _get = function get(_x4, _x5, _x6) { var _again = true; _function: while (_again) { var object = _x4, property = _x5, receiver = _x6; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x4 = parent; _x5 = property; _x6 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } - function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) subClass.__proto__ = superClass; } + function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var _utilBezierEdgeBase = __webpack_require__(84); @@ -31849,34 +33595,41 @@ return /******/ (function(modules) { // webpackBootstrap _get(Object.getPrototypeOf(BezierEdgeStatic.prototype), 'constructor', this).call(this, options, body, labelModule); } + /** + * Draw a line between two nodes + * @param {CanvasRenderingContext2D} ctx + * @private + */ + _createClass(BezierEdgeStatic, [{ key: '_line', - - /** - * Draw a line between two nodes - * @param {CanvasRenderingContext2D} ctx - * @private - */ - value: function _line(ctx) { + value: function _line(ctx, viaNode) { // draw a straight line ctx.beginPath(); - ctx.moveTo(this.from.x, this.from.y); - var via = this._getViaCoordinates(); - var returnValue = via; + ctx.moveTo(this.fromPoint.x, this.fromPoint.y); // fallback to normal straight edges - if (via.x === undefined) { - ctx.lineTo(this.to.x, this.to.y); - returnValue = undefined; + if (viaNode.x === undefined) { + ctx.lineTo(this.toPoint.x, this.toPoint.y); } else { - ctx.quadraticCurveTo(via.x, via.y, this.to.x, this.to.y); + ctx.quadraticCurveTo(viaNode.x, viaNode.y, this.toPoint.x, this.toPoint.y); } // draw shadow if enabled this.enableShadow(ctx); ctx.stroke(); this.disableShadow(ctx); - return returnValue; } + }, { + key: 'getViaNode', + value: function getViaNode() { + return this._getViaCoordinates(); + } + + /** + * We do not use the to and fromPoints here to make the via nodes the same as edges without arrows. + * @returns {{x: undefined, y: undefined}} + * @private + */ }, { key: '_getViaCoordinates', value: function _getViaCoordinates() { @@ -31905,7 +33658,7 @@ return /******/ (function(modules) { // webpackBootstrap yVia = this.from.y + factor * dy; } } - if (type === 'discrete') { + if (type === "discrete") { xVia = dx < factor * dy ? this.from.x : xVia; } } else if (Math.abs(this.from.x - this.to.x) > Math.abs(this.from.y - this.to.y)) { @@ -31926,11 +33679,11 @@ return /******/ (function(modules) { // webpackBootstrap yVia = this.from.y + factor * dx; } } - if (type === 'discrete') { + if (type === "discrete") { yVia = dy < factor * dx ? this.from.y : yVia; } } - } else if (type === 'straightCross') { + } else if (type === "straightCross") { if (Math.abs(this.from.x - this.to.x) <= Math.abs(this.from.y - this.to.y)) { // up - down xVia = this.from.x; @@ -32044,26 +33797,26 @@ return /******/ (function(modules) { // webpackBootstrap }, { key: '_getDistanceToEdge', value: function _getDistanceToEdge(x1, y1, x2, y2, x3, y3) { - var via = arguments.length <= 6 || arguments[6] === undefined ? this._getViaCoordinates() : arguments[6]; + var viaNode = arguments.length <= 6 || arguments[6] === undefined ? this._getViaCoordinates() : arguments[6]; // x3,y3 is the point - return this._getDistanceToBezierEdge(x1, y1, x2, y2, x3, y3, via); + return this._getDistanceToBezierEdge(x1, y1, x2, y2, x3, y3, viaNode); } - }, { - key: 'getPoint', /** * Combined function of pointOnLine and pointOnBezier. This gives the coordinates of a point on the line at a certain percentage of the way * @param percentage - * @param via + * @param viaNode * @returns {{x: number, y: number}} * @private */ + }, { + key: 'getPoint', value: function getPoint(percentage) { - var via = arguments.length <= 1 || arguments[1] === undefined ? this._getViaCoordinates() : arguments[1]; + var viaNode = arguments.length <= 1 || arguments[1] === undefined ? this._getViaCoordinates() : arguments[1]; var t = percentage; - var x = Math.pow(1 - t, 2) * this.from.x + 2 * t * (1 - t) * via.x + Math.pow(t, 2) * this.to.x; - var y = Math.pow(1 - t, 2) * this.from.y + 2 * t * (1 - t) * via.y + Math.pow(t, 2) * this.to.y; + var x = Math.pow(1 - t, 2) * this.fromPoint.x + 2 * t * (1 - t) * viaNode.x + Math.pow(t, 2) * this.toPoint.x; + var y = Math.pow(1 - t, 2) * this.fromPoint.y + 2 * t * (1 - t) * viaNode.y + Math.pow(t, 2) * this.toPoint.y; return { x: x, y: y }; } @@ -32076,7 +33829,7 @@ return /******/ (function(modules) { // webpackBootstrap module.exports = exports['default']; /***/ }, -/* 87 */ +/* 88 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; @@ -32087,13 +33840,13 @@ return /******/ (function(modules) { // webpackBootstrap var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); - var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; desc = parent = getter = undefined; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; + var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } - function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) subClass.__proto__ = superClass; } + function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var _utilEdgeBase = __webpack_require__(85); @@ -32108,27 +33861,29 @@ return /******/ (function(modules) { // webpackBootstrap _get(Object.getPrototypeOf(StraightEdge.prototype), 'constructor', this).call(this, options, body, labelModule); } + /** + * Draw a line between two nodes + * @param {CanvasRenderingContext2D} ctx + * @private + */ + _createClass(StraightEdge, [{ key: '_line', - - /** - * Draw a line between two nodes - * @param {CanvasRenderingContext2D} ctx - * @private - */ value: function _line(ctx) { // draw a straight line ctx.beginPath(); - ctx.moveTo(this.from.x, this.from.y); - ctx.lineTo(this.to.x, this.to.y); + ctx.moveTo(this.fromPoint.x, this.fromPoint.y); + ctx.lineTo(this.toPoint.x, this.toPoint.y); // draw shadow if enabled this.enableShadow(ctx); ctx.stroke(); this.disableShadow(ctx); - return undefined; } }, { - key: 'getPoint', + key: 'getViaNode', + value: function getViaNode() { + return undefined; + } /** * Combined function of pointOnLine and pointOnBezier. This gives the coordinates of a point on the line at a certain percentage of the way @@ -32137,10 +33892,12 @@ return /******/ (function(modules) { // webpackBootstrap * @returns {{x: number, y: number}} * @private */ + }, { + key: 'getPoint', value: function getPoint(percentage) { return { - x: (1 - percentage) * this.from.x + percentage * this.to.x, - y: (1 - percentage) * this.from.y + percentage * this.to.y + x: (1 - percentage) * this.fromPoint.x + percentage * this.toPoint.x, + y: (1 - percentage) * this.fromPoint.y + percentage * this.toPoint.y }; } }, { @@ -32181,7 +33938,7 @@ return /******/ (function(modules) { // webpackBootstrap module.exports = exports['default']; /***/ }, -/* 88 */ +/* 89 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; @@ -32196,39 +33953,39 @@ return /******/ (function(modules) { // webpackBootstrap function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } - var _componentsPhysicsBarnesHutSolver = __webpack_require__(89); + var _componentsPhysicsBarnesHutSolver = __webpack_require__(90); var _componentsPhysicsBarnesHutSolver2 = _interopRequireDefault(_componentsPhysicsBarnesHutSolver); - var _componentsPhysicsRepulsionSolver = __webpack_require__(90); + var _componentsPhysicsRepulsionSolver = __webpack_require__(91); var _componentsPhysicsRepulsionSolver2 = _interopRequireDefault(_componentsPhysicsRepulsionSolver); - var _componentsPhysicsHierarchicalRepulsionSolver = __webpack_require__(91); + var _componentsPhysicsHierarchicalRepulsionSolver = __webpack_require__(92); var _componentsPhysicsHierarchicalRepulsionSolver2 = _interopRequireDefault(_componentsPhysicsHierarchicalRepulsionSolver); - var _componentsPhysicsSpringSolver = __webpack_require__(92); + var _componentsPhysicsSpringSolver = __webpack_require__(93); var _componentsPhysicsSpringSolver2 = _interopRequireDefault(_componentsPhysicsSpringSolver); - var _componentsPhysicsHierarchicalSpringSolver = __webpack_require__(93); + var _componentsPhysicsHierarchicalSpringSolver = __webpack_require__(94); var _componentsPhysicsHierarchicalSpringSolver2 = _interopRequireDefault(_componentsPhysicsHierarchicalSpringSolver); - var _componentsPhysicsCentralGravitySolver = __webpack_require__(94); + var _componentsPhysicsCentralGravitySolver = __webpack_require__(95); var _componentsPhysicsCentralGravitySolver2 = _interopRequireDefault(_componentsPhysicsCentralGravitySolver); - var _componentsPhysicsFA2BasedRepulsionSolver = __webpack_require__(95); + var _componentsPhysicsFA2BasedRepulsionSolver = __webpack_require__(96); var _componentsPhysicsFA2BasedRepulsionSolver2 = _interopRequireDefault(_componentsPhysicsFA2BasedRepulsionSolver); - var _componentsPhysicsFA2BasedCentralGravitySolver = __webpack_require__(96); + var _componentsPhysicsFA2BasedCentralGravitySolver = __webpack_require__(97); var _componentsPhysicsFA2BasedCentralGravitySolver2 = _interopRequireDefault(_componentsPhysicsFA2BasedCentralGravitySolver); - var util = __webpack_require__(7); + var util = __webpack_require__(1); var PhysicsEngine = (function () { function PhysicsEngine(body) { @@ -32241,9 +33998,15 @@ return /******/ (function(modules) { // webpackBootstrap this.simulationInterval = 1000 / 60; this.requiresTimeout = true; this.previousStates = {}; + this.referenceState = {}; this.freezeCache = {}; this.renderTimer = undefined; - this.initialStabilizationEmitted = false; + + // parameters for the adaptive timestep + this.adaptiveTimestep = false; + this.adaptiveTimestepEnabled = false; + this.adaptiveCounter = 0; + this.adaptiveInterval = 3; this.stabilized = false; this.startedStabilization = false; @@ -32288,7 +34051,7 @@ return /******/ (function(modules) { // webpackBootstrap damping: 0.09 }, maxVelocity: 50, - minVelocity: 0.1, // px/s + minVelocity: 0.75, // px/s solver: 'barnesHut', stabilization: { enabled: true, @@ -32297,9 +34060,12 @@ return /******/ (function(modules) { // webpackBootstrap onlyDynamicEdges: false, fit: true }, - timestep: 0.5 + timestep: 0.5, + adaptiveTimestep: true }; util.extend(this.options, this.defaultOptions); + this.timestep = 0.5; + this.layoutFailed = false; this.bindEventListeners(); } @@ -32312,6 +34078,9 @@ return /******/ (function(modules) { // webpackBootstrap this.body.emitter.on('initPhysics', function () { _this.initPhysics(); }); + this.body.emitter.on('_layoutFailed', function () { + _this.layoutFailed = true; + }); this.body.emitter.on('resetPhysics', function () { _this.stopSimulation();_this.ready = false; }); @@ -32336,7 +34105,20 @@ return /******/ (function(modules) { // webpackBootstrap _this.stopSimulation(false); _this.body.emitter.off(); }); + // this event will trigger a rebuilding of the cache everything. Used when nodes or edges have been added or removed. + this.body.emitter.on("_dataChanged", function () { + // update shortcut lists + _this.updatePhysicsData(); + }); + + // debug: show forces + // this.body.emitter.on("afterDrawing", (ctx) => {this._drawForces(ctx);}); } + + /** + * set the physics options + * @param options + */ }, { key: 'setOptions', value: function setOptions(options) { @@ -32358,10 +34140,17 @@ return /******/ (function(modules) { // webpackBootstrap this.physicsEnabled = false; this.stopSimulation(); } + + // set the timestep + this.timestep = this.options.timestep; } } this.init(); } + + /** + * configure the engine. + */ }, { key: 'init', value: function init() { @@ -32391,6 +34180,10 @@ return /******/ (function(modules) { // webpackBootstrap this.modelOptions = options; } + + /** + * initialize the engine + */ }, { key: 'initPhysics', value: function initPhysics() { @@ -32400,7 +34193,7 @@ return /******/ (function(modules) { // webpackBootstrap } else { this.stabilized = false; this.ready = true; - this.body.emitter.emit('fit', {}, true); + this.body.emitter.emit('fit', {}, this.layoutFailed); // if the layout failed, we use the approximation for the zoom this.startSimulation(); } } else { @@ -32408,18 +34201,21 @@ return /******/ (function(modules) { // webpackBootstrap this.body.emitter.emit('fit'); } } - }, { - key: 'startSimulation', /** * Start the simulation */ + }, { + key: 'startSimulation', value: function startSimulation() { if (this.physicsEnabled === true && this.options.enabled === true) { this.stabilized = false; + // when visible, adaptivity is disabled. + this.adaptiveTimestep = false; + // this sets the width of all nodes initially which could be required for the avoidOverlap - this.body.emitter.emit('_resizeNodes'); + this.body.emitter.emit("_resizeNodes"); if (this.viewFunction === undefined) { this.viewFunction = this.simulationStep.bind(this); this.body.emitter.on('initRedraw', this.viewFunction); @@ -32429,12 +34225,12 @@ return /******/ (function(modules) { // webpackBootstrap this.body.emitter.emit('_redraw'); } } - }, { - key: 'stopSimulation', /** * Stop the simulation, force stabilization. */ + }, { + key: 'stopSimulation', value: function stopSimulation() { var emit = arguments.length <= 0 || arguments[0] === undefined ? true : arguments[0]; @@ -32450,13 +34246,13 @@ return /******/ (function(modules) { // webpackBootstrap } } } - }, { - key: 'simulationStep', /** - * The viewFunction inserts this step into each renderloop. It calls the physics tick and handles the cleanup at stabilized. + * The viewFunction inserts this step into each render loop. It calls the physics tick and handles the cleanup at stabilized. * */ + }, { + key: 'simulationStep', value: function simulationStep() { // check if the physics have settled var startTime = Date.now(); @@ -32472,65 +34268,115 @@ return /******/ (function(modules) { // webpackBootstrap } if (this.stabilized === true) { - if (this.stabilizationIterations > 1) { - // trigger the 'stabilized' event. - // The event is triggered on the next tick, to prevent the case that - // it is fired while initializing the Network, in which case you would not - // be able to catch it - this.startedStabilization = false; - //this._emitStabilized(); - } this.stopSimulation(); } } + + /** + * trigger the stabilized event. + * @private + */ }, { key: '_emitStabilized', value: function _emitStabilized() { var _this2 = this; - if (this.stabilizationIterations > 1 || this.initialStabilizationEmitted === false) { - this.initialStabilizationEmitted = true; + var amountOfIterations = arguments.length <= 0 || arguments[0] === undefined ? this.stabilizationIterations : arguments[0]; + + if (this.stabilizationIterations > 1 || this.startedStabilization === true) { setTimeout(function () { - _this2.body.emitter.emit('stabilized', { iterations: _this2.stabilizationIterations }); + _this2.body.emitter.emit('stabilized', { iterations: amountOfIterations }); + _this2.startedStabilization = false; _this2.stabilizationIterations = 0; }, 0); } } - }, { - key: 'physicsTick', /** * A single simulation step (or 'tick') in the physics simulation * * @private */ + }, { + key: 'physicsTick', value: function physicsTick() { + // this is here to ensure that there is no start event when the network is already stable. + if (this.startedStabilization === false) { + this.body.emitter.emit('startStabilizing'); + this.startedStabilization = true; + } + if (this.stabilized === false) { - this.calculateForces(); - this.stabilized = this.moveNodes(); + // adaptivity means the timestep adapts to the situation, only applicable for stabilization + if (this.adaptiveTimestep === true && this.adaptiveTimestepEnabled === true) { + // this is the factor for increasing the timestep on success. + var factor = 1.2; + + // we assume the adaptive interval is + if (this.adaptiveCounter % this.adaptiveInterval === 0) { + // we leave the timestep stable for "interval" iterations. + // first the big step and revert. Revert saves the reference state. + this.timestep = 2 * this.timestep; + this.calculateForces(); + this.moveNodes(); + this.revert(); + + // now the normal step. Since this is the last step, it is the more stable one and we will take this. + this.timestep = 0.5 * this.timestep; + + // since it's half the step, we do it twice. + this.calculateForces(); + this.moveNodes(); + this.calculateForces(); + this.moveNodes(); + + // we compare the two steps. if it is acceptable we double the step. + if (this._evaluateStepQuality() === true) { + this.timestep = factor * this.timestep; + } else { + // if not, we decrease the step to a minimum of the options timestep. + // if the decreased timestep is smaller than the options step, we do not reset the counter + // we assume that the options timestep is stable enough. + if (this.timestep / factor < this.options.timestep) { + this.timestep = this.options.timestep; + } else { + // if the timestep was larger than 2 times the option one we check the adaptivity again to ensure + // that large instabilities do not form. + this.adaptiveCounter = -1; // check again next iteration + this.timestep = Math.max(this.options.timestep, this.timestep / factor); + } + } + } else { + // normal step, keeping timestep constant + this.calculateForces(); + this.moveNodes(); + } + + // increment the counter + this.adaptiveCounter += 1; + } else { + // case for the static timestep, we reset it to the one in options and take a normal step. + this.timestep = this.options.timestep; + this.calculateForces(); + this.moveNodes(); + } // determine if the network has stabilzied if (this.stabilized === true) { this.revert(); - } else { - // this is here to ensure that there is no start event when the network is already stable. - if (this.startedStabilization === false) { - this.body.emitter.emit('startStabilizing'); - this.startedStabilization = true; - } } this.stabilizationIterations++; } } - }, { - key: 'updatePhysicsData', /** * Nodes and edges can have the physics toggles on or off. A collection of indices is created here so we can skip the check all the time. * * @private */ + }, { + key: 'updatePhysicsData', value: function updatePhysicsData() { this.physicsBody.forces = {}; this.physicsBody.physicsNodeIndices = []; @@ -32542,7 +34388,7 @@ return /******/ (function(modules) { // webpackBootstrap for (var nodeId in nodes) { if (nodes.hasOwnProperty(nodeId)) { if (nodes[nodeId].options.physics === true) { - this.physicsBody.physicsNodeIndices.push(nodeId); + this.physicsBody.physicsNodeIndices.push(nodes[nodeId].id); } } } @@ -32551,7 +34397,7 @@ return /******/ (function(modules) { // webpackBootstrap for (var edgeId in edges) { if (edges.hasOwnProperty(edgeId)) { if (edges[edgeId].options.physics === true) { - this.physicsBody.physicsEdgeIndices.push(edgeId); + this.physicsBody.physicsEdgeIndices.push(edges[edgeId].id); } } } @@ -32574,21 +34420,25 @@ return /******/ (function(modules) { // webpackBootstrap } } } - }, { - key: 'revert', /** * Revert the simulation one step. This is done so after stabilization, every new start of the simulation will also say stabilized. */ + }, { + key: 'revert', value: function revert() { var nodeIds = Object.keys(this.previousStates); var nodes = this.body.nodes; var velocities = this.physicsBody.velocities; + this.referenceState = {}; for (var i = 0; i < nodeIds.length; i++) { var nodeId = nodeIds[i]; if (nodes[nodeId] !== undefined) { if (nodes[nodeId].options.physics === true) { + this.referenceState[nodeId] = { + positions: { x: nodes[nodeId].x, y: nodes[nodeId].y } + }; velocities[nodeId].x = this.previousStates[nodeId].vx; velocities[nodeId].y = this.previousStates[nodeId].vy; nodes[nodeId].x = this.previousStates[nodeId].x; @@ -32599,39 +34449,62 @@ return /******/ (function(modules) { // webpackBootstrap } } } - }, { - key: 'moveNodes', /** - * move the nodes one timestap and check if they are stabilized + * This compares the reference state to the current state + */ + }, { + key: '_evaluateStepQuality', + value: function _evaluateStepQuality() { + var dx = undefined, + dy = undefined, + dpos = undefined; + var nodes = this.body.nodes; + var reference = this.referenceState; + var posThreshold = 0.3; + + for (var nodeId in this.referenceState) { + if (this.referenceState.hasOwnProperty(nodeId) && nodes[nodeId] !== undefined) { + dx = nodes[nodeId].x - reference[nodeId].positions.x; + dy = nodes[nodeId].y - reference[nodeId].positions.y; + + dpos = Math.sqrt(Math.pow(dx, 2) + Math.pow(dy, 2)); + + if (dpos > posThreshold) { + return false; + } + } + } + return true; + } + + /** + * move the nodes one timestep and check if they are stabilized * @returns {boolean} */ + }, { + key: 'moveNodes', value: function moveNodes() { - var nodesPresent = false; var nodeIndices = this.physicsBody.physicsNodeIndices; var maxVelocity = this.options.maxVelocity ? this.options.maxVelocity : 1e9; - var stabilized = true; - var vminCorrected = this.options.minVelocity / Math.max(this.body.view.scale, 0.05); + var maxNodeVelocity = 0; + var averageNodeVelocity = 0; + + // the velocity threshold (energy in the system) for the adaptivity toggle + var velocityAdaptiveThreshold = 5; for (var i = 0; i < nodeIndices.length; i++) { var nodeId = nodeIndices[i]; var nodeVelocity = this._performStep(nodeId, maxVelocity); // stabilized is true if stabilized is true and velocity is smaller than vmin --> all nodes must be stabilized - stabilized = nodeVelocity < vminCorrected && stabilized === true; - nodesPresent = true; + maxNodeVelocity = Math.max(maxNodeVelocity, nodeVelocity); + averageNodeVelocity += nodeVelocity; } - if (nodesPresent === true) { - if (vminCorrected > 0.5 * this.options.maxVelocity) { - return false; - } else { - return stabilized; - } - } - return true; + // evaluating the stabilized and adaptiveTimestepEnabled conditions + this.adaptiveTimestepEnabled = averageNodeVelocity / nodeIndices.length < velocityAdaptiveThreshold; + this.stabilized = maxNodeVelocity < this.options.minVelocity; } - }, { - key: '_performStep', /** * Perform the actual step @@ -32641,9 +34514,11 @@ return /******/ (function(modules) { // webpackBootstrap * @returns {number} * @private */ + }, { + key: '_performStep', value: function _performStep(nodeId, maxVelocity) { var node = this.body.nodes[nodeId]; - var timestep = this.options.timestep; + var timestep = this.timestep; var forces = this.physicsBody.forces; var velocities = this.physicsBody.velocities; @@ -32657,9 +34532,9 @@ return /******/ (function(modules) { // webpackBootstrap velocities[nodeId].x = Math.abs(velocities[nodeId].x) > maxVelocity ? velocities[nodeId].x > 0 ? maxVelocity : -maxVelocity : velocities[nodeId].x; node.x += velocities[nodeId].x * timestep; // position } else { - forces[nodeId].x = 0; - velocities[nodeId].x = 0; - } + forces[nodeId].x = 0; + velocities[nodeId].x = 0; + } if (node.options.fixed.y === false) { var dy = this.modelOptions.damping * velocities[nodeId].y; // damping force @@ -32668,26 +34543,24 @@ return /******/ (function(modules) { // webpackBootstrap velocities[nodeId].y = Math.abs(velocities[nodeId].y) > maxVelocity ? velocities[nodeId].y > 0 ? maxVelocity : -maxVelocity : velocities[nodeId].y; node.y += velocities[nodeId].y * timestep; // position } else { - forces[nodeId].y = 0; - velocities[nodeId].y = 0; - } + forces[nodeId].y = 0; + velocities[nodeId].y = 0; + } var totalVelocity = Math.sqrt(Math.pow(velocities[nodeId].x, 2) + Math.pow(velocities[nodeId].y, 2)); return totalVelocity; } - }, { - key: 'calculateForces', /** * calculate the forces for one physics iteration. */ + }, { + key: 'calculateForces', value: function calculateForces() { this.gravitySolver.solve(); this.nodesSolver.solve(); this.edgesSolver.solve(); } - }, { - key: '_freezeNodes', /** * When initializing and stabilizing, we can freeze nodes with a predefined position. This greatly speeds up stabilization @@ -32695,6 +34568,8 @@ return /******/ (function(modules) { // webpackBootstrap * * @private */ + }, { + key: '_freezeNodes', value: function _freezeNodes() { var nodes = this.body.nodes; for (var id in nodes) { @@ -32707,14 +34582,14 @@ return /******/ (function(modules) { // webpackBootstrap } } } - }, { - key: '_restoreFrozenNodes', /** * Unfreezes the nodes that have been frozen by _freezeDefinedNodes. * * @private */ + }, { + key: '_restoreFrozenNodes', value: function _restoreFrozenNodes() { var nodes = this.body.nodes; for (var id in nodes) { @@ -32727,13 +34602,12 @@ return /******/ (function(modules) { // webpackBootstrap } this.freezeCache = {}; } - }, { - key: 'stabilize', /** * Find a stable position for all nodes - * @private */ + }, { + key: 'stabilize', value: function stabilize() { var _this3 = this; @@ -32749,8 +34623,11 @@ return /******/ (function(modules) { // webpackBootstrap return; } + // enable adaptive timesteps + this.adaptiveTimestep = true && this.options.adaptiveTimestep; + // this sets the width of all nodes initially which could be required for the avoidOverlap - this.body.emitter.emit('_resizeNodes'); + this.body.emitter.emit("_resizeNodes"); // stop the render loop this.stopSimulation(); @@ -32772,13 +34649,23 @@ return /******/ (function(modules) { // webpackBootstrap return _this3._stabilizationBatch(); }, 0); } + + /** + * One batch of stabilization + * @private + */ }, { key: '_stabilizationBatch', value: function _stabilizationBatch() { + // this is here to ensure that there is at least one start event. + if (this.startedStabilization === false) { + this.body.emitter.emit('startStabilizing'); + this.startedStabilization = true; + } + var count = 0; while (this.stabilized === false && count < this.options.stabilization.updateInterval && this.stabilizationIterations < this.targetIterations) { this.physicsTick(); - this.stabilizationIterations++; count++; } @@ -32789,6 +34676,11 @@ return /******/ (function(modules) { // webpackBootstrap this._finalizeStabilization(); } } + + /** + * Wrap up the stabilization, fit and emit the events. + * @private + */ }, { key: '_finalizeStabilization', value: function _finalizeStabilization() { @@ -32812,6 +34704,34 @@ return /******/ (function(modules) { // webpackBootstrap this.ready = true; } + }, { + key: '_drawForces', + value: function _drawForces(ctx) { + for (var i = 0; i < this.physicsBody.physicsNodeIndices.length; i++) { + var node = this.body.nodes[this.physicsBody.physicsNodeIndices[i]]; + var force = this.physicsBody.forces[this.physicsBody.physicsNodeIndices[i]]; + var factor = 20; + var colorFactor = 0.03; + var forceSize = Math.sqrt(Math.pow(force.x, 2) + Math.pow(force.x, 2)); + + var size = Math.min(Math.max(5, forceSize), 15); + var arrowSize = 3 * size; + + var color = util.HSVToHex((180 - Math.min(1, Math.max(0, colorFactor * forceSize)) * 180) / 360, 1, 1); + + ctx.lineWidth = size; + ctx.strokeStyle = color; + ctx.beginPath(); + ctx.moveTo(node.x, node.y); + ctx.lineTo(node.x + factor * force.x, node.y + factor * force.y); + ctx.stroke(); + + var angle = Math.atan2(force.y, force.x); + ctx.fillStyle = color; + ctx.arrow(node.x + factor * force.x + Math.cos(angle) * arrowSize, node.y + factor * force.y + Math.sin(angle) * arrowSize, angle, arrowSize); + ctx.fill(); + } + } }]); return PhysicsEngine; @@ -32821,7 +34741,7 @@ return /******/ (function(modules) { // webpackBootstrap module.exports = exports['default']; /***/ }, -/* 89 */ +/* 90 */ /***/ function(module, exports) { "use strict"; @@ -32843,6 +34763,9 @@ return /******/ (function(modules) { // webpackBootstrap this.barnesHutTree; this.setOptions(options); this.randomSeed = 5; + + // debug: show grid + //this.body.emitter.on("afterDrawing", (ctx) => {this._debug(ctx,'#ff0000')}) } _createClass(BarnesHutSolver, [{ @@ -32858,15 +34781,15 @@ return /******/ (function(modules) { // webpackBootstrap var x = Math.sin(this.randomSeed++) * 10000; return x - Math.floor(x); } - }, { - key: "solve", /** - * This function calculates the forces the nodes apply on eachother based on a gravitational model. + * This function calculates the forces the nodes apply on each other based on a gravitational model. * The Barnes Hut method is used to speed up this N-body simulation. * * @private */ + }, { + key: "solve", value: function solve() { if (this.options.gravitationalConstant !== 0 && this.physicsBody.physicsNodeIndices.length > 0) { var node = undefined; @@ -32893,8 +34816,6 @@ return /******/ (function(modules) { // webpackBootstrap } } } - }, { - key: "_getForceContribution", /** * This function traverses the barnesHutTree. It checks when it can approximate distant nodes with their center of mass. @@ -32904,6 +34825,8 @@ return /******/ (function(modules) { // webpackBootstrap * @param node * @private */ + }, { + key: "_getForceContribution", value: function _getForceContribution(parentBranch, node) { // we get no force contribution from an empty region if (parentBranch.childrenCount > 0) { @@ -32938,8 +34861,6 @@ return /******/ (function(modules) { // webpackBootstrap } } } - }, { - key: "_calculateForces", /** * Calculate the forces based on the distance. @@ -32951,6 +34872,8 @@ return /******/ (function(modules) { // webpackBootstrap * @param parentBranch * @private */ + }, { + key: "_calculateForces", value: function _calculateForces(distance, dx, dy, node, parentBranch) { if (distance === 0) { distance = 0.1; @@ -32970,8 +34893,6 @@ return /******/ (function(modules) { // webpackBootstrap this.physicsBody.forces[node.id].x += fx; this.physicsBody.forces[node.id].y += fy; } - }, { - key: "_formBarnesHutTree", /** * This function constructs the barnesHut tree recursively. It creates the root, splits it and starts placing the nodes. @@ -32980,6 +34901,8 @@ return /******/ (function(modules) { // webpackBootstrap * @param nodeIndices * @private */ + }, { + key: "_formBarnesHutTree", value: function _formBarnesHutTree(nodes, nodeIndices) { var node = undefined; var nodeCount = nodeIndices.length; @@ -33015,9 +34938,9 @@ return /******/ (function(modules) { // webpackBootstrap maxY += 0.5 * sizeDiff; } // xSize > ySize else { - minX += 0.5 * sizeDiff; - maxX -= 0.5 * sizeDiff; - } // xSize < ySize + minX += 0.5 * sizeDiff; + maxX -= 0.5 * sizeDiff; + } // xSize < ySize var minimumTreeSize = 1e-5; var rootSize = Math.max(minimumTreeSize, Math.abs(maxX - minX)); @@ -33055,8 +34978,6 @@ return /******/ (function(modules) { // webpackBootstrap // make global return barnesHutTree; } - }, { - key: "_updateBranchMass", /** * this updates the mass of a branch. this is increased by adding a node. @@ -33065,6 +34986,8 @@ return /******/ (function(modules) { // webpackBootstrap * @param node * @private */ + }, { + key: "_updateBranchMass", value: function _updateBranchMass(parentBranch, node) { var totalMass = parentBranch.mass + node.options.mass; var totalMassInv = 1 / totalMass; @@ -33079,8 +35002,6 @@ return /******/ (function(modules) { // webpackBootstrap var biggestSize = Math.max(Math.max(node.height, node.radius), node.width); parentBranch.maxWidth = parentBranch.maxWidth < biggestSize ? biggestSize : parentBranch.maxWidth; } - }, { - key: "_placeInTree", /** * determine in which branch the node will be placed. @@ -33090,6 +35011,8 @@ return /******/ (function(modules) { // webpackBootstrap * @param skipMassUpdate * @private */ + }, { + key: "_placeInTree", value: function _placeInTree(parentBranch, node, skipMassUpdate) { if (skipMassUpdate != true || skipMassUpdate === undefined) { // update the mass of the branch. @@ -33116,8 +35039,6 @@ return /******/ (function(modules) { // webpackBootstrap } } } - }, { - key: "_placeInRegion", /** * actually place the node in a region (or branch) @@ -33127,6 +35048,8 @@ return /******/ (function(modules) { // webpackBootstrap * @param region * @private */ + }, { + key: "_placeInRegion", value: function _placeInRegion(parentBranch, node, region) { switch (parentBranch.children[region].childrenCount) { case 0: @@ -33138,7 +35061,7 @@ return /******/ (function(modules) { // webpackBootstrap case 1: // convert into children // if there are two nodes exactly overlapping (on init, on opening of cluster etc.) - // we move one node a pixel and we do not put it in the tree. + // we move one node a little bit and we do not put it in the tree. if (parentBranch.children[region].children.data.x === node.x && parentBranch.children[region].children.data.y === node.y) { node.x += this.seededRandom(); node.y += this.seededRandom(); @@ -33153,8 +35076,6 @@ return /******/ (function(modules) { // webpackBootstrap break; } } - }, { - key: "_splitBranch", /** * this function splits a branch into 4 sub branches. If the branch contained a node, we place it in the subbranch @@ -33163,6 +35084,8 @@ return /******/ (function(modules) { // webpackBootstrap * @param parentBranch * @private */ + }, { + key: "_splitBranch", value: function _splitBranch(parentBranch) { // if the branch is shaded with a node, replace the node in the new subset. var containedNode = null; @@ -33183,8 +35106,6 @@ return /******/ (function(modules) { // webpackBootstrap this._placeInTree(parentBranch, containedNode); } } - }, { - key: "_insertRegion", /** * This function subdivides the region into four new segments. @@ -33196,6 +35117,8 @@ return /******/ (function(modules) { // webpackBootstrap * @param parentRange * @private */ + }, { + key: "_insertRegion", value: function _insertRegion(parentBranch, region) { var minX = undefined, maxX = undefined, @@ -33241,8 +35164,6 @@ return /******/ (function(modules) { // webpackBootstrap childrenCount: 0 }; } - }, { - key: "_debug", //--------------------------- DEBUGGING BELOW ---------------------------// @@ -33253,6 +35174,8 @@ return /******/ (function(modules) { // webpackBootstrap * @param color * @private */ + }, { + key: "_debug", value: function _debug(ctx, color) { if (this.barnesHutTree !== undefined) { @@ -33261,8 +35184,6 @@ return /******/ (function(modules) { // webpackBootstrap this._drawBranch(this.barnesHutTree.root, ctx, color); } } - }, { - key: "_drawBranch", /** * This function is for debugging purposes. It draws the branches recursively. @@ -33272,6 +35193,8 @@ return /******/ (function(modules) { // webpackBootstrap * @param color * @private */ + }, { + key: "_drawBranch", value: function _drawBranch(branch, ctx, color) { if (color === undefined) { color = "#FF0000"; @@ -33320,7 +35243,7 @@ return /******/ (function(modules) { // webpackBootstrap module.exports = exports["default"]; /***/ }, -/* 90 */ +/* 91 */ /***/ function(module, exports) { "use strict"; @@ -33347,8 +35270,6 @@ return /******/ (function(modules) { // webpackBootstrap value: function setOptions(options) { this.options = options; } - }, { - key: "solve", /** * Calculate the forces the nodes apply on each other based on a repulsion field. @@ -33356,6 +35277,8 @@ return /******/ (function(modules) { // webpackBootstrap * * @private */ + }, { + key: "solve", value: function solve() { var dx, dy, distance, fx, fy, repulsingForce, node1, node2; @@ -33415,7 +35338,7 @@ return /******/ (function(modules) { // webpackBootstrap module.exports = exports["default"]; /***/ }, -/* 91 */ +/* 92 */ /***/ function(module, exports) { "use strict"; @@ -33442,8 +35365,6 @@ return /******/ (function(modules) { // webpackBootstrap value: function setOptions(options) { this.options = options; } - }, { - key: "solve", /** * Calculate the forces the nodes apply on each other based on a repulsion field. @@ -33451,6 +35372,8 @@ return /******/ (function(modules) { // webpackBootstrap * * @private */ + }, { + key: "solve", value: function solve() { var dx, dy, distance, fx, fy, repulsingForce, node1, node2, i, j; @@ -33506,7 +35429,7 @@ return /******/ (function(modules) { // webpackBootstrap module.exports = exports["default"]; /***/ }, -/* 92 */ +/* 93 */ /***/ function(module, exports) { "use strict"; @@ -33533,14 +35456,14 @@ return /******/ (function(modules) { // webpackBootstrap value: function setOptions(options) { this.options = options; } - }, { - key: "solve", /** * This function calculates the springforces on the nodes, accounting for the support nodes. * * @private */ + }, { + key: "solve", value: function solve() { var edgeLength = undefined, edge = undefined; @@ -33574,8 +35497,6 @@ return /******/ (function(modules) { // webpackBootstrap } } } - }, { - key: "_calculateSpringForce", /** * This is the code actually performing the calculation for the function above. @@ -33585,6 +35506,8 @@ return /******/ (function(modules) { // webpackBootstrap * @param edgeLength * @private */ + }, { + key: "_calculateSpringForce", value: function _calculateSpringForce(node1, node2, edgeLength) { var dx = node1.x - node2.x; var dy = node1.y - node2.y; @@ -33616,7 +35539,7 @@ return /******/ (function(modules) { // webpackBootstrap module.exports = exports["default"]; /***/ }, -/* 93 */ +/* 94 */ /***/ function(module, exports) { "use strict"; @@ -33643,14 +35566,14 @@ return /******/ (function(modules) { // webpackBootstrap value: function setOptions(options) { this.options = options; } - }, { - key: "solve", /** * This function calculates the springforces on the nodes, accounting for the support nodes. * * @private */ + }, { + key: "solve", value: function solve() { var edgeLength, edge; var dx, dy, fx, fy, springForce, distance; @@ -33745,7 +35668,7 @@ return /******/ (function(modules) { // webpackBootstrap module.exports = exports["default"]; /***/ }, -/* 94 */ +/* 95 */ /***/ function(module, exports) { "use strict"; @@ -33793,13 +35716,13 @@ return /******/ (function(modules) { // webpackBootstrap this._calculateForces(distance, dx, dy, forces, node); } } - }, { - key: "_calculateForces", /** * Calculate the forces based on the distance. * @private */ + }, { + key: "_calculateForces", value: function _calculateForces(distance, dx, dy, forces, node) { var gravityForce = distance === 0 ? 0 : this.options.centralGravity / distance; forces[node.id].x = dx * gravityForce; @@ -33814,7 +35737,7 @@ return /******/ (function(modules) { // webpackBootstrap module.exports = exports["default"]; /***/ }, -/* 95 */ +/* 96 */ /***/ function(module, exports, __webpack_require__) { "use strict"; @@ -33825,15 +35748,15 @@ return /******/ (function(modules) { // webpackBootstrap var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); - var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; desc = parent = getter = undefined; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; continue _function; } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; + var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) subClass.__proto__ = superClass; } + function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - var _BarnesHutSolver2 = __webpack_require__(89); + var _BarnesHutSolver2 = __webpack_require__(90); var _BarnesHutSolver3 = _interopRequireDefault(_BarnesHutSolver2); @@ -33846,19 +35769,19 @@ return /******/ (function(modules) { // webpackBootstrap _get(Object.getPrototypeOf(ForceAtlas2BasedRepulsionSolver.prototype), "constructor", this).call(this, body, physicsBody, options); } + /** + * Calculate the forces based on the distance. + * + * @param distance + * @param dx + * @param dy + * @param node + * @param parentBranch + * @private + */ + _createClass(ForceAtlas2BasedRepulsionSolver, [{ key: "_calculateForces", - - /** - * Calculate the forces based on the distance. - * - * @param distance - * @param dx - * @param dy - * @param node - * @param parentBranch - * @private - */ value: function _calculateForces(distance, dx, dy, node, parentBranch) { if (distance === 0) { distance = 0.1 * Math.random(); @@ -33888,7 +35811,7 @@ return /******/ (function(modules) { // webpackBootstrap module.exports = exports["default"]; /***/ }, -/* 96 */ +/* 97 */ /***/ function(module, exports, __webpack_require__) { "use strict"; @@ -33899,15 +35822,15 @@ return /******/ (function(modules) { // webpackBootstrap var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); - var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; desc = parent = getter = undefined; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; continue _function; } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; + var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) subClass.__proto__ = superClass; } + function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - var _CentralGravitySolver2 = __webpack_require__(94); + var _CentralGravitySolver2 = __webpack_require__(95); var _CentralGravitySolver3 = _interopRequireDefault(_CentralGravitySolver2); @@ -33920,13 +35843,13 @@ return /******/ (function(modules) { // webpackBootstrap _get(Object.getPrototypeOf(ForceAtlas2BasedCentralGravitySolver.prototype), "constructor", this).call(this, body, physicsBody, options); } + /** + * Calculate the forces based on the distance. + * @private + */ + _createClass(ForceAtlas2BasedCentralGravitySolver, [{ key: "_calculateForces", - - /** - * Calculate the forces based on the distance. - * @private - */ value: function _calculateForces(distance, dx, dy, forces, node) { if (distance > 0) { var degree = node.edges.length + 1; @@ -33944,7 +35867,7 @@ return /******/ (function(modules) { // webpackBootstrap module.exports = exports["default"]; /***/ }, -/* 97 */ +/* 98 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; @@ -33959,11 +35882,15 @@ return /******/ (function(modules) { // webpackBootstrap function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } - var _componentsNodesCluster = __webpack_require__(98); + var _NetworkUtil = __webpack_require__(99); + + var _NetworkUtil2 = _interopRequireDefault(_NetworkUtil); + + var _componentsNodesCluster = __webpack_require__(100); var _componentsNodesCluster2 = _interopRequireDefault(_componentsNodesCluster); - var util = __webpack_require__(7); + var util = __webpack_require__(1); var ClusterEngine = (function () { function ClusterEngine(body) { @@ -33973,13 +35900,14 @@ return /******/ (function(modules) { // webpackBootstrap this.body = body; this.clusteredNodes = {}; + this.clusteredEdges = {}; this.options = {}; this.defaultOptions = {}; util.extend(this.options, this.defaultOptions); this.body.emitter.on('_resetData', function () { - _this.clusteredNodes = {}; + _this.clusteredNodes = {};_this.clusteredEdges = {}; }); } @@ -33988,18 +35916,18 @@ return /******/ (function(modules) { // webpackBootstrap value: function setOptions(options) { if (options !== undefined) {} } - }, { - key: 'clusterByHubsize', /** * * @param hubsize * @param options */ + }, { + key: 'clusterByHubsize', value: function clusterByHubsize(hubsize, options) { if (hubsize === undefined) { hubsize = this._getHubSize(); - } else if (typeof hubsize === 'object') { + } else if (typeof hubsize === "object") { options = this._checkOptions(hubsize); hubsize = this._getHubSize(); } @@ -34013,24 +35941,25 @@ return /******/ (function(modules) { // webpackBootstrap } for (var i = 0; i < nodesToCluster.length; i++) { - this.clusterByConnection(nodesToCluster[i], options, false); + this.clusterByConnection(nodesToCluster[i], options, true); } + this.body.emitter.emit('_dataChanged'); } - }, { - key: 'cluster', /** * loop over all nodes, check if they adhere to the condition and cluster if needed. * @param options * @param refreshData */ + }, { + key: 'cluster', value: function cluster() { var options = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0]; var refreshData = arguments.length <= 1 || arguments[1] === undefined ? true : arguments[1]; if (options.joinCondition === undefined) { - throw new Error('Cannot call clusterByNodeData without a joinCondition function in the options.'); + throw new Error("Cannot call clusterByNodeData without a joinCondition function in the options."); } // check if the options object is fine, append if needed @@ -34043,72 +35972,91 @@ return /******/ (function(modules) { // webpackBootstrap for (var i = 0; i < this.body.nodeIndices.length; i++) { var nodeId = this.body.nodeIndices[i]; var node = this.body.nodes[nodeId]; - var clonedOptions = this._cloneOptions(node); + var clonedOptions = _NetworkUtil2['default'].cloneOptions(node); if (options.joinCondition(clonedOptions) === true) { childNodesObj[nodeId] = this.body.nodes[nodeId]; // collect the nodes that will be in the cluster for (var _i = 0; _i < node.edges.length; _i++) { var edge = node.edges[_i]; - childEdgesObj[edge.id] = edge; + if (this.clusteredEdges[edge.id] === undefined) { + childEdgesObj[edge.id] = edge; + } } } } this._cluster(childNodesObj, childEdgesObj, options, refreshData); } - }, { - key: 'clusterOutliers', /** - * Cluster all nodes in the network that have only 1 edge - * @param options - * @param refreshData - */ - value: function clusterOutliers(options) { - var refreshData = arguments.length <= 1 || arguments[1] === undefined ? true : arguments[1]; + * Cluster all nodes in the network that have only X edges + * @param edgeCount + * @param options + * @param refreshData + */ + }, { + key: 'clusterByEdgeCount', + value: function clusterByEdgeCount(edgeCount, options) { + var refreshData = arguments.length <= 2 || arguments[2] === undefined ? true : arguments[2]; options = this._checkOptions(options); var clusters = []; - + var usedNodes = {}; + var edge = undefined, + edges = undefined, + node = undefined, + nodeId = undefined, + relevantEdgeCount = undefined; // collect the nodes that will be in the cluster for (var i = 0; i < this.body.nodeIndices.length; i++) { var childNodesObj = {}; var childEdgesObj = {}; - var nodeId = this.body.nodeIndices[i]; - var visibleEdges = 0; - var edge = undefined; - for (var j = 0; j < this.body.nodes[nodeId].edges.length; j++) { - if (this.body.nodes[nodeId].edges[j].options.hidden === false) { - visibleEdges++; - edge = this.body.nodes[nodeId].edges[j]; - } - } + nodeId = this.body.nodeIndices[i]; - if (visibleEdges === 1) { - // this is an outlier - var childNodeId = this._getConnectedId(edge, nodeId); - if (childNodeId !== nodeId) { - if (options.joinCondition === undefined) { - if (this._checkIfUsed(clusters, nodeId, edge.id) === false && this._checkIfUsed(clusters, childNodeId, edge.id) === false) { + // if this node is already used in another cluster this session, we do not have to re-evaluate it. + if (usedNodes[nodeId] === undefined) { + relevantEdgeCount = 0; + node = this.body.nodes[nodeId]; + edges = []; + for (var j = 0; j < node.edges.length; j++) { + edge = node.edges[j]; + if (this.clusteredEdges[edge.id] === undefined) { + if (edge.toId !== edge.fromId) { + relevantEdgeCount++; + } + edges.push(edge); + } + } + + // this node qualifies, we collect its neighbours to start the clustering process. + if (relevantEdgeCount === edgeCount) { + var gatheringSuccessful = true; + for (var j = 0; j < edges.length; j++) { + edge = edges[j]; + var childNodeId = this._getConnectedId(edge, nodeId); + // add the nodes to the list by the join condition. + if (options.joinCondition === undefined) { childEdgesObj[edge.id] = edge; childNodesObj[nodeId] = this.body.nodes[nodeId]; childNodesObj[childNodeId] = this.body.nodes[childNodeId]; - } - } else { - var clonedOptions = this._cloneOptions(this.body.nodes[nodeId]); - if (options.joinCondition(clonedOptions) === true && this._checkIfUsed(clusters, nodeId, edge.id) === false) { - childEdgesObj[edge.id] = edge; - childNodesObj[nodeId] = this.body.nodes[nodeId]; - } - clonedOptions = this._cloneOptions(this.body.nodes[childNodeId]); - if (options.joinCondition(clonedOptions) === true && this._checkIfUsed(clusters, nodeId, edge.id) === false) { - childEdgesObj[edge.id] = edge; - childNodesObj[childNodeId] = this.body.nodes[childNodeId]; + usedNodes[nodeId] = true; + } else { + var clonedOptions = _NetworkUtil2['default'].cloneOptions(this.body.nodes[nodeId]); + if (options.joinCondition(clonedOptions) === true) { + childEdgesObj[edge.id] = edge; + childNodesObj[nodeId] = this.body.nodes[nodeId]; + usedNodes[nodeId] = true; + } else { + // this node does not qualify after all. + gatheringSuccessful = false; + break; + } } } - if (Object.keys(childNodesObj).length > 0 && Object.keys(childEdgesObj).length > 0) { + // add to the cluster queue + if (Object.keys(childNodesObj).length > 0 && Object.keys(childEdgesObj).length > 0 && gatheringSuccessful === true) { clusters.push({ nodes: childNodesObj, edges: childEdgesObj }); } } @@ -34123,19 +36071,32 @@ return /******/ (function(modules) { // webpackBootstrap this.body.emitter.emit('_dataChanged'); } } + + /** + * Cluster all nodes in the network that have only 1 edge + * @param options + * @param refreshData + */ }, { - key: '_checkIfUsed', - value: function _checkIfUsed(clusters, nodeId, edgeId) { - for (var i = 0; i < clusters.length; i++) { - var cluster = clusters[i]; - if (cluster.nodes[nodeId] !== undefined || cluster.edges[edgeId] !== undefined) { - return true; - } - } - return false; + key: 'clusterOutliers', + value: function clusterOutliers(options) { + var refreshData = arguments.length <= 1 || arguments[1] === undefined ? true : arguments[1]; + + this.clusterByEdgeCount(1, options, refreshData); } + + /** + * Cluster all nodes in the network that have only 2 edge + * @param options + * @param refreshData + */ }, { - key: 'clusterByConnection', + key: 'clusterBridges', + value: function clusterBridges(options) { + var refreshData = arguments.length <= 1 || arguments[1] === undefined ? true : arguments[1]; + + this.clusterByEdgeCount(2, options, refreshData); + } /** * suck all connected nodes of a node into the node. @@ -34143,15 +36104,17 @@ return /******/ (function(modules) { // webpackBootstrap * @param options * @param refreshData */ + }, { + key: 'clusterByConnection', value: function clusterByConnection(nodeId, options) { var refreshData = arguments.length <= 2 || arguments[2] === undefined ? true : arguments[2]; // kill conditions if (nodeId === undefined) { - throw new Error('No nodeId supplied to clusterByConnection!'); + throw new Error("No nodeId supplied to clusterByConnection!"); } if (this.body.nodes[nodeId] === undefined) { - throw new Error('The nodeId given to clusterByConnection does not exist!'); + throw new Error("The nodeId given to clusterByConnection does not exist!"); } var node = this.body.nodes[nodeId]; @@ -34171,68 +36134,53 @@ return /******/ (function(modules) { // webpackBootstrap var childNodesObj = {}; var childEdgesObj = {}; var parentNodeId = node.id; - var parentClonedOptions = this._cloneOptions(node); + var parentClonedOptions = _NetworkUtil2['default'].cloneOptions(node); childNodesObj[parentNodeId] = node; // collect the nodes that will be in the cluster for (var i = 0; i < node.edges.length; i++) { var edge = node.edges[i]; - var childNodeId = this._getConnectedId(edge, parentNodeId); + if (this.clusteredEdges[edge.id] === undefined) { + var childNodeId = this._getConnectedId(edge, parentNodeId); - if (childNodeId !== parentNodeId) { - if (options.joinCondition === undefined) { - childEdgesObj[edge.id] = edge; - childNodesObj[childNodeId] = this.body.nodes[childNodeId]; - } else { - // clone the options and insert some additional parameters that could be interesting. - var childClonedOptions = this._cloneOptions(this.body.nodes[childNodeId]); - if (options.joinCondition(parentClonedOptions, childClonedOptions) === true) { + // if the child node is not in a cluster + if (this.clusteredNodes[childNodeId] === undefined) { + if (childNodeId !== parentNodeId) { + if (options.joinCondition === undefined) { + childEdgesObj[edge.id] = edge; + childNodesObj[childNodeId] = this.body.nodes[childNodeId]; + } else { + // clone the options and insert some additional parameters that could be interesting. + var childClonedOptions = _NetworkUtil2['default'].cloneOptions(this.body.nodes[childNodeId]); + if (options.joinCondition(parentClonedOptions, childClonedOptions) === true) { + childEdgesObj[edge.id] = edge; + childNodesObj[childNodeId] = this.body.nodes[childNodeId]; + } + } + } else { + // swallow the edge if it is self-referencing. childEdgesObj[edge.id] = edge; - childNodesObj[childNodeId] = this.body.nodes[childNodeId]; } } - } else { - childEdgesObj[edge.id] = edge; } } this._cluster(childNodesObj, childEdgesObj, options, refreshData); } - }, { - key: '_cloneOptions', /** - * This returns a clone of the options or options of the edge or node to be used for construction of new edges or check functions for new nodes. - * @param objId - * @param type - * @returns {{}} - * @private - */ - value: function _cloneOptions(item, type) { - var clonedOptions = {}; - if (type === undefined || type === 'node') { - util.deepExtend(clonedOptions, item.options, true); - clonedOptions.x = item.x; - clonedOptions.y = item.y; - clonedOptions.amountOfConnections = item.edges.length; - } else { - util.deepExtend(clonedOptions, item.options, true); - } - return clonedOptions; - } - }, { - key: '_createClusterEdges', - - /** - * This function creates the edges that will be attached to the cluster. + * This function creates the edges that will be attached to the cluster + * It looks for edges that are connected to the nodes from the "outside' of the cluster. * * @param childNodesObj * @param childEdgesObj - * @param newEdges - * @param options + * @param clusterNodeProperties + * @param clusterEdgeProperties * @private */ - value: function _createClusterEdges(childNodesObj, childEdgesObj, newEdges, clusterNodeProperties, clusterEdgeProperties) { + }, { + key: '_createClusterEdges', + value: function _createClusterEdges(childNodesObj, childEdgesObj, clusterNodeProperties, clusterEdgeProperties) { var edge = undefined, childNodeId = undefined, childNode = undefined, @@ -34240,7 +36188,10 @@ return /******/ (function(modules) { // webpackBootstrap fromId = undefined, otherNodeId = undefined; + // loop over all child nodes and their edges to find edges going out of the cluster + // these edges will be replaced by clusterEdges. var childKeys = Object.keys(childNodesObj); + var createEdges = []; for (var i = 0; i < childKeys.length; i++) { childNodeId = childKeys[i]; childNode = childNodesObj[childNodeId]; @@ -34248,34 +36199,61 @@ return /******/ (function(modules) { // webpackBootstrap // construct new edges from the cluster to others for (var j = 0; j < childNode.edges.length; j++) { edge = childNode.edges[j]; - childEdgesObj[edge.id] = edge; + // we only handle edges that are visible to the system, not the disabled ones from the clustering process. + if (this.clusteredEdges[edge.id] === undefined) { + // self-referencing edges will be added to the "hidden" list + if (edge.toId == edge.fromId) { + childEdgesObj[edge.id] = edge; + } else { + // set up the from and to. + if (edge.toId == childNodeId) { + // this is a double equals because ints and strings can be interchanged here. + toId = clusterNodeProperties.id; + fromId = edge.fromId; + otherNodeId = fromId; + } else { + toId = edge.toId; + fromId = clusterNodeProperties.id; + otherNodeId = toId; + } + } - // childNodeId position will be replaced by the cluster. - if (edge.toId == childNodeId) { - // this is a double equals because ints and strings can be interchanged here. - toId = clusterNodeProperties.id; - fromId = edge.fromId; - otherNodeId = fromId; - } else { - toId = edge.toId; - fromId = clusterNodeProperties.id; - otherNodeId = toId; - } - - // if the node connected to the cluster is also in the cluster we do not need a new edge. - if (childNodesObj[otherNodeId] === undefined) { - var clonedOptions = this._cloneOptions(edge, 'edge'); - util.deepExtend(clonedOptions, clusterEdgeProperties); - clonedOptions.from = fromId; - clonedOptions.to = toId; - clonedOptions.id = 'clusterEdge:' + util.randomUUID(); - newEdges.push(this.body.functions.createEdge(clonedOptions)); + // Only edges from the cluster outwards are being replaced. + if (childNodesObj[otherNodeId] === undefined) { + createEdges.push({ edge: edge, fromId: fromId, toId: toId }); + } } } } + + // here we actually create the replacement edges. We could not do this in the loop above as the creation process + // would add an edge to the edges array we are iterating over. + for (var j = 0; j < createEdges.length; j++) { + var _edge = createEdges[j].edge; + // copy the options of the edge we will replace + var clonedOptions = _NetworkUtil2['default'].cloneOptions(_edge, 'edge'); + // make sure the properties of clusterEdges are superimposed on it + util.deepExtend(clonedOptions, clusterEdgeProperties); + + // set up the edge + clonedOptions.from = createEdges[j].fromId; + clonedOptions.to = createEdges[j].toId; + clonedOptions.id = 'clusterEdge:' + util.randomUUID(); + //clonedOptions.id = '(cf: ' + createEdges[j].fromId + " to: " + createEdges[j].toId + ")" + Math.random(); + + // create the edge and give a reference to the one it replaced. + var newEdge = this.body.functions.createEdge(clonedOptions); + newEdge.clusteringEdgeReplacingId = _edge.id; + + // connect the edge. + this.body.edges[newEdge.id] = newEdge; + newEdge.connect(); + + // hide the replaced edge + this._backupEdgeOptions(_edge); + _edge.setOptions({ physics: false, hidden: true }); + } } - }, { - key: '_checkOptions', /** * This function checks the options that can be supplied to the different cluster functions @@ -34284,6 +36262,8 @@ return /******/ (function(modules) { // webpackBootstrap * @returns {*} * @private */ + }, { + key: '_checkOptions', value: function _checkOptions() { var options = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0]; @@ -34296,8 +36276,6 @@ return /******/ (function(modules) { // webpackBootstrap return options; } - }, { - key: '_cluster', /** * @@ -34307,14 +36285,25 @@ return /******/ (function(modules) { // webpackBootstrap * @param {Boolean} refreshData | when true, do not wrap up * @private */ + }, { + key: '_cluster', value: function _cluster(childNodesObj, childEdgesObj, options) { var refreshData = arguments.length <= 3 || arguments[3] === undefined ? true : arguments[3]; - // kill condition: no children so cant cluster - if (Object.keys(childNodesObj).length === 0) { + // kill condition: no children so can't cluster or only one node in the cluster, don't bother + if (Object.keys(childNodesObj).length < 2) { return; } + // check if this cluster call is not trying to cluster anything that is in another cluster. + for (var nodeId in childNodesObj) { + if (childNodesObj.hasOwnProperty(nodeId)) { + if (this.clusteredNodes[nodeId] !== undefined) { + return; + } + } + } + var clusterNodeProperties = util.deepExtend({}, options.clusterNodeProperties); // construct the clusterNodeProperties @@ -34322,23 +36311,27 @@ return /******/ (function(modules) { // webpackBootstrap // get the childNode options var childNodesOptions = []; for (var nodeId in childNodesObj) { - var clonedOptions = this._cloneOptions(childNodesObj[nodeId]); - childNodesOptions.push(clonedOptions); + if (childNodesObj.hasOwnProperty(nodeId)) { + var clonedOptions = _NetworkUtil2['default'].cloneOptions(childNodesObj[nodeId]); + childNodesOptions.push(clonedOptions); + } } - // get clusterproperties based on childNodes + // get cluster properties based on childNodes var childEdgesOptions = []; for (var edgeId in childEdgesObj) { - // these cluster edges will be removed on creation of the cluster. - if (edgeId.substr(0, 12) !== 'clusterEdge:') { - var clonedOptions = this._cloneOptions(childEdgesObj[edgeId], 'edge'); - childEdgesOptions.push(clonedOptions); + if (childEdgesObj.hasOwnProperty(edgeId)) { + // these cluster edges will be removed on creation of the cluster. + if (edgeId.substr(0, 12) !== "clusterEdge:") { + var clonedOptions = _NetworkUtil2['default'].cloneOptions(childEdgesObj[edgeId], 'edge'); + childEdgesOptions.push(clonedOptions); + } } } clusterNodeProperties = options.processProperties(clusterNodeProperties, childNodesOptions, childEdgesOptions); if (!clusterNodeProperties) { - throw new Error('The processProperties function does not return properties!'); + throw new Error("The processProperties function does not return properties!"); } } @@ -34352,7 +36345,7 @@ return /******/ (function(modules) { // webpackBootstrap clusterNodeProperties.label = 'cluster'; } - // give the clusterNode a postion if it does not have one. + // give the clusterNode a position if it does not have one. var pos = undefined; if (clusterNodeProperties.x === undefined) { pos = this._getClusterPosition(childNodesObj); @@ -34379,47 +36372,18 @@ return /******/ (function(modules) { // webpackBootstrap // finally put the cluster node into global this.body.nodes[clusterNodeProperties.id] = clusterNode; - // create the new edges that will connect to the cluster - var newEdges = []; - this._createClusterEdges(childNodesObj, childEdgesObj, newEdges, clusterNodeProperties, options.clusterEdgeProperties); + // create the new edges that will connect to the cluster, all self-referencing edges will be added to childEdgesObject here. + this._createClusterEdges(childNodesObj, childEdgesObj, clusterNodeProperties, options.clusterEdgeProperties); // disable the childEdges for (var edgeId in childEdgesObj) { if (childEdgesObj.hasOwnProperty(edgeId)) { if (this.body.edges[edgeId] !== undefined) { var edge = this.body.edges[edgeId]; - - // if the edge is a clusterEdge, we delete it. The opening of the clusters will restore these edges when required. - if (edgeId.substr(0, 12) === 'clusterEdge:') { - // we only delete the cluster edge if there is another edge to the node that is not a cluster. - var target = edge.from.isCluster === true ? edge.toId : edge.fromId; - var deleteEdge = false; - - // search the contained edges for an edge that has a link to the targetNode - for (var edgeId2 in childEdgesObj) { - if (childEdgesObj.hasOwnProperty(edgeId2)) { - if (this.body.edges[edgeId2] !== undefined && edgeId2 !== edgeId) { - var edge2 = this.body.edges[edgeId2]; - if (edge2.fromId == target || edge2.toId == target) { - deleteEdge = true; - break; - } - } - } - } - - // if we found the edge that will trigger the recreation of a new cluster edge on opening, we can delete this edge. - if (deleteEdge === true) { - edge.edgeType.cleanup(); - // this removes the edge from node.edges, which is why edgeIds is formed - edge.disconnect(); - delete childEdgesObj[edgeId]; - delete this.body.edges[edgeId]; - } - } else { - edge.togglePhysics(false); - edge.options.hidden = true; - } + // cache the options before changing + this._backupEdgeOptions(edge); + // disable physics and hide the edge + edge.setOptions({ physics: false, hidden: true }); } } } @@ -34428,17 +36392,10 @@ return /******/ (function(modules) { // webpackBootstrap for (var nodeId in childNodesObj) { if (childNodesObj.hasOwnProperty(nodeId)) { this.clusteredNodes[nodeId] = { clusterId: clusterNodeProperties.id, node: this.body.nodes[nodeId] }; - this.body.nodes[nodeId].togglePhysics(false); - this.body.nodes[nodeId].options.hidden = true; + this.body.nodes[nodeId].setOptions({ hidden: true, physics: false }); } } - // push new edges to global - for (var i = 0; i < newEdges.length; i++) { - this.body.edges[newEdges[i].id] = newEdges[i]; - this.body.edges[newEdges[i].id].connect(); - } - // set ID to undefined so no duplicates arise clusterNodeProperties.id = undefined; @@ -34448,23 +36405,37 @@ return /******/ (function(modules) { // webpackBootstrap } } }, { - key: 'isCluster', + key: '_backupEdgeOptions', + value: function _backupEdgeOptions(edge) { + if (this.clusteredEdges[edge.id] === undefined) { + this.clusteredEdges[edge.id] = { physics: edge.options.physics, hidden: edge.options.hidden }; + } + } + }, { + key: '_restoreEdge', + value: function _restoreEdge(edge) { + var originalOptions = this.clusteredEdges[edge.id]; + if (originalOptions !== undefined) { + edge.setOptions({ physics: originalOptions.physics, hidden: originalOptions.hidden }); + delete this.clusteredEdges[edge.id]; + } + } /** * Check if a node is a cluster. * @param nodeId * @returns {*} */ + }, { + key: 'isCluster', value: function isCluster(nodeId) { if (this.body.nodes[nodeId] !== undefined) { return this.body.nodes[nodeId].isCluster === true; } else { - console.log('Node does not exist.'); + console.log("Node does not exist."); return false; } } - }, { - key: '_getClusterPosition', /** * get the position of the cluster node based on what's inside @@ -34472,6 +36443,8 @@ return /******/ (function(modules) { // webpackBootstrap * @returns {{x: number, y: number}} * @private */ + }, { + key: '_getClusterPosition', value: function _getClusterPosition(childNodesObj) { var childKeys = Object.keys(childNodesObj); var minX = childNodesObj[childKeys[0]].x; @@ -34489,26 +36462,26 @@ return /******/ (function(modules) { // webpackBootstrap return { x: 0.5 * (minX + maxX), y: 0.5 * (minY + maxY) }; } - }, { - key: 'openCluster', /** * Open a cluster by calling this function. * @param {String} clusterNodeId | the ID of the cluster node * @param {Boolean} refreshData | wrap up afterwards if not true */ + }, { + key: 'openCluster', value: function openCluster(clusterNodeId, options) { var refreshData = arguments.length <= 2 || arguments[2] === undefined ? true : arguments[2]; // kill conditions if (clusterNodeId === undefined) { - throw new Error('No clusterNodeId supplied to openCluster.'); + throw new Error("No clusterNodeId supplied to openCluster."); } if (this.body.nodes[clusterNodeId] === undefined) { - throw new Error('The clusterNodeId supplied to openCluster does not exist.'); + throw new Error("The clusterNodeId supplied to openCluster does not exist."); } if (this.body.nodes[clusterNodeId].containedNodes === undefined) { - console.log('The node:' + clusterNodeId + ' is not a cluster.'); + console.log("The node:" + clusterNodeId + " is not a cluster."); return; } var clusterNode = this.body.nodes[clusterNodeId]; @@ -34531,8 +36504,8 @@ return /******/ (function(modules) { // webpackBootstrap if (containedNodes.hasOwnProperty(nodeId)) { var containedNode = this.body.nodes[nodeId]; if (newPositions[nodeId] !== undefined) { - containedNode.x = newPositions[nodeId].x || clusterNode.x; - containedNode.y = newPositions[nodeId].y || clusterNode.y; + containedNode.x = newPositions[nodeId].x === undefined ? clusterNode.x : newPositions[nodeId].x; + containedNode.y = newPositions[nodeId].y === undefined ? clusterNode.y : newPositions[nodeId].y; } } } @@ -34543,8 +36516,12 @@ return /******/ (function(modules) { // webpackBootstrap var containedNode = this.body.nodes[nodeId]; containedNode = containedNodes[nodeId]; // inherit position - containedNode.x = clusterNode.x; - containedNode.y = clusterNode.y; + if (containedNode.options.fixed.x === false) { + containedNode.x = clusterNode.x; + } + if (containedNode.options.fixed.y === false) { + containedNode.y = clusterNode.y; + } } } } @@ -34558,74 +36535,76 @@ return /******/ (function(modules) { // webpackBootstrap containedNode.vx = clusterNode.vx; containedNode.vy = clusterNode.vy; - containedNode.options.hidden = false; - containedNode.togglePhysics(true); + // we use these methods to avoid re-instantiating the shape, which happens with setOptions. + containedNode.setOptions({ hidden: false, physics: true }); delete this.clusteredNodes[nodeId]; } } - // release edges - for (var edgeId in containedEdges) { - if (containedEdges.hasOwnProperty(edgeId)) { - var edge = containedEdges[edgeId]; - // if this edge was a temporary edge and it's connected nodes do not exist anymore, we remove it from the data - if (this.body.nodes[edge.fromId] === undefined || this.body.nodes[edge.toId] === undefined || edge.toId == clusterNodeId || edge.fromId == clusterNodeId) { - edge.edgeType.cleanup(); - // this removes the edge from node.edges, which is why edgeIds is formed - edge.disconnect(); - delete this.body.edges[edgeId]; - } else { - // one of the nodes connected to this edge is in a cluster. We give the edge to that cluster so it will be released when that cluster is opened. - if (this.clusteredNodes[edge.fromId] !== undefined || this.clusteredNodes[edge.toId] !== undefined) { - var fromId = undefined, - toId = undefined; - var clusteredNode = this.clusteredNodes[edge.fromId] || this.clusteredNodes[edge.toId]; - var clusterId = clusteredNode.clusterId; - var _clusterNode = this.body.nodes[clusterId]; - _clusterNode.containedEdges[edgeId] = edge; + // copy the clusterNode edges because we cannot iterate over an object that we add or remove from. + var edgesToBeDeleted = []; + for (var i = 0; i < clusterNode.edges.length; i++) { + edgesToBeDeleted.push(clusterNode.edges[i]); + } - if (this.clusteredNodes[edge.fromId] !== undefined) { - fromId = clusterId; - toId = edge.toId; - } else { - fromId = edge.fromId; - toId = clusterId; - } + // actually handling the deleting. + for (var i = 0; i < edgesToBeDeleted.length; i++) { + var edge = edgesToBeDeleted[i]; - // if both from and to nodes are visible, we create a new temporary edge - if (this.body.nodes[fromId].options.hidden !== true && this.body.nodes[toId].options.hidden !== true) { - var clonedOptions = this._cloneOptions(edge, 'edge'); - var id = 'clusterEdge:' + util.randomUUID(); - util.deepExtend(clonedOptions, _clusterNode.clusterEdgeProperties); - util.deepExtend(clonedOptions, { from: fromId, to: toId, hidden: false, physics: true, id: id }); - var newEdge = this.body.functions.createEdge(clonedOptions); + var otherNodeId = this._getConnectedId(edge, clusterNodeId); + // if the other node is in another cluster, we transfer ownership of this edge to the other cluster + if (this.clusteredNodes[otherNodeId] !== undefined) { + // transfer ownership: + var otherCluster = this.body.nodes[this.clusteredNodes[otherNodeId].clusterId]; + var transferEdge = this.body.edges[edge.clusteringEdgeReplacingId]; + if (transferEdge !== undefined) { + otherCluster.containedEdges[transferEdge.id] = transferEdge; - this.body.edges[id] = newEdge; - this.body.edges[id].connect(); - } + // delete local reference + delete containedEdges[transferEdge.id]; + + // create new cluster edge from the otherCluster: + // get to and from + var fromId = transferEdge.fromId; + var toId = transferEdge.toId; + if (transferEdge.toId == otherNodeId) { + toId = this.clusteredNodes[otherNodeId].clusterId; } else { - edge.options.hidden = false; - edge.togglePhysics(true); + fromId = this.clusteredNodes[otherNodeId].clusterId; } + + // clone the options and apply the cluster options to them + var clonedOptions = _NetworkUtil2['default'].cloneOptions(transferEdge, 'edge'); + util.deepExtend(clonedOptions, otherCluster.clusterEdgeProperties); + + // apply the edge specific options to it. + var id = 'clusterEdge:' + util.randomUUID(); + util.deepExtend(clonedOptions, { from: fromId, to: toId, hidden: false, physics: true, id: id }); + + // create it + var newEdge = this.body.functions.createEdge(clonedOptions); + newEdge.clusteringEdgeReplacingId = transferEdge.id; + this.body.edges[id] = newEdge; + this.body.edges[id].connect(); + } + } else { + var replacedEdge = this.body.edges[edge.clusteringEdgeReplacingId]; + if (replacedEdge !== undefined) { + this._restoreEdge(replacedEdge); } } - } - - // remove all temporary edges, make an array of ids so we don't remove from the list we're iterating over. - var removeIds = []; - for (var i = 0; i < clusterNode.edges.length; i++) { - var edgeId = clusterNode.edges[i].id; - removeIds.push(edgeId); - } - - // actually removing the edges - for (var i = 0; i < removeIds.length; i++) { - var edgeId = removeIds[i]; - this.body.edges[edgeId].edgeType.cleanup(); + edge.cleanup(); // this removes the edge from node.edges, which is why edgeIds is formed - this.body.edges[edgeId].disconnect(); - delete this.body.edges[edgeId]; + edge.disconnect(); + delete this.body.edges[edge.id]; + } + + // handle the releasing of the edges + for (var edgeId in containedEdges) { + if (containedEdges.hasOwnProperty(edgeId)) { + this._restoreEdge(containedEdges[edgeId]); + } } // remove clusterNode @@ -34643,37 +36622,36 @@ return /******/ (function(modules) { // webpackBootstrap var containedNodes = this.body.nodes[clusterId].containedNodes; for (var nodeId in containedNodes) { if (containedNodes.hasOwnProperty(nodeId)) { - nodesArray.push(nodeId); + nodesArray.push(this.body.nodes[nodeId].id); } } } return nodesArray; } - }, { - key: 'findNode', /** * Get the stack clusterId's that a certain node resides in. cluster A -> cluster B -> cluster C -> node * @param nodeId * @returns {Array} - * @private */ + }, { + key: 'findNode', value: function findNode(nodeId) { var stack = []; var max = 100; var counter = 0; while (this.clusteredNodes[nodeId] !== undefined && counter < max) { - stack.push(this.clusteredNodes[nodeId].node); + stack.push(this.body.nodes[nodeId].id); nodeId = this.clusteredNodes[nodeId].clusterId; counter++; } - stack.push(this.body.nodes[nodeId]); + stack.push(this.body.nodes[nodeId].id); + stack.reverse(); + return stack; } - }, { - key: '_getConnectedId', /** * Get the Id the node is connected to @@ -34682,6 +36660,8 @@ return /******/ (function(modules) { // webpackBootstrap * @returns {*} * @private */ + }, { + key: '_getConnectedId', value: function _getConnectedId(edge, nodeId) { if (edge.toId != nodeId) { return edge.toId; @@ -34691,8 +36671,6 @@ return /******/ (function(modules) { // webpackBootstrap return edge.fromId; } } - }, { - key: '_getHubSize', /** * We determine how many connections denote an important hub. @@ -34700,6 +36678,8 @@ return /******/ (function(modules) { // webpackBootstrap * * @private */ + }, { + key: '_getHubSize', value: function _getHubSize() { var average = 0; var averageSquared = 0; @@ -34718,8 +36698,8 @@ return /******/ (function(modules) { // webpackBootstrap average = average / hubCounter; averageSquared = averageSquared / hubCounter; - var letiance = averageSquared - Math.pow(average, 2); - var standardDeviation = Math.sqrt(letiance); + var variance = averageSquared - Math.pow(average, 2); + var standardDeviation = Math.sqrt(variance); var hubThreshold = Math.floor(average + 2 * standardDeviation); @@ -34739,7 +36719,142 @@ return /******/ (function(modules) { // webpackBootstrap module.exports = exports['default']; /***/ }, -/* 98 */ +/* 99 */ +/***/ function(module, exports, __webpack_require__) { + + "use strict"; + + Object.defineProperty(exports, "__esModule", { + value: true + }); + + var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); + + function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + + var util = __webpack_require__(1); + + var NetworkUtil = (function () { + function NetworkUtil() { + _classCallCheck(this, NetworkUtil); + } + + /** + * Find the center position of the network considering the bounding boxes + */ + + _createClass(NetworkUtil, null, [{ + key: "getRange", + value: function getRange(allNodes) { + var specificNodes = arguments.length <= 1 || arguments[1] === undefined ? [] : arguments[1]; + + var minY = 1e9, + maxY = -1e9, + minX = 1e9, + maxX = -1e9, + node; + if (specificNodes.length > 0) { + for (var i = 0; i < specificNodes.length; i++) { + node = allNodes[specificNodes[i]]; + if (minX > node.shape.boundingBox.left) { + minX = node.shape.boundingBox.left; + } + if (maxX < node.shape.boundingBox.right) { + maxX = node.shape.boundingBox.right; + } + if (minY > node.shape.boundingBox.top) { + minY = node.shape.boundingBox.top; + } // top is negative, bottom is positive + if (maxY < node.shape.boundingBox.bottom) { + maxY = node.shape.boundingBox.bottom; + } // top is negative, bottom is positive + } + } + + if (minX === 1e9 && maxX === -1e9 && minY === 1e9 && maxY === -1e9) { + minY = 0, maxY = 0, minX = 0, maxX = 0; + } + return { minX: minX, maxX: maxX, minY: minY, maxY: maxY }; + } + + /** + * Find the center position of the network + */ + }, { + key: "getRangeCore", + value: function getRangeCore(allNodes) { + var specificNodes = arguments.length <= 1 || arguments[1] === undefined ? [] : arguments[1]; + + var minY = 1e9, + maxY = -1e9, + minX = 1e9, + maxX = -1e9, + node; + if (specificNodes.length > 0) { + for (var i = 0; i < specificNodes.length; i++) { + node = allNodes[specificNodes[i]]; + if (minX > node.x) { + minX = node.x; + } + if (maxX < node.x) { + maxX = node.x; + } + if (minY > node.y) { + minY = node.y; + } // top is negative, bottom is positive + if (maxY < node.y) { + maxY = node.y; + } // top is negative, bottom is positive + } + } + + if (minX === 1e9 && maxX === -1e9 && minY === 1e9 && maxY === -1e9) { + minY = 0, maxY = 0, minX = 0, maxX = 0; + } + return { minX: minX, maxX: maxX, minY: minY, maxY: maxY }; + } + + /** + * @param {object} range = {minX: minX, maxX: maxX, minY: minY, maxY: maxY}; + * @returns {{x: number, y: number}} + */ + }, { + key: "findCenter", + value: function findCenter(range) { + return { x: 0.5 * (range.maxX + range.minX), + y: 0.5 * (range.maxY + range.minY) }; + } + + /** + * This returns a clone of the options or options of the edge or node to be used for construction of new edges or check functions for new nodes. + * @param item + * @param type + * @returns {{}} + */ + }, { + key: "cloneOptions", + value: function cloneOptions(item, type) { + var clonedOptions = {}; + if (type === undefined || type === 'node') { + util.deepExtend(clonedOptions, item.options, true); + clonedOptions.x = item.x; + clonedOptions.y = item.y; + clonedOptions.amountOfConnections = item.edges.length; + } else { + util.deepExtend(clonedOptions, item.options, true); + } + return clonedOptions; + } + }]); + + return NetworkUtil; + })(); + + exports["default"] = NetworkUtil; + module.exports = exports["default"]; + +/***/ }, +/* 100 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; @@ -34748,15 +36863,15 @@ return /******/ (function(modules) { // webpackBootstrap value: true }); - var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; desc = parent = getter = undefined; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; + var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } - function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) subClass.__proto__ = superClass; } + function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - var _Node2 = __webpack_require__(62); + var _Node2 = __webpack_require__(61); var _Node3 = _interopRequireDefault(_Node2); @@ -34784,7 +36899,7 @@ return /******/ (function(modules) { // webpackBootstrap module.exports = exports['default']; /***/ }, -/* 99 */ +/* 101 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; @@ -34801,7 +36916,7 @@ return /******/ (function(modules) { // webpackBootstrap window.requestAnimationFrame = window.requestAnimationFrame || window.mozRequestAnimationFrame || window.webkitRequestAnimationFrame || window.msRequestAnimationFrame; } - var util = __webpack_require__(7); + var util = __webpack_require__(1); var CanvasRenderer = (function () { function CanvasRenderer(body, canvas) { @@ -34835,39 +36950,40 @@ return /******/ (function(modules) { // webpackBootstrap value: function bindEventListeners() { var _this = this; - this.body.emitter.on('dragStart', function () { + this.body.emitter.on("dragStart", function () { _this.dragging = true; }); - this.body.emitter.on('dragEnd', function () { + this.body.emitter.on("dragEnd", function () { return _this.dragging = false; }); - this.body.emitter.on('_resizeNodes', function () { + this.body.emitter.on("_resizeNodes", function () { return _this._resizeNodes(); }); - this.body.emitter.on('_redraw', function () { + this.body.emitter.on("_redraw", function () { if (_this.renderingActive === false) { _this._redraw(); } }); - this.body.emitter.on('_blockRedraw', function () { + this.body.emitter.on("_blockRedraw", function () { _this.allowRedraw = false; }); - this.body.emitter.on('_allowRedraw', function () { + this.body.emitter.on("_allowRedraw", function () { _this.allowRedraw = true;_this.redrawRequested = false; }); - this.body.emitter.on('_requestRedraw', this._requestRedraw.bind(this)); - this.body.emitter.on('_startRendering', function () { + this.body.emitter.on("_requestRedraw", this._requestRedraw.bind(this)); + this.body.emitter.on("_startRendering", function () { _this.renderRequests += 1; _this.renderingActive = true; _this._startRendering(); }); - this.body.emitter.on('_stopRendering', function () { + this.body.emitter.on("_stopRendering", function () { _this.renderRequests -= 1; _this.renderingActive = _this.renderRequests > 0; _this.renderTimer = undefined; }); this.body.emitter.on('destroy', function () { _this.renderRequests = 0; + _this.allowRedraw = false; _this.renderingActive = false; if (_this.requiresTimeout === true) { clearTimeout(_this.renderTimer); @@ -34893,8 +37009,8 @@ return /******/ (function(modules) { // webpackBootstrap if (this.requiresTimeout === true) { this.renderTimer = window.setTimeout(this._renderStep.bind(this), this.simulationInterval); // wait this.renderTimeStep milliseconds and perform the animation step function } else { - this.renderTimer = window.requestAnimationFrame(this._renderStep.bind(this)); // wait this.renderTimeStep milliseconds and perform the animation step function - } + this.renderTimer = window.requestAnimationFrame(this._renderStep.bind(this)); // wait this.renderTimeStep milliseconds and perform the animation step function + } } } } @@ -34918,25 +37034,25 @@ return /******/ (function(modules) { // webpackBootstrap } } } - }, { - key: 'redraw', /** * Redraw the network with the current data * chart will be resized too. */ + }, { + key: 'redraw', value: function redraw() { this.body.emitter.emit('setSize'); this._redraw(); } - }, { - key: '_requestRedraw', /** * Redraw the network with the current data * @param hidden | used to get the first estimate of the node sizes. only the nodes are drawn after which they are quickly drawn over. * @private */ + }, { + key: '_requestRedraw', value: function _requestRedraw() { var _this2 = this; @@ -34959,7 +37075,7 @@ return /******/ (function(modules) { // webpackBootstrap var hidden = arguments.length <= 0 || arguments[0] === undefined ? false : arguments[0]; if (this.allowRedraw === true) { - this.body.emitter.emit('initRedraw'); + this.body.emitter.emit("initRedraw"); this.redrawRequested = false; var ctx = this.canvas.frame.canvas.getContext('2d'); @@ -34969,9 +37085,7 @@ return /******/ (function(modules) { // webpackBootstrap this.canvas.setSize(); } - if (this.pixelRatio === undefined) { - this.pixelRatio = (window.devicePixelRatio || 1) / (ctx.webkitBackingStorePixelRatio || ctx.mozBackingStorePixelRatio || ctx.msBackingStorePixelRatio || ctx.oBackingStorePixelRatio || ctx.backingStorePixelRatio || 1); - } + this.pixelRatio = (window.devicePixelRatio || 1) / (ctx.webkitBackingStorePixelRatio || ctx.mozBackingStorePixelRatio || ctx.msBackingStorePixelRatio || ctx.oBackingStorePixelRatio || ctx.backingStorePixelRatio || 1); ctx.setTransform(this.pixelRatio, 0, 0, this.pixelRatio, 0, 0); @@ -34980,13 +37094,18 @@ return /******/ (function(modules) { // webpackBootstrap var h = this.canvas.frame.canvas.clientHeight; ctx.clearRect(0, 0, w, h); + // if the div is hidden, we stop the redraw here for performance. + if (this.canvas.frame.clientWidth === 0) { + return; + } + // set scaling and translation ctx.save(); ctx.translate(this.body.view.translation.x, this.body.view.translation.y); ctx.scale(this.body.view.scale, this.body.view.scale); ctx.beginPath(); - this.body.emitter.emit('beforeDrawing', ctx); + this.body.emitter.emit("beforeDrawing", ctx); ctx.closePath(); if (hidden === false) { @@ -34999,24 +37118,17 @@ return /******/ (function(modules) { // webpackBootstrap this._drawNodes(ctx, hidden); } - if (this.controlNodesActive === true) { - this._drawControlNodes(ctx); - } - ctx.beginPath(); - //this.physics.nodesSolver._debug(ctx,"#F00F0F"); - this.body.emitter.emit('afterDrawing', ctx); + this.body.emitter.emit("afterDrawing", ctx); ctx.closePath(); + // restore original scaling and translation ctx.restore(); - if (hidden === true) { ctx.clearRect(0, 0, w, h); } } } - }, { - key: '_resizeNodes', /** * Redraw all nodes @@ -35025,6 +37137,8 @@ return /******/ (function(modules) { // webpackBootstrap * @param {Boolean} [alwaysShow] * @private */ + }, { + key: '_resizeNodes', value: function _resizeNodes() { var ctx = this.canvas.frame.canvas.getContext('2d'); if (this.pixelRatio === undefined) { @@ -35050,8 +37164,6 @@ return /******/ (function(modules) { // webpackBootstrap // restore original scaling and translation ctx.restore(); } - }, { - key: '_drawNodes', /** * Redraw all nodes @@ -35060,6 +37172,8 @@ return /******/ (function(modules) { // webpackBootstrap * @param {Boolean} [alwaysShow] * @private */ + }, { + key: '_drawNodes', value: function _drawNodes(ctx) { var alwaysShow = arguments.length <= 1 || arguments[1] === undefined ? false : arguments[1]; @@ -35098,8 +37212,6 @@ return /******/ (function(modules) { // webpackBootstrap node.draw(ctx); } } - }, { - key: '_drawEdges', /** * Redraw all edges @@ -35107,6 +37219,8 @@ return /******/ (function(modules) { // webpackBootstrap * @param {CanvasRenderingContext2D} ctx * @private */ + }, { + key: '_drawEdges', value: function _drawEdges(ctx) { var edges = this.body.edges; var edgeIndices = this.body.edgeIndices; @@ -35119,33 +37233,14 @@ return /******/ (function(modules) { // webpackBootstrap } } } - }, { - key: '_drawControlNodes', - - /** - * Redraw all edges - * The 2d context of a HTML canvas can be retrieved by canvas.getContext('2d'); - * @param {CanvasRenderingContext2D} ctx - * @private - */ - value: function _drawControlNodes(ctx) { - var edges = this.body.edges; - var edgeIndices = this.body.edgeIndices; - var edge = undefined; - - for (var i = 0; i < edgeIndices.length; i++) { - edge = edges[edgeIndices[i]]; - edge._drawControlNodes(ctx); - } - } - }, { - key: '_determineBrowserMethod', /** * Determine if the browser requires a setTimeout or a requestAnimationFrame. This was required because * some implementations (safari and IE9) did not support requestAnimationFrame * @private */ + }, { + key: '_determineBrowserMethod', value: function _determineBrowserMethod() { if (typeof window !== 'undefined') { var browserType = navigator.userAgent.toLowerCase(); @@ -35172,7 +37267,7 @@ return /******/ (function(modules) { // webpackBootstrap module.exports = exports['default']; /***/ }, -/* 100 */ +/* 102 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; @@ -35185,10 +37280,10 @@ return /******/ (function(modules) { // webpackBootstrap function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } - var Hammer = __webpack_require__(3); - var hammerUtil = __webpack_require__(30); + var Hammer = __webpack_require__(20); + var hammerUtil = __webpack_require__(24); - var util = __webpack_require__(7); + var util = __webpack_require__(1); /** * Create the main frame for the Network. @@ -35206,6 +37301,7 @@ return /******/ (function(modules) { // webpackBootstrap this.pixelRatio = 1; this.resizeTimer = undefined; this.resizeFunction = this._onResize.bind(this); + this.cameraState = {}; this.options = {}; this.defaultOptions = { @@ -35224,7 +37320,7 @@ return /******/ (function(modules) { // webpackBootstrap var _this = this; // bind the events - this.body.emitter.once('resize', function (obj) { + this.body.emitter.once("resize", function (obj) { if (obj.width !== 0) { _this.body.view.translation.x = obj.width * 0.5; } @@ -35232,8 +37328,8 @@ return /******/ (function(modules) { // webpackBootstrap _this.body.view.translation.y = obj.height * 0.5; } }); - this.body.emitter.on('setSize', this.setSize.bind(this)); - this.body.emitter.on('destroy', function () { + this.body.emitter.on("setSize", this.setSize.bind(this)); + this.body.emitter.on("destroy", function () { _this.hammerFrame.destroy(); _this.hammer.destroy(); _this._cleanUp(); @@ -35255,7 +37351,7 @@ return /******/ (function(modules) { // webpackBootstrap this.resizeTimer = setInterval(function () { var changed = _this2.setSize(); if (changed === true) { - _this2.body.emitter.emit('_requestRedraw'); + _this2.body.emitter.emit("_requestRedraw"); } }, 1000); this.resizeFunction = this._onResize.bind(this); @@ -35276,7 +37372,59 @@ return /******/ (function(modules) { // webpackBootstrap key: '_onResize', value: function _onResize() { this.setSize(); - this.body.emitter.emit('_redraw'); + this.body.emitter.emit("_redraw"); + } + + /** + * Get and store the cameraState + * @private + */ + }, { + key: '_getCameraState', + value: function _getCameraState() { + var pixelRatio = arguments.length <= 0 || arguments[0] === undefined ? this.pixelRatio : arguments[0]; + + this.cameraState.previousWidth = this.frame.canvas.width / pixelRatio; + this.cameraState.previousHeight = this.frame.canvas.height / pixelRatio; + this.cameraState.scale = this.body.view.scale; + this.cameraState.position = this.DOMtoCanvas({ x: 0.5 * this.frame.canvas.width / pixelRatio, y: 0.5 * this.frame.canvas.height / pixelRatio }); + } + + /** + * Set the cameraState + * @private + */ + }, { + key: '_setCameraState', + value: function _setCameraState() { + if (this.cameraState.scale !== undefined && this.frame.canvas.clientWidth !== 0 && this.frame.canvas.clientHeight !== 0 && this.pixelRatio !== 0 && this.cameraState.previousWidth > 0) { + + var widthRatio = this.frame.canvas.width / this.pixelRatio / this.cameraState.previousWidth; + var heightRatio = this.frame.canvas.height / this.pixelRatio / this.cameraState.previousHeight; + var newScale = this.cameraState.scale; + + if (widthRatio != 1 && heightRatio != 1) { + newScale = this.cameraState.scale * 0.5 * (widthRatio + heightRatio); + } else if (widthRatio != 1) { + newScale = this.cameraState.scale * widthRatio; + } else if (heightRatio != 1) { + newScale = this.cameraState.scale * heightRatio; + } + + this.body.view.scale = newScale; + // this comes from the view module. + var currentViewCenter = this.DOMtoCanvas({ + x: 0.5 * this.frame.canvas.clientWidth, + y: 0.5 * this.frame.canvas.clientHeight + }); + + var distanceFromCenter = { // offset from view, distance view has to change by these x and y to center the node + x: currentViewCenter.x - this.cameraState.position.x, + y: currentViewCenter.y - this.cameraState.position.y + }; + this.body.view.translation.x += distanceFromCenter.x * this.body.view.scale; + this.body.view.translation.y += distanceFromCenter.y * this.body.view.scale; + } } }, { key: '_prepareValue', @@ -35290,14 +37438,14 @@ return /******/ (function(modules) { // webpackBootstrap return value + 'px'; } } - throw new Error('Could not use the value supplie for width or height:' + value); + throw new Error('Could not use the value supplied for width or height:' + value); } - }, { - key: '_create', /** * Create the HTML */ + }, { + key: '_create', value: function _create() { // remove all elements from the container element. while (this.body.container.hasChildNodes()) { @@ -35312,7 +37460,7 @@ return /******/ (function(modules) { // webpackBootstrap ////////////////////////////////////////////////////////////////// - this.frame.canvas = document.createElement('canvas'); + this.frame.canvas = document.createElement("canvas"); this.frame.canvas.style.position = 'relative'; this.frame.appendChild(this.frame.canvas); @@ -35324,10 +37472,10 @@ return /******/ (function(modules) { // webpackBootstrap noCanvas.innerHTML = 'Error: your browser does not support HTML canvas'; this.frame.canvas.appendChild(noCanvas); } else { - var ctx = this.frame.canvas.getContext('2d'); + var ctx = this.frame.canvas.getContext("2d"); this.pixelRatio = (window.devicePixelRatio || 1) / (ctx.webkitBackingStorePixelRatio || ctx.mozBackingStorePixelRatio || ctx.msBackingStorePixelRatio || ctx.oBackingStorePixelRatio || ctx.backingStorePixelRatio || 1); - this.frame.canvas.getContext('2d').setTransform(this.pixelRatio, 0, 0, this.pixelRatio, 0, 0); + this.frame.canvas.getContext("2d").setTransform(this.pixelRatio, 0, 0, this.pixelRatio, 0, 0); } // add the frame to the container element @@ -35338,13 +37486,13 @@ return /******/ (function(modules) { // webpackBootstrap this._bindHammer(); } - }, { - key: '_bindHammer', /** * This function binds hammer, it can be repeated over and over due to the uniqueness check. * @private */ + }, { + key: '_bindHammer', value: function _bindHammer() { var _this3 = this; @@ -35405,8 +37553,6 @@ return /******/ (function(modules) { // webpackBootstrap _this3.body.eventListeners.onRelease(event); }); } - }, { - key: 'setSize', /** * Set a new size for the network @@ -35415,6 +37561,8 @@ return /******/ (function(modules) { // webpackBootstrap * @param {string} height Height in pixels or percentage (for example '400px' * or '30%') */ + }, { + key: 'setSize', value: function setSize() { var width = arguments.length <= 0 || arguments[0] === undefined ? this.options.width : arguments[0]; var height = arguments.length <= 1 || arguments[1] === undefined ? this.options.height : arguments[1]; @@ -35426,7 +37574,14 @@ return /******/ (function(modules) { // webpackBootstrap var oldWidth = this.frame.canvas.width; var oldHeight = this.frame.canvas.height; + // update the pixel ratio + var ctx = this.frame.canvas.getContext("2d"); + var previousRatio = this.pixelRatio; // we cache this because the camera state storage needs the old value + this.pixelRatio = (window.devicePixelRatio || 1) / (ctx.webkitBackingStorePixelRatio || ctx.mozBackingStorePixelRatio || ctx.msBackingStorePixelRatio || ctx.oBackingStorePixelRatio || ctx.backingStorePixelRatio || 1); + if (width != this.options.width || height != this.options.height || this.frame.style.width != width || this.frame.style.height != height) { + this._getCameraState(previousRatio); + this.frame.style.width = width; this.frame.style.height = height; @@ -35444,6 +37599,11 @@ return /******/ (function(modules) { // webpackBootstrap // this would adapt the width of the canvas to the width from 100% if and only if // there is a change. + // store the camera if there is a change in size. + if (this.frame.canvas.width != Math.round(this.frame.canvas.clientWidth * this.pixelRatio) || this.frame.canvas.height != Math.round(this.frame.canvas.clientHeight * this.pixelRatio)) { + this._getCameraState(previousRatio); + } + if (this.frame.canvas.width != Math.round(this.frame.canvas.clientWidth * this.pixelRatio)) { this.frame.canvas.width = Math.round(this.frame.canvas.clientWidth * this.pixelRatio); emitEvent = true; @@ -35461,6 +37621,9 @@ return /******/ (function(modules) { // webpackBootstrap oldWidth: Math.round(oldWidth / this.pixelRatio), oldHeight: Math.round(oldHeight / this.pixelRatio) }); + + // restore the camera on change. + this._setCameraState(); } return emitEvent; @@ -35478,8 +37641,6 @@ return /******/ (function(modules) { // webpackBootstrap value: function _XconvertDOMtoCanvas(x) { return (x - this.body.view.translation.x) / this.body.view.scale; } - }, { - key: '_XconvertCanvasToDOM', /** * Convert the X coordinate in canvas-space (the simulation sandbox, which the camera looks upon) to @@ -35488,11 +37649,11 @@ return /******/ (function(modules) { // webpackBootstrap * @returns {number} * @private */ + }, { + key: '_XconvertCanvasToDOM', value: function _XconvertCanvasToDOM(x) { return x * this.body.view.scale + this.body.view.translation.x; } - }, { - key: '_YconvertDOMtoCanvas', /** * Convert the Y coordinate in DOM-space (coordinate point in browser relative to the container div) to @@ -35501,11 +37662,11 @@ return /******/ (function(modules) { // webpackBootstrap * @returns {number} * @private */ + }, { + key: '_YconvertDOMtoCanvas', value: function _YconvertDOMtoCanvas(y) { return (y - this.body.view.translation.y) / this.body.view.scale; } - }, { - key: '_YconvertCanvasToDOM', /** * Convert the Y coordinate in canvas-space (the simulation sandbox, which the camera looks upon) to @@ -35514,11 +37675,11 @@ return /******/ (function(modules) { // webpackBootstrap * @returns {number} * @private */ + }, { + key: '_YconvertCanvasToDOM', value: function _YconvertCanvasToDOM(y) { return y * this.body.view.scale + this.body.view.translation.y; } - }, { - key: 'canvasToDOM', /** * @@ -35526,11 +37687,11 @@ return /******/ (function(modules) { // webpackBootstrap * @returns {{x: number, y: number}} * @constructor */ + }, { + key: 'canvasToDOM', value: function canvasToDOM(pos) { return { x: this._XconvertCanvasToDOM(pos.x), y: this._YconvertCanvasToDOM(pos.y) }; } - }, { - key: 'DOMtoCanvas', /** * @@ -35538,6 +37699,8 @@ return /******/ (function(modules) { // webpackBootstrap * @returns {{x: number, y: number}} * @constructor */ + }, { + key: 'DOMtoCanvas', value: function DOMtoCanvas(pos) { return { x: this._XconvertDOMtoCanvas(pos.x), y: this._YconvertDOMtoCanvas(pos.y) }; } @@ -35550,20 +37713,26 @@ return /******/ (function(modules) { // webpackBootstrap module.exports = exports['default']; /***/ }, -/* 101 */ +/* 103 */ /***/ function(module, exports, __webpack_require__) { - "use strict"; + 'use strict'; - Object.defineProperty(exports, "__esModule", { + Object.defineProperty(exports, '__esModule', { value: true }); - var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); + var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); - function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } - var util = __webpack_require__(7); + function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } + + var _NetworkUtil = __webpack_require__(99); + + var _NetworkUtil2 = _interopRequireDefault(_NetworkUtil); + + var util = __webpack_require__(1); var View = (function () { function View(body, canvas) { @@ -35595,92 +37764,29 @@ return /******/ (function(modules) { // webpackBootstrap } _createClass(View, [{ - key: "setOptions", + key: 'setOptions', value: function setOptions() { var options = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0]; this.options = options; } - }, { - key: "_getRange", - - /** - * Find the center position of the network - * @private - */ - value: function _getRange() { - var specificNodes = arguments.length <= 0 || arguments[0] === undefined ? [] : arguments[0]; - - var minY = 1e9, - maxY = -1e9, - minX = 1e9, - maxX = -1e9, - node; - if (specificNodes.length > 0) { - for (var i = 0; i < specificNodes.length; i++) { - node = this.body.nodes[specificNodes[i]]; - if (minX > node.shape.boundingBox.left) { - minX = node.shape.boundingBox.left; - } - if (maxX < node.shape.boundingBox.right) { - maxX = node.shape.boundingBox.right; - } - if (minY > node.shape.boundingBox.top) { - minY = node.shape.boundingBox.top; - } // top is negative, bottom is positive - if (maxY < node.shape.boundingBox.bottom) { - maxY = node.shape.boundingBox.bottom; - } // top is negative, bottom is positive - } - } else { - for (var i = 0; i < this.body.nodeIndices.length; i++) { - node = this.body.nodes[this.body.nodeIndices[i]]; - if (minX > node.shape.boundingBox.left) { - minX = node.shape.boundingBox.left; - } - if (maxX < node.shape.boundingBox.right) { - maxX = node.shape.boundingBox.right; - } - if (minY > node.shape.boundingBox.top) { - minY = node.shape.boundingBox.top; - } // top is negative, bottom is positive - if (maxY < node.shape.boundingBox.bottom) { - maxY = node.shape.boundingBox.bottom; - } // top is negative, bottom is positive - } - } - - if (minX === 1e9 && maxX === -1e9 && minY === 1e9 && maxY === -1e9) { - minY = 0, maxY = 0, minX = 0, maxX = 0; - } - return { minX: minX, maxX: maxX, minY: minY, maxY: maxY }; - } - }, { - key: "_findCenter", - - /** - * @param {object} range = {minX: minX, maxX: maxX, minY: minY, maxY: maxY}; - * @returns {{x: number, y: number}} - * @private - */ - value: function _findCenter(range) { - return { x: 0.5 * (range.maxX + range.minX), - y: 0.5 * (range.maxY + range.minY) }; - } - }, { - key: "fit", /** * This function zooms out to fit all data on screen based on amount of nodes * @param {Object} Options * @param {Boolean} [initialZoom] | zoom based on fitted formula or range, true = fitted, default = false; */ + }, { + key: 'fit', value: function fit() { var options = arguments.length <= 0 || arguments[0] === undefined ? { nodes: [] } : arguments[0]; var initialZoom = arguments.length <= 1 || arguments[1] === undefined ? false : arguments[1]; - var range; - var zoomLevel; + var range = undefined; + var zoomLevel = undefined; + if (options.nodes === undefined || options.nodes.length === 0) { + options.nodes = this.body.nodeIndices; + } if (initialZoom === true) { // check if more than half of the nodes have a predefined position. If so, we use the range, not the approximation. @@ -35698,7 +37804,7 @@ return /******/ (function(modules) { // webpackBootstrap return; } - range = this._getRange(options.nodes); + range = _NetworkUtil2['default'].getRange(this.body.nodes, options.nodes); var numberOfNodes = this.body.nodeIndices.length; zoomLevel = 12.662 / (numberOfNodes + 7.4147) + 0.0964822; // this is obtained from fitting a dataset from 5 points with scale levels that looked good. @@ -35708,7 +37814,7 @@ return /******/ (function(modules) { // webpackBootstrap zoomLevel *= factor; } else { this.body.emitter.emit("_resizeNodes"); - range = this._getRange(options.nodes); + range = _NetworkUtil2['default'].getRange(this.body.nodes, options.nodes); var xDistance = Math.abs(range.maxX - range.minX) * 1.1; var yDistance = Math.abs(range.maxY - range.minY) * 1.1; @@ -35725,12 +37831,10 @@ return /******/ (function(modules) { // webpackBootstrap zoomLevel = 1.0; } - var center = this._findCenter(range); + var center = _NetworkUtil2['default'].findCenter(range); var animationOptions = { position: center, scale: zoomLevel, animation: options.animation }; this.moveTo(animationOptions); } - }, { - key: "focus", // animation @@ -35740,6 +37844,8 @@ return /******/ (function(modules) { // webpackBootstrap * @param {Number} nodeId * @param {Number} [options] */ + }, { + key: 'focus', value: function focus(nodeId) { var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; @@ -35753,8 +37859,6 @@ return /******/ (function(modules) { // webpackBootstrap console.log("Node: " + nodeId + " cannot be found."); } } - }, { - key: "moveTo", /** * @@ -35763,6 +37867,8 @@ return /******/ (function(modules) { // webpackBootstrap * | options.position = {x:Number, y:Number} // position to move to * | options.animation = {duration:Number, easingFunction:String} || Boolean // position to move to */ + }, { + key: 'moveTo', value: function moveTo(options) { if (options === undefined) { options = {}; @@ -35801,8 +37907,6 @@ return /******/ (function(modules) { // webpackBootstrap this.animateView(options); } - }, { - key: "animateView", /** * @@ -35815,6 +37919,8 @@ return /******/ (function(modules) { // webpackBootstrap * // easeInQuart, easeOutQuart, easeInOutQuart, * // easeInQuint, easeOutQuint, easeInOutQuint */ + }, { + key: 'animateView', value: function animateView(options) { if (options === undefined) { return; @@ -35869,13 +37975,13 @@ return /******/ (function(modules) { // webpackBootstrap this.body.emitter.emit("_startRendering"); } } - }, { - key: "_lockedRedraw", /** * used to animate smoothly by hijacking the redraw function. * @private */ + }, { + key: '_lockedRedraw', value: function _lockedRedraw() { var nodePosition = { x: this.body.nodes[this.lockedOnNodeId].x, y: this.body.nodes[this.lockedOnNodeId].y }; var viewCenter = this.canvas.DOMtoCanvas({ x: 0.5 * this.canvas.frame.canvas.clientWidth, y: 0.5 * this.canvas.frame.canvas.clientHeight }); @@ -35892,7 +37998,7 @@ return /******/ (function(modules) { // webpackBootstrap this.body.view.translation = targetTranslation; } }, { - key: "releaseNode", + key: 'releaseNode', value: function releaseNode() { if (this.lockedOnNodeId !== undefined && this.viewFunction !== undefined) { this.body.emitter.off("initRedraw", this.viewFunction); @@ -35900,14 +38006,14 @@ return /******/ (function(modules) { // webpackBootstrap this.lockedOnNodeOffset = undefined; } } - }, { - key: "_transitionRedraw", /** * * @param easingTime * @private */ + }, { + key: '_transitionRedraw', value: function _transitionRedraw() { var finished = arguments.length <= 0 || arguments[0] === undefined ? false : arguments[0]; @@ -35934,12 +38040,12 @@ return /******/ (function(modules) { // webpackBootstrap } } }, { - key: "getScale", + key: 'getScale', value: function getScale() { return this.body.view.scale; } }, { - key: "getViewPosition", + key: 'getViewPosition', value: function getViewPosition() { return this.canvas.DOMtoCanvas({ x: 0.5 * this.canvas.frame.canvas.clientWidth, y: 0.5 * this.canvas.frame.canvas.clientHeight }); } @@ -35948,11 +38054,11 @@ return /******/ (function(modules) { // webpackBootstrap return View; })(); - exports["default"] = View; - module.exports = exports["default"]; + exports['default'] = View; + module.exports = exports['default']; /***/ }, -/* 102 */ +/* 104 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; @@ -35967,15 +38073,15 @@ return /******/ (function(modules) { // webpackBootstrap function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } - var _componentsNavigationHandler = __webpack_require__(103); + var _componentsNavigationHandler = __webpack_require__(105); var _componentsNavigationHandler2 = _interopRequireDefault(_componentsNavigationHandler); - var _componentsPopup = __webpack_require__(104); + var _componentsPopup = __webpack_require__(106); var _componentsPopup2 = _interopRequireDefault(_componentsPopup); - var util = __webpack_require__(7); + var util = __webpack_require__(1); var InteractionHandler = (function () { function InteractionHandler(body, canvas, selectionHandler) { @@ -36059,8 +38165,6 @@ return /******/ (function(modules) { // webpackBootstrap this.navigationHandler.setOptions(this.options); } - }, { - key: 'getPointer', /** * Get the pointer location from a touch location @@ -36068,20 +38172,22 @@ return /******/ (function(modules) { // webpackBootstrap * @return {{x: Number, y: Number}} pointer * @private */ + }, { + key: 'getPointer', value: function getPointer(touch) { return { x: touch.x - util.getAbsoluteLeft(this.canvas.frame.canvas), y: touch.y - util.getAbsoluteTop(this.canvas.frame.canvas) }; } - }, { - key: 'onTouch', /** * On start of a touch gesture, store the pointer * @param event * @private */ + }, { + key: 'onTouch', value: function onTouch(event) { if (new Date().valueOf() - this.touchTime > 50) { this.drag.pointer = this.getPointer(event.center); @@ -36091,13 +38197,13 @@ return /******/ (function(modules) { // webpackBootstrap this.touchTime = new Date().valueOf(); } } - }, { - key: 'onTap', /** * handle tap/click event: select/unselect a node * @private */ + }, { + key: 'onTap', value: function onTap(event) { var pointer = this.getPointer(event.center); var multiselect = this.selectionHandler.options.multiselect && (event.changedPointers[0].ctrlKey || event.changedPointers[0].metaKey); @@ -36105,24 +38211,24 @@ return /******/ (function(modules) { // webpackBootstrap this.checkSelectionChanges(pointer, event, multiselect); this.selectionHandler._generateClickEvent('click', event, pointer); } - }, { - key: 'onDoubleTap', /** * handle doubletap event * @private */ + }, { + key: 'onDoubleTap', value: function onDoubleTap(event) { var pointer = this.getPointer(event.center); this.selectionHandler._generateClickEvent('doubleClick', event, pointer); } - }, { - key: 'onHold', /** * handle long tap event: multi select nodes * @private */ + }, { + key: 'onHold', value: function onHold(event) { var pointer = this.getPointer(event.center); var multiselect = this.selectionHandler.options.multiselect; @@ -36132,14 +38238,14 @@ return /******/ (function(modules) { // webpackBootstrap this.selectionHandler._generateClickEvent('click', event, pointer); this.selectionHandler._generateClickEvent('hold', event, pointer); } - }, { - key: 'onRelease', /** * handle the release of the screen * * @private */ + }, { + key: 'onRelease', value: function onRelease(event) { if (new Date().valueOf() - this.touchTime > 10) { var pointer = this.getPointer(event.center); @@ -36154,14 +38260,14 @@ return /******/ (function(modules) { // webpackBootstrap var pointer = this.getPointer({ x: event.clientX, y: event.clientY }); this.selectionHandler._generateClickEvent('oncontext', event, pointer); } - }, { - key: 'checkSelectionChanges', /** * * @param pointer * @param add */ + }, { + key: 'checkSelectionChanges', value: function checkSelectionChanges(pointer, event) { var add = arguments.length <= 2 || arguments[2] === undefined ? false : arguments[2]; @@ -36183,10 +38289,13 @@ return /******/ (function(modules) { // webpackBootstrap var nodesChanges = _determineIfDifferent2.nodesChanges; var edgesChanges = _determineIfDifferent2.edgesChanges; + var nodeSelected = false; + if (selectedNodesCount - previouslySelectedNodeCount > 0) { // node was selected this.selectionHandler._generateClickEvent('selectNode', event, pointer); selected = true; + nodeSelected = true; } else if (selectedNodesCount - previouslySelectedNodeCount < 0) { // node was deselected this.selectionHandler._generateClickEvent('deselectNode', event, pointer, previousSelection); @@ -36194,10 +38303,12 @@ return /******/ (function(modules) { // webpackBootstrap } else if (selectedNodesCount === previouslySelectedNodeCount && nodesChanges === true) { this.selectionHandler._generateClickEvent('deselectNode', event, pointer, previousSelection); this.selectionHandler._generateClickEvent('selectNode', event, pointer); + nodeSelected = true; selected = true; } - if (selectedEdgesCount - previouslySelectedEdgeCount > 0) { + // handle the selected edges + if (selectedEdgesCount - previouslySelectedEdgeCount > 0 && nodeSelected === false) { // edge was selected this.selectionHandler._generateClickEvent('selectEdge', event, pointer); selected = true; @@ -36211,13 +38322,12 @@ return /******/ (function(modules) { // webpackBootstrap selected = true; } + // fire the select event if anything has been selected or deselected if (selected === true) { // select or unselect this.selectionHandler._generateClickEvent('select', event, pointer); } } - }, { - key: '_determineIfDifferent', /** * This function checks if the nodes and edges previously selected have changed. @@ -36226,6 +38336,8 @@ return /******/ (function(modules) { // webpackBootstrap * @returns {{nodesChanges: boolean, edgesChanges: boolean}} * @private */ + }, { + key: '_determineIfDifferent', value: function _determineIfDifferent(previousSelection, currentSelection) { var nodesChanges = false; var edgesChanges = false; @@ -36253,8 +38365,6 @@ return /******/ (function(modules) { // webpackBootstrap return { nodesChanges: nodesChanges, edgesChanges: edgesChanges }; } - }, { - key: 'onDragStart', /** * This function is called by onDragStart. @@ -36262,6 +38372,8 @@ return /******/ (function(modules) { // webpackBootstrap * * @private */ + }, { + key: 'onDragStart', value: function onDragStart(event) { //in case the touch event was triggered on an external div, do the initial touch now. if (this.drag.pointer === undefined) { @@ -36314,13 +38426,13 @@ return /******/ (function(modules) { // webpackBootstrap this.selectionHandler._generateClickEvent('dragStart', event, this.drag.pointer, undefined, true); } } - }, { - key: 'onDrag', /** * handle drag event * @private */ + }, { + key: 'onDrag', value: function onDrag(event) { var _this2 = this; @@ -36376,13 +38488,13 @@ return /******/ (function(modules) { // webpackBootstrap } } } - }, { - key: 'onDragEnd', /** * handle drag start event * @private */ + }, { + key: 'onDragEnd', value: function onDragEnd(event) { this.drag.dragging = false; var selection = this.drag.selection; @@ -36399,14 +38511,14 @@ return /******/ (function(modules) { // webpackBootstrap this.body.emitter.emit('_requestRedraw'); } } - }, { - key: 'onPinch', /** * Handle pinch event * @param event * @private */ + }, { + key: 'onPinch', value: function onPinch(event) { var pointer = this.getPointer(event.center); @@ -36419,8 +38531,6 @@ return /******/ (function(modules) { // webpackBootstrap var scale = this.pinch.scale * event.scale; this.zoom(scale, pointer); } - }, { - key: 'zoom', /** * Zoom the network in or out @@ -36429,6 +38539,8 @@ return /******/ (function(modules) { // webpackBootstrap * @return {Number} appliedScale scale is limited within the boundaries * @private */ + }, { + key: 'zoom', value: function zoom(scale, pointer) { if (this.options.zoomView === true) { var scaleOld = this.body.view.scale; @@ -36470,8 +38582,6 @@ return /******/ (function(modules) { // webpackBootstrap } } } - }, { - key: 'onMouseWheel', /** * Event handler for mouse wheel event, used to zoom the timeline @@ -36480,50 +38590,54 @@ return /******/ (function(modules) { // webpackBootstrap * @param {MouseEvent} event * @private */ - value: function onMouseWheel(event) { - // retrieve delta - var delta = 0; - if (event.wheelDelta) { - /* IE/Opera. */ - delta = event.wheelDelta / 120; - } else if (event.detail) { - /* Mozilla case. */ - // In Mozilla, sign of delta is different than in IE. - // Also, delta is multiple of 3. - delta = -event.detail / 3; - } - - // If delta is nonzero, handle it. - // Basically, delta is now positive if wheel was scrolled up, - // and negative, if wheel was scrolled down. - if (delta !== 0) { - - // calculate the new scale - var scale = this.body.view.scale; - var zoom = delta / 10; - if (delta < 0) { - zoom = zoom / (1 - zoom); - } - scale *= 1 + zoom; - - // calculate the pointer location - var pointer = this.getPointer({ x: event.clientX, y: event.clientY }); - - // apply the new scale - this.zoom(scale, pointer); - } - - // Prevent default actions caused by mouse wheel. - event.preventDefault(); - } }, { - key: 'onMouseMove', + key: 'onMouseWheel', + value: function onMouseWheel(event) { + if (this.options.zoomView === true) { + // retrieve delta + var delta = 0; + if (event.wheelDelta) { + /* IE/Opera. */ + delta = event.wheelDelta / 120; + } else if (event.detail) { + /* Mozilla case. */ + // In Mozilla, sign of delta is different than in IE. + // Also, delta is multiple of 3. + delta = -event.detail / 3; + } + + // If delta is nonzero, handle it. + // Basically, delta is now positive if wheel was scrolled up, + // and negative, if wheel was scrolled down. + if (delta !== 0) { + + // calculate the new scale + var scale = this.body.view.scale; + var zoom = delta / 10; + if (delta < 0) { + zoom = zoom / (1 - zoom); + } + scale *= 1 + zoom; + + // calculate the pointer location + var pointer = this.getPointer({ x: event.clientX, y: event.clientY }); + + // apply the new scale + this.zoom(scale, pointer); + } + + // Prevent default actions caused by mouse wheel. + event.preventDefault(); + } + } /** * Mouse move handler for checking whether the title moves over a node with a title. * @param {Event} event * @private */ + }, { + key: 'onMouseMove', value: function onMouseMove(event) { var _this3 = this; @@ -36574,8 +38688,6 @@ return /******/ (function(modules) { // webpackBootstrap this.selectionHandler.hoverObject(obj); } } - }, { - key: '_checkShowPopup', /** * Check if there is an element on the given position in the network @@ -36585,6 +38697,8 @@ return /******/ (function(modules) { // webpackBootstrap * @param {{x:Number, y:Number}} pointer * @private */ + }, { + key: '_checkShowPopup', value: function _checkShowPopup(pointer) { var x = this.canvas._XconvertDOMtoCanvas(pointer.x); var y = this.canvas._YconvertDOMtoCanvas(pointer.y); @@ -36669,8 +38783,6 @@ return /******/ (function(modules) { // webpackBootstrap } } } - }, { - key: '_checkHidePopup', /** * Check if the popup must be hidden, which is the case when the mouse is no @@ -36678,6 +38790,8 @@ return /******/ (function(modules) { // webpackBootstrap * @param {{x:Number, y:Number}} pointer * @private */ + }, { + key: '_checkHidePopup', value: function _checkHidePopup(pointer) { var pointerObj = this.selectionHandler._pointerToPositionObject(pointer); @@ -36716,7 +38830,7 @@ return /******/ (function(modules) { // webpackBootstrap module.exports = exports['default']; /***/ }, -/* 103 */ +/* 105 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; @@ -36729,10 +38843,10 @@ return /******/ (function(modules) { // webpackBootstrap function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } - var util = __webpack_require__(7); - var Hammer = __webpack_require__(3); - var hammerUtil = __webpack_require__(30); - var keycharm = __webpack_require__(43); + var util = __webpack_require__(1); + var Hammer = __webpack_require__(20); + var hammerUtil = __webpack_require__(24); + var keycharm = __webpack_require__(40); var NavigationHandler = (function () { function NavigationHandler(body, canvas) { @@ -36749,13 +38863,13 @@ return /******/ (function(modules) { // webpackBootstrap this.touchTime = 0; this.activated = false; - this.body.emitter.on('activate', function () { + this.body.emitter.on("activate", function () { _this.activated = true;_this.configureKeyboardBindings(); }); - this.body.emitter.on('deactivate', function () { + this.body.emitter.on("deactivate", function () { _this.activated = false;_this.configureKeyboardBindings(); }); - this.body.emitter.on('destroy', function () { + this.body.emitter.on("destroy", function () { if (_this.keycharm !== undefined) { _this.keycharm.destroy(); } @@ -36803,8 +38917,6 @@ return /******/ (function(modules) { // webpackBootstrap this.iconsCreated = false; } - }, { - key: 'loadNavigationElements', /** * Creation of the navigation controls nodes. They are drawn over the rest of the nodes and are not affected by scale and translation @@ -36814,6 +38926,8 @@ return /******/ (function(modules) { // webpackBootstrap * * @private */ + }, { + key: 'loadNavigationElements', value: function loadNavigationElements() { var _this2 = this; @@ -36833,7 +38947,7 @@ return /******/ (function(modules) { // webpackBootstrap this.navigationDOM['wrapper'].appendChild(this.navigationDOM[navigationDivs[i]]); var hammer = new Hammer(this.navigationDOM[navigationDivs[i]]); - if (navigationDivActions[i] === '_fit') { + if (navigationDivActions[i] === "_fit") { hammerUtil.onTouch(hammer, this._fit.bind(this)); } else { hammerUtil.onTouch(hammer, this.bindToRedraw.bind(this, navigationDivActions[i])); @@ -36857,47 +38971,47 @@ return /******/ (function(modules) { // webpackBootstrap value: function bindToRedraw(action) { if (this.boundFunctions[action] === undefined) { this.boundFunctions[action] = this[action].bind(this); - this.body.emitter.on('initRedraw', this.boundFunctions[action]); - this.body.emitter.emit('_startRendering'); + this.body.emitter.on("initRedraw", this.boundFunctions[action]); + this.body.emitter.emit("_startRendering"); } } }, { key: 'unbindFromRedraw', value: function unbindFromRedraw(action) { if (this.boundFunctions[action] !== undefined) { - this.body.emitter.off('initRedraw', this.boundFunctions[action]); - this.body.emitter.emit('_stopRendering'); + this.body.emitter.off("initRedraw", this.boundFunctions[action]); + this.body.emitter.emit("_stopRendering"); delete this.boundFunctions[action]; } } - }, { - key: '_fit', /** * this stops all movement induced by the navigation buttons * * @private */ + }, { + key: '_fit', value: function _fit() { if (new Date().valueOf() - this.touchTime > 700) { // TODO: fix ugly hack to avoid hammer's double fireing of event (because we use release?) - this.body.emitter.emit('fit', { duration: 700 }); + this.body.emitter.emit("fit", { duration: 700 }); this.touchTime = new Date().valueOf(); } } - }, { - key: '_stopMovement', /** * this stops all movement induced by the navigation buttons * * @private */ + }, { + key: '_stopMovement', value: function _stopMovement() { for (var boundAction in this.boundFunctions) { if (this.boundFunctions.hasOwnProperty(boundAction)) { - this.body.emitter.off('initRedraw', this.boundFunctions[boundAction]); - this.body.emitter.emit('_stopRendering'); + this.body.emitter.off("initRedraw", this.boundFunctions[boundAction]); + this.body.emitter.emit("_stopRendering"); } } this.boundFunctions = {}; @@ -36934,12 +39048,12 @@ return /******/ (function(modules) { // webpackBootstrap this.body.view.scale /= 1 + this.options.keyboard.speed.zoom; this.body.emitter.emit('zoom', { direction: '-', scale: this.body.view.scale }); } - }, { - key: 'configureKeyboardBindings', /** * bind all keys using keycharm. */ + }, { + key: 'configureKeyboardBindings', value: function configureKeyboardBindings() { var _this3 = this; @@ -36957,79 +39071,79 @@ return /******/ (function(modules) { // webpackBootstrap this.keycharm.reset(); if (this.activated === true) { - this.keycharm.bind('up', function () { - _this3.bindToRedraw('_moveUp'); - }, 'keydown'); - this.keycharm.bind('down', function () { - _this3.bindToRedraw('_moveDown'); - }, 'keydown'); - this.keycharm.bind('left', function () { - _this3.bindToRedraw('_moveLeft'); - }, 'keydown'); - this.keycharm.bind('right', function () { - _this3.bindToRedraw('_moveRight'); - }, 'keydown'); - this.keycharm.bind('=', function () { - _this3.bindToRedraw('_zoomIn'); - }, 'keydown'); - this.keycharm.bind('num+', function () { - _this3.bindToRedraw('_zoomIn'); - }, 'keydown'); - this.keycharm.bind('num-', function () { - _this3.bindToRedraw('_zoomOut'); - }, 'keydown'); - this.keycharm.bind('-', function () { - _this3.bindToRedraw('_zoomOut'); - }, 'keydown'); - this.keycharm.bind('[', function () { - _this3.bindToRedraw('_zoomOut'); - }, 'keydown'); - this.keycharm.bind(']', function () { - _this3.bindToRedraw('_zoomIn'); - }, 'keydown'); - this.keycharm.bind('pageup', function () { - _this3.bindToRedraw('_zoomIn'); - }, 'keydown'); - this.keycharm.bind('pagedown', function () { - _this3.bindToRedraw('_zoomOut'); - }, 'keydown'); + this.keycharm.bind("up", function () { + _this3.bindToRedraw("_moveUp"); + }, "keydown"); + this.keycharm.bind("down", function () { + _this3.bindToRedraw("_moveDown"); + }, "keydown"); + this.keycharm.bind("left", function () { + _this3.bindToRedraw("_moveLeft"); + }, "keydown"); + this.keycharm.bind("right", function () { + _this3.bindToRedraw("_moveRight"); + }, "keydown"); + this.keycharm.bind("=", function () { + _this3.bindToRedraw("_zoomIn"); + }, "keydown"); + this.keycharm.bind("num+", function () { + _this3.bindToRedraw("_zoomIn"); + }, "keydown"); + this.keycharm.bind("num-", function () { + _this3.bindToRedraw("_zoomOut"); + }, "keydown"); + this.keycharm.bind("-", function () { + _this3.bindToRedraw("_zoomOut"); + }, "keydown"); + this.keycharm.bind("[", function () { + _this3.bindToRedraw("_zoomOut"); + }, "keydown"); + this.keycharm.bind("]", function () { + _this3.bindToRedraw("_zoomIn"); + }, "keydown"); + this.keycharm.bind("pageup", function () { + _this3.bindToRedraw("_zoomIn"); + }, "keydown"); + this.keycharm.bind("pagedown", function () { + _this3.bindToRedraw("_zoomOut"); + }, "keydown"); - this.keycharm.bind('up', function () { - _this3.unbindFromRedraw('_moveUp'); - }, 'keyup'); - this.keycharm.bind('down', function () { - _this3.unbindFromRedraw('_moveDown'); - }, 'keyup'); - this.keycharm.bind('left', function () { - _this3.unbindFromRedraw('_moveLeft'); - }, 'keyup'); - this.keycharm.bind('right', function () { - _this3.unbindFromRedraw('_moveRight'); - }, 'keyup'); - this.keycharm.bind('=', function () { - _this3.unbindFromRedraw('_zoomIn'); - }, 'keyup'); - this.keycharm.bind('num+', function () { - _this3.unbindFromRedraw('_zoomIn'); - }, 'keyup'); - this.keycharm.bind('num-', function () { - _this3.unbindFromRedraw('_zoomOut'); - }, 'keyup'); - this.keycharm.bind('-', function () { - _this3.unbindFromRedraw('_zoomOut'); - }, 'keyup'); - this.keycharm.bind('[', function () { - _this3.unbindFromRedraw('_zoomOut'); - }, 'keyup'); - this.keycharm.bind(']', function () { - _this3.unbindFromRedraw('_zoomIn'); - }, 'keyup'); - this.keycharm.bind('pageup', function () { - _this3.unbindFromRedraw('_zoomIn'); - }, 'keyup'); - this.keycharm.bind('pagedown', function () { - _this3.unbindFromRedraw('_zoomOut'); - }, 'keyup'); + this.keycharm.bind("up", function () { + _this3.unbindFromRedraw("_moveUp"); + }, "keyup"); + this.keycharm.bind("down", function () { + _this3.unbindFromRedraw("_moveDown"); + }, "keyup"); + this.keycharm.bind("left", function () { + _this3.unbindFromRedraw("_moveLeft"); + }, "keyup"); + this.keycharm.bind("right", function () { + _this3.unbindFromRedraw("_moveRight"); + }, "keyup"); + this.keycharm.bind("=", function () { + _this3.unbindFromRedraw("_zoomIn"); + }, "keyup"); + this.keycharm.bind("num+", function () { + _this3.unbindFromRedraw("_zoomIn"); + }, "keyup"); + this.keycharm.bind("num-", function () { + _this3.unbindFromRedraw("_zoomOut"); + }, "keyup"); + this.keycharm.bind("-", function () { + _this3.unbindFromRedraw("_zoomOut"); + }, "keyup"); + this.keycharm.bind("[", function () { + _this3.unbindFromRedraw("_zoomOut"); + }, "keyup"); + this.keycharm.bind("]", function () { + _this3.unbindFromRedraw("_zoomIn"); + }, "keyup"); + this.keycharm.bind("pageup", function () { + _this3.unbindFromRedraw("_zoomIn"); + }, "keyup"); + this.keycharm.bind("pagedown", function () { + _this3.unbindFromRedraw("_zoomOut"); + }, "keyup"); } } } @@ -37042,7 +39156,7 @@ return /******/ (function(modules) { // webpackBootstrap module.exports = exports['default']; /***/ }, -/* 104 */ +/* 106 */ /***/ function(module, exports) { /** @@ -37081,24 +39195,24 @@ return /******/ (function(modules) { // webpackBootstrap this.container.appendChild(this.frame); } + /** + * @param {number} x Horizontal position of the popup window + * @param {number} y Vertical position of the popup window + */ + _createClass(Popup, [{ key: 'setPosition', - - /** - * @param {number} x Horizontal position of the popup window - * @param {number} y Vertical position of the popup window - */ value: function setPosition(x, y) { this.x = parseInt(x); this.y = parseInt(y); } - }, { - key: 'setText', /** * Set the content for the popup window. This can be HTML code or text. * @param {string | Element} content */ + }, { + key: 'setText', value: function setText(content) { if (content instanceof Element) { this.frame.innerHTML = ''; @@ -37107,13 +39221,13 @@ return /******/ (function(modules) { // webpackBootstrap this.frame.innerHTML = content; // string containing text or HTML } } - }, { - key: 'show', /** * Show the popup window * @param {boolean} [doShow] Show or hide the window */ + }, { + key: 'show', value: function show(doShow) { if (doShow === undefined) { doShow = true; @@ -37141,23 +39255,23 @@ return /******/ (function(modules) { // webpackBootstrap left = this.padding; } - this.frame.style.left = left + 'px'; - this.frame.style.top = top + 'px'; - this.frame.style.visibility = 'visible'; + this.frame.style.left = left + "px"; + this.frame.style.top = top + "px"; + this.frame.style.visibility = "visible"; this.hidden = false; } else { this.hide(); } } - }, { - key: 'hide', /** * Hide the popup window */ + }, { + key: 'hide', value: function hide() { this.hidden = true; - this.frame.style.visibility = 'hidden'; + this.frame.style.visibility = "hidden"; } }]); @@ -37168,7 +39282,7 @@ return /******/ (function(modules) { // webpackBootstrap module.exports = exports['default']; /***/ }, -/* 105 */ +/* 107 */ /***/ function(module, exports, __webpack_require__) { "use strict"; @@ -37181,9 +39295,9 @@ return /******/ (function(modules) { // webpackBootstrap function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - var Node = __webpack_require__(62); - var Edge = __webpack_require__(82); - var util = __webpack_require__(7); + var Node = __webpack_require__(61); + var Edge = __webpack_require__(81); + var util = __webpack_require__(1); var SelectionHandler = (function () { function SelectionHandler(body, canvas) { @@ -37214,12 +39328,10 @@ return /******/ (function(modules) { // webpackBootstrap key: "setOptions", value: function setOptions(options) { if (options !== undefined) { - var fields = ["multiselect", "hoverConnectedEdges", "selectable", "selectConnectedEdges"]; + var fields = ['multiselect', 'hoverConnectedEdges', 'selectable', 'selectConnectedEdges']; util.selectiveDeepExtend(fields, this.options, options); } } - }, { - key: "selectOnPoint", /** * handles the selection part of the tap; @@ -37227,6 +39339,8 @@ return /******/ (function(modules) { // webpackBootstrap * @param {Object} pointer * @private */ + }, { + key: "selectOnPoint", value: function selectOnPoint(pointer) { var selected = false; if (this.options.selectable === true) { @@ -37273,14 +39387,14 @@ return /******/ (function(modules) { // webpackBootstrap } else { properties = this.getSelection(); } - properties["pointer"] = { + properties['pointer'] = { DOM: { x: pointer.x, y: pointer.y }, canvas: this.canvas.DOMtoCanvas(pointer) }; - properties["event"] = event; + properties['event'] = event; if (oldSelection !== undefined) { - properties["previousSelection"] = oldSelection; + properties['previousSelection'] = oldSelection; } this.body.emitter.emit(eventType, properties); } @@ -37309,8 +39423,6 @@ return /******/ (function(modules) { // webpackBootstrap this._removeFromSelection(obj); } } - }, { - key: "_getAllNodesOverlappingWith", /** * retrieve all nodes overlapping with given object @@ -37318,6 +39430,8 @@ return /******/ (function(modules) { // webpackBootstrap * @return {Number[]} An array with id's of the overlapping nodes * @private */ + }, { + key: "_getAllNodesOverlappingWith", value: function _getAllNodesOverlappingWith(object) { var overlappingNodes = []; var nodes = this.body.nodes; @@ -37329,8 +39443,6 @@ return /******/ (function(modules) { // webpackBootstrap } return overlappingNodes; } - }, { - key: "_pointerToPositionObject", /** * Return a position object in canvasspace from a single point in screenspace @@ -37339,6 +39451,8 @@ return /******/ (function(modules) { // webpackBootstrap * @returns {{left: number, top: number, right: number, bottom: number}} * @private */ + }, { + key: "_pointerToPositionObject", value: function _pointerToPositionObject(pointer) { var canvasPos = this.canvas.DOMtoCanvas(pointer); return { @@ -37348,16 +39462,15 @@ return /******/ (function(modules) { // webpackBootstrap bottom: canvasPos.y - 1 }; } - }, { - key: "getNodeAt", /** * Get the top node at the a specific point (like a click) * * @param {{x: Number, y: Number}} pointer * @return {Node | undefined} node - * @private */ + }, { + key: "getNodeAt", value: function getNodeAt(pointer) { var returnNode = arguments.length <= 1 || arguments[1] === undefined ? true : arguments[1]; @@ -37376,8 +39489,6 @@ return /******/ (function(modules) { // webpackBootstrap return undefined; } } - }, { - key: "_getEdgesOverlappingWith", /** * retrieve all edges overlapping with given object, selector is around center @@ -37385,6 +39496,8 @@ return /******/ (function(modules) { // webpackBootstrap * @return {Number[]} An array with id's of the overlapping nodes * @private */ + }, { + key: "_getEdgesOverlappingWith", value: function _getEdgesOverlappingWith(object, overlappingEdges) { var edges = this.body.edges; for (var i = 0; i < this.body.edgeIndices.length; i++) { @@ -37394,8 +39507,6 @@ return /******/ (function(modules) { // webpackBootstrap } } } - }, { - key: "_getAllEdgesOverlappingWith", /** * retrieve all nodes overlapping with given object @@ -37403,13 +39514,13 @@ return /******/ (function(modules) { // webpackBootstrap * @return {Number[]} An array with id's of the overlapping nodes * @private */ + }, { + key: "_getAllEdgesOverlappingWith", value: function _getAllEdgesOverlappingWith(object) { var overlappingEdges = []; this._getEdgesOverlappingWith(object, overlappingEdges); return overlappingEdges; } - }, { - key: "getEdgeAt", /** * Place holder. To implement change the getNodeAt to a _getObjectAt. Have the _getObjectAt call @@ -37417,8 +39528,9 @@ return /******/ (function(modules) { // webpackBootstrap * * @param pointer * @returns {undefined} - * @private */ + }, { + key: "getEdgeAt", value: function getEdgeAt(pointer) { var returnEdge = arguments.length <= 1 || arguments[1] === undefined ? true : arguments[1]; @@ -37435,8 +39547,6 @@ return /******/ (function(modules) { // webpackBootstrap return undefined; } } - }, { - key: "_addToSelection", /** * Add object to the selection array. @@ -37444,6 +39554,8 @@ return /******/ (function(modules) { // webpackBootstrap * @param obj * @private */ + }, { + key: "_addToSelection", value: function _addToSelection(obj) { if (obj instanceof Node) { this.selectionObj.nodes[obj.id] = obj; @@ -37451,8 +39563,6 @@ return /******/ (function(modules) { // webpackBootstrap this.selectionObj.edges[obj.id] = obj; } } - }, { - key: "_addToHover", /** * Add object to the selection array. @@ -37460,6 +39570,8 @@ return /******/ (function(modules) { // webpackBootstrap * @param obj * @private */ + }, { + key: "_addToHover", value: function _addToHover(obj) { if (obj instanceof Node) { this.hoverObj.nodes[obj.id] = obj; @@ -37467,8 +39579,6 @@ return /******/ (function(modules) { // webpackBootstrap this.hoverObj.edges[obj.id] = obj; } } - }, { - key: "_removeFromSelection", /** * Remove a single option from selection. @@ -37476,21 +39586,22 @@ return /******/ (function(modules) { // webpackBootstrap * @param {Object} obj * @private */ + }, { + key: "_removeFromSelection", value: function _removeFromSelection(obj) { if (obj instanceof Node) { delete this.selectionObj.nodes[obj.id]; + this._unselectConnectedEdges(obj); } else { delete this.selectionObj.edges[obj.id]; } } - }, { - key: "unselectAll", /** * Unselect all. The selectionObj is useful for this. - * - * @private */ + }, { + key: "unselectAll", value: function unselectAll() { for (var nodeId in this.selectionObj.nodes) { if (this.selectionObj.nodes.hasOwnProperty(nodeId)) { @@ -37505,8 +39616,6 @@ return /******/ (function(modules) { // webpackBootstrap this.selectionObj = { nodes: {}, edges: {} }; } - }, { - key: "_getSelectedNodeCount", /** * return the number of selected nodes @@ -37514,6 +39623,8 @@ return /******/ (function(modules) { // webpackBootstrap * @returns {number} * @private */ + }, { + key: "_getSelectedNodeCount", value: function _getSelectedNodeCount() { var count = 0; for (var nodeId in this.selectionObj.nodes) { @@ -37523,8 +39634,6 @@ return /******/ (function(modules) { // webpackBootstrap } return count; } - }, { - key: "_getSelectedNode", /** * return the selected node @@ -37532,6 +39641,8 @@ return /******/ (function(modules) { // webpackBootstrap * @returns {number} * @private */ + }, { + key: "_getSelectedNode", value: function _getSelectedNode() { for (var nodeId in this.selectionObj.nodes) { if (this.selectionObj.nodes.hasOwnProperty(nodeId)) { @@ -37540,8 +39651,6 @@ return /******/ (function(modules) { // webpackBootstrap } return undefined; } - }, { - key: "_getSelectedEdge", /** * return the selected edge @@ -37549,6 +39658,8 @@ return /******/ (function(modules) { // webpackBootstrap * @returns {number} * @private */ + }, { + key: "_getSelectedEdge", value: function _getSelectedEdge() { for (var edgeId in this.selectionObj.edges) { if (this.selectionObj.edges.hasOwnProperty(edgeId)) { @@ -37557,8 +39668,6 @@ return /******/ (function(modules) { // webpackBootstrap } return undefined; } - }, { - key: "_getSelectedEdgeCount", /** * return the number of selected edges @@ -37566,6 +39675,8 @@ return /******/ (function(modules) { // webpackBootstrap * @returns {number} * @private */ + }, { + key: "_getSelectedEdgeCount", value: function _getSelectedEdgeCount() { var count = 0; for (var edgeId in this.selectionObj.edges) { @@ -37575,8 +39686,6 @@ return /******/ (function(modules) { // webpackBootstrap } return count; } - }, { - key: "_getSelectedObjectCount", /** * return the number of selected objects. @@ -37584,6 +39693,8 @@ return /******/ (function(modules) { // webpackBootstrap * @returns {number} * @private */ + }, { + key: "_getSelectedObjectCount", value: function _getSelectedObjectCount() { var count = 0; for (var nodeId in this.selectionObj.nodes) { @@ -37598,8 +39709,6 @@ return /******/ (function(modules) { // webpackBootstrap } return count; } - }, { - key: "_selectionIsEmpty", /** * Check if anything is selected @@ -37607,6 +39716,8 @@ return /******/ (function(modules) { // webpackBootstrap * @returns {boolean} * @private */ + }, { + key: "_selectionIsEmpty", value: function _selectionIsEmpty() { for (var nodeId in this.selectionObj.nodes) { if (this.selectionObj.nodes.hasOwnProperty(nodeId)) { @@ -37620,8 +39731,6 @@ return /******/ (function(modules) { // webpackBootstrap } return true; } - }, { - key: "_clusterInSelection", /** * check if one of the selected nodes is a cluster. @@ -37629,6 +39738,8 @@ return /******/ (function(modules) { // webpackBootstrap * @returns {boolean} * @private */ + }, { + key: "_clusterInSelection", value: function _clusterInSelection() { for (var nodeId in this.selectionObj.nodes) { if (this.selectionObj.nodes.hasOwnProperty(nodeId)) { @@ -37639,8 +39750,6 @@ return /******/ (function(modules) { // webpackBootstrap } return false; } - }, { - key: "_selectConnectedEdges", /** * select the edges connected to the node that is being selected @@ -37648,6 +39757,8 @@ return /******/ (function(modules) { // webpackBootstrap * @param {Node} node * @private */ + }, { + key: "_selectConnectedEdges", value: function _selectConnectedEdges(node) { for (var i = 0; i < node.edges.length; i++) { var edge = node.edges[i]; @@ -37655,8 +39766,6 @@ return /******/ (function(modules) { // webpackBootstrap this._addToSelection(edge); } } - }, { - key: "_hoverConnectedEdges", /** * select the edges connected to the node that is being selected @@ -37664,6 +39773,8 @@ return /******/ (function(modules) { // webpackBootstrap * @param {Node} node * @private */ + }, { + key: "_hoverConnectedEdges", value: function _hoverConnectedEdges(node) { for (var i = 0; i < node.edges.length; i++) { var edge = node.edges[i]; @@ -37671,8 +39782,6 @@ return /******/ (function(modules) { // webpackBootstrap this._addToHover(edge); } } - }, { - key: "_unselectConnectedEdges", /** * unselect the edges connected to the node that is being selected @@ -37680,6 +39789,8 @@ return /******/ (function(modules) { // webpackBootstrap * @param {Node} node * @private */ + }, { + key: "_unselectConnectedEdges", value: function _unselectConnectedEdges(node) { for (var i = 0; i < node.edges.length; i++) { var edge = node.edges[i]; @@ -37687,8 +39798,6 @@ return /******/ (function(modules) { // webpackBootstrap this._removeFromSelection(edge); } } - }, { - key: "blurObject", /** * This is called when someone clicks on a node. either select or deselect it. @@ -37697,6 +39806,8 @@ return /******/ (function(modules) { // webpackBootstrap * @param {Node || Edge} object * @private */ + }, { + key: "blurObject", value: function blurObject(object) { if (object.hover === true) { object.hover = false; @@ -37707,8 +39818,6 @@ return /******/ (function(modules) { // webpackBootstrap } } } - }, { - key: "hoverObject", /** * This is called when someone clicks on a node. either select or deselect it. @@ -37717,6 +39826,8 @@ return /******/ (function(modules) { // webpackBootstrap * @param {Node || Edge} object * @private */ + }, { + key: "hoverObject", value: function hoverObject(object) { var hoverChanged = false; // remove all node hover highlights @@ -37741,10 +39852,10 @@ return /******/ (function(modules) { // webpackBootstrap } // if the blur remains the same and the object is undefined (mouse off), we blur the edge else if (object === undefined) { - this.blurObject(this.hoverObj.edges[edgeId]); - delete this.hoverObj.edges[edgeId]; - hoverChanged = true; - } + this.blurObject(this.hoverObj.edges[edgeId]); + delete this.hoverObj.edges[edgeId]; + hoverChanged = true; + } } } @@ -37765,24 +39876,22 @@ return /******/ (function(modules) { // webpackBootstrap } if (hoverChanged === true) { - this.body.emitter.emit("_requestRedraw"); + this.body.emitter.emit('_requestRedraw'); } } - }, { - key: "getSelection", /** * * retrieve the currently selected objects * @return {{nodes: Array., edges: Array.}} selection */ + }, { + key: "getSelection", value: function getSelection() { var nodeIds = this.getSelectedNodes(); var edgeIds = this.getSelectedEdges(); return { nodes: nodeIds, edges: edgeIds }; } - }, { - key: "getSelectedNodes", /** * @@ -37790,19 +39899,19 @@ return /******/ (function(modules) { // webpackBootstrap * @return {String[]} selection An array with the ids of the * selected nodes. */ + }, { + key: "getSelectedNodes", value: function getSelectedNodes() { var idArray = []; if (this.options.selectable === true) { for (var nodeId in this.selectionObj.nodes) { if (this.selectionObj.nodes.hasOwnProperty(nodeId)) { - idArray.push(nodeId); + idArray.push(this.selectionObj.nodes[nodeId].id); } } } return idArray; } - }, { - key: "getSelectedEdges", /** * @@ -37810,19 +39919,64 @@ return /******/ (function(modules) { // webpackBootstrap * @return {Array} selection An array with the ids of the * selected nodes. */ + }, { + key: "getSelectedEdges", value: function getSelectedEdges() { var idArray = []; if (this.options.selectable === true) { for (var edgeId in this.selectionObj.edges) { if (this.selectionObj.edges.hasOwnProperty(edgeId)) { - idArray.push(edgeId); + idArray.push(this.selectionObj.edges[edgeId].id); } } } return idArray; } + + /** + * Updates the current selection + * @param {{nodes: Array., edges: Array.}} Selection + * @param {Object} options Options + */ }, { - key: "selectNodes", + key: "setSelection", + value: function setSelection(selection) { + var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; + + var i = undefined, + id = undefined; + + if (!selection || !selection.nodes && !selection.edges) throw 'Selection must be an object with nodes and/or edges properties'; + // first unselect any selected node, if option is true or undefined + if (options.unselectAll || options.unselectAll === undefined) { + this.unselectAll(); + } + if (selection.nodes) { + for (i = 0; i < selection.nodes.length; i++) { + id = selection.nodes[i]; + + var node = this.body.nodes[id]; + if (!node) { + throw new RangeError('Node with id "' + id + '" not found'); + } + // don't select edges with it + this.selectObject(node, options.highlightEdges); + } + } + + if (selection.edges) { + for (i = 0; i < selection.edges.length; i++) { + id = selection.edges[i]; + + var edge = this.body.edges[id]; + if (!edge) { + throw new RangeError('Edge with id "' + id + '" not found'); + } + this.selectObject(edge); + } + } + this.body.emitter.emit('_requestRedraw'); + } /** * select zero or more nodes with the option to highlight edges @@ -37830,63 +39984,35 @@ return /******/ (function(modules) { // webpackBootstrap * selected nodes. * @param {boolean} [highlightEdges] */ + }, { + key: "selectNodes", value: function selectNodes(selection) { var highlightEdges = arguments.length <= 1 || arguments[1] === undefined ? true : arguments[1]; - var i = undefined, - id = undefined; + if (!selection || selection.length === undefined) throw 'Selection must be an array with ids'; - if (!selection || selection.length === undefined) throw "Selection must be an array with ids"; - - // first unselect any selected node - this.unselectAll(); - - for (i = 0; i < selection.length; i++) { - id = selection[i]; - - var node = this.body.nodes[id]; - if (!node) { - throw new RangeError("Node with id \"" + id + "\" not found"); - } - this.selectObject(node, highlightEdges); - } - this.body.emitter.emit("_requestRedraw"); + this.setSelection({ nodes: selection }, { highlightEdges: highlightEdges }); } - }, { - key: "selectEdges", /** * select zero or more edges * @param {Number[] | String[]} selection An array with the ids of the * selected nodes. */ - value: function selectEdges(selection) { - var i = undefined, - id = undefined; - - if (!selection || selection.length === undefined) throw "Selection must be an array with ids"; - - // first unselect any selected objects - this.unselectAll(); - - for (i = 0; i < selection.length; i++) { - id = selection[i]; - - var edge = this.body.edges[id]; - if (!edge) { - throw new RangeError("Edge with id \"" + id + "\" not found"); - } - this.selectObject(edge); - } - this.body.emitter.emit("_requestRedraw"); - } }, { - key: "updateSelection", + key: "selectEdges", + value: function selectEdges(selection) { + if (!selection || selection.length === undefined) throw 'Selection must be an array with ids'; + + this.setSelection({ edges: selection }); + } /** * Validate the selection: remove ids of nodes which no longer exist * @private */ + }, { + key: "updateSelection", value: function updateSelection() { for (var nodeId in this.selectionObj.nodes) { if (this.selectionObj.nodes.hasOwnProperty(nodeId)) { @@ -37912,7 +40038,7 @@ return /******/ (function(modules) { // webpackBootstrap module.exports = exports["default"]; /***/ }, -/* 106 */ +/* 108 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; @@ -37921,11 +40047,19 @@ return /******/ (function(modules) { // webpackBootstrap value: true }); + var _slicedToArray = (function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i['return']) _i['return'](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError('Invalid attempt to destructure non-iterable instance'); } }; })(); + var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); + function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } + function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } - var util = __webpack_require__(7); + var _NetworkUtil = __webpack_require__(99); + + var _NetworkUtil2 = _interopRequireDefault(_NetworkUtil); + + var util = __webpack_require__(1); var LayoutEngine = (function () { function LayoutEngine(body) { @@ -37935,22 +40069,25 @@ return /******/ (function(modules) { // webpackBootstrap this.initialRandomSeed = Math.round(Math.random() * 1000000); this.randomSeed = this.initialRandomSeed; + this.setPhysics = false; this.options = {}; - this.optionsBackup = {}; + this.optionsBackup = { physics: {} }; this.defaultOptions = { randomSeed: undefined, + improvedLayout: true, hierarchical: { enabled: false, levelSeparation: 150, + nodeSpacing: 100, + treeSpacing: 200, + blockShifting: true, + edgeMinimization: true, direction: 'UD', // UD, DU, LR, RL sortMethod: 'hubsize' // hubsize, directed } }; util.extend(this.options, this.defaultOptions); - - this.hierarchicalLevels = {}; - this.bindEventListeners(); } @@ -37962,6 +40099,9 @@ return /******/ (function(modules) { // webpackBootstrap this.body.emitter.on('_dataChanged', function () { _this.setupHierarchicalLayout(); }); + this.body.emitter.on('_dataLoaded', function () { + _this.layoutNetwork(); + }); this.body.emitter.on('_resetHierarchicalLayout', function () { _this.setupHierarchicalLayout(); }); @@ -37971,7 +40111,7 @@ return /******/ (function(modules) { // webpackBootstrap value: function setOptions(options, allOptions) { if (options !== undefined) { var prevHierarchicalState = this.options.hierarchical.enabled; - + util.selectiveDeepExtend(["randomSeed", "improvedLayout"], this.options, options); util.mergeOptions(this.options, options, 'hierarchical'); if (options.randomSeed !== undefined) { this.initialRandomSeed = options.randomSeed; @@ -37980,10 +40120,10 @@ return /******/ (function(modules) { // webpackBootstrap if (this.options.hierarchical.enabled === true) { if (prevHierarchicalState === true) { // refresh the overridden options for nodes and edges. - this.body.emitter.emit('refresh'); + this.body.emitter.emit('refresh', true); } - // make sure the level seperation is the right way up + // make sure the level separation is the right way up if (this.options.hierarchical.direction === 'RL' || this.options.hierarchical.direction === 'DU') { if (this.options.hierarchical.levelSeparation > 0) { this.options.hierarchical.levelSeparation *= -1; @@ -37996,7 +40136,7 @@ return /******/ (function(modules) { // webpackBootstrap this.body.emitter.emit('_resetHierarchicalLayout'); // because the hierarchical system needs it's own physics and smooth curve settings, we adapt the other options if needed. - return this.adaptAllOptions(allOptions); + return this.adaptAllOptionsForHierarchicalLayout(allOptions); } else { if (prevHierarchicalState === true) { // refresh the overridden options for nodes and edges. @@ -38008,22 +40148,24 @@ return /******/ (function(modules) { // webpackBootstrap return allOptions; } }, { - key: 'adaptAllOptions', - value: function adaptAllOptions(allOptions) { + key: 'adaptAllOptionsForHierarchicalLayout', + value: function adaptAllOptionsForHierarchicalLayout(allOptions) { if (this.options.hierarchical.enabled === true) { // set the physics if (allOptions.physics === undefined || allOptions.physics === true) { - allOptions.physics = { solver: 'hierarchicalRepulsion' }; - this.optionsBackup.physics = { solver: 'barnesHut' }; + allOptions.physics = { + enabled: this.optionsBackup.physics.enabled === undefined ? true : this.optionsBackup.physics.enabled, + solver: 'hierarchicalRepulsion' + }; + this.optionsBackup.physics.enabled = this.optionsBackup.physics.enabled === undefined ? true : this.optionsBackup.physics.enabled; + this.optionsBackup.physics.solver = this.optionsBackup.physics.solver || 'barnesHut'; } else if (typeof allOptions.physics === 'object') { - this.optionsBackup.physics = { solver: 'barnesHut' }; - if (allOptions.physics.solver !== undefined) { - this.optionsBackup.physics = { solver: allOptions.physics.solver }; - } - allOptions.physics['solver'] = 'hierarchicalRepulsion'; + this.optionsBackup.physics.enabled = allOptions.physics.enabled === undefined ? true : allOptions.physics.enabled; + this.optionsBackup.physics.solver = allOptions.physics.solver || 'barnesHut'; + allOptions.physics.solver = 'hierarchicalRepulsion'; } else if (allOptions.physics !== false) { - this.optionsBackup.physics = { solver: 'barnesHut' }; - allOptions.physics['solver'] = 'hierarchicalRepulsion'; + this.optionsBackup.physics.solver = 'barnesHut'; + allOptions.physics = { solver: 'hierarchicalRepulsion' }; } // get the type of static smooth curve in case it is required @@ -38052,12 +40194,14 @@ return /******/ (function(modules) { // webpackBootstrap this.optionsBackup.edges = { smooth: allOptions.edges.smooth.enabled === undefined ? true : allOptions.edges.smooth.enabled, type: allOptions.edges.smooth.type === undefined ? 'dynamic' : allOptions.edges.smooth.type, - roundness: allOptions.edges.smooth.roundness === undefined ? 0.5 : allOptions.edges.smooth.roundness + roundness: allOptions.edges.smooth.roundness === undefined ? 0.5 : allOptions.edges.smooth.roundness, + forceDirection: allOptions.edges.smooth.forceDirection === undefined ? false : allOptions.edges.smooth.forceDirection }; allOptions.edges.smooth = { enabled: allOptions.edges.smooth.enabled === undefined ? true : allOptions.edges.smooth.enabled, type: type, - roundness: allOptions.edges.smooth.roundness === undefined ? 0.5 : allOptions.edges.smooth.roundness + roundness: allOptions.edges.smooth.roundness === undefined ? 0.5 : allOptions.edges.smooth.roundness, + forceDirection: allOptions.edges.smooth.forceDirection === undefined ? false : allOptions.edges.smooth.forceDirection }; } } @@ -38065,6 +40209,7 @@ return /******/ (function(modules) { // webpackBootstrap // force all edges into static smooth curves. Only applies to edges that do not use the global options for smooth. this.body.emitter.emit('_forceDisableDynamicCurves', type); } + return allOptions; } }, { @@ -38091,13 +40236,115 @@ return /******/ (function(modules) { // webpackBootstrap } } } + + /** + * Use Kamada Kawai to position nodes. This is quite a heavy algorithm so if there are a lot of nodes we + * cluster them first to reduce the amount. + */ + }, { + key: 'layoutNetwork', + value: function layoutNetwork() { + if (this.options.hierarchical.enabled !== true && this.options.improvedLayout === true) { + // first check if we should Kamada Kawai to layout. The threshold is if less than half of the visible + // nodes have predefined positions we use this. + var positionDefined = 0; + for (var i = 0; i < this.body.nodeIndices.length; i++) { + var node = this.body.nodes[this.body.nodeIndices[i]]; + if (node.predefinedPosition === true) { + positionDefined += 1; + } + } + + // if less than half of the nodes have a predefined position we continue + if (positionDefined < 0.5 * this.body.nodeIndices.length) { + var MAX_LEVELS = 10; + var level = 0; + var clusterThreshold = 100; + // if there are a lot of nodes, we cluster before we run the algorithm. + if (this.body.nodeIndices.length > clusterThreshold) { + var startLength = this.body.nodeIndices.length; + while (this.body.nodeIndices.length > clusterThreshold) { + //console.time("clustering") + level += 1; + var before = this.body.nodeIndices.length; + // if there are many nodes we do a hubsize cluster + if (level % 3 === 0) { + this.body.modules.clustering.clusterBridges(); + } else { + this.body.modules.clustering.clusterOutliers(); + } + var after = this.body.nodeIndices.length; + if (before == after && level % 3 !== 0 || level > MAX_LEVELS) { + this._declusterAll(); + this.body.emitter.emit("_layoutFailed"); + console.info("This network could not be positioned by this version of the improved layout algorithm. Please disable improvedLayout for better performance."); + return; + } + //console.timeEnd("clustering") + //console.log(level,after) + } + // increase the size of the edges + this.body.modules.kamadaKawai.setOptions({ springLength: Math.max(150, 2 * startLength) }); + } + + // position the system for these nodes and edges + this.body.modules.kamadaKawai.solve(this.body.nodeIndices, this.body.edgeIndices, true); + + // shift to center point + this._shiftToCenter(); + + // perturb the nodes a little bit to force the physics to kick in + var offset = 70; + for (var i = 0; i < this.body.nodeIndices.length; i++) { + this.body.nodes[this.body.nodeIndices[i]].x += (0.5 - this.seededRandom()) * offset; + this.body.nodes[this.body.nodeIndices[i]].y += (0.5 - this.seededRandom()) * offset; + } + + // uncluster all clusters + this._declusterAll(); + + // reposition all bezier nodes. + this.body.emitter.emit("_repositionBezierNodes"); + } + } + } + + /** + * Move all the nodes towards to the center so gravitational pull wil not move the nodes away from view + * @private + */ + }, { + key: '_shiftToCenter', + value: function _shiftToCenter() { + var range = _NetworkUtil2['default'].getRangeCore(this.body.nodes, this.body.nodeIndices); + var center = _NetworkUtil2['default'].findCenter(range); + for (var i = 0; i < this.body.nodeIndices.length; i++) { + this.body.nodes[this.body.nodeIndices[i]].x -= center.x; + this.body.nodes[this.body.nodeIndices[i]].y -= center.y; + } + } + }, { + key: '_declusterAll', + value: function _declusterAll() { + var clustersPresent = true; + while (clustersPresent === true) { + clustersPresent = false; + for (var i = 0; i < this.body.nodeIndices.length; i++) { + if (this.body.nodes[this.body.nodeIndices[i]].isCluster === true) { + clustersPresent = true; + this.body.modules.clustering.openCluster(this.body.nodeIndices[i], {}, false); + } + } + if (clustersPresent === true) { + this.body.emitter.emit('_dataChanged'); + } + } + } }, { key: 'getSeed', value: function getSeed() { return this.initialRandomSeed; } - }, { - key: 'setupHierarchicalLayout', /** * This is the main function to layout the nodes in a hierarchical way. @@ -38105,19 +40352,33 @@ return /******/ (function(modules) { // webpackBootstrap * * @private */ + }, { + key: 'setupHierarchicalLayout', value: function setupHierarchicalLayout() { if (this.options.hierarchical.enabled === true && this.body.nodeIndices.length > 0) { // get the size of the largest hubs and check if the user has defined a level for a node. var node = undefined, nodeId = undefined; var definedLevel = false; + var definedPositions = true; var undefinedLevel = false; this.hierarchicalLevels = {}; - this.nodeSpacing = 100; + this.lastNodeOnLevel = {}; + this.hierarchicalParents = {}; + this.hierarchicalChildren = {}; + this.hierarchicalTrees = {}; + this.treeIndex = -1; + + this.distributionOrdering = {}; + this.distributionIndex = {}; + this.distributionOrderingPresence = {}; for (nodeId in this.body.nodes) { if (this.body.nodes.hasOwnProperty(nodeId)) { node = this.body.nodes[nodeId]; + if (node.options.x === undefined && node.options.y === undefined) { + definedPositions = false; + } if (node.options.level !== undefined) { definedLevel = true; this.hierarchicalLevels[nodeId] = node.options.level; @@ -38132,28 +40393,551 @@ return /******/ (function(modules) { // webpackBootstrap throw new Error('To use the hierarchical layout, nodes require either no predefined levels or levels have to be defined for all nodes.'); return; } else { - // setup the system to use hierarchical method. - //this._changeConstants(); - - // define levels if undefined by the users. Based on hubsize + // define levels if undefined by the users. Based on hubsize. if (undefinedLevel === true) { if (this.options.hierarchical.sortMethod === 'hubsize') { this._determineLevelsByHubsize(); - } else if (this.options.hierarchical.sortMethod === 'directed' || 'direction') { + } else if (this.options.hierarchical.sortMethod === 'directed') { this._determineLevelsDirected(); + } else if (this.options.hierarchical.sortMethod === 'custom') { + this._determineLevelsCustomCallback(); } } + // fallback for cases where there are nodes but no edges + for (var _nodeId in this.body.nodes) { + if (this.body.nodes.hasOwnProperty(_nodeId)) { + if (this.hierarchicalLevels[_nodeId] === undefined) { + this.hierarchicalLevels[_nodeId] = 0; + } + } + } // check the distribution of the nodes per level. var distribution = this._getDistribution(); + // get the parent children relations. + this._generateMap(); + // place the nodes on the canvas. this._placeNodesByHierarchy(distribution); + + // condense the whitespace. + this._condenseHierarchy(); + + // shift to center so gravity does not have to do much + this._shiftToCenter(); } } } + + /** + * @private + */ }, { - key: '_placeNodesByHierarchy', + key: '_condenseHierarchy', + value: function _condenseHierarchy() { + var _this2 = this; + + // Global var in this scope to define when the movement has stopped. + var stillShifting = false; + var branches = {}; + // first we have some methods to help shifting trees around. + // the main method to shift the trees + var shiftTrees = function shiftTrees() { + var treeSizes = getTreeSizes(); + for (var i = 0; i < treeSizes.length - 1; i++) { + var diff = treeSizes[i].max - treeSizes[i + 1].min; + if (diff !== _this2.options.hierarchical.treeSpacing) { + shiftTree(i + 1, diff - _this2.options.hierarchical.treeSpacing); + } + } + }; + + // shift a single tree by an offset + var shiftTree = function shiftTree(index, offset) { + for (var nodeId in _this2.hierarchicalTrees) { + if (_this2.hierarchicalTrees.hasOwnProperty(nodeId)) { + if (_this2.hierarchicalTrees[nodeId] === index) { + _this2._setPositionForHierarchy(_this2.body.nodes[nodeId], offset, undefined, true); + } + } + } + }; + + // get the width of a tree + var getTreeSize = function getTreeSize(index) { + var min = 1e9; + var max = -1e9; + for (var nodeId in _this2.hierarchicalTrees) { + if (_this2.hierarchicalTrees.hasOwnProperty(nodeId)) { + if (_this2.hierarchicalTrees[nodeId] === index) { + var pos = _this2._getPositionForHierarchy(_this2.body.nodes[nodeId]); + min = Math.min(pos, min); + max = Math.max(pos, max); + } + } + } + return { min: min, max: max }; + }; + + // get the width of all trees + var getTreeSizes = function getTreeSizes() { + var treeWidths = []; + for (var i = 0; i < _this2.treeIndex; i++) { + treeWidths.push(getTreeSize(i)); + } + return treeWidths; + }; + + // get a map of all nodes in this branch + var getBranchNodes = function getBranchNodes(source, map) { + map[source.id] = true; + if (_this2.hierarchicalParents[source.id]) { + var children = _this2.hierarchicalParents[source.id].children; + if (children.length > 0) { + for (var i = 0; i < children.length; i++) { + getBranchNodes(_this2.body.nodes[children[i]], map); + } + } + } + }; + + // get a min max width as well as the maximum movement space it has on either sides + // we use min max terminology because width and height can interchange depending on the direction of the layout + var getBranchBoundary = function getBranchBoundary(branchMap) { + var maxLevel = arguments.length <= 1 || arguments[1] === undefined ? 1e9 : arguments[1]; + + var minSpace = 1e9; + var maxSpace = 1e9; + var min = 1e9; + var max = -1e9; + for (var branchNode in branchMap) { + if (branchMap.hasOwnProperty(branchNode)) { + var node = _this2.body.nodes[branchNode]; + var level = _this2.hierarchicalLevels[node.id]; + var position = _this2._getPositionForHierarchy(node); + + // get the space around the node. + + var _getSpaceAroundNode2 = _this2._getSpaceAroundNode(node, branchMap); + + var _getSpaceAroundNode22 = _slicedToArray(_getSpaceAroundNode2, 2); + + var minSpaceNode = _getSpaceAroundNode22[0]; + var maxSpaceNode = _getSpaceAroundNode22[1]; + + minSpace = Math.min(minSpaceNode, minSpace); + maxSpace = Math.min(maxSpaceNode, maxSpace); + + // the width is only relevant for the levels two nodes have in common. This is why we filter on this. + if (level <= maxLevel) { + min = Math.min(position, min); + max = Math.max(position, max); + } + } + } + + return [min, max, minSpace, maxSpace]; + }; + + // get the maximum level of a branch. + var getMaxLevel = function getMaxLevel(nodeId) { + var level = _this2.hierarchicalLevels[nodeId]; + if (_this2.hierarchicalParents[nodeId]) { + var children = _this2.hierarchicalParents[nodeId].children; + if (children.length > 0) { + for (var i = 0; i < children.length; i++) { + level = Math.max(level, getMaxLevel(children[i])); + } + } + } + return level; + }; + + // check what the maximum level is these nodes have in common. + var getCollisionLevel = function getCollisionLevel(node1, node2) { + var maxLevel1 = getMaxLevel(node1.id); + var maxLevel2 = getMaxLevel(node2.id); + return Math.min(maxLevel1, maxLevel2); + }; + + // check if two nodes have the same parent(s) + var hasSameParent = function hasSameParent(node1, node2) { + var parents1 = _this2.hierarchicalChildren[node1.id]; + var parents2 = _this2.hierarchicalChildren[node2.id]; + if (parents1 === undefined || parents2 === undefined) { + return false; + } + parents1 = parents1.parents; + parents2 = parents2.parents; + for (var i = 0; i < parents1.length; i++) { + for (var j = 0; j < parents2.length; j++) { + if (parents1[i] == parents2[j]) { + return true; + } + } + } + return false; + }; + + // condense elements. These can be nodes or branches depending on the callback. + var shiftElementsCloser = function shiftElementsCloser(callback, levels, centerParents) { + for (var i = 0; i < levels.length; i++) { + var level = levels[i]; + var levelNodes = _this2.distributionOrdering[level]; + if (levelNodes.length > 1) { + for (var j = 0; j < levelNodes.length - 1; j++) { + if (hasSameParent(levelNodes[j], levelNodes[j + 1]) === true) { + if (_this2.hierarchicalTrees[levelNodes[j].id] === _this2.hierarchicalTrees[levelNodes[j + 1].id]) { + callback(levelNodes[j], levelNodes[j + 1], centerParents); + } + } + } + } + } + }; + + // callback for shifting branches + var branchShiftCallback = function branchShiftCallback(node1, node2) { + var centerParent = arguments.length <= 2 || arguments[2] === undefined ? false : arguments[2]; + + //window.CALLBACKS.push(() => { + var pos1 = _this2._getPositionForHierarchy(node1); + var pos2 = _this2._getPositionForHierarchy(node2); + var diffAbs = Math.abs(pos2 - pos1); + //console.log("NOW CHEcKING:", node1.id, node2.id, diffAbs); + if (diffAbs > _this2.options.hierarchical.nodeSpacing) { + var branchNodes1 = {};branchNodes1[node1.id] = true; + var branchNodes2 = {};branchNodes2[node2.id] = true; + + getBranchNodes(node1, branchNodes1); + getBranchNodes(node2, branchNodes2); + + // check the largest distance between the branches + var maxLevel = getCollisionLevel(node1, node2); + + var _getBranchBoundary = getBranchBoundary(branchNodes1, maxLevel); + + var _getBranchBoundary2 = _slicedToArray(_getBranchBoundary, 4); + + var min1 = _getBranchBoundary2[0]; + var max1 = _getBranchBoundary2[1]; + var minSpace1 = _getBranchBoundary2[2]; + var maxSpace1 = _getBranchBoundary2[3]; + + var _getBranchBoundary3 = getBranchBoundary(branchNodes2, maxLevel); + + var _getBranchBoundary32 = _slicedToArray(_getBranchBoundary3, 4); + + var min2 = _getBranchBoundary32[0]; + var max2 = _getBranchBoundary32[1]; + var minSpace2 = _getBranchBoundary32[2]; + var maxSpace2 = _getBranchBoundary32[3]; + + //console.log(node1.id, getBranchBoundary(branchNodes1, maxLevel), node2.id, getBranchBoundary(branchNodes2, maxLevel), maxLevel); + var diffBranch = Math.abs(max1 - min2); + if (diffBranch > _this2.options.hierarchical.nodeSpacing) { + var offset = max1 - min2 + _this2.options.hierarchical.nodeSpacing; + if (offset < -minSpace2 + _this2.options.hierarchical.nodeSpacing) { + offset = -minSpace2 + _this2.options.hierarchical.nodeSpacing; + //console.log("RESETTING OFFSET", max1 - min2 + this.options.hierarchical.nodeSpacing, -minSpace2, offset); + } + if (offset < 0) { + //console.log("SHIFTING", node2.id, offset); + _this2._shiftBlock(node2.id, offset); + stillShifting = true; + + if (centerParent === true) _this2._centerParent(node2); + } + } + } + //this.body.emitter.emit("_redraw");}) + }; + + var minimizeEdgeLength = function minimizeEdgeLength(iterations, node) { + //window.CALLBACKS.push(() => { + // console.log("ts",node.id); + var nodeId = node.id; + var allEdges = node.edges; + var nodeLevel = _this2.hierarchicalLevels[node.id]; + + // gather constants + var C2 = _this2.options.hierarchical.levelSeparation * _this2.options.hierarchical.levelSeparation; + var referenceNodes = {}; + var aboveEdges = []; + for (var i = 0; i < allEdges.length; i++) { + var edge = allEdges[i]; + if (edge.toId != edge.fromId) { + var otherNode = edge.toId == nodeId ? edge.from : edge.to; + referenceNodes[allEdges[i].id] = otherNode; + if (_this2.hierarchicalLevels[otherNode.id] < nodeLevel) { + aboveEdges.push(edge); + } + } + } + + // differentiated sum of lengths based on only moving one node over one axis + var getFx = function getFx(point, edges) { + var sum = 0; + for (var i = 0; i < edges.length; i++) { + if (referenceNodes[edges[i].id] !== undefined) { + var a = _this2._getPositionForHierarchy(referenceNodes[edges[i].id]) - point; + sum += a / Math.sqrt(a * a + C2); + } + } + return sum; + }; + + // doubly differentiated sum of lengths based on only moving one node over one axis + var getDFx = function getDFx(point, edges) { + var sum = 0; + for (var i = 0; i < edges.length; i++) { + if (referenceNodes[edges[i].id] !== undefined) { + var a = _this2._getPositionForHierarchy(referenceNodes[edges[i].id]) - point; + sum -= C2 * Math.pow(a * a + C2, -1.5); + } + } + return sum; + }; + + var getGuess = function getGuess(iterations, edges) { + var guess = _this2._getPositionForHierarchy(node); + // Newton's method for optimization + var guessMap = {}; + for (var i = 0; i < iterations; i++) { + var fx = getFx(guess, edges); + var dfx = getDFx(guess, edges); + + // we limit the movement to avoid instability. + var limit = 40; + var ratio = Math.max(-limit, Math.min(limit, Math.round(fx / dfx))); + guess = guess - ratio; + // reduce duplicates + if (guessMap[guess] !== undefined) { + break; + } + guessMap[guess] = i; + } + return guess; + }; + + var moveBranch = function moveBranch(guess) { + // position node if there is space + var nodePosition = _this2._getPositionForHierarchy(node); + + // check movable area of the branch + if (branches[node.id] === undefined) { + var branchNodes = {}; + branchNodes[node.id] = true; + getBranchNodes(node, branchNodes); + branches[node.id] = branchNodes; + } + + var _getBranchBoundary4 = getBranchBoundary(branches[node.id]); + + var _getBranchBoundary42 = _slicedToArray(_getBranchBoundary4, 4); + + var minBranch = _getBranchBoundary42[0]; + var maxBranch = _getBranchBoundary42[1]; + var minSpaceBranch = _getBranchBoundary42[2]; + var maxSpaceBranch = _getBranchBoundary42[3]; + + var diff = guess - nodePosition; + + // check if we are allowed to move the node: + var branchOffset = 0; + if (diff > 0) { + branchOffset = Math.min(diff, maxSpaceBranch - _this2.options.hierarchical.nodeSpacing); + } else if (diff < 0) { + branchOffset = -Math.min(-diff, minSpaceBranch - _this2.options.hierarchical.nodeSpacing); + } + + if (branchOffset != 0) { + //console.log("moving branch:",branchOffset, maxSpaceBranch, minSpaceBranch) + _this2._shiftBlock(node.id, branchOffset); + //this.body.emitter.emit("_redraw"); + stillShifting = true; + } + }; + + var moveNode = function moveNode(guess) { + var nodePosition = _this2._getPositionForHierarchy(node); + + // position node if there is space + + var _getSpaceAroundNode3 = _this2._getSpaceAroundNode(node); + + var _getSpaceAroundNode32 = _slicedToArray(_getSpaceAroundNode3, 2); + + var minSpace = _getSpaceAroundNode32[0]; + var maxSpace = _getSpaceAroundNode32[1]; + + var diff = guess - nodePosition; + // check if we are allowed to move the node: + var newPosition = nodePosition; + if (diff > 0) { + newPosition = Math.min(nodePosition + (maxSpace - _this2.options.hierarchical.nodeSpacing), guess); + } else if (diff < 0) { + newPosition = Math.max(nodePosition - (minSpace - _this2.options.hierarchical.nodeSpacing), guess); + } + + if (newPosition !== nodePosition) { + //console.log("moving Node:",diff, minSpace, maxSpace) + _this2._setPositionForHierarchy(node, newPosition, undefined, true); + //this.body.emitter.emit("_redraw"); + stillShifting = true; + } + }; + + var guess = getGuess(iterations, aboveEdges); + moveBranch(guess); + guess = getGuess(iterations, allEdges); + moveNode(guess); + //}) + }; + + // method to remove whitespace between branches. Because we do bottom up, we can center the parents. + var minimizeEdgeLengthBottomUp = function minimizeEdgeLengthBottomUp(iterations) { + var levels = Object.keys(_this2.distributionOrdering); + levels = levels.reverse(); + for (var i = 0; i < iterations; i++) { + stillShifting = false; + for (var j = 0; j < levels.length; j++) { + var level = levels[j]; + var levelNodes = _this2.distributionOrdering[level]; + for (var k = 0; k < levelNodes.length; k++) { + minimizeEdgeLength(1000, levelNodes[k]); + } + } + if (stillShifting !== true) { + //console.log("FINISHED minimizeEdgeLengthBottomUp IN " + i); + break; + } + } + }; + + //// method to remove whitespace between branches. Because we do bottom up, we can center the parents. + var shiftBranchesCloserBottomUp = function shiftBranchesCloserBottomUp(iterations) { + var levels = Object.keys(_this2.distributionOrdering); + levels = levels.reverse(); + for (var i = 0; i < iterations; i++) { + stillShifting = false; + shiftElementsCloser(branchShiftCallback, levels, true); + if (stillShifting !== true) { + //console.log("FINISHED shiftBranchesCloserBottomUp IN " + (i+1)); + break; + } + } + }; + + // center all parents + var centerAllParents = function centerAllParents() { + for (var nodeId in _this2.body.nodes) { + if (_this2.body.nodes.hasOwnProperty(nodeId)) _this2._centerParent(_this2.body.nodes[nodeId]); + } + }; + + // the actual work is done here. + if (this.options.hierarchical.blockShifting === true) { + shiftBranchesCloserBottomUp(5); + centerAllParents(); + } + + // minimize edge length + if (this.options.hierarchical.edgeMinimization === true) { + minimizeEdgeLengthBottomUp(20); + } + + shiftTrees(); + } + + /** + * This gives the space around the node. IF a map is supplied, it will only check against nodes NOT in the map. + * This is used to only get the distances to nodes outside of a branch. + * @param node + * @param map + * @returns {*[]} + * @private + */ + }, { + key: '_getSpaceAroundNode', + value: function _getSpaceAroundNode(node, map) { + var useMap = true; + if (map === undefined) { + useMap = false; + } + var level = this.hierarchicalLevels[node.id]; + if (level !== undefined) { + var index = this.distributionIndex[node.id]; + var position = this._getPositionForHierarchy(node); + var minSpace = 1e9; + var maxSpace = 1e9; + if (index !== 0) { + var prevNode = this.distributionOrdering[level][index - 1]; + if (useMap === true && map[prevNode.id] === undefined || useMap === false) { + var prevPos = this._getPositionForHierarchy(prevNode); + minSpace = position - prevPos; + } + } + + if (index != this.distributionOrdering[level].length - 1) { + var nextNode = this.distributionOrdering[level][index + 1]; + if (useMap === true && map[nextNode.id] === undefined || useMap === false) { + var nextPos = this._getPositionForHierarchy(nextNode); + maxSpace = Math.min(maxSpace, nextPos - position); + } + } + + return [minSpace, maxSpace]; + } else { + return [0, 0]; + } + } + + /** + * We use this method to center a parent node and check if it does not cross other nodes when it does. + * @param node + * @private + */ + }, { + key: '_centerParent', + value: function _centerParent(node) { + if (this.hierarchicalChildren[node.id]) { + var parents = this.hierarchicalChildren[node.id].parents; + for (var i = 0; i < parents.length; i++) { + var parentId = parents[i]; + var parentNode = this.body.nodes[parentId]; + if (this.hierarchicalParents[parentId]) { + // get the range of the children + var minPos = 1e9; + var maxPos = -1e9; + var children = this.hierarchicalParents[parentId].children; + if (children.length > 0) { + for (var _i = 0; _i < children.length; _i++) { + var childNode = this.body.nodes[children[_i]]; + minPos = Math.min(minPos, this._getPositionForHierarchy(childNode)); + maxPos = Math.max(maxPos, this._getPositionForHierarchy(childNode)); + } + } + + var position = this._getPositionForHierarchy(parentNode); + + var _getSpaceAroundNode4 = this._getSpaceAroundNode(parentNode); + + var _getSpaceAroundNode42 = _slicedToArray(_getSpaceAroundNode4, 2); + + var minSpace = _getSpaceAroundNode42[0]; + var maxSpace = _getSpaceAroundNode42[1]; + + var newPosition = 0.5 * (minPos + maxPos); + var diff = position - newPosition; + if (diff < 0 && Math.abs(diff) < maxSpace - this.options.hierarchical.nodeSpacing || diff > 0 && Math.abs(diff) < minSpace - this.options.hierarchical.nodeSpacing) { + this._setPositionForHierarchy(parentNode, newPosition, undefined, true); + } + } + } + } + } /** * This function places the nodes on the canvas based on the hierarchial distribution. @@ -38161,39 +40945,44 @@ return /******/ (function(modules) { // webpackBootstrap * @param {Object} distribution | obtained by the function this._getDistribution() * @private */ + }, { + key: '_placeNodesByHierarchy', value: function _placeNodesByHierarchy(distribution) { - var nodeId = undefined, - node = undefined; this.positionedNodes = {}; // start placing all the level 0 nodes first. Then recursively position their branches. for (var level in distribution) { if (distribution.hasOwnProperty(level)) { - for (nodeId in distribution[level].nodes) { - if (distribution[level].nodes.hasOwnProperty(nodeId)) { + // sort nodes in level by position: + var nodeArray = Object.keys(distribution[level]); + nodeArray = this._indexArrayToNodes(nodeArray); + this._sortNodeArray(nodeArray); - node = distribution[level].nodes[nodeId]; - - if (this.options.hierarchical.direction === 'UD' || this.options.hierarchical.direction === 'DU') { - if (node.x === undefined) { - node.x = distribution[level].distance; - } - distribution[level].distance = node.x + this.nodeSpacing; - } else { - if (node.y === undefined) { - node.y = distribution[level].distance; - } - distribution[level].distance = node.y + this.nodeSpacing; - } - - this.positionedNodes[nodeId] = true; - this._placeBranchNodes(node.edges, node.id, distribution, level); + for (var i = 0; i < nodeArray.length; i++) { + var node = nodeArray[i]; + if (this.positionedNodes[node.id] === undefined) { + this._setPositionForHierarchy(node, this.options.hierarchical.nodeSpacing * i, level); + this.positionedNodes[node.id] = true; + this._placeBranchNodes(node.id, level); } } } } } + + /** + * Receives an array with node indices and returns an array with the actual node references. Used for sorting based on + * node properties. + * @param idArray + */ }, { - key: '_getDistribution', + key: '_indexArrayToNodes', + value: function _indexArrayToNodes(idArray) { + var array = []; + for (var i = 0; i < idArray.length; i++) { + array.push(this.body.nodes[idArray[i]]); + } + return array; + } /** * This function get the distribution of levels based on hubsize @@ -38201,6 +40990,8 @@ return /******/ (function(modules) { // webpackBootstrap * @returns {Object} * @private */ + }, { + key: '_getDistribution', value: function _getDistribution() { var distribution = {}; var nodeId = undefined, @@ -38220,16 +41011,13 @@ return /******/ (function(modules) { // webpackBootstrap node.options.fixed.x = true; } if (distribution[level] === undefined) { - distribution[level] = { amount: 0, nodes: {}, distance: 0 }; + distribution[level] = {}; } - distribution[level].amount += 1; - distribution[level].nodes[nodeId] = node; + distribution[level][nodeId] = node; } } return distribution; } - }, { - key: '_getHubSize', /** * Get the hubsize from all remaining unlevelled nodes. @@ -38237,6 +41025,8 @@ return /******/ (function(modules) { // webpackBootstrap * @returns {number} * @private */ + }, { + key: '_getHubSize', value: function _getHubSize() { var hubSize = 0; for (var nodeId in this.body.nodes) { @@ -38249,8 +41039,6 @@ return /******/ (function(modules) { // webpackBootstrap } return hubSize; } - }, { - key: '_determineLevelsByHubsize', /** * this function allocates nodes in levels based on the recursive branching from the largest hubs. @@ -38258,53 +41046,69 @@ return /******/ (function(modules) { // webpackBootstrap * @param hubsize * @private */ + }, { + key: '_determineLevelsByHubsize', value: function _determineLevelsByHubsize() { - var nodeId = undefined, - node = undefined; + var _this3 = this; + var hubSize = 1; + var levelDownstream = function levelDownstream(nodeA, nodeB) { + if (_this3.hierarchicalLevels[nodeB.id] === undefined) { + // set initial level + if (_this3.hierarchicalLevels[nodeA.id] === undefined) { + _this3.hierarchicalLevels[nodeA.id] = 0; + } + // set level + _this3.hierarchicalLevels[nodeB.id] = _this3.hierarchicalLevels[nodeA.id] + 1; + } + }; + while (hubSize > 0) { // determine hubs hubSize = this._getHubSize(); if (hubSize === 0) break; - for (nodeId in this.body.nodes) { + for (var nodeId in this.body.nodes) { if (this.body.nodes.hasOwnProperty(nodeId)) { - node = this.body.nodes[nodeId]; + var node = this.body.nodes[nodeId]; if (node.edges.length === hubSize) { - this._setLevelByHubsize(0, node); + this._crawlNetwork(levelDownstream, nodeId); } } } } } - }, { - key: '_setLevelByHubsize', /** - * this function is called recursively to enumerate the barnches of the largest hubs and give each node a level. - * - * @param level - * @param edges - * @param parentId + * TODO: release feature * @private */ - value: function _setLevelByHubsize(level, node) { - if (this.hierarchicalLevels[node.id] !== undefined) return; - - var childNode = undefined; - this.hierarchicalLevels[node.id] = level; - for (var i = 0; i < node.edges.length; i++) { - if (node.edges[i].toId === node.id) { - childNode = node.edges[i].from; - } else { - childNode = node.edges[i].to; - } - this._setLevelByHubsize(level + 1, childNode); - } - } }, { - key: '_determineLevelsDirected', + key: '_determineLevelsCustomCallback', + value: function _determineLevelsCustomCallback() { + var _this4 = this; + + var minLevel = 100000; + + // TODO: this should come from options. + var customCallback = function customCallback(nodeA, nodeB, edge) {}; + + var levelByDirection = function levelByDirection(nodeA, nodeB, edge) { + var levelA = _this4.hierarchicalLevels[nodeA.id]; + // set initial level + if (levelA === undefined) { + _this4.hierarchicalLevels[nodeA.id] = minLevel; + } + + var diff = customCallback(_NetworkUtil2['default'].cloneOptions(nodeA, 'node'), _NetworkUtil2['default'].cloneOptions(nodeB, 'node'), _NetworkUtil2['default'].cloneOptions(edge, 'edge')); + + _this4.hierarchicalLevels[nodeB.id] = _this4.hierarchicalLevels[nodeA.id] + diff; + }; + + this._crawlNetwork(levelByDirection); + this._setMinLevelToZero(); + } /** * this function allocates nodes in levels based on the direction of the edges @@ -38312,107 +41116,354 @@ return /******/ (function(modules) { // webpackBootstrap * @param hubsize * @private */ + }, { + key: '_determineLevelsDirected', value: function _determineLevelsDirected() { - var nodeId = undefined, - node = undefined; + var _this5 = this; + var minLevel = 10000; - - // set first node to source - for (nodeId in this.body.nodes) { - if (this.body.nodes.hasOwnProperty(nodeId)) { - node = this.body.nodes[nodeId]; - this._setLevelDirected(minLevel, node); + var levelByDirection = function levelByDirection(nodeA, nodeB, edge) { + var levelA = _this5.hierarchicalLevels[nodeA.id]; + // set initial level + if (levelA === undefined) { + _this5.hierarchicalLevels[nodeA.id] = minLevel; } - } + if (edge.toId == nodeB.id) { + _this5.hierarchicalLevels[nodeB.id] = _this5.hierarchicalLevels[nodeA.id] + 1; + } else { + _this5.hierarchicalLevels[nodeB.id] = _this5.hierarchicalLevels[nodeA.id] - 1; + } + }; + this._crawlNetwork(levelByDirection); + this._setMinLevelToZero(); + } + /** + * Small util method to set the minimum levels of the nodes to zero. + * @private + */ + }, { + key: '_setMinLevelToZero', + value: function _setMinLevelToZero() { + var minLevel = 1e9; // get the minimum level - for (nodeId in this.body.nodes) { + for (var nodeId in this.body.nodes) { if (this.body.nodes.hasOwnProperty(nodeId)) { - minLevel = this.hierarchicalLevels[nodeId] < minLevel ? this.hierarchicalLevels[nodeId] : minLevel; + if (this.hierarchicalLevels[nodeId] !== undefined) { + minLevel = Math.min(this.hierarchicalLevels[nodeId], minLevel); + } } } // subtract the minimum from the set so we have a range starting from 0 - for (nodeId in this.body.nodes) { + for (var nodeId in this.body.nodes) { if (this.body.nodes.hasOwnProperty(nodeId)) { - this.hierarchicalLevels[nodeId] -= minLevel; + if (this.hierarchicalLevels[nodeId] !== undefined) { + this.hierarchicalLevels[nodeId] -= minLevel; + } } } } - }, { - key: '_setLevelDirected', /** - * this function is called recursively to enumerate the branched of the first node and give each node a level based on edge direction - * - * @param level - * @param edges - * @param parentId + * Update the bookkeeping of parent and child. * @private */ - value: function _setLevelDirected(level, node) { - if (this.hierarchicalLevels[node.id] !== undefined) return; + }, { + key: '_generateMap', + value: function _generateMap() { + var _this6 = this; - var childNode = undefined; - this.hierarchicalLevels[node.id] = level; - - for (var i = 0; i < node.edges.length; i++) { - if (node.edges[i].toId === node.id) { - childNode = node.edges[i].from; - this._setLevelDirected(level - 1, childNode); - } else { - childNode = node.edges[i].to; - this._setLevelDirected(level + 1, childNode); + var fillInRelations = function fillInRelations(parentNode, childNode) { + if (_this6.hierarchicalLevels[childNode.id] > _this6.hierarchicalLevels[parentNode.id]) { + var parentNodeId = parentNode.id; + var childNodeId = childNode.id; + if (_this6.hierarchicalParents[parentNodeId] === undefined) { + _this6.hierarchicalParents[parentNodeId] = { children: [], amount: 0 }; + } + _this6.hierarchicalParents[parentNodeId].children.push(childNodeId); + if (_this6.hierarchicalChildren[childNodeId] === undefined) { + _this6.hierarchicalChildren[childNodeId] = { parents: [], amount: 0 }; + } + _this6.hierarchicalChildren[childNodeId].parents.push(parentNodeId); } + }; + + this._crawlNetwork(fillInRelations); + } + + /** + * Crawl over the entire network and use a callback on each node couple that is connected to each other. + * @param callback | will receive nodeA nodeB and the connecting edge. A and B are unique. + * @param startingNodeId + * @private + */ + }, { + key: '_crawlNetwork', + value: function _crawlNetwork(callback, startingNodeId) { + if (callback === undefined) callback = function () {}; + + var progress = {}; + var crawler = function crawler(node) { + if (progress[node.id] === undefined) { + progress[node.id] = true; + var childNode = undefined; + for (var i = 0; i < node.edges.length; i++) { + if (node.edges[i].connected === true) { + if (node.edges[i].toId === node.id) { + childNode = node.edges[i].from; + } else { + childNode = node.edges[i].to; + } + + if (node.id !== childNode.id) { + callback(node, childNode, node.edges[i]); + crawler(childNode); + } + } + } + } + }; + + // we can crawl from a specific node or over all nodes. + if (startingNodeId === undefined) { + for (var i = 0; i < this.body.nodeIndices.length; i++) { + var node = this.body.nodes[this.body.nodeIndices[i]]; + crawler(node); + } + } else { + var node = this.body.nodes[startingNodeId]; + if (node === undefined) { + console.error("Node not found:", startingNodeId); + return; + } + crawler(node); } } - }, { - key: '_placeBranchNodes', /** * This is a recursively called function to enumerate the branches from the largest hubs and place the nodes * on a X position that ensures there will be no overlap. * - * @param edges * @param parentId - * @param distribution * @param parentLevel * @private */ - value: function _placeBranchNodes(edges, parentId, distribution, parentLevel) { - for (var i = 0; i < edges.length; i++) { - var childNode = undefined; - var parentNode = undefined; - if (edges[i].toId === parentId) { - childNode = edges[i].from; - parentNode = edges[i].to; - } else { - childNode = edges[i].to; - parentNode = edges[i].from; - } + }, { + key: '_placeBranchNodes', + value: function _placeBranchNodes(parentId, parentLevel) { + // if this is not a parent, cancel the placing. This can happen with multiple parents to one child. + if (this.hierarchicalParents[parentId] === undefined) { + return; + } + + // get a list of childNodes + var childNodes = []; + for (var i = 0; i < this.hierarchicalParents[parentId].children.length; i++) { + childNodes.push(this.body.nodes[this.hierarchicalParents[parentId].children[i]]); + } + + // use the positions to order the nodes. + this._sortNodeArray(childNodes); + + // position the childNodes + for (var i = 0; i < childNodes.length; i++) { + var childNode = childNodes[i]; var childNodeLevel = this.hierarchicalLevels[childNode.id]; + // check if the child node is below the parent node and if it has already been positioned. + if (childNodeLevel > parentLevel && this.positionedNodes[childNode.id] === undefined) { + // get the amount of space required for this node. If parent the width is based on the amount of children. + var pos = undefined; - if (this.positionedNodes[childNode.id] === undefined) { - // if a node is conneceted to another node on the same level (or higher (means lower level))!, this is not handled here. - if (childNodeLevel > parentLevel) { - if (this.options.hierarchical.direction === 'UD' || this.options.hierarchical.direction === 'DU') { - if (childNode.x === undefined) { - childNode.x = Math.max(distribution[childNodeLevel].distance, parentNode.x); - } - distribution[childNodeLevel].distance = childNode.x + this.nodeSpacing; - this.positionedNodes[childNode.id] = true; - } else { - if (childNode.y === undefined) { - childNode.y = Math.max(distribution[childNodeLevel].distance, parentNode.y); - } - distribution[childNodeLevel].distance = childNode.y + this.nodeSpacing; - } - this.positionedNodes[childNode.id] = true; + // we get the X or Y values we need and store them in pos and previousPos. The get and set make sure we get X or Y + if (i === 0) { + pos = this._getPositionForHierarchy(this.body.nodes[parentId]); + } else { + pos = this._getPositionForHierarchy(childNodes[i - 1]) + this.options.hierarchical.nodeSpacing; + } + this._setPositionForHierarchy(childNode, pos, childNodeLevel); - if (childNode.edges.length > 1) { - this._placeBranchNodes(childNode.edges, childNode.id, distribution, childNodeLevel); + // if overlap has been detected, we shift the branch + if (this.lastNodeOnLevel[childNodeLevel] !== undefined) { + var previousPos = this._getPositionForHierarchy(this.body.nodes[this.lastNodeOnLevel[childNodeLevel]]); + if (pos - previousPos < this.options.hierarchical.nodeSpacing) { + var diff = previousPos + this.options.hierarchical.nodeSpacing - pos; + var sharedParent = this._findCommonParent(this.lastNodeOnLevel[childNodeLevel], childNode.id); + this._shiftBlock(sharedParent.withChild, diff); } } + + // store change in position. + this.lastNodeOnLevel[childNodeLevel] = childNode.id; + + this.positionedNodes[childNode.id] = true; + + this._placeBranchNodes(childNode.id, childNodeLevel); + } else { + return; + } + } + + // center the parent nodes. + var minPos = 1e9; + var maxPos = -1e9; + for (var i = 0; i < childNodes.length; i++) { + var childNodeId = childNodes[i].id; + minPos = Math.min(minPos, this._getPositionForHierarchy(this.body.nodes[childNodeId])); + maxPos = Math.max(maxPos, this._getPositionForHierarchy(this.body.nodes[childNodeId])); + } + this._setPositionForHierarchy(this.body.nodes[parentId], 0.5 * (minPos + maxPos), parentLevel); + } + + /** + * Shift a branch a certain distance + * @param parentId + * @param diff + * @private + */ + }, { + key: '_shiftBlock', + value: function _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.hierarchicalParents[parentId] !== undefined) { + for (var i = 0; i < this.hierarchicalParents[parentId].children.length; i++) { + this._shiftBlock(this.hierarchicalParents[parentId].children[i], diff); + } + } + } + + /** + * Find a common parent between branches. + * @param childA + * @param childB + * @returns {{foundParent, withChild}} + * @private + */ + }, { + key: '_findCommonParent', + value: function _findCommonParent(childA, childB) { + var _this7 = this; + + var parents = {}; + var iterateParents = function iterateParents(parents, child) { + if (_this7.hierarchicalChildren[child] !== undefined) { + for (var i = 0; i < _this7.hierarchicalChildren[child].parents.length; i++) { + var _parent = _this7.hierarchicalChildren[child].parents[i]; + parents[_parent] = true; + iterateParents(parents, _parent); + } + } + }; + var findParent = function findParent(parents, child) { + if (_this7.hierarchicalChildren[child] !== undefined) { + for (var i = 0; i < _this7.hierarchicalChildren[child].parents.length; i++) { + var _parent2 = _this7.hierarchicalChildren[child].parents[i]; + if (parents[_parent2] !== undefined) { + return { foundParent: _parent2, withChild: child }; + } + var branch = findParent(parents, _parent2); + if (branch.foundParent !== null) { + return branch; + } + } + } + return { foundParent: null, withChild: child }; + }; + + iterateParents(parents, childA); + return findParent(parents, childB); + } + + /** + * Abstract the getting of the position so we won't have to repeat the check for direction all the time + * @param node + * @param position + * @param level + * @private + */ + }, { + key: '_setPositionForHierarchy', + value: function _setPositionForHierarchy(node, position, level) { + var doNotUpdate = arguments.length <= 3 || arguments[3] === undefined ? false : arguments[3]; + + if (doNotUpdate !== true) { + if (this.distributionOrdering[level] === undefined) { + this.distributionOrdering[level] = []; + this.distributionOrderingPresence[level] = {}; + } + + if (this.distributionOrderingPresence[level][node.id] === undefined) { + this.distributionOrdering[level].push(node); + this.distributionIndex[node.id] = this.distributionOrdering[level].length - 1; + } + this.distributionOrderingPresence[level][node.id] = true; + + if (this.hierarchicalTrees[node.id] === undefined) { + if (this.hierarchicalChildren[node.id] !== undefined) { + var tree = 1; + // get the lowest tree denominator. + for (var i = 0; i < this.hierarchicalChildren[node.id].parents.length; i++) { + var parentId = this.hierarchicalChildren[node.id].parents[i]; + if (this.hierarchicalTrees[parentId] !== undefined) { + //tree = Math.min(tree,this.hierarchicalTrees[parentId]); + tree = this.hierarchicalTrees[parentId]; + } + } + //for (let i = 0; i < this.hierarchicalChildren.parents.length; i++) { + // let parentId = this.hierarchicalChildren.parents[i]; + // this.hierarchicalTrees[parentId] = tree; + //} + this.hierarchicalTrees[node.id] = tree; + } else { + this.hierarchicalTrees[node.id] = ++this.treeIndex; + } + } + } + + if (this.options.hierarchical.direction === 'UD' || this.options.hierarchical.direction === 'DU') { + node.x = position; + } else { + node.y = position; + } + } + + /** + * Abstract the getting of the position of a node so we do not have to repeat the direction check all the time. + * @param node + * @returns {number|*} + * @private + */ + }, { + key: '_getPositionForHierarchy', + value: function _getPositionForHierarchy(node) { + if (this.options.hierarchical.direction === 'UD' || this.options.hierarchical.direction === 'DU') { + return node.x; + } else { + return node.y; + } + } + + /** + * Use the x or y value to sort the array, allowing users to specify order. + * @param nodeArray + * @private + */ + }, { + key: '_sortNodeArray', + value: function _sortNodeArray(nodeArray) { + if (nodeArray.length > 1) { + if (this.options.hierarchical.direction === 'UD' || this.options.hierarchical.direction === 'DU') { + nodeArray.sort(function (a, b) { + return a.x - b.x; + }); + } else { + nodeArray.sort(function (a, b) { + return a.y - b.y; + }); } } } @@ -38425,7 +41476,7 @@ return /******/ (function(modules) { // webpackBootstrap module.exports = exports['default']; /***/ }, -/* 107 */ +/* 109 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; @@ -38438,9 +41489,9 @@ return /******/ (function(modules) { // webpackBootstrap function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } - var util = __webpack_require__(7); - var Hammer = __webpack_require__(3); - var hammerUtil = __webpack_require__(30); + var util = __webpack_require__(1); + var Hammer = __webpack_require__(20); + var hammerUtil = __webpack_require__(24); /** * clears the toolbar div element of children @@ -38500,13 +41551,13 @@ return /******/ (function(modules) { // webpackBootstrap this.body.emitter.on('_resetData', this._restore.bind(this)); } + /** + * If something changes in the data during editing, switch back to the initial datamanipulation state and close all edit modes. + * @private + */ + _createClass(ManipulationSystem, [{ key: '_restore', - - /** - * If something changes in the data during editing, switch back to the initial datamanipulation state and close all edit modes. - * @private - */ value: function _restore() { if (this.inMode !== false) { if (this.options.initiallyActive === true) { @@ -38516,13 +41567,13 @@ return /******/ (function(modules) { // webpackBootstrap } } } - }, { - key: 'setOptions', /** * Set the Options * @param options */ + }, { + key: 'setOptions', value: function setOptions(options, allOptions, globalOptions) { if (allOptions !== undefined) { if (allOptions.locale !== undefined) { @@ -38550,14 +41601,14 @@ return /******/ (function(modules) { // webpackBootstrap this._setup(); } } - }, { - key: 'toggleEditMode', /** * Enable or disable edit-mode. Draws the DOM required and cleans up after itself. * * @private */ + }, { + key: 'toggleEditMode', value: function toggleEditMode() { if (this.editMode === true) { this.disableEditMode(); @@ -38591,19 +41642,19 @@ return /******/ (function(modules) { // webpackBootstrap this._createEditButton(); } } - }, { - key: 'showManipulatorToolbar', /** * Creates the main toolbar. Removes functions bound to the select event. Binds all the buttons of the toolbar. * * @private */ + }, { + key: 'showManipulatorToolbar', value: function showManipulatorToolbar() { // restore the state of any bound functions or events, remove control nodes, restore physics this._clean(); - // reset global letiables + // reset global variables this.manipulationDOM = {}; // if the gui is enabled, draw all elements. @@ -38650,7 +41701,7 @@ return /******/ (function(modules) { // webpackBootstrap // remove buttons if (selectedTotalCount !== 0) { - if (selectedNodeCount === 1 && this.options.deleteNode !== false) { + if (selectedNodeCount > 0 && this.options.deleteNode !== false) { if (needSeperator === true) { this._createSeperator(4); } @@ -38673,14 +41724,12 @@ return /******/ (function(modules) { // webpackBootstrap // redraw to show any possible changes this.body.emitter.emit('_redraw'); } - }, { - key: 'addNodeMode', /** * Create the toolbar for adding Nodes - * - * @private */ + }, { + key: 'addNodeMode', value: function addNodeMode() { // when using the gui, enable edit mode if it wasnt already. if (this.editMode !== true) { @@ -38704,14 +41753,12 @@ return /******/ (function(modules) { // webpackBootstrap this._temporaryBindEvent('click', this._performAddNode.bind(this)); } - }, { - key: 'editNode', /** * call the bound function to handle the editing of the node. The node has to be selected. - * - * @private */ + }, { + key: 'editNode', value: function editNode() { var _this2 = this; @@ -38752,14 +41799,12 @@ return /******/ (function(modules) { // webpackBootstrap this.showManipulatorToolbar(); } } - }, { - key: 'addEdgeMode', /** * create the toolbar to connect nodes - * - * @private */ + }, { + key: 'addEdgeMode', value: function addEdgeMode() { // when using the gui, enable edit mode if it wasnt already. if (this.editMode !== true) { @@ -38790,18 +41835,16 @@ return /******/ (function(modules) { // webpackBootstrap this._temporaryBindUI('onDragStart', function () {}); this._temporaryBindUI('onHold', function () {}); } - }, { - key: 'editEdgeMode', /** * create the toolbar to edit edges - * - * @private */ + }, { + key: 'editEdgeMode', value: function editEdgeMode() { var _this3 = this; - // when using the gui, enable edit mode if it wasnt already. + // when using the gui, enable edit mode if it wasn't already. if (this.editMode !== true) { this.enableEditMode(); } @@ -38867,14 +41910,12 @@ return /******/ (function(modules) { // webpackBootstrap this.showManipulatorToolbar(); } } - }, { - key: 'deleteSelected', /** * delete everything in the selection - * - * @private */ + }, { + key: 'deleteSelected', value: function deleteSelected() { var _this4 = this; @@ -38932,8 +41973,6 @@ return /******/ (function(modules) { // webpackBootstrap this.showManipulatorToolbar(); } } - }, { - key: '_setup', //********************************************** PRIVATE ***************************************// @@ -38941,6 +41980,8 @@ return /******/ (function(modules) { // webpackBootstrap * draw or remove the DOM * @private */ + }, { + key: '_setup', value: function _setup() { if (this.options.enabled === true) { // Enable the GUI @@ -38959,13 +42000,13 @@ return /******/ (function(modules) { // webpackBootstrap this.guiEnabled = false; } } - }, { - key: '_createWrappers', /** * create the div overlays that contain the DOM * @private */ + }, { + key: '_createWrappers', value: function _createWrappers() { // load the manipulator HTML elements. All styling done in css. if (this.manipulationDiv === undefined) { @@ -38999,8 +42040,6 @@ return /******/ (function(modules) { // webpackBootstrap this.canvas.frame.appendChild(this.closeDiv); } } - }, { - key: '_getNewTargetNode', /** * generate a new target node. Used for creating new edges and editing edges @@ -39009,6 +42048,8 @@ return /******/ (function(modules) { // webpackBootstrap * @returns {*} * @private */ + }, { + key: '_getNewTargetNode', value: function _getNewTargetNode(x, y) { var controlNodeStyle = util.deepExtend({}, this.options.controlNodeStyle); @@ -39018,14 +42059,18 @@ return /******/ (function(modules) { // webpackBootstrap controlNodeStyle.x = x; controlNodeStyle.y = y; - return this.body.functions.createNode(controlNodeStyle); + // we have to define the bounding box in order for the nodes to be drawn immediately + var node = this.body.functions.createNode(controlNodeStyle); + node.shape.boundingBox = { left: x, right: x, top: y, bottom: y }; + + return node; } - }, { - key: '_createEditButton', /** * Create the edit button */ + }, { + key: '_createEditButton', value: function _createEditButton() { // restore everything to it's original state (if applicable) this._clean(); @@ -39044,13 +42089,13 @@ return /******/ (function(modules) { // webpackBootstrap // bind a hammer listener to the button, calling the function toggleEditMode. this._bindHammerToDiv(button, this.toggleEditMode.bind(this)); } - }, { - key: '_clean', /** * this function cleans up after everything this module does. Temporary elements, functions and events are removed, physics restored, hammers removed. * @private */ + }, { + key: '_clean', value: function _clean() { // not in mode this.inMode = false; @@ -39076,13 +42121,13 @@ return /******/ (function(modules) { // webpackBootstrap // restore the physics if required this.body.emitter.emit('restorePhysics'); } - }, { - key: '_cleanManipulatorHammers', /** * Each dom element has it's own hammer. They are stored in this.manipulationHammers. This cleans them up. * @private */ + }, { + key: '_cleanManipulatorHammers', value: function _cleanManipulatorHammers() { // _clean hammer bindings if (this.manipulationHammers.length != 0) { @@ -39092,13 +42137,13 @@ return /******/ (function(modules) { // webpackBootstrap this.manipulationHammers = []; } } - }, { - key: '_removeManipulationDOM', /** * Remove all DOM elements created by this module. * @private */ + }, { + key: '_removeManipulationDOM', value: function _removeManipulationDOM() { // removes all the bindings and overloads this._clean(); @@ -39116,7 +42161,7 @@ return /******/ (function(modules) { // webpackBootstrap this.canvas.frame.removeChild(this.editModeDiv); } if (this.closeDiv) { - this.canvas.frame.removeChild(this.manipulationDiv); + this.canvas.frame.removeChild(this.closeDiv); } // set the references to undefined @@ -39124,14 +42169,14 @@ return /******/ (function(modules) { // webpackBootstrap this.editModeDiv = undefined; this.closeDiv = undefined; } - }, { - key: '_createSeperator', /** * create a seperator line. the index is to differentiate in the manipulation dom * @param index * @private */ + }, { + key: '_createSeperator', value: function _createSeperator() { var index = arguments.length <= 0 || arguments[0] === undefined ? 1 : arguments[0]; @@ -39139,11 +42184,11 @@ return /******/ (function(modules) { // webpackBootstrap this.manipulationDOM['seperatorLineDiv' + index].className = 'vis-separator-line'; this.manipulationDiv.appendChild(this.manipulationDOM['seperatorLineDiv' + index]); } - }, { - key: '_createAddNodeButton', // ---------------------- DOM functions for buttons --------------------------// + }, { + key: '_createAddNodeButton', value: function _createAddNodeButton(locale) { var button = this._createButton('addNode', 'vis-button vis-add', locale['addNode'] || this.options.locales['en']['addNode']); this.manipulationDiv.appendChild(button); @@ -39202,8 +42247,6 @@ return /******/ (function(modules) { // webpackBootstrap value: function _createDescription(label) { this.manipulationDiv.appendChild(this._createButton('description', 'vis-button vis-none', label)); } - }, { - key: '_temporaryBindEvent', // -------------------------- End of DOM functions for buttons ------------------------------// @@ -39213,12 +42256,12 @@ return /******/ (function(modules) { // webpackBootstrap * @param newFunction * @private */ + }, { + key: '_temporaryBindEvent', value: function _temporaryBindEvent(event, newFunction) { this.temporaryEventFunctions.push({ event: event, boundFunction: newFunction }); this.body.emitter.on(event, newFunction); } - }, { - key: '_temporaryBindUI', /** * this overrides an UI function until cleanup by the clean function @@ -39226,6 +42269,8 @@ return /******/ (function(modules) { // webpackBootstrap * @param newFunction * @private */ + }, { + key: '_temporaryBindUI', value: function _temporaryBindUI(UIfunctionName, newFunction) { if (this.body.eventListeners[UIfunctionName] !== undefined) { this.temporaryUIFunctions[UIfunctionName] = this.body.eventListeners[UIfunctionName]; @@ -39234,14 +42279,14 @@ return /******/ (function(modules) { // webpackBootstrap throw new Error('This UI function does not exist. Typo? You tried: ' + UIfunctionName + ' possible are: ' + JSON.stringify(Object.keys(this.body.eventListeners))); } } - }, { - key: '_unbindTemporaryUIs', /** * Restore the overridden UI functions to their original state. * * @private */ + }, { + key: '_unbindTemporaryUIs', value: function _unbindTemporaryUIs() { for (var functionName in this.temporaryUIFunctions) { if (this.temporaryUIFunctions.hasOwnProperty(functionName)) { @@ -39251,13 +42296,13 @@ return /******/ (function(modules) { // webpackBootstrap } this.temporaryUIFunctions = {}; } - }, { - key: '_unbindTemporaryEvents', /** * Unbind the events created by _temporaryBindEvent * @private */ + }, { + key: '_unbindTemporaryEvents', value: function _unbindTemporaryEvents() { for (var i = 0; i < this.temporaryEventFunctions.length; i++) { var eventName = this.temporaryEventFunctions[i].event; @@ -39266,26 +42311,26 @@ return /******/ (function(modules) { // webpackBootstrap } this.temporaryEventFunctions = []; } - }, { - key: '_bindHammerToDiv', /** * Bind an hammer instance to a DOM element. * @param domElement * @param funct */ + }, { + key: '_bindHammerToDiv', value: function _bindHammerToDiv(domElement, boundFunction) { var hammer = new Hammer(domElement, {}); hammerUtil.onTouch(hammer, boundFunction); this.manipulationHammers.push(hammer); } - }, { - key: '_cleanupTemporaryNodesAndEdges', /** * Neatly clean up temporary edges and nodes * @private */ + }, { + key: '_cleanupTemporaryNodesAndEdges', value: function _cleanupTemporaryNodesAndEdges() { // _clean temporary edges for (var i = 0; i < this.temporaryIds.edges.length; i++) { @@ -39308,8 +42353,6 @@ return /******/ (function(modules) { // webpackBootstrap this.temporaryIds = { nodes: [], edges: [] }; } - }, { - key: '_controlNodeTouch', // ------------------------------------------ EDIT EDGE FUNCTIONS -----------------------------------------// @@ -39318,19 +42361,21 @@ return /******/ (function(modules) { // webpackBootstrap * @param event * @private */ + }, { + key: '_controlNodeTouch', value: function _controlNodeTouch(event) { this.selectionHandler.unselectAll(); this.lastTouch = this.body.functions.getPointer(event.center); this.lastTouch.translation = util.extend({}, this.body.view.translation); // copy the object } - }, { - key: '_controlNodeDragStart', /** * the drag start is used to mark one of the control nodes as selected. * @param event * @private */ + }, { + key: '_controlNodeDragStart', value: function _controlNodeDragStart(event) { var pointer = this.lastTouch; var pointerObj = this.selectionHandler._pointerToPositionObject(pointer); @@ -39352,14 +42397,14 @@ return /******/ (function(modules) { // webpackBootstrap this.body.emitter.emit('_redraw'); } - }, { - key: '_controlNodeDrag', /** * dragging the control nodes or the canvas * @param event * @private */ + }, { + key: '_controlNodeDrag', value: function _controlNodeDrag(event) { this.body.emitter.emit('disablePhysics'); var pointer = this.body.functions.getPointer(event.center); @@ -39376,19 +42421,24 @@ return /******/ (function(modules) { // webpackBootstrap } this.body.emitter.emit('_redraw'); } - }, { - key: '_controlNodeDragEnd', /** * connecting or restoring the control nodes. * @param event * @private */ + }, { + key: '_controlNodeDragEnd', value: function _controlNodeDragEnd(event) { var pointer = this.body.functions.getPointer(event.center); var pointerObj = this.selectionHandler._pointerToPositionObject(pointer); var edge = this.body.edges[this.edgeBeingEditedId]; + // if the node that was dragged is not a control node, return + if (this.selectedControlNode === undefined) { + return; + } + var overlappingNodeIds = this.selectionHandler._getAllNodesOverlappingWith(pointerObj); var node = undefined; for (var i = overlappingNodeIds.length - 1; i >= 0; i--) { @@ -39416,8 +42466,6 @@ return /******/ (function(modules) { // webpackBootstrap } this.body.emitter.emit('_redraw'); } - }, { - key: '_handleConnect', // ------------------------------------ END OF EDIT EDGE FUNCTIONS -----------------------------------------// @@ -39428,6 +42476,8 @@ return /******/ (function(modules) { // webpackBootstrap * * @private */ + }, { + key: '_handleConnect', value: function _handleConnect(event) { // check to avoid double fireing of this function. if (new Date().valueOf() - this.touchTime > 100) { @@ -39483,14 +42533,14 @@ return /******/ (function(modules) { // webpackBootstrap this.body.view.translation = { x: this.lastTouch.translation.x + diffX, y: this.lastTouch.translation.y + diffY }; } } - }, { - key: '_finishConnect', /** * Connect the new edge to the target if one exists, otherwise remove temp line * @param event * @private */ + }, { + key: '_finishConnect', value: function _finishConnect(event) { var pointer = this.body.functions.getPointer(event.center); var pointerObj = this.selectionHandler._pointerToPositionObject(pointer); @@ -39527,8 +42577,6 @@ return /******/ (function(modules) { // webpackBootstrap } this.body.emitter.emit('_redraw'); } - }, { - key: '_performAddNode', // --------------------------------------- END OF ADD EDGE FUNCTIONS -------------------------------------// @@ -39537,6 +42585,8 @@ return /******/ (function(modules) { // webpackBootstrap /** * Adds a node on the specified location */ + }, { + key: '_performAddNode', value: function _performAddNode(clickData) { var _this5 = this; @@ -39565,14 +42615,14 @@ return /******/ (function(modules) { // webpackBootstrap this.showManipulatorToolbar(); } } - }, { - key: '_performAddEdge', /** * connect two nodes with a new edge. * * @private */ + }, { + key: '_performAddEdge', value: function _performAddEdge(sourceNodeId, targetNodeId) { var _this6 = this; @@ -39596,14 +42646,14 @@ return /******/ (function(modules) { // webpackBootstrap this.showManipulatorToolbar(); } } - }, { - key: '_performEditEdge', /** * connect two nodes with a new edge. * * @private */ + }, { + key: '_performEditEdge', value: function _performEditEdge(sourceNodeId, targetNodeId) { var _this7 = this; @@ -39639,7 +42689,7 @@ return /******/ (function(modules) { // webpackBootstrap module.exports = exports['default']; /***/ }, -/* 108 */ +/* 110 */ /***/ function(module, exports) { /** @@ -39677,6 +42727,7 @@ return /******/ (function(modules) { // webpackBootstrap from: { enabled: { boolean: boolean }, scaleFactor: { number: number }, __type__: { object: object, boolean: boolean } }, __type__: { string: ['from', 'to', 'middle'], object: object } }, + arrowStrikethrough: { boolean: boolean }, color: { color: { string: string }, highlight: { string: string }, @@ -39720,6 +42771,7 @@ return /******/ (function(modules) { // webpackBootstrap selfReferenceSize: { number: number }, shadow: { enabled: { boolean: boolean }, + color: { string: string }, size: { number: number }, x: { number: number }, y: { number: number }, @@ -39727,8 +42779,9 @@ return /******/ (function(modules) { // webpackBootstrap }, smooth: { enabled: { boolean: boolean }, - type: { string: ['dynamic', 'continuous', 'discrete', 'diagonalCross', 'straightCross', 'horizontal', 'vertical', 'curvedCW', 'curvedCCW'] }, + type: { string: ['dynamic', 'continuous', 'discrete', 'diagonalCross', 'straightCross', 'horizontal', 'vertical', 'curvedCW', 'curvedCCW', 'cubicBezier'] }, roundness: { number: number }, + forceDirection: { string: ['horizontal', 'vertical', 'none'], boolean: boolean }, __type__: { object: object, boolean: boolean } }, title: { string: string, 'undefined': 'undefined' }, @@ -39764,9 +42817,14 @@ return /******/ (function(modules) { // webpackBootstrap }, layout: { randomSeed: { 'undefined': 'undefined', number: number }, + improvedLayout: { boolean: boolean }, hierarchical: { enabled: { boolean: boolean }, levelSeparation: { number: number }, + nodeSpacing: { number: number }, + treeSpacing: { number: number }, + blockShifting: { boolean: boolean }, + edgeMinimization: { boolean: boolean }, direction: { string: ['UD', 'DU', 'LR', 'RL'] }, // UD, DU, LR, RL sortMethod: { string: ['hubsize', 'directed'] }, // hubsize, directed __type__: { object: object, boolean: boolean } @@ -39850,6 +42908,7 @@ return /******/ (function(modules) { // webpackBootstrap }, shadow: { enabled: { boolean: boolean }, + color: { string: string }, size: { number: number }, x: { number: number }, y: { number: number }, @@ -39858,6 +42917,9 @@ return /******/ (function(modules) { // webpackBootstrap shape: { string: ['ellipse', 'circle', 'database', 'box', 'text', 'image', 'circularImage', 'diamond', 'dot', 'star', 'triangle', 'triangleDown', 'square', 'icon'] }, shapeProperties: { borderDashes: { boolean: boolean, array: array }, + borderRadius: { number: number }, + useImageSize: { boolean: boolean }, + useBorderWithImage: { boolean: boolean }, __type__: { object: object } }, size: { number: number }, @@ -39915,6 +42977,7 @@ return /******/ (function(modules) { // webpackBootstrap __type__: { object: object, boolean: boolean } }, timestep: { number: number }, + adaptiveTimestep: { boolean: boolean }, __type__: { object: object, boolean: boolean } }, @@ -39986,13 +43049,16 @@ return /******/ (function(modules) { // webpackBootstrap }, shadow: { enabled: false, + color: 'rgba(0,0,0,0.5)', size: [10, 0, 20, 1], x: [5, -30, 30, 1], y: [5, -30, 30, 1] }, shape: ['ellipse', 'box', 'circle', 'database', 'diamond', 'dot', 'square', 'star', 'text', 'triangle', 'triangleDown'], shapeProperties: { - borderDashes: false + borderDashes: false, + borderRadius: [6, 0, 20, 1], + useImageSize: false }, size: [25, 0, 200, 1] }, @@ -40002,6 +43068,7 @@ return /******/ (function(modules) { // webpackBootstrap middle: { enabled: false, scaleFactor: [1, 0, 3, 0.05] }, from: { enabled: false, scaleFactor: [1, 0, 3, 0.05] } }, + arrowStrikethrough: true, color: { color: ['color', '#848484'], highlight: ['color', '#848484'], @@ -40038,22 +43105,29 @@ return /******/ (function(modules) { // webpackBootstrap selfReferenceSize: [20, 0, 200, 1], shadow: { enabled: false, + color: 'rgba(0,0,0,0.5)', size: [10, 0, 20, 1], x: [5, -30, 30, 1], y: [5, -30, 30, 1] }, smooth: { enabled: true, - type: ['dynamic', 'continuous', 'discrete', 'diagonalCross', 'straightCross', 'horizontal', 'vertical', 'curvedCW', 'curvedCCW'], + type: ['dynamic', 'continuous', 'discrete', 'diagonalCross', 'straightCross', 'horizontal', 'vertical', 'curvedCW', 'curvedCCW', 'cubicBezier'], + forceDirection: ['horizontal', 'vertical', 'none'], roundness: [0.5, 0, 1, 0.05] }, width: [1, 0, 30, 1] }, layout: { //randomSeed: [0, 0, 500, 1], + //improvedLayout: true, hierarchical: { enabled: false, levelSeparation: [150, 20, 500, 5], + nodeSpacing: [100, 20, 500, 5], + treeSpacing: [200, 20, 500, 5], + blockShifting: true, + edgeMinimization: true, direction: ['UD', 'DU', 'LR', 'RL'], // UD, DU, LR, RL sortMethod: ['hubsize', 'directed'] // hubsize, directed } @@ -40120,6 +43194,7 @@ return /******/ (function(modules) { // webpackBootstrap solver: ['barnesHut', 'forceAtlas2Based', 'repulsion', 'hierarchicalRepulsion'], timestep: [0.5, 0.01, 1, 0.01] }, + //adaptiveTimestep: true global: { locale: ['en', 'nl'] } @@ -40129,7 +43204,363 @@ return /******/ (function(modules) { // webpackBootstrap exports.configureOptions = configureOptions; /***/ }, -/* 109 */ +/* 111 */ +/***/ function(module, exports, __webpack_require__) { + + // distance finding algorithm + "use strict"; + + Object.defineProperty(exports, "__esModule", { + value: true + }); + + var _slicedToArray = (function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; })(); + + var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); + + function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + + function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + + var _componentsAlgorithmsFloydWarshallJs = __webpack_require__(112); + + var _componentsAlgorithmsFloydWarshallJs2 = _interopRequireDefault(_componentsAlgorithmsFloydWarshallJs); + + /** + * KamadaKawai positions the nodes initially based on + * + * "AN ALGORITHM FOR DRAWING GENERAL UNDIRECTED GRAPHS" + * -- Tomihisa KAMADA and Satoru KAWAI in 1989 + * + * Possible optimizations in the distance calculation can be implemented. + */ + + var KamadaKawai = (function () { + function KamadaKawai(body, edgeLength, edgeStrength) { + _classCallCheck(this, KamadaKawai); + + this.body = body; + this.springLength = edgeLength; + this.springConstant = edgeStrength; + this.distanceSolver = new _componentsAlgorithmsFloydWarshallJs2["default"](); + } + + /** + * Not sure if needed but can be used to update the spring length and spring constant + * @param options + */ + + _createClass(KamadaKawai, [{ + key: "setOptions", + value: function setOptions(options) { + if (options) { + if (options.springLength) { + this.springLength = options.springLength; + } + if (options.springConstant) { + this.springConstant = options.springConstant; + } + } + } + + /** + * Position the system + * @param nodesArray + * @param edgesArray + */ + }, { + key: "solve", + value: function solve(nodesArray, edgesArray) { + var ignoreClusters = arguments.length <= 2 || arguments[2] === undefined ? false : arguments[2]; + + // get distance matrix + var D_matrix = this.distanceSolver.getDistances(this.body, nodesArray, edgesArray); // distance matrix + + // get the L Matrix + this._createL_matrix(D_matrix); + + // get the K Matrix + this._createK_matrix(D_matrix); + + // calculate positions + var threshold = 0.01; + var innerThreshold = 1; + var iterations = 0; + var maxIterations = Math.max(1000, Math.min(10 * this.body.nodeIndices.length, 6000)); + var maxInnerIterations = 5; + + var maxEnergy = 1e9; + var highE_nodeId = 0, + dE_dx = 0, + dE_dy = 0, + delta_m = 0, + subIterations = 0; + + while (maxEnergy > threshold && iterations < maxIterations) { + iterations += 1; + + var _getHighestEnergyNode2 = this._getHighestEnergyNode(ignoreClusters); + + var _getHighestEnergyNode22 = _slicedToArray(_getHighestEnergyNode2, 4); + + highE_nodeId = _getHighestEnergyNode22[0]; + maxEnergy = _getHighestEnergyNode22[1]; + dE_dx = _getHighestEnergyNode22[2]; + dE_dy = _getHighestEnergyNode22[3]; + + delta_m = maxEnergy; + subIterations = 0; + while (delta_m > innerThreshold && subIterations < maxInnerIterations) { + subIterations += 1; + this._moveNode(highE_nodeId, dE_dx, dE_dy); + + var _getEnergy2 = this._getEnergy(highE_nodeId); + + var _getEnergy22 = _slicedToArray(_getEnergy2, 3); + + delta_m = _getEnergy22[0]; + dE_dx = _getEnergy22[1]; + dE_dy = _getEnergy22[2]; + } + } + } + + /** + * get the node with the highest energy + * @returns {*[]} + * @private + */ + }, { + key: "_getHighestEnergyNode", + value: function _getHighestEnergyNode(ignoreClusters) { + var nodesArray = this.body.nodeIndices; + var nodes = this.body.nodes; + var maxEnergy = 0; + var maxEnergyNodeId = nodesArray[0]; + var dE_dx_max = 0, + dE_dy_max = 0; + + for (var nodeIdx = 0; nodeIdx < nodesArray.length; nodeIdx++) { + var m = nodesArray[nodeIdx]; + // by not evaluating nodes with predefined positions we should only move nodes that have no positions. + if (nodes[m].predefinedPosition === false || nodes[m].isCluster === true && ignoreClusters === true || nodes[m].options.fixed.x === true || nodes[m].options.fixed.y === true) { + var _getEnergy3 = this._getEnergy(m); + + var _getEnergy32 = _slicedToArray(_getEnergy3, 3); + + var delta_m = _getEnergy32[0]; + var dE_dx = _getEnergy32[1]; + var dE_dy = _getEnergy32[2]; + + if (maxEnergy < delta_m) { + maxEnergy = delta_m; + maxEnergyNodeId = m; + dE_dx_max = dE_dx; + dE_dy_max = dE_dy; + } + } + } + + return [maxEnergyNodeId, maxEnergy, dE_dx_max, dE_dy_max]; + } + + /** + * calculate the energy of a single node + * @param m + * @returns {*[]} + * @private + */ + }, { + key: "_getEnergy", + value: function _getEnergy(m) { + var nodesArray = this.body.nodeIndices; + var nodes = this.body.nodes; + + var x_m = nodes[m].x; + var y_m = nodes[m].y; + var dE_dx = 0; + var dE_dy = 0; + for (var iIdx = 0; iIdx < nodesArray.length; iIdx++) { + var i = nodesArray[iIdx]; + if (i !== m) { + var x_i = nodes[i].x; + var y_i = nodes[i].y; + var denominator = 1.0 / Math.sqrt(Math.pow(x_m - x_i, 2) + Math.pow(y_m - y_i, 2)); + dE_dx += this.K_matrix[m][i] * (x_m - x_i - this.L_matrix[m][i] * (x_m - x_i) * denominator); + dE_dy += this.K_matrix[m][i] * (y_m - y_i - this.L_matrix[m][i] * (y_m - y_i) * denominator); + } + } + + var delta_m = Math.sqrt(Math.pow(dE_dx, 2) + Math.pow(dE_dy, 2)); + return [delta_m, dE_dx, dE_dy]; + } + + /** + * move the node based on it's energy + * the dx and dy are calculated from the linear system proposed by Kamada and Kawai + * @param m + * @param dE_dx + * @param dE_dy + * @private + */ + }, { + key: "_moveNode", + value: function _moveNode(m, dE_dx, dE_dy) { + var nodesArray = this.body.nodeIndices; + var nodes = this.body.nodes; + var d2E_dx2 = 0; + var d2E_dxdy = 0; + var d2E_dy2 = 0; + + var x_m = nodes[m].x; + var y_m = nodes[m].y; + for (var iIdx = 0; iIdx < nodesArray.length; iIdx++) { + var i = nodesArray[iIdx]; + if (i !== m) { + var x_i = nodes[i].x; + var y_i = nodes[i].y; + var denominator = 1.0 / Math.pow(Math.pow(x_m - x_i, 2) + Math.pow(y_m - y_i, 2), 1.5); + d2E_dx2 += this.K_matrix[m][i] * (1 - this.L_matrix[m][i] * Math.pow(y_m - y_i, 2) * denominator); + d2E_dxdy += this.K_matrix[m][i] * (this.L_matrix[m][i] * (x_m - x_i) * (y_m - y_i) * denominator); + d2E_dy2 += this.K_matrix[m][i] * (1 - this.L_matrix[m][i] * Math.pow(x_m - x_i, 2) * denominator); + } + } + // make the variable names easier to make the solving of the linear system easier to read + var A = d2E_dx2, + B = d2E_dxdy, + C = dE_dx, + D = d2E_dy2, + E = dE_dy; + + // solve the linear system for dx and dy + var dy = (C / A + E / B) / (B / A - D / B); + var dx = -(B * dy + C) / A; + + // move the node + nodes[m].x += dx; + nodes[m].y += dy; + } + + /** + * Create the L matrix: edge length times shortest path + * @param D_matrix + * @private + */ + }, { + key: "_createL_matrix", + value: function _createL_matrix(D_matrix) { + var nodesArray = this.body.nodeIndices; + var edgeLength = this.springLength; + + this.L_matrix = []; + for (var i = 0; i < nodesArray.length; i++) { + this.L_matrix[nodesArray[i]] = {}; + for (var j = 0; j < nodesArray.length; j++) { + this.L_matrix[nodesArray[i]][nodesArray[j]] = edgeLength * D_matrix[nodesArray[i]][nodesArray[j]]; + } + } + } + + /** + * Create the K matrix: spring constants times shortest path + * @param D_matrix + * @private + */ + }, { + key: "_createK_matrix", + value: function _createK_matrix(D_matrix) { + var nodesArray = this.body.nodeIndices; + var edgeStrength = this.springConstant; + + this.K_matrix = []; + for (var i = 0; i < nodesArray.length; i++) { + this.K_matrix[nodesArray[i]] = {}; + for (var j = 0; j < nodesArray.length; j++) { + this.K_matrix[nodesArray[i]][nodesArray[j]] = edgeStrength * Math.pow(D_matrix[nodesArray[i]][nodesArray[j]], -2); + } + } + } + }]); + + return KamadaKawai; + })(); + + exports["default"] = KamadaKawai; + module.exports = exports["default"]; + +/***/ }, +/* 112 */ +/***/ function(module, exports) { + + /** + * Created by Alex on 10-Aug-15. + */ + + "use strict"; + + Object.defineProperty(exports, "__esModule", { + value: true + }); + + var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); + + function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + + var FloydWarshall = (function () { + function FloydWarshall() { + _classCallCheck(this, FloydWarshall); + } + + _createClass(FloydWarshall, [{ + key: "getDistances", + value: function getDistances(body, nodesArray, edgesArray) { + var D_matrix = {}; + var edges = body.edges; + + // prepare matrix with large numbers + for (var i = 0; i < nodesArray.length; i++) { + D_matrix[nodesArray[i]] = {}; + D_matrix[nodesArray[i]] = {}; + for (var j = 0; j < nodesArray.length; j++) { + D_matrix[nodesArray[i]][nodesArray[j]] = i == j ? 0 : 1e9; + D_matrix[nodesArray[i]][nodesArray[j]] = i == j ? 0 : 1e9; + } + } + + // put the weights for the edges in. This assumes unidirectionality. + for (var i = 0; i < edgesArray.length; i++) { + var edge = edges[edgesArray[i]]; + // edge has to be connected if it counts to the distances. If it is connected to inner clusters it will crash so we also check if it is in the D_matrix + if (edge.connected === true && D_matrix[edge.fromId] !== undefined && D_matrix[edge.toId] !== undefined) { + D_matrix[edge.fromId][edge.toId] = 1; + D_matrix[edge.toId][edge.fromId] = 1; + } + } + + var nodeCount = nodesArray.length; + + // Adapted FloydWarshall based on unidirectionality to greatly reduce complexity. + for (var k = 0; k < nodeCount; k++) { + for (var i = 0; i < nodeCount - 1; i++) { + for (var j = i + 1; j < nodeCount; j++) { + D_matrix[nodesArray[i]][nodesArray[j]] = Math.min(D_matrix[nodesArray[i]][nodesArray[j]], D_matrix[nodesArray[i]][nodesArray[k]] + D_matrix[nodesArray[k]][nodesArray[j]]); + D_matrix[nodesArray[j]][nodesArray[i]] = D_matrix[nodesArray[i]][nodesArray[j]]; + } + } + } + + return D_matrix; + } + }]); + + return FloydWarshall; + })(); + + exports["default"] = FloydWarshall; + module.exports = exports["default"]; + +/***/ }, +/* 113 */ /***/ function(module, exports) { /** @@ -40416,7 +43847,7 @@ return /******/ (function(modules) { // webpackBootstrap } /***/ }, -/* 110 */ +/* 114 */ /***/ function(module, exports) { /** @@ -40766,10 +44197,10 @@ return /******/ (function(modules) { // webpackBootstrap if (token === 'false') { token = false; // convert to boolean } else if (token === 'true') { - token = true; // convert to boolean - } else if (!isNaN(Number(token))) { - token = Number(token); // convert to number - } + token = true; // convert to boolean + } else if (!isNaN(Number(token))) { + token = Number(token); // convert to number + } tokenType = TOKENTYPE.IDENTIFIER; return; } @@ -40911,8 +44342,8 @@ return /******/ (function(modules) { // webpackBootstrap getToken(); // TODO: implement comma separated list with "a_list: ID=ID [','] [a_list] " } else { - parseNodeStatement(graph, id); - } + parseNodeStatement(graph, id); + } } /** @@ -41314,7 +44745,7 @@ return /******/ (function(modules) { // webpackBootstrap exports.DOTToGraph = DOTToGraph; /***/ }, -/* 111 */ +/* 115 */ /***/ function(module, exports) { 'use strict'; @@ -41353,6 +44784,11 @@ return /******/ (function(modules) { // webpackBootstrap edge['from'] = gEdge.source; edge['to'] = gEdge.target; edge['attributes'] = gEdge.attributes; + edge['label'] = gEdge.label; + edge['title'] = gEdge.attributes !== undefined ? gEdge.attributes.title : undefined; + if (gEdge['type'] === 'Directed') { + edge['arrows'] = 'to'; + } // edge['value'] = gEdge.attributes !== undefined ? gEdge.attributes.Weight : undefined; // edge['width'] = edge['value'] !== undefined ? undefined : edgegEdge.size; if (gEdge.color && options.inheritColor === false) { @@ -41370,6 +44806,7 @@ return /******/ (function(modules) { // webpackBootstrap node['x'] = gNode.x; node['y'] = gNode.y; node['label'] = gNode.label; + node['title'] = gNode.attributes !== undefined ? gNode.attributes.title : undefined; if (options.nodes.parseColor === true) { node['color'] = gNode.color; } else { @@ -41386,7 +44823,7 @@ return /******/ (function(modules) { // webpackBootstrap exports.parseGephi = parseGephi; /***/ }, -/* 112 */ +/* 116 */ /***/ function(module, exports) { /** @@ -41395,74 +44832,124 @@ return /******/ (function(modules) { // webpackBootstrap */ "use strict"; - function Images(callback) { - this.images = {}; - this.imageBroken = {}; - this.callback = callback; - } + Object.defineProperty(exports, "__esModule", { + value: true + }); - /** - * - * @param {string} url Url of the image - * @param {string} url Url of an image to use if the url image is not found - * @return {Image} img The image object - */ - Images.prototype.load = function (url, brokenUrl, id) { - var img = this.images[url]; // make a pointer - if (img === undefined) { - // create the image - var me = this; - img = new Image(); - img.onload = function () { - // IE11 fix -- thanks dponch! - if (this.width === 0) { - document.body.appendChild(this); - this.width = this.offsetWidth; - this.height = this.offsetHeight; - document.body.removeChild(this); - } + var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); - if (me.callback) { - me.images[url] = img; - me.callback(this); - } - }; + function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - img.onerror = function () { - if (brokenUrl === undefined) { - console.error("Could not load image:", url); - delete this.src; - if (me.callback) { - me.callback(this); + var Images = (function () { + function Images(callback) { + _classCallCheck(this, Images); + + this.images = {}; + this.imageBroken = {}; + this.callback = callback; + } + + /** + * @param {string} url The Url to cache the image as + * @return {Image} imageToLoadBrokenUrlOn The image object + */ + + _createClass(Images, [{ + key: "_addImageToCache", + value: function _addImageToCache(url, imageToCache) { + // IE11 fix -- thanks dponch! + if (imageToCache.width === 0) { + document.body.appendChild(imageToCache); + imageToCache.width = imageToCache.offsetWidth; + imageToCache.height = imageToCache.offsetHeight; + document.body.removeChild(imageToCache); + } + + this.images[url] = imageToCache; } - } else { - if (me.imageBroken[id] && me.imageBroken[id][url] === true) { - console.error("Could not load brokenImage:", brokenUrl); - delete this.src; - if (me.callback) { - me.callback(this); - } - } else { - console.error("Could not load image:", url); - this.src = brokenUrl; - if (me.imageBroken[id] === undefined) { - me.imageBroken[id] = {}; - } - me.imageBroken[id][url] = true; + + /** + * @param {string} url The original Url that failed to load, if the broken image is successfully loaded it will be added to the cache using this Url as the key so that subsequent requests for this Url will return the broken image + * @param {string} brokenUrl Url the broken image to try and load + * @return {Image} imageToLoadBrokenUrlOn The image object + */ + }, { + key: "_tryloadBrokenUrl", + value: function _tryloadBrokenUrl(url, brokenUrl, imageToLoadBrokenUrlOn) { + var _this = this; + + //If any of the parameters aren't specified then exit the function because nothing constructive can be done + if (url === undefined || brokenUrl === undefined || imageToLoadBrokenUrlOn === undefined) return; + + //Clear the old subscription to the error event and put a new in place that only handle errors in loading the brokenImageUrl + imageToLoadBrokenUrlOn.onerror = function () { + console.error("Could not load brokenImage:", brokenUrl); + //Add an empty image to the cache so that when subsequent load calls are made for the url we don't try load the image and broken image again + _this._addImageToCache(url, new Image()); + }; + + //Set the source of the image to the brokenUrl, this is actually what kicks off the loading of the broken image + imageToLoadBrokenUrlOn.src = brokenUrl; } - } - }; - img.src = url; - } + /** + * @return {Image} imageToRedrawWith The images that will be passed to the callback when it is invoked + */ + }, { + key: "_redrawWithImage", + value: function _redrawWithImage(imageToRedrawWith) { + if (this.callback) { + this.callback(imageToRedrawWith); + } + } - return img; - }; + /** + * @param {string} url Url of the image + * @param {string} brokenUrl Url of an image to use if the url image is not found + * @return {Image} img The image object + */ + }, { + key: "load", + value: function load(url, brokenUrl, id) { + var _this2 = this; - module.exports = Images; + //Try and get the image from the cache, if successful then return the cached image + var cachedImage = this.images[url]; + if (cachedImage) return cachedImage; + + //Create a new image + var img = new Image(); + + //Subscribe to the event that is raised if the image loads successfully + img.onload = function () { + //Add the image to the cache and then request a redraw + _this2._addImageToCache(url, img); + _this2._redrawWithImage(img); + }; + + //Subscribe to the event that is raised if the image fails to load + img.onerror = function () { + console.error("Could not load image:", url); + //Try and load the image specified by the brokenUrl using + _this2._tryloadBrokenUrl(url, brokenUrl, img); + }; + + //Set the source of the image to the url, this is actuall what kicks off the loading of the image + img.src = url; + + //Return the new image + return img; + } + }]); + + return Images; + })(); + + exports["default"] = Images; + module.exports = exports["default"]; /***/ }, -/* 113 */ +/* 117 */ /***/ function(module, exports) { // English @@ -41486,6 +44973,42 @@ return /******/ (function(modules) { // webpackBootstrap exports['en_EN'] = exports['en']; exports['en_US'] = exports['en']; + // German + exports['de'] = { + edit: 'Editieren', + del: 'Lösche Auswahl', + back: 'Zurück', + addNode: 'Knoten hinzufügen', + addEdge: 'Kante hinzufügen', + editNode: 'Knoten editieren', + editEdge: 'Kante editieren', + addDescription: 'Klicke auf eine freie Stelle, um einen neuen Knoten zu plazieren.', + edgeDescription: 'Klicke auf einen Knoten und ziehe die Kante zu einem anderen Knoten, um diese zu verbinden.', + editEdgeDescription: 'Klicke auf die Verbindungspunkte und ziehe diese auf einen Knoten, um sie zu verbinden.', + createEdgeError: 'Es ist nicht möglich, Kanten mit Clustern zu verbinden.', + deleteClusterError: 'Cluster können nicht gelöscht werden.', + editClusterError: 'Cluster können nicht editiert werden.' + }; + exports['de_DE'] = exports['de']; + + // Spanish + exports['es'] = { + edit: 'Editar', + del: 'Eliminar selección', + back: 'Átras', + addNode: 'Añadir nodo', + addEdge: 'Añadir arista', + editNode: 'Editar nodo', + editEdge: 'Editar arista', + addDescription: 'Haga clic en un lugar vacío para colocar un nuevo nodo.', + edgeDescription: 'Haga clic en un nodo y arrastre la arista hacia otro nodo para conectarlos.', + editEdgeDescription: 'Haga clic en un punto de control y arrastrelo a un nodo para conectarlo.', + createEdgeError: 'No se puede conectar una arista a un grupo.', + deleteClusterError: 'No es posible eliminar grupos.', + editClusterError: 'No es posible editar grupos.' + }; + exports['es_ES'] = exports['es']; + // Dutch exports['nl'] = { edit: 'Wijzigen', diff --git a/lib/vis/dist/vis.map b/lib/vis/dist/vis.map index 14ec4f94c4..83f7e60b1b 100644 --- a/lib/vis/dist/vis.map +++ b/lib/vis/dist/vis.map @@ -1 +1 @@ -{"version":3,"file":"vis.map","sources":["./dist/vis.js"],"names":["root","factory","exports","module","define","amd","this","modules","__webpack_require__","moduleId","installedModules","id","loaded","call","m","c","p","util","DOMutil","DataSet","DataView","Queue","Graph3d","graph3d","Camera","Filter","Point2d","Point3d","Slider","StepNumber","Timeline","Graph2d","timeline","DateUtil","DataStep","Range","stack","TimeStep","components","items","Item","BackgroundItem","BoxItem","PointItem","RangeItem","Component","CurrentTime","CustomTime","DataAxis","GraphGroup","Group","BackgroundGroup","ItemSet","Legend","LineGraph","TimeAxis","Network","network","Images","dotparser","gephiParser","allOptions","convertDot","input","DOTToGraph","convertGephi","options","parseGephi","Graph","Error","moment","hammer","Hammer","keycharm","data","conversion","props","dot","top","width","height","content","marginLeft","undefined","start","prototype","isVisible","range","interval","end","redraw","dom","point","document","createElement","className","appendChild","dirty","parent","parentNode","foreground","displayed","_updateContents","_updateTitle","_updateDataAttributes","_updateStyle","editable","updateTime","updateGroup","selected","offsetWidth","offsetHeight","style","left","_repaintDeleteButton","show","hide","removeChild","repositionX","toScreen","repositionY","orientation","item","getWidthLeft","getWidthRight","hasOwnProperty","select","unselect","setData","groupChanged","group","itemSet","_moveToGroup","setParent","anchor","remove","deleteButton","me","title","on","event","stopPropagation","removeFromDataSet","element","template","itemData","itemsData","get","changed","_contentToString","Element","innerHTML","type","removeAttribute","dataAttributes","length","attributes","Array","isArray","Object","keys","i","name","value","setAttribute","removeCssText","addCssText","outerHTML","window","propagating","preventDefault","__WEBPACK_AMD_DEFINE_FACTORY__","__WEBPACK_AMD_DEFINE_ARRAY__","__WEBPACK_AMD_DEFINE_RESULT__","apply","_firstTarget","split","events","match","propagatedHandler","srcEvent","_handled","stopped","firstTarget","elem","_handlers","_options","Manager","PropagatingHammer","o","create","extend","wrapper","pointerType","isFirst","target","handler","forEach","push","off","filter","h","emit","eventType","destroy","exportName","setTimeoutContext","fn","timeout","context","setTimeout","bindFn","invokeArrayArg","arg","each","obj","iterator","dest","src","merge","inherit","child","base","properties","childP","baseP","constructor","_super","arguments","boolOrFn","val","args","TYPE_FUNCTION","ifUndefined","val1","val2","addEventListeners","types","splitStr","addEventListener","removeEventListeners","removeEventListener","hasParent","node","inStr","str","find","indexOf","trim","inArray","findByKey","toArray","slice","uniqueArray","key","sort","results","values","a","b","prefixed","property","prefix","prop","camelProp","toUpperCase","VENDOR_PREFIXES","uniqueId","_uniqueId","getWindowForElement","doc","ownerDocument","defaultView","parentWindow","Input","manager","callback","self","inputTarget","domHandler","ev","enable","init","createInputInstance","Type","inputClass","SUPPORT_POINTER_EVENTS","PointerEventInput","SUPPORT_ONLY_TOUCH","TouchInput","SUPPORT_TOUCH","TouchMouseInput","MouseInput","inputHandler","pointersLen","pointers","changedPointersLen","changedPointers","INPUT_START","isFinal","INPUT_END","INPUT_CANCEL","session","computeInputData","recognize","prevInput","pointersLength","firstInput","simpleCloneInputData","firstMultiple","offsetCenter","center","getCenter","timeStamp","now","deltaTime","angle","getAngle","distance","getDistance","computeDeltaXY","offsetDirection","getDirection","deltaX","deltaY","scale","getScale","rotation","getRotation","computeIntervalInputData","offset","offsetDelta","prevDelta","x","y","velocity","velocityX","velocityY","direction","last","lastInterval","COMPUTE_INTERVAL","v","getVelocity","abs","clientX","round","clientY","DIRECTION_NONE","DIRECTION_LEFT","DIRECTION_RIGHT","DIRECTION_UP","DIRECTION_DOWN","p1","p2","PROPS_XY","Math","sqrt","atan2","PI","PROPS_CLIENT_XY","evEl","MOUSE_ELEMENT_EVENTS","evWin","MOUSE_WINDOW_EVENTS","allow","pressed","POINTER_ELEMENT_EVENTS","POINTER_WINDOW_EVENTS","store","pointerEvents","SingleTouchInput","evTarget","SINGLE_TOUCH_TARGET_EVENTS","SINGLE_TOUCH_WINDOW_EVENTS","started","normalizeSingleTouches","all","touches","changedTouches","concat","TOUCH_TARGET_EVENTS","targetIds","getTouches","allTouches","INPUT_MOVE","identifier","targetTouches","changedTargetTouches","touch","mouse","TouchAction","set","cleanTouchActions","actions","TOUCH_ACTION_NONE","hasPanX","TOUCH_ACTION_PAN_X","hasPanY","TOUCH_ACTION_PAN_Y","TOUCH_ACTION_MANIPULATION","TOUCH_ACTION_AUTO","Recognizer","defaults","state","STATE_POSSIBLE","simultaneous","requireFail","stateStr","STATE_CANCELLED","STATE_ENDED","STATE_CHANGED","STATE_BEGAN","directionStr","getRecognizerByNameIfManager","otherRecognizer","recognizer","AttrRecognizer","PanRecognizer","pX","pY","PinchRecognizer","PressRecognizer","_timer","_input","RotateRecognizer","SwipeRecognizer","TapRecognizer","pTime","pCenter","count","recognizers","preset","handlers","touchAction","toggleCssProps","add","recognizeWith","requireFailure","cssProps","triggerDomEvent","gestureEvent","createEvent","initEvent","gesture","dispatchEvent","TEST_ELEMENT","Date","MOBILE_REGEX","test","navigator","userAgent","INPUT_TYPE_TOUCH","INPUT_TYPE_PEN","INPUT_TYPE_MOUSE","INPUT_TYPE_KINECT","DIRECTION_HORIZONTAL","DIRECTION_VERTICAL","DIRECTION_ALL","MOUSE_INPUT_MAP","mousedown","mousemove","mouseup","button","which","POINTER_INPUT_MAP","pointerdown","pointermove","pointerup","pointercancel","pointerout","IE10_POINTER_TYPE_ENUM",2,3,4,5,"MSPointerEvent","removePointer","eventTypeNormalized","toLowerCase","replace","isTouch","storeIndex","pointerId","splice","SINGLE_TOUCH_INPUT_MAP","touchstart","touchmove","touchend","touchcancel","TOUCH_INPUT_MAP","inputEvent","inputData","isMouse","PREFIXED_TOUCH_ACTION","NATIVE_TOUCH_ACTION","TOUCH_ACTION_COMPUTE","compute","update","getTouchAction","join","preventDefaults","prevented","hasNone","preventSrc","STATE_RECOGNIZED","STATE_FAILED","dropRecognizeWith","dropRequireFailure","index","hasRequireFailures","canRecognizeWith","withState","tryEmit","canEmit","inputDataClone","process","reset","attrTest","optionPointers","isRecognized","isValid","threshold","directionTest","hasMoved","inOut","time","validPointers","validMovement","validTime","clearTimeout","taps","posThreshold","validTouchTime","failTimeout","validInterval","validMultiTap","tapCount","VERSION","domEvents","userSelect","touchSelect","touchCallout","contentZooming","userDrag","tapHighlightColor","STOP","FORCED_STOP","stop","force","curRecognizer","existing","Tap","Pan","Swipe","Pinch","Rotate","Press","__webpack_amd_options__","uuid","isNumber","object","Number","recursiveDOMDelete","DOMobject","hasChildNodes","firstChild","giveRange","min","max","total","isString","String","isDate","ASPDateRegex","exec","isNaN","parse","randomUUID","v4","assignAllKeys","fillIfDefined","allowDeletion","protoExtend","other","selectiveExtend","selectiveDeepExtend","TypeError","deepExtend","selectiveNotDeepExtend","equalArray","len","convert","Boolean","valueOf","isMoment","toDate","getType","toISOString","copyAndExtendArray","arr","newValue","newArr","copyArray","getAbsoluteLeft","getBoundingClientRect","getAbsoluteTop","addClassName","classes","removeClassName","array","updateProperty","action","listener","useCapture","attachEvent","detachEvent","returnValue","getTarget","srcElement","nodeType","e","option","asBoolean","defaultValue","asNumber","asString","asSize","asElement","hexToRGB","hex","shorthandRegex","r","g","result","parseInt","overrideOpacity","color","opacity","rgb","substr","RGBToHex","red","green","blue","toString","parseColor","isValidRGB","map","isValidHex","hsv","hexToHSV","lighterColorHSV","s","darkerColorHSV","darkerColorHex","HSVToHex","lighterColorHex","background","border","highlight","hover","RGBToHSV","minRGB","maxRGB","d","hue","saturation","cssUtil","cssText","styles","parts","currentStyles","newStyles","removeStyles","HSVToRGB","floor","f","q","t","isOk","isValidRGBA","rgba","selectiveBridgeObject","fields","referenceObject","objectTo","bridgeObject","mergeOptions","mergeTarget","enabled","binarySearchCustom","orderedItems","searchFunction","field","field2","maxIterations","iteration","low","high","middle","searchResult","binarySearchValue","sidePreference","prevValue","nextValue","easingFunctions","linear","easeInQuad","easeOutQuad","easeInOutQuad","easeInCubic","easeOutCubic","easeInOutCubic","easeInQuart","easeOutQuart","easeInOutQuart","easeInQuint","easeOutQuint","easeInOutQuint","global","utils_hooks__hooks","hookCallback","setHookCallback","res","hasOwnProp","create_utc__createUTC","format","locale","strict","createLocalOrUTC","utc","defaultParsingFlags","empty","unusedTokens","unusedInput","overflow","charsLeftOver","nullInput","invalidMonth","invalidFormat","userInvalidated","iso","getParsingFlags","_pf","valid__isValid","_isValid","flags","_d","getTime","_strict","bigHour","valid__createInvalid","NaN","copyConfig","to","from","_isAMomentObject","_i","_f","_l","_tzm","_isUTC","_offset","_locale","momentProperties","Moment","config","updateInProgress","updateOffset","toInt","argumentForCoercion","coercedNumber","isFinite","ceil","compareArrays","array1","array2","dontConvert","lengthDiff","diffs","Locale","normalizeLocale","chooseLocale","names","j","next","loadLocale","oldLocale","locales","globalLocale","_abbr","code","locale_locales__getSetGlobalLocale","locale_locales__getLocale","defineLocale","abbr","addUnitAlias","unit","shorthand","lowerCase","aliases","normalizeUnits","units","normalizeObjectUnits","inputObject","normalizedProp","normalizedInput","makeGetSet","keepTime","get_set__set","get_set__get","mom","getSet","zeroFill","number","targetLength","forceSign","output","sign","addFormatToken","token","padded","ordinal","func","formatTokenFunctions","localeData","removeFormattingTokens","makeFormatFunction","formattingTokens","Function","formatMoment","expandFormat","formatFunctions","invalidDate","replaceLongDateFormatTokens","longDateFormat","localFormattingTokens","lastIndex","addRegexToken","regex","strictRegex","regexes","isStrict","getParseRegexForToken","RegExp","unescapeFormat","matched","p3","p4","addParseToken","tokens","addWeekParseToken","_w","addTimeToArrayFromToken","_a","daysInMonth","year","month","UTC","getUTCDate","localeMonths","_months","localeMonthsShort","_monthsShort","localeMonthsParse","monthName","_monthsParse","_longMonthsParse","_shortMonthsParse","months","monthsShort","setMonth","dayOfMonth","monthsParse","date","getSetMonth","getDaysInMonth","checkOverflow","MONTH","DATE","YEAR","HOUR","MINUTE","SECOND","MILLISECOND","_overflowDayOfYear","warn","msg","suppressDeprecationWarnings","console","deprecate","firstTime","msgWithStack","deprecateSimple","deprecations","configFromISO","l","string","from_string__isoRegex","isoDates","isoTimes","matchOffset","configFromStringAndFormat","configFromString","aspNetJsonRegex","createFromInputFallback","createDate","M","ms","setFullYear","createUTCDate","setUTCFullYear","daysInYear","isLeapYear","getIsLeapYear","weekOfYear","firstDayOfWeek","firstDayOfWeekOfYear","adjustedMoment","daysToDayOfWeek","day","local__createLocal","week","dayOfYear","localeWeek","_week","dow","doy","localeFirstDayOfWeek","localeFirstDayOfYear","getSetWeek","getSetISOWeek","dayOfYearFromWeeks","weekday","daysToAdd","getUTCDay","getSetDayOfYear","clone","startOf","currentDateArray","_useUTC","getUTCFullYear","getUTCMonth","getFullYear","getMonth","getDate","configFromArray","currentDate","yearToUse","dayOfYearFromWeekInfo","_dayOfYear","_nextDay","setUTCMinutes","getUTCMinutes","w","weekYear","temp","GG","W","E","gg","ISO_8601","parsedInput","skipped","stringLength","totalParsedInputLength","meridiemFixWrap","_meridiem","hour","meridiem","isPm","meridiemHour","isPM","configFromStringAndArray","tempConfig","bestMoment","scoreToBeat","currentScore","score","configFromObject","minute","second","millisecond","createFromConfig","preparse","configFromInput","isUTC","pickBy","moments","Duration","duration","years","quarters","quarter","weeks","days","hours","minutes","seconds","milliseconds","_milliseconds","_days","_data","_bubble","isDuration","separator","utcOffset","offsetFromString","matches","chunk","chunkOffset","cloneWithOffset","model","diff","setTime","local","getDateOffset","getTimezoneOffset","getSetOffset","keepLocalTime","localAdjust","_changeInProgress","add_subtract__addSubtract","create__createDuration","getSetZone","setOffsetToUTC","setOffsetToLocal","subtract","setOffsetToParsedOffset","hasAlignedHourOffset","isDaylightSavingTime","isDaylightSavingTimeShifted","isLocal","isUtcOffset","isUtc","ret","diffRes","aspNetRegex","create__isoRegex","parseIso","momentsDifference","inp","parseFloat","positiveMomentsDifference","isAfter","isBefore","createAdder","period","dur","tmp","isAdding","moment_calendar__calendar","sod","calendar","inputMs","endOf","isBetween","isSame","absFloor","asFloat","delta","that","zoneDelta","monthDiff","anchor2","adjust","wholeMonthDiff","moment_format__toISOString","inputString","defaultFormat","postformat","withoutSuffix","humanize","fromNow","toNow","newLocaleData","isoWeekday","to_type__valueOf","unix","moment_valid__isValid","parsingFlags","invalidAt","addWeekYearFormatToken","getter","weeksInYear","getSetWeekYear","getSetISOWeekYear","getISOWeeksInYear","getWeeksInYear","weekInfo","getSetQuarter","parseWeekday","weekdaysParse","localeWeekdays","_weekdays","localeWeekdaysShort","_weekdaysShort","localeWeekdaysMin","_weekdaysMin","localeWeekdaysParse","weekdayName","_weekdaysParse","weekdays","weekdaysShort","weekdaysMin","getSetDayOfWeek","getDay","getSetLocaleDayOfWeek","getSetISODayOfWeek","lowercase","matchMeridiem","_meridiemParse","localeIsPM","charAt","localeMeridiem","isLower","millisecond__milliseconds","getZoneAbbr","getZoneName","moment__createUnix","moment__createInZone","parseZone","locale_calendar__calendar","_calendar","_longDateFormat","_invalidDate","_ordinal","preParsePostFormat","relative__relativeTime","isFuture","_relativeTime","pastFuture","locale_set__set","_ordinalParseLenient","_ordinalParse","source","lists__get","setter","list","out","lists__listMonths","lists__listMonthsShort","lists__listWeekdays","lists__listWeekdaysShort","lists__listWeekdaysMin","duration_abs__abs","mathAbs","duration_add_subtract__addSubtract","duration_add_subtract__add","duration_add_subtract__subtract","bubble","daysToYears","yearsToDays","as","duration_as__valueOf","makeAs","alias","duration_get__get","makeGetter","substituteTimeAgo","relativeTime","duration_humanize__relativeTime","posNegDuration","thresholds","duration_humanize__getSetRelativeTimeThreshold","limit","withSuffix","iso_string__toISOString","Y","iso_string__abs","D","asSeconds","match1","match2","match3","match4","match6","match1to2","match1to3","match1to4","match1to6","matchUnsigned","matchSigned","matchTimestamp","matchWord","defaultLocaleMonths","defaultLocaleMonthsShort","parseTwoDigitYear","getSetYear","defaultLocaleWeek","prototypeMin","prototypeMax","add_subtract__add","add_subtract__subtract","lang","isoWeekYear","getSetDayOfMonth","invalidWeekday","defaultLocaleWeekdays","defaultLocaleWeekdaysShort","defaultLocaleWeekdaysMin","_isPm","defaultLocaleMeridiemParse","getSetHour","getSetMinute","getSetSecond","getSetMillisecond","momentPrototype__proto","toJSON","isoWeek","isoWeeks","isoWeeksInYear","isDST","isDSTShifted","zoneAbbr","zoneName","dates","zone","momentPrototype","defaultCalendar","sameDay","nextDay","nextWeek","lastDay","lastWeek","sameElse","defaultLongDateFormat","LTS","LT","L","LL","LLL","LLLL","defaultInvalidDate","defaultOrdinal","defaultOrdinalParse","defaultRelativeTime","future","past","mm","hh","dd","MM","yy","prototype__proto","firstDayOfYear","ordinalParse","langData","asMilliseconds","asMinutes","asHours","asDays","asWeeks","asMonths","asYears","duration_get__milliseconds","duration_prototype__proto","toIsoString","version","invalid","relativeTimeThreshold","_moment","webpackPolyfill","paths","children","webpackContext","req","resolve","buf","ii","oct","_hexToByte","unparse","bth","_byteToHex","v1","clockseq","_clockseq","msecs","nsecs","_lastNSecs","dt","_lastMSecs","tl","tmh","_nodeId","n","rnds","random","rng","_rng","globalVar","crypto","getRandomValues","_rnds8","Uint8Array","_rnds","_seedBytes","prepareElements","JSONcontainer","elementType","redundant","used","cleanupElements","getSVGElement","svgContainer","shift","createElementNS","getDOMElement","DOMContainer","insertBefore","drawPoint","groupTemplate","labelObj","setAttributeNS","size","label","xOffset","yOffset","textContent","drawBar","rect","_fieldId","fieldId","_type","_subscribers","setOptions","queue","_queue","subscribers","subscribe","unsubscribe","_trigger","params","senderId","subscriber","addedIds","_addItem","updatedIds","updatedData","addOrUpdate","_updateItem","ids","firstType","returnType","allowedValues","itemId","_getItem","order","_sort","_filterFields","getIds","getDataSet","mappedItems","filteredItem","av","bv","removedId","removedIds","_remove","clear","maxField","itemField","minField","distinct","fieldType","exists","raw","converted","JSON","stringify","delay","Infinity","_timeout","_extended","_flushIfNeeded","flush","methods","original","method","entry","_ids","_onEvent","refresh","newIds","added","removed","viewOptions","getArguments","defaultFilter","dataSet","updated","container","SyntaxError","containerElement","margin","defaultXCenter","defaultYCenter","xLabel","yLabel","zLabel","passValueFn","xValueLabel","yValueLabel","zValueLabel","filterLabel","legendLabel","STYLE","DOT","showPerspective","showGrid","keepAspectRatio","showShadow","showGrayBottom","showTooltip","verticalRatio","animationInterval","animationPreload","camera","setArmRotation","setArmLength","eye","dataTable","dataPoints","colX","colY","colZ","colValue","colFilter","xMin","xStep","xMax","yMin","yStep","yMax","zMin","zStep","zMax","valueMin","valueMax","xBarWidth","yBarWidth","axisColor","gridColor","dataColor","fill","stroke","strokeWidth","getMouseX","getMouseY","Emitter","_setScale","z","xCenter","yCenter","zCenter","setArmLocation","_convert3Dto2D","point3d","translation","_convertPointToTranslation","_convertTranslationToScreen","ax","ay","az","cx","getCameraLocation","cy","cz","sinTx","sin","getCameraRotation","cosTx","cos","sinTy","cosTy","sinTz","cosTz","dx","dy","dz","bx","by","ex","ey","ez","getArmLength","xcenter","frame","canvas","clientWidth","ycenter","_setBackgroundColor","backgroundColor","borderColor","borderWidth","borderStyle","BAR","BARCOLOR","BARSIZE","DOTLINE","DOTCOLOR","DOTSIZE","GRID","LINE","SURFACE","_getStyleNumber","styleName","_determineColumnIndexes","getNumberOfColumns","getNumberOfRows","counter","column","getDistinctValues","distinctValues","getColumnRange","minMax","_dataInitialize","rawData","_onChange","dataFilter","setOnLoadCallback","withBars","defaultXBarWidth","dataX","defaultYBarWidth","dataY","xRange","defaultXMin","defaultXMax","defaultXStep","yRange","defaultYMin","defaultYMax","defaultYStep","zRange","defaultZMin","defaultZMax","defaultZStep","valueRange","defaultValueMin","defaultValueMax","_getDataPoints","sortNumber","dataMatrix","xIndex","yIndex","trans","screen","bottom","pointRight","pointTop","pointCross","position","noCanvas","fontWeight","padding","onmousedown","_onMouseDown","ontouchstart","_onTouchStart","onmousewheel","_onWheel","ontooltip","_onTooltip","onkeydown","setSize","_resizeCanvas","clientHeight","animationStart","slider","play","animationStop","_resizeCenter","setCameraPosition","pos","horizontal","vertical","getCameraPosition","getArmRotation","_readData","_redrawFilter","animationAutoStart","cameraPosition","styleNumber","tooltip","showAnimationControls","_redrawSlider","_redrawClear","_redrawAxis","_redrawDataGrid","_redrawDataLine","_redrawDataBar","_redrawDataDot","_redrawInfo","_redrawLegend","ctx","getContext","clearRect","widthMin","widthMax","dotSize","right","lineWidth","font","ymin","ymax","_hsv2rgb","strokeStyle","beginPath","moveTo","lineTo","strokeRect","fillStyle","closePath","gridLineLen","step","getCurrent","textAlign","textBaseline","fillText","visible","setValues","setPlayInterval","onchange","getIndex","selectValue","setOnChangeCallback","lineStyle","getLabel","getSelectedValue","prettyStep","text","xText","yText","zText","xMin2d","xMax2d","gridLenX","gridLenY","textMargin","armAngle","H","S","V","R","G","B","C","Hi","X","cross","topSideVisible","zAvg","lineJoin","lineCap","transBottom","dist","sortDepth","aDiff","bDiff","crossproduct","crossProduct","_getStrokeWidth","radius","arc","surface","corners","xWidth","yWidth","surfaces","avg","transCenter","leftButtonDown","_onMouseUp","touchDown","startMouseX","startMouseY","startStart","startEnd","startArmRotation","cursor","onmousemove","_onMouseMove","onmouseup","diffX","diffY","horizontalNew","verticalNew","snapAngle","snapValue","parameters","boundingRect","mouseX","mouseY","tooltipTimeout","_hideTooltip","dataPoint","_dataPointFromXY","_showTooltip","ontouchmove","_onTouchMove","ontouchend","_onTouchEnd","wheelDelta","detail","oldLength","newLength","_insideTriangle","triangle","bs","cs","distMax","closestDataPoint","closestDist","triangle1","triangle2","distX","distY","line","borderRadius","boxShadow","borderLeft","contentWidth","contentHeight","lineHeight","dotWidth","dotHeight","mixin","_callbacks","once","removeListener","removeAllListeners","callbacks","cb","listeners","hasListeners","sub","sum","armLocation","armRotation","armLength","cameraLocation","cameraRotation","calculateCameraOrientation","rot","graph","onLoadCallback","loadInBackground","isLoaded","getLoadedProgress","getColumn","getValues","getValue","dataView","progress","prev","bar","MozBorderRadius","slide","onclick","togglePlay","onChangeCallback","playTimeout","playInterval","playLoop","setIndex","playNext","clearInterval","getPlayInterval","setPlayLoop","doLoop","onChange","indexToLeft","startClientX","startSlideX","leftToIndex","_start","_end","_step","precision","_current","setRange","setStep","calculatePrettyStep","log10","log","LN10","step1","pow","step2","step5","toPrecision","getStep","groups","forthArgument","defaultOptions","autoResize","axis","maxHeight","minHeight","_create","body","domProps","emitter","bind","hiddenDates","timeAxis","_toScreen","toGlobalScreen","_toGlobalScreen","toTime","_toTime","toGlobalTime","_toGlobalTime","timeAxis2","currentTime","groupsData","getEventProperties","oncontextmenu","setGroups","setItems","_redraw","Core","Configurator","Validator","printStyle","configureOptions","_createConfigurator","markDirty","refreshItems","errorFound","validate","selection","getSelection","setSelection","newDataSet","initialLoad","getItemRange","setWindow","animation","fit","focus","_this","getDataRange","minItem","maxItem","factor","lhs","rhs","getStart","getEnd","dataset","centerContainer","itemFromTarget","groupFromTarget","customTime","customTimeFromTarget","snap","snappedTime","what","labelSet","groupId","pageX","pageY","showCurrentTime","backgroundVertical","warned","current","substring","currentTimeTimer","setCurrentTime","getCurrentTime","_isResized","resized","_previousWidth","_previousHeight","deltaDifference","scaleOffset","startToFront","endToFront","moveable","zoomable","zoomMin","zoomMax","animationTimer","_onDragStart","_onDrag","_onDragEnd","_onMouseWheel","_onTouch","_onPinch","validateDirection","getPointer","byUser","finalStart","finalEnd","_cancelAnimation","initStart","initEnd","easingName","easingFunction","initTime","anyChanged","dragging","ease","done","_applyRange","updateHiddenDates","newStart","newEnd","getRange","totalHidden","previousDelta","_isInsideRange","allowDragging","getHiddenDurationBetween","diffRange","safeStart","snapAwayFromHidden","safeEnd","zoomKey","pointer","pointerDate","_pointerToDate","zoom","centerDate","hiddenDuration","hiddenDurationBefore","getHiddenDurationBefore","hiddenDurationAfter","move","onTouch","isTouching","onRelease","isReleasing","offTouch","offRelease","convertHiddenOptions","repeat","dateItem","totalRange","pixelTime","startDate","endDate","runUntil","dayOffset","removeDuplicates","startHidden","isHidden","endHidden","rangeStart","rangeEnd","hidden","safeDates","printDates","stepOverHiddenDates","timeStep","previousTime","stepInHidden","currentValue","switchedYear","switchedMonth","switchedDay","correctTimeForHidden","totalDuration","partialDuration","accumulatedHiddenDuration","getAccumulatedHiddenDuration","newTime","timeOffset","requiredDuration","previousPoint","correctionEnabled","hammerUtil","Activator","onMouseWheel","isActive","backgroundHorizontal","leftContainer","rightContainer","shadowTop","shadowBottom","shadowTopLeft","shadowBottomLeft","shadowTopRight","shadowBottomRight","_redrawTimer","scrollTop","scrollTopMin","customTimes","redrawCount","drawPoints","onRender","clickToUse","activator","_initAutoResize","component","configurator","configure","appliedOptions","setModuleOptions","active","_stopAutoResize","setCustomTime","getCustomTime","addCustomTime","timestamp","some","removeCustomTime","getVisibleItems","getWindow","borderRootHeight","borderRootWidth","autoHeight","containerHeight","centerWidth","_updateScrollTop","visibilityTop","visibilityBottom","visibility","MAX_REDRAWS","repaint","_startAutoResize","_onResize","lastWidth","lastHeight","watchTimer","setInterval","initialScrollTop","oldScrollTop","_getScrollTop","newScrollTop","_setScrollTop","align","groupOrder","selectable","multiselect","onAdd","onUpdate","onMove","onRemove","onMoving","itemOptions","itemListeners","_onAdd","_onUpdate","_onRemove","groupListeners","_onAddGroups","_onUpdateGroups","_onRemoveGroups","groupIds","stackDirty","touchParams","UNGROUPED","BACKGROUND","box","_updateUngrouped","backgroundGroup","_onSelectItem","_onMultiSelectItem","_onAddItem","addCallback","rawVisibleItems","visibleItems","_deselect","_orderGroups","visibleInterval","zoomed","lastVisibleInterval","restack","firstGroup","_firstGroup","firstMargin","nonFirstMargin","groupMargin","groupResized","firstGroupIndex","firstGroupId","ungrouped","_getGroupId","getLabelSet","oldItemsData","getItems","_order","getGroups","removeItem","_getType","_removeItem","groupData","groupOptions","oldGroupId","oldSubGroupId","subgroup","oldGroup","_constructByEndArray","endArray","dragLeftItem","dragRightItem","itemProps","initialX","dragLeft","dragRight","ctrlKey","metaKey","_onDragStartAddItem","xAbs","newItem","offsetLeft","initial","updateTimeAllowed","initialStart","initialEnd","updateGroupAllowed","shiftKey","oldSelection","newSelection","_getItemRange","_item","itemSetFromTarget","subgroups","subgroupIndex","subgroupOrderer","subgroupOrder","byStart","byEnd","checkRangedItems","inner","marker","getLabelWidth","markerHeight","lastMarkerHeight","limitSize","customOrderedItems","_updateVisibleItems","nostack","_calculateHeight","offsetTop","resetSubgroups","orderSubgroups","_checkIfVisible","sortArray","sortField","itemIndex","startArray","orderByStart","orderByEnd","oldVisibleItems","visibleItemsLookup","lowerBound","upperBound","_checkIfVisibleWithReference","initialPosByStart","_traceVisible","initialPosByEnd","initialPos","breakCondition","EPSILON","aTime","bTime","iMax","collidingItem","jj","collision","newTop","baseClassName","getComputedStyle","maxWidth","_repaintDragLeft","_repaintDragRight","contentLeft","parentWidth","boxWidth","minimumStep","autoScale","FORMAT","minorLabels","majorLabels","setFormat","setMinimumStep","first","roundToMinor","setDate","setHours","setMinutes","setSeconds","setMilliseconds","getMilliseconds","getSeconds","getMinutes","getHours","hasNext","setScale","setAutoScale","stepYear","stepMonth","stepDay","stepHour","stepMinute","stepSecond","stepMillisecond","isMajor","getLabelMinor","getLabelMajor","getClassName","even","today","currentWeek","currentMonth","currentYear","itemSetHeight","onTop","itemSubgroup","totalHeight","newHeight","lines","majorTexts","minorTexts","lineTop","showMinorLabels","showMajorLabels","parentChanged","_calculateCharSize","minorLabelHeight","minorCharHeight","majorLabelHeight","majorCharHeight","minorLineHeight","minorLineWidth","majorLineHeight","majorLineWidth","foregroundNextSibling","nextSibling","backgroundNextSibling","_repaintLabels","timeLabelsize","minorCharWidth","xNext","labelMinor","xFirstMajorLabel","labelFits","_repaintMinorText","_repaintMajorText","_repaintMajorLine","_repaintMinorLine","leftTime","leftText","widthText","majorCharWidth","pop","createTextNode","childNodes","nodeValue","measureCharMinor","measureCharMajor","overlay","_onTapOverlay","onClick","_hasParent","deactivate","escListener","activate","display","unbind","_exportFunctions","_bound","keydown","keyup","_keys","fromCharCode","down","handleEvent","up","keyCode","bound","bindAll","getKey","newBindings","eventParams","drag","_interopRequireDefault","__esModule","default","_classCallCheck","instance","Constructor","defineProperty","_createClass","defineProperties","descriptor","enumerable","configurable","writable","protoProps","staticProps","_ColorPicker","_ColorPicker2","parentModule","defaultContainer","pixelRatio","changedOptions","allowCreation","showButton","moduleOptions","domElements","colorPicker","_clean","_handleObject","_makeItem","_makeHeader","generateButton","_printOptions","onmouseover","onmouseout","optionsContainer","_push","insertTo","path","_arguments","_this2","_len","_key","div","objectLabel","selectedValue","_update","_makeLabel","err","oninput","checkbox","checked","_this3","defaultColor","_showColorPicker","_this4","bodyRect","pickerX","pickerY","setColor","setCallback","colorString","checkOnly","visibleInSet","subObj","newPath","_getValue","_handleArray","_makeTextInput","_makeCheckbox","draw","physics","solver","enabledPath","enabledValue","error","_makeColorField","_makeDropdown","_makeRange","_constructOptions","optionsObj","getOptions","ColorPicker","generated","centerCoordinates","hueCircle","initialColor","previousColor","applied","updateCallback","_bindHammer","_setSize","htmlColors","black","navy","darkblue","mediumblue","darkgreen","teal","darkcyan","deepskyblue","darkturquoise","mediumspringgreen","lime","springgreen","aqua","cyan","midnightblue","dodgerblue","lightseagreen","forestgreen","seagreen","darkslategray","limegreen","mediumseagreen","turquoise","royalblue","steelblue","darkslateblue","mediumturquoise","indigo","darkolivegreen","cadetblue","cornflowerblue","mediumaquamarine","dimgray","slateblue","olivedrab","slategray","lightslategray","mediumslateblue","lawngreen","chartreuse","aquamarine","maroon","purple","olive","gray","skyblue","lightskyblue","blueviolet","darkred","darkmagenta","saddlebrown","darkseagreen","lightgreen","mediumpurple","darkviolet","palegreen","darkorchid","yellowgreen","sienna","brown","darkgray","lightblue","greenyellow","paleturquoise","lightsteelblue","powderblue","firebrick","darkgoldenrod","mediumorchid","rosybrown","darkkhaki","silver","mediumvioletred","indianred","peru","chocolate","tan","lightgrey","palevioletred","thistle","orchid","goldenrod","crimson","gainsboro","plum","burlywood","lightcyan","lavender","darksalmon","violet","palegoldenrod","lightcoral","khaki","aliceblue","honeydew","azure","sandybrown","wheat","beige","whitesmoke","mintcream","ghostwhite","salmon","antiquewhite","linen","lightgoldenrodyellow","oldlace","fuchsia","magenta","deeppink","orangered","tomato","hotpink","coral","darkorange","lightsalmon","orange","lightpink","pink","gold","peachpuff","navajowhite","moccasin","bisque","mistyrose","blanchedalmond","papayawhip","lavenderblush","seashell","cornsilk","lemonchiffon","floralwhite","snow","yellow","lightyellow","ivory","white","setInitial","htmlColor","_isColorString","rgbaArray","rgbObj","alpha","_setColor","_generateHueCircle","storePrevious","_hide","_updatePicker","alert","angleConvert","colorPickerSelector","colorPickerCanvas","pixelRation","devicePixelRatio","webkitBackingStorePixelRatio","mozBackingStorePixelRatio","msBackingStorePixelRatio","oBackingStorePixelRatio","backingStorePixelRatio","setTransform","putImageData","circle","brightnessRange","opacityRange","initialColorDiv","newColorDiv","colorPickerDiv","opacityDiv","brightnessDiv","arrowDiv","_setOpacity","_setBrightness","brightnessLabel","opacityLabel","cancelButton","applyButton","_apply","saveButton","_save","loadButton","_loadLast","pinch","_moveSelector","sat","hfac","sfac","fillRect","getImageData","centerY","centerX","newLeft","referenceOptions","subObject","usedOptions","check","__any__","getSuggestion","__type__","checkFields","referenceOption","refOptionObj","optionType","refOptionType","print","printLocation","localSearch","findInOptions","globalSearch","localSearchThreshold","globalSearchThreshold","indexMatch","closestMatch","recursive","closestMatchPath","lowerCaseOption","op","levenshteinDistance","matrix","boolean","any","function","null","linegraph","getLegend","isGroupVisible","yAxisLeft","yAxisRight","legendLeft","legendRight","screenToValue","yAxisOrientation","defaultGroup","sampling","graphHeight","shaded","barChart","sideBySide","interpolation","parametrization","dataAxis","icons","alignZeros","legend","abortedGraphUpdate","updateSVGheight","updateSVGheightOnResize","lastStart","svgElements","groupsUsingDefaultStyles","COUNTER","svg","framework","BarFunctions","_updateAllGroupData","_updateGroup","removeGroup","addGroup","groupsContent","ungroupedCounter","forceGraphUpdate","_updateGraph","rangePerPixelInv","preprocessedGroupData","processedGroupData","groupRanges","changeCalled","minDate","maxDate","_getRelevantData","_applySampling","_convertXcoordinates","_getYRanges","_updateYAxis","MAX_CYCLES","_convertYcoordinates","dataContainer","guess","increment","amountOfPoints","xDistance","pointsPerPixel","sampledData","combinedDataLeft","combinedDataRight","getData","getYRange","getStackedYRange","minVal","maxVal","yAxisLeftUsed","yAxisRightUsed","minLeft","minRight","maxLeft","maxRight","ignore","_toggleAxisVisiblity","drawIcons","master","lineOffset","stepPixels","zeroCrossing","amountOfSteps","tempGroups","axisUsed","datapoints","xValue","yValue","extractedData","svgHeight","labelValue","convertValue","setZeroPosition","linegraphOptions","majorLinesOffset","minorLinesOffset","labelOffsetX","labelOffsetY","iconWidth","linegraphSVG","DOMelements","labels","conversionFactor","minWidth","iconsRemoved","amountOfGroups","lineContainer","graphOptions","_redrawGroupIcons","iconHeight","iconOffset","groupArray","drawIcon","_cleanupIcons","activeGroups","_redrawLabels","_redrawTitle","stepSize","marginRange","valueAtBottom","marginEnd","maxLabelSize","stepIndex","_redrawLabel","_redrawLine","titleWidth","titleCharHeight","invertedValue","convertedValue","characterHeight","largestWidth","textMinor","textMajor","textTitle","measureCharTitle","titleCharWidth","customRange","formattingFunction","marginStart","deadSpace","majorSteps","minorSteps","setFirst","safeRange","minimumStepValue","orderOfMagnitude","minorStepIdx","magnitudefactor","solutionFound","niceStart","niceEnd","rounded","previous","steps","usingDefaultStyle","zeroPosition","Line","Bar","Points","SVGcontainer","fillPath","fillHeight","outline","barWidth","bar1Height","bar2Height","icon","combinedData","groupLabel","intersections","_getDataIntersections","_getStackedYRange","accumulatedNegative","accumulatedPositive","xpos","coreDistance","amount","resolved","_catmullRom","_linear","dFill","_catmullRomUniform","p0","bp1","bp2","normalization","d1","d2","d3","A","N","d3powA","d2powA","d3pow2A","d2pow2A","d1pow2A","d1powA","getGroupTemplate","callbackResult","getCallback","Bargraph","drawData","barPoints","heightOffset","_getSafeDrawData","nextKey","prevKey","side","iconSize","iconSpacing","textArea","scrollableHeight","drawLegendIcons","paddingTop","nodes","nodeIndices","edges","edgeIndices","eventListeners","onTap","onDoubleTap","onHold","onDragStart","onDrag","onDragEnd","onPinch","onMouseMove","onContext","functions","createNode","createEdge","view","bindEventListeners","images","_modulesGroups2","_modulesCanvas2","selectionHandler","_modulesSelectionHandler2","interactionHandler","_modulesInteractionHandler2","_modulesView2","renderer","_modulesCanvasRenderer2","_modulesPhysicsEngine2","layoutEngine","_modulesLayoutEngine2","clustering","_modulesClustering2","manipulation","_modulesManipulationSystem2","nodesHandler","_modulesNodesHandler2","edgesHandler","_modulesEdgesHandler2","_modulesGroups","_modulesNodesHandler","_modulesEdgesHandler","_modulesPhysicsEngine","_modulesClustering","_modulesCanvasRenderer","_modulesCanvas","_modulesView","_modulesInteractionHandler","_modulesSelectionHandler","_modulesLayoutEngine","_modulesManipulationSystem","_sharedConfigurator","_sharedConfigurator2","_sharedValidator","_sharedValidator2","_optionsJs","layout","interaction","networkOptions","_updateVisibleIndices","nodeId","edgeId","updatePhysicsData","_updateValueRange","unselectAll","dotData","gephi","gephiData","valueTotal","setValueRange","canvasToDOM","DOMtoCanvas","findNode","isCluster","openCluster","cluster","getNodesInCluster","clusterByConnection","clusterByHubsize","clusterOutliers","getSeed","enableEditMode","disableEditMode","addNodeMode","editNode","editNodeMode","addEdgeMode","editEdgeMode","deleteSelected","getPositions","storePositions","getBoundingBox","getConnectedNodes","objectId","getConnectedEdges","startSimulation","stopSimulation","stabilize","getSelectedNodes","getSelectedEdges","getNodeAt","getEdgeAt","edge","selectNodes","selectEdges","getViewPosition","releaseNode","getOptionsFromConfigurator","Groups","defaultIndex","groupsArray","groupIndex","defaultGroups","useDefaultGroups","optionFields","groupName","groupname","_componentsNode","_componentsNode2","_componentsSharedLabel","_componentsSharedLabel2","NodesHandler","nodesListeners","borderWidthSelected","brokenImage","fixed","face","strokeColor","image","labelHighlightBold","level","mass","scaling","maxVisible","drawThreshold","customScalingFunction","shadow","shape","shapeProperties","borderDashes","parseOptions","updateShape","updateLabelModule","_reset","doNotEmit","oldNodesData","newNodes","positionInitially","changedData","dataChanged","constructorClass","dataArray","boundingBox","nodeList","nodeObj","toId","fromId","edgeList","_sharedLabel","_sharedLabel2","_nodesShapesBox","_nodesShapesBox2","_nodesShapesCircle","_nodesShapesCircle2","_nodesShapesCircularImage","_nodesShapesCircularImage2","_nodesShapesDatabase","_nodesShapesDatabase2","_nodesShapesDiamond","_nodesShapesDiamond2","_nodesShapesDot","_nodesShapesDot2","_nodesShapesEllipse","_nodesShapesEllipse2","_nodesShapesIcon","_nodesShapesIcon2","_nodesShapesImage","_nodesShapesImage2","_nodesShapesSquare","_nodesShapesSquare2","_nodesShapesStar","_nodesShapesStar2","_nodesShapesText","_nodesShapesText2","_nodesShapesTriangle","_nodesShapesTriangle2","_nodesShapesTriangleDown","_nodesShapesTriangleDown2","Node","imagelist","grouplist","globalOptions","baseSize","baseFontSize","predefinedPosition","labelModule","status","groupObj","imageObj","load","distanceToBorder","sizeDiff","fontDiff","updateBoundingBox","resize","parentOptions","newOptions","parsedColor","_slicedToArray","sliceIterator","_arr","_n","_e","_s","Symbol","Label","pointToSelf","yLine","labelDirty","baseline","viewFontSize","calculateLabelSize","_drawBackground","_drawText","lineMargin","fontSize","_getColor2","_getColor","_getColor22","fontColor","_setAlignment2","_setAlignment","_setAlignment22","lineCount","strokeText","_processLabel","measureText","newOptionsArray","_inherits","subClass","superClass","__proto__","_get","_x","_x2","_x3","_again","receiver","desc","getOwnPropertyDescriptor","getPrototypeOf","_utilNodeBase","_utilNodeBase2","Box","_NodeBase","textSize","getTextSize","selectionLineWidth","roundRect","enableBorderDashes","enableShadow","disableBorderDashes","disableShadow","NodeBase","shadowColor","shadowBlur","shadowOffsetX","shadowOffsetY","setLineDash","_utilCircleImageBase","_utilCircleImageBase2","Circle","_CircleImageBase","diameter","_drawRawCircle","CircleImageBase","labelOffset","imageLoaded","ratio","networkScaleInv","globalAlpha","drawImage","labelDimensions","CircularImage","_swapToImageResizeWhenImageLoaded","_resizeImage","save","clip","_drawImageAtPosition","restore","_drawImageLabel","_distanceToBorder","Database","database","_utilShapeBase","_utilShapeBase2","Diamond","_ShapeBase","_resizeShape","_drawShape","ShapeBase","sizeMultiplier","Dot","Ellipse","ellipse","Icon","_icon","iconTextSpacing","Image","Square","Star","Text","Triangle","TriangleDown","_componentsEdge","_componentsEdge2","EdgesHandler","edgesListeners","arrows","scaleFactor","dashes","hoverWidth","selectionWidth","selfReferenceSize","smooth","roundness","emitChange","edgeData","edgeOptions","reconnectEdges","markAllEdgesAsDirty","updateEdgeType","oldEdgesData","edgesData","oldEdge","disconnect","showInternalIds","connect","edgeType","cleanup","colorDirty","_edgesBezierEdgeDynamic","_edgesBezierEdgeDynamic2","_edgesBezierEdgeStatic","_edgesBezierEdgeStatic2","_edgesStraightEdge","_edgesStraightEdge2","Edge","baseWidth","connected","_setInteractionWidths","changeInType","togglePhysics","attachEdge","detachEdge","widthDiff","via","drawLine","drawArrows","drawLabel","viaNode","drawArrowHead","node1","node2","getPoint","translate","_rotateForLabelAlignment","_pointOnCircle","xFrom","yFrom","xTo","yTo","xObj","yObj","getDistanceToEdge","angleInDegrees","rotate","percentage","colorsDefined","_utilBezierEdgeBase","_utilBezierEdgeBase2","BezierEdgeDynamic","_BezierEdgeBase","setupSupportNode","positionBezierNode","parentEdgeId","quadraticCurveTo","nearNode","_findBorderPositionBezier","x1","y1","x2","y2","x3","y3","_getDistanceToBezierEdge","_x4","_EdgeBase2","_EdgeBase3","BezierEdgeBase","_EdgeBase","distanceToPoint","difference","_getViaCoordinates","xVia","yVia","minDistance","lastX","lastY","_getDistanceToLine","EdgeBase","getColor","getLineWidth","_drawDashedLine","_drawLine","_line","_getCircleData2","_getCircleData","_getCircleData22","_circle","pattern","lineDashOffset","_getCircleData3","_getCircleData32","dashedLine","_getCircleData4","_getCircleData42","_findBorderPosition","_findBorderPositionCircle","_getCircleData5","_getCircleData52","colorOptions","grd","createLinearGradient","fromColor","toColor","addColorStop","_getDistanceToEdge","_getCircleData6","_getCircleData62","px","py","something","u","arrowPos","guideOffset","findBorderPosition","guidePos","arrow","_angle","_getCircleData7","_getCircleData72","_length","_x5","_x6","BezierEdgeStatic","pi","originalAngle","myAngle","_utilEdgeBase","_utilEdgeBase2","StraightEdge","edgeSegmentLength","toBorderDist","toBorderPoint","borderPos","_componentsPhysicsBarnesHutSolver","_componentsPhysicsBarnesHutSolver2","_componentsPhysicsRepulsionSolver","_componentsPhysicsRepulsionSolver2","_componentsPhysicsHierarchicalRepulsionSolver","_componentsPhysicsHierarchicalRepulsionSolver2","_componentsPhysicsSpringSolver","_componentsPhysicsSpringSolver2","_componentsPhysicsHierarchicalSpringSolver","_componentsPhysicsHierarchicalSpringSolver2","_componentsPhysicsCentralGravitySolver","_componentsPhysicsCentralGravitySolver2","_componentsPhysicsFA2BasedRepulsionSolver","_componentsPhysicsFA2BasedRepulsionSolver2","_componentsPhysicsFA2BasedCentralGravitySolver","_componentsPhysicsFA2BasedCentralGravitySolver2","PhysicsEngine","physicsBody","physicsNodeIndices","physicsEdgeIndices","forces","velocities","physicsEnabled","simulationInterval","requiresTimeout","previousStates","freezeCache","renderTimer","initialStabilizationEmitted","stabilized","startedStabilization","stabilizationIterations","ready","barnesHut","theta","gravitationalConstant","centralGravity","springLength","springConstant","damping","avoidOverlap","forceAtlas2Based","repulsion","nodeDistance","hierarchicalRepulsion","maxVelocity","minVelocity","stabilization","iterations","updateInterval","onlyDynamicEdges","timestep","initPhysics","nodesSolver","edgesSolver","gravitySolver","modelOptions","viewFunction","simulationStep","_emitStabilized","startTime","physicsTick","physicsTime","runDoubleSpeed","calculateForces","moveNodes","revert","nodeIds","vx","vy","nodesPresent","vminCorrected","nodeVelocity","_performStep","totalVelocity","solve","targetIterations","_freezeNodes","_stabilizationBatch","_finalizeStabilization","_restoreFrozenNodes","BarnesHutSolver","barnesHutTree","randomSeed","thetaInversed","overlapAvoidanceFactor","nodeCount","_formBarnesHutTree","_getForceContribution","NW","NE","SW","SE","parentBranch","childrenCount","centerOfMass","calcSize","_calculateForces","gravityForce","fx","fy","minX","minY","maxX","maxY","minimumTreeSize","rootSize","halfRootSize","_splitBranch","_placeInTree","totalMass","totalMassInv","biggestSize","skipMassUpdate","_updateBranchMass","_placeInRegion","region","seededRandom","containedNode","_insertRegion","childSize","_drawBranch","branch","RepulsionSolver","repulsingForce","HierarchicalRepulsionSolver","steepness","SpringSolver","edgeLength","node3","_calculateSpringForce","springForce","HierarchicalSpringSolver","springFx","springFy","totalFx","totalFy","correctionFx","correctionFy","CentralGravitySolver","_BarnesHutSolver2","_BarnesHutSolver3","ForceAtlas2BasedRepulsionSolver","_BarnesHutSolver","degree","_CentralGravitySolver2","_CentralGravitySolver3","ForceAtlas2BasedCentralGravitySolver","_CentralGravitySolver","_componentsNodesCluster","_componentsNodesCluster2","ClusterEngine","clusteredNodes","hubsize","_getHubSize","_checkOptions","nodesToCluster","refreshData","joinCondition","childNodesObj","childEdgesObj","clonedOptions","_cloneOptions","_cluster","clusters","visibleEdges","childNodeId","_getConnectedId","_checkIfUsed","clusterNodeProperties","parentNodeId","parentClonedOptions","childClonedOptions","amountOfConnections","newEdges","clusterEdgeProperties","childNode","otherNodeId","childKeys","processProperties","childNodesOptions","childEdgesOptions","clusterId","_getClusterPosition","clusterNode","containedNodes","containedEdges","_createClusterEdges","deleteEdge","edgeId2","edge2","clusterNodeId","releaseFunction","positions","clusterPosition","newPositions","clusteredNode","_clusterNode","newEdge","removeIds","nodesArray","average","averageSquared","hubCounter","largestHub","letiance","standardDeviation","hubThreshold","_Node2","_Node3","Cluster","_Node","requestAnimationFrame","mozRequestAnimationFrame","webkitRequestAnimationFrame","msRequestAnimationFrame","CanvasRenderer","redrawRequested","renderingActive","renderRequests","allowRedraw","hideEdgesOnDrag","hideNodesOnDrag","_determineBrowserMethod","_resizeNodes","_requestRedraw","_startRendering","cancelAnimationFrame","_renderStep","_drawEdges","_drawNodes","controlNodesActive","_drawControlNodes","alwaysShow","topLeft","bottomRight","viewableArea","isSelected","isBoundingBoxOverlappingWith","browserType","Canvas","resizeTimer","resizeFunction","hammerFrame","_cleanUp","tabIndex","_prepareValue","emitEvent","oldWidth","oldHeight","_XconvertCanvasToDOM","_YconvertCanvasToDOM","_XconvertDOMtoCanvas","_YconvertDOMtoCanvas","View","animationSpeed","renderRefreshRate","animationEasingFunction","easingTime","sourceScale","targetScale","sourceTranslation","targetTranslation","lockedOnNodeId","lockedOnNodeOffset","touchTime","specificNodes","zoomLevel","initialZoom","positionDefined","_getRange","numberOfNodes","yDistance","xZoomLevel","yZoomLevel","_findCenter","animationOptions","nodePosition","lockedOnNode","animateView","locked","_transitionRedraw","viewCenter","distanceFromCenter","_lockedRedraw","finished","_componentsNavigationHandler","_componentsNavigationHandler2","_componentsPopup","_componentsPopup2","InteractionHandler","navigationHandler","popup","popupObj","popupTimer","dragNodes","dragView","keyboard","speed","bindToWindow","navigationButtons","tooltipDelay","zoomView","pinched","checkSelectionChanges","_generateClickEvent","previouslySelectedEdgeCount","_getSelectedEdgeCount","previouslySelectedNodeCount","_getSelectedNodeCount","previousSelection","selectAdditionalOnPoint","selectOnPoint","selectedEdgesCount","selectedNodesCount","currentSelection","_determineIfDifferent2","_determineIfDifferent","nodesChanges","edgesChanges","selectObject","selectionObj","xFixed","yFixed","scaleOld","preScaleDragPointer","scaleFrac","tx","ty","postScaleDragPointer","popupVisible","_checkHidePopup","setPosition","_checkShowPopup","hoverObject","pointerObj","previousPopupObjId","nodeUnderCursor","popupType","overlappingNodes","isOverlappingWith","getTitle","overlappingEdges","popupTargetType","popupTargetId","setText","_pointerToPositionObject","stillOnObj","overNode","NavigationHandler","iconsCreated","navigationHammers","boundFunctions","activated","configureKeyboardBindings","loadNavigationElements","cleanNavigation","navigationDOM","navigationDivs","navigationDivActions","_fit","bindToRedraw","_stopMovement","boundAction","unbindFromRedraw","Popup","doShow","SelectionHandler","hoverObj","selectConnectedEdges","hoverConnectedEdges","updateSelection","selectionChanged","deselectObject","emptySelection","DOM","highlightEdges","_selectConnectedEdges","_addToSelection","_removeFromSelection","canvasPos","returnNode","positionObject","_getAllNodesOverlappingWith","_getEdgesOverlappingWith","returnEdge","_getAllEdgesOverlappingWith","clusterSize","_addToHover","hoverChanged","blurObject","_hoverConnectedEdges","edgeIds","idArray","RangeError","LayoutEngine","initialRandomSeed","optionsBackup","hierarchical","levelSeparation","sortMethod","hierarchicalLevels","setupHierarchicalLayout","prevHierarchicalState","adaptAllOptions","definedLevel","undefinedLevel","nodeSpacing","_determineLevelsByHubsize","_determineLevelsDirected","distribution","_getDistribution","_placeNodesByHierarchy","positionedNodes","_placeBranchNodes","hubSize","_setLevelByHubsize","minLevel","_setLevelDirected","parentId","parentLevel","childNodeLevel","ManipulationSystem","editMode","manipulationDiv","editModeDiv","closeDiv","manipulationHammers","temporaryUIFunctions","temporaryEventFunctions","temporaryIds","guiEnabled","inMode","selectedControlNode","initiallyActive","addNode","addEdge","editEdge","deleteNode","controlNodeStyle","_restore","_setup","showManipulatorToolbar","_createEditButton","manipulationDOM","selectedNodeCount","selectedEdgeCount","selectedTotalCount","needSeperator","_createAddNodeButton","_createSeperator","_createAddEdgeButton","_createEditNodeButton","_createEditEdgeButton","_createDeleteButton","_bindHammerToDiv","toggleEditMode","_temporaryBindEvent","_createBackButton","_createDescription","_performAddNode","_getSelectedNode","finalizedData","_temporaryBindUI","_handleConnect","_finishConnect","_dragControlNode","edgeBeingEditedId","controlNodeFrom","_getNewTargetNode","controlNodeTo","_controlNodeTouch","_controlNodeDragStart","_controlNodeDrag","_controlNodeDragEnd","findBorderPositions","selectedNodes","selectedEdges","deleteFunction","_createWrappers","_removeManipulationDOM","_createButton","_cleanManipulatorHammers","_cleanupTemporaryNodesAndEdges","_unbindTemporaryUIs","_unbindTemporaryEvents","labelClassName","newFunction","boundFunction","UIfunctionName","functionName","eventName","domElement","indexTempEdge","indexTempNode","lastTouch","fromSelect","toSelect","overlappingNodeIds","_performEditEdge","targetNode","connectionEdge","connectFromId","_performAddEdge","clickData","_this5","defaultData","sourceNodeId","targetNodeId","_this6","_this7","CanvasRenderingContext2D","square","s2","ir","triangleDown","star","diamond","r2d","kappa","ox","oy","xe","ye","xm","ym","bezierCurveTo","wEllipse","hEllipse","ymb","yeb","xt","yt","xi","yi","xl","yl","xr","yr","patternLength","slope","distRemaining","patternIndex","dashLength","parseDOT","parseGraph","nextPreview","isAlphaNumeric","regexAlphaNumeric","setValue","graphs","attr","getToken","tokenType","TOKENTYPE","NULL","isComment","DELIMITER","c2","DELIMITERS","IDENTIFIER","newSyntaxError","UNKNOWN","chop","parseStatements","parseStatement","subgraph","parseSubgraph","parseEdge","parseAttributeStatement","parseNodeStatement","subgraphs","parseAttributeList","message","maxLength","forEach2","elem1","elem2","setProp","convertAttr","mapping","visProp","visPropI","graphData","dotNode","graphNode","NODE_ATTR_MAPPING","convertEdge","dotEdge","graphEdge","EDGE_ATTR_MAPPING","subEdge","fontsize","fontcolor","labelfontcolor","fontname","fillcolor","labeltooltip","{","}","[","]",";","=",",","->","--","gephiJSON","inheritColor","gEdges","gNodes","gEdge","gNode","imageBroken","url","brokenUrl","img","onload","onerror","edit","del","back","addDescription","edgeDescription","editEdgeDescription","createEdgeError","deleteClusterError","editClusterError"],"mappings":"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"} \ No newline at end of file +{"version":3,"sources":["vis.js"],"names":["root","factory","exports","module","define","amd","this","modules","__webpack_require__","moduleId","installedModules","id","loaded","call","m","c","p","util","DOMutil","DataSet","DataView","Queue","Graph3d","graph3d","Camera","Filter","Point2d","Point3d","Slider","StepNumber","Timeline","Graph2d","timeline","Core","DateUtil","Range","stack","TimeStep","components","items","Item","BackgroundItem","BoxItem","PointItem","RangeItem","BackgroundGroup","Component","CurrentTime","CustomTime","DataAxis","DataScale","GraphGroup","Group","ItemSet","Legend","LineGraph","TimeAxis","Network","network","Images","dotparser","gephiParser","allOptions","convertDot","input","DOTToGraph","convertGephi","options","parseGephi","moment","Hammer","keycharm","uuid","isNumber","object","Number","recursiveDOMDelete","DOMobject","hasChildNodes","firstChild","removeChild","giveRange","min","max","total","value","scale","Math","isString","String","isDate","Date","match","ASPDateRegex","exec","isNaN","parse","randomUUID","v4","assignAllKeys","obj","prop","hasOwnProperty","fillIfDefined","a","b","allowDeletion","arguments","length","undefined","protoExtend","i","other","extend","selectiveExtend","props","Array","isArray","Error","selectiveDeepExtend","TypeError","constructor","Object","deepExtend","selectiveNotDeepExtend","indexOf","push","equalArray","len","convert","type","Boolean","valueOf","isMoment","toDate","getType","toISOString","copyAndExtendArray","arr","newValue","newArr","copyArray","getAbsoluteLeft","elem","getBoundingClientRect","left","getAbsoluteTop","top","addClassName","className","classes","split","join","removeClassName","index","splice","forEach","callback","toArray","array","updateProperty","key","throttle","fn","wait","timeout","needExecution","throttled","setTimeout","addEventListener","element","action","listener","useCapture","navigator","userAgent","attachEvent","removeEventListener","detachEvent","preventDefault","event","window","returnValue","getTarget","target","srcElement","nodeType","parentNode","hasParent","parent","e","option","asBoolean","defaultValue","asNumber","asString","asSize","asElement","hexToRGB","hex","shorthandRegex","replace","r","g","result","parseInt","overrideOpacity","color","opacity","rgb","substr","RGBToHex","red","green","blue","toString","slice","parseColor","isValidRGB","map","isValidHex","hsv","hexToHSV","lighterColorHSV","h","s","v","darkerColorHSV","darkerColorHex","HSVToHex","lighterColorHex","background","border","highlight","hover","RGBToHSV","minRGB","maxRGB","d","hue","saturation","cssUtil","cssText","styles","style","trim","parts","keys","addCssText","currentStyles","newStyles","removeCssText","removeStyles","HSVToRGB","floor","f","q","t","isOk","test","isValidRGBA","rgba","selectiveBridgeObject","fields","referenceObject","objectTo","create","bridgeObject","insertSort","compare","k","j","mergeOptions","mergeTarget","globalOptions","enabled","binarySearchCustom","orderedItems","comparator","field","field2","maxIterations","iteration","low","high","middle","item","searchResult","binarySearchValue","sidePreference","prevValue","nextValue","easingFunctions","linear","easeInQuad","easeOutQuad","easeInOutQuad","easeInCubic","easeOutCubic","easeInOutCubic","easeInQuart","easeOutQuart","easeInOutQuart","easeInQuint","easeOutQuint","easeInOutQuint","global","utils_hooks__hooks","hookCallback","apply","setHookCallback","prototype","res","hasOwnProp","create_utc__createUTC","format","locale","strict","createLocalOrUTC","utc","defaultParsingFlags","empty","unusedTokens","unusedInput","overflow","charsLeftOver","nullInput","invalidMonth","invalidFormat","userInvalidated","iso","getParsingFlags","_pf","valid__isValid","_isValid","flags","_d","getTime","invalidWeekday","_strict","bigHour","valid__createInvalid","NaN","isUndefined","copyConfig","to","from","val","_isAMomentObject","_i","_f","_l","_tzm","_isUTC","_offset","_locale","momentProperties","Moment","config","updateInProgress","updateOffset","absFloor","number","ceil","toInt","argumentForCoercion","coercedNumber","isFinite","compareArrays","array1","array2","dontConvert","lengthDiff","abs","diffs","Locale","normalizeLocale","toLowerCase","chooseLocale","names","next","loadLocale","name","oldLocale","locales","globalLocale","_abbr","code","locale_locales__getSetGlobalLocale","values","data","locale_locales__getLocale","defineLocale","abbr","set","addUnitAlias","unit","shorthand","lowerCase","aliases","normalizeUnits","units","normalizeObjectUnits","inputObject","normalizedProp","normalizedInput","isFunction","Function","makeGetSet","keepTime","get_set__set","get_set__get","mom","isValid","getSet","zeroFill","targetLength","forceSign","absNumber","zerosToFill","sign","pow","addFormatToken","token","padded","ordinal","func","formatTokenFunctions","localeData","removeFormattingTokens","makeFormatFunction","formattingTokens","output","formatMoment","expandFormat","formatFunctions","invalidDate","replaceLongDateFormatTokens","longDateFormat","localFormattingTokens","lastIndex","addRegexToken","regex","strictRegex","regexes","isStrict","getParseRegexForToken","RegExp","unescapeFormat","regexEscape","matched","p1","p2","p3","p4","addParseToken","tokens","addWeekParseToken","_w","addTimeToArrayFromToken","_a","daysInMonth","year","month","UTC","getUTCDate","localeMonths","_months","MONTHS_IN_FORMAT","localeMonthsShort","_monthsShort","localeMonthsParse","monthName","_monthsParse","_longMonthsParse","_shortMonthsParse","months","monthsShort","setMonth","dayOfMonth","monthsParse","date","getSetMonth","getDaysInMonth","monthsShortRegex","_monthsParseExact","computeMonthsParse","_monthsShortStrictRegex","_monthsShortRegex","monthsRegex","_monthsStrictRegex","_monthsRegex","cmpLenRev","shortPieces","longPieces","mixedPieces","sort","checkOverflow","MONTH","DATE","YEAR","HOUR","MINUTE","SECOND","MILLISECOND","_overflowDayOfYear","_overflowWeeks","WEEK","_overflowWeekday","WEEKDAY","warn","msg","suppressDeprecationWarnings","console","deprecate","firstTime","deprecateSimple","deprecations","configFromISO","l","allowTime","dateFormat","timeFormat","tzFormat","string","extendedIsoRegex","basicIsoRegex","isoDates","isoTimes","tzRegex","configFromStringAndFormat","configFromString","aspNetJsonRegex","createFromInputFallback","createDate","y","M","ms","getFullYear","setFullYear","createUTCDate","getUTCFullYear","setUTCFullYear","daysInYear","isLeapYear","getIsLeapYear","firstWeekOffset","dow","doy","fwd","fwdlw","getUTCDay","dayOfYearFromWeeks","week","weekday","resYear","resDayOfYear","localWeekday","weekOffset","dayOfYear","weekOfYear","resWeek","weeksInYear","weekOffsetNext","defaults","currentDateArray","nowValue","now","_useUTC","getUTCMonth","getMonth","getDate","configFromArray","currentDate","yearToUse","dayOfYearFromWeekInfo","_dayOfYear","_nextDay","setUTCMinutes","getUTCMinutes","w","weekYear","temp","weekdayOverflow","GG","W","E","local__createLocal","_week","gg","ISO_8601","parsedInput","skipped","stringLength","totalParsedInputLength","meridiemFixWrap","_meridiem","hour","meridiem","isPm","meridiemHour","isPM","configFromStringAndArray","tempConfig","bestMoment","scoreToBeat","currentScore","score","configFromObject","day","minute","second","millisecond","createFromConfig","prepareConfig","add","preparse","configFromInput","isUTC","pickBy","moments","args","Duration","duration","years","quarters","quarter","weeks","days","hours","minutes","seconds","milliseconds","_milliseconds","_days","_data","_bubble","isDuration","offset","separator","utcOffset","offsetFromString","matcher","matches","chunk","chunkOffset","cloneWithOffset","model","diff","clone","setTime","local","getDateOffset","round","getTimezoneOffset","getSetOffset","keepLocalTime","localAdjust","matchShortOffset","_changeInProgress","add_subtract__addSubtract","create__createDuration","getSetZone","setOffsetToUTC","setOffsetToLocal","subtract","setOffsetToParsedOffset","matchOffset","hasAlignedHourOffset","isDaylightSavingTime","isDaylightSavingTimeShifted","_isDSTShifted","isLocal","isUtcOffset","isUtc","ret","diffRes","aspNetRegex","isoRegex","parseIso","momentsDifference","inp","parseFloat","positiveMomentsDifference","base","isAfter","isBefore","createAdder","direction","period","dur","tmp","isAdding","moment_calendar__calendar","time","formats","sod","startOf","calendar","localInput","endOf","isBetween","isSame","inputMs","isSameOrAfter","isSameOrBefore","asFloat","that","zoneDelta","delta","monthDiff","anchor2","adjust","wholeMonthDiff","anchor","moment_format__toISOString","inputString","defaultFormat","postformat","withoutSuffix","humanize","fromNow","toNow","newLocaleData","isoWeekday","to_type__valueOf","unix","toObject","toJSON","moment_valid__isValid","parsingFlags","invalidAt","creationData","addWeekYearFormatToken","getter","getSetWeekYear","getSetWeekYearHelper","getSetISOWeekYear","isoWeek","getISOWeeksInYear","getWeeksInYear","weekInfo","weeksTarget","setWeekAll","dayOfYearData","getSetQuarter","localeWeek","localeFirstDayOfWeek","localeFirstDayOfYear","getSetWeek","getSetISOWeek","parseWeekday","weekdaysParse","localeWeekdays","_weekdays","isFormat","localeWeekdaysShort","_weekdaysShort","localeWeekdaysMin","_weekdaysMin","localeWeekdaysParse","weekdayName","_weekdaysParse","_minWeekdaysParse","_shortWeekdaysParse","_fullWeekdaysParse","weekdays","weekdaysShort","weekdaysMin","getSetDayOfWeek","getDay","getSetLocaleDayOfWeek","getSetISODayOfWeek","getSetDayOfYear","hFormat","lowercase","matchMeridiem","_meridiemParse","localeIsPM","charAt","localeMeridiem","isLower","parseMs","getZoneAbbr","getZoneName","moment__createUnix","moment__createInZone","parseZone","locale_calendar__calendar","_calendar","_longDateFormat","formatUpper","toUpperCase","_invalidDate","_ordinal","preParsePostFormat","relative__relativeTime","isFuture","_relativeTime","pastFuture","locale_set__set","_ordinalParseLenient","_ordinalParse","source","lists__get","setter","list","count","out","lists__listMonths","lists__listMonthsShort","lists__listWeekdays","lists__listWeekdaysShort","lists__listWeekdaysMin","duration_abs__abs","mathAbs","duration_add_subtract__addSubtract","duration_add_subtract__add","duration_add_subtract__subtract","absCeil","bubble","monthsFromDays","monthsToDays","daysToMonths","as","duration_as__valueOf","makeAs","alias","duration_get__get","makeGetter","substituteTimeAgo","relativeTime","duration_humanize__relativeTime","posNegDuration","thresholds","duration_humanize__getSetRelativeTimeThreshold","threshold","limit","withSuffix","iso_string__toISOString","iso_string__abs","Y","D","asSeconds","match1","match2","match3","match4","match6","match1to2","match3to4","match5to6","match1to3","match1to4","match1to6","matchUnsigned","matchSigned","matchTimestamp","matchWord","defaultLocaleMonths","defaultLocaleMonthsShort","defaultMonthsShortRegex","defaultMonthsRegex","parseTwoDigitYear","getSetYear","prototypeMin","prototypeMax","add_subtract__add","add_subtract__subtract","lang","isoWeekYear","defaultLocaleWeek","getSetDayOfMonth","defaultLocaleWeekdays","defaultLocaleWeekdaysShort","defaultLocaleWeekdaysMin","_isPm","pos","pos1","pos2","defaultLocaleMeridiemParse","getSetHour","getSetMinute","getSetSecond","getSetMillisecond","momentPrototype__proto","get","isoWeeks","isoWeeksInYear","isDST","isDSTShifted","zoneAbbr","zoneName","dates","zone","momentPrototype","defaultCalendar","sameDay","nextDay","nextWeek","lastDay","lastWeek","sameElse","defaultLongDateFormat","LTS","LT","L","LL","LLL","LLLL","defaultInvalidDate","defaultOrdinal","defaultOrdinalParse","defaultRelativeTime","future","past","mm","hh","dd","MM","yy","prototype__proto","firstDayOfYear","firstDayOfWeek","ordinalParse","langData","asMilliseconds","asMinutes","asHours","asDays","asWeeks","asMonths","asYears","duration_prototype__proto","toIsoString","version","invalid","relativeTimeThreshold","_moment","webpackPolyfill","paths","children","webpackContext","req","resolve","buf","ii","oct","_hexToByte","unparse","bth","_byteToHex","v1","clockseq","_clockseq","msecs","nsecs","_lastNSecs","dt","_lastMSecs","tl","tmh","node","_nodeId","n","rnds","random","rng","_rng","globalVar","crypto","getRandomValues","_rnds8","Uint8Array","_rnds","_seedBytes","prepareElements","JSONcontainer","elementType","redundant","used","cleanupElements","resetElements","getSVGElement","svgContainer","shift","document","createElementNS","appendChild","getDOMElement","DOMContainer","insertBefore","createElement","drawPoint","x","groupTemplate","labelObj","point","setAttributeNS","size","label","xOffset","yOffset","content","textContent","drawBar","width","height","rect","_options","_fieldId","fieldId","_type","_subscribers","setOptions","queue","_queue","destroy","on","subscribers","subscribe","off","filter","unsubscribe","_trigger","params","senderId","concat","subscriber","addedIds","me","_addItem","update","updatedIds","oldData","updatedData","addOrUpdate","oldItem","_updateItem","ids","firstType","returnType","allowedValues","itemIds","itemId","_getItem","order","_sort","_filterFields","resultant","getIds","getDataSet","mappedItems","filteredItem","itemFields","av","bv","remove","removedId","removedIds","_remove","clear","maxField","itemField","minField","distinct","fieldType","exists","types","raw","converted","JSON","stringify","delay","Infinity","_timeout","_extended","_flushIfNeeded","flush","methods","original","method","context","entry","clearTimeout","_ids","_onEvent","setData","refresh","oldIds","newIds","added","removed","viewOptions","getArguments","defaultFilter","dataSet","updated","container","SyntaxError","containerElement","margin","defaultXCenter","defaultYCenter","xLabel","yLabel","zLabel","passValueFn","xValueLabel","yValueLabel","zValueLabel","filterLabel","legendLabel","STYLE","DOT","showPerspective","showGrid","keepAspectRatio","showShadow","showGrayBottom","showTooltip","verticalRatio","animationInterval","animationPreload","camera","setArmRotation","setArmLength","eye","dataTable","dataPoints","colX","colY","colZ","colValue","colFilter","xMin","xStep","xMax","yMin","yStep","yMax","zMin","zStep","zMax","valueMin","valueMax","xBarWidth","yBarWidth","axisColor","gridColor","dataColor","fill","stroke","strokeWidth","dotSizeRatio","getMouseX","clientX","targetTouches","getMouseY","clientY","Emitter","_setScale","z","xCenter","yCenter","zCenter","setArmLocation","_convert3Dto2D","point3d","translation","_convertPointToTranslation","_convertTranslationToScreen","ax","ay","az","cx","getCameraLocation","cy","cz","sinTx","sin","getCameraRotation","cosTx","cos","sinTy","cosTy","sinTz","cosTz","dx","dy","dz","bx","by","ex","ey","ez","getArmLength","xcenter","frame","canvas","clientWidth","ycenter","_setBackgroundColor","backgroundColor","borderColor","borderWidth","borderStyle","BAR","BARCOLOR","BARSIZE","DOTLINE","DOTCOLOR","DOTSIZE","GRID","LINE","SURFACE","_getStyleNumber","styleName","_determineColumnIndexes","getNumberOfColumns","getNumberOfRows","counter","column","getDistinctValues","distinctValues","getColumnRange","minMax","_dataInitialize","rawData","_onChange","dataFilter","setOnLoadCallback","redraw","withBars","defaultXBarWidth","dataX","defaultYBarWidth","dataY","xRange","defaultXMin","defaultXMax","defaultXStep","yRange","defaultYMin","defaultYMax","defaultYStep","zRange","defaultZMin","defaultZMax","defaultZStep","valueRange","defaultValueMin","defaultValueMax","_getDataPoints","sortNumber","dataMatrix","xIndex","yIndex","trans","screen","bottom","pointRight","pointTop","pointCross","position","noCanvas","fontWeight","padding","innerHTML","onmousedown","_onMouseDown","ontouchstart","_onTouchStart","onmousewheel","_onWheel","ontooltip","_onTooltip","onkeydown","setSize","_resizeCanvas","clientHeight","animationStart","slider","play","animationStop","stop","_resizeCenter","setCameraPosition","horizontal","vertical","distance","getCameraPosition","getArmRotation","_readData","_redrawFilter","animationAutoStart","cameraPosition","styleNumber","tooltip","showAnimationControls","_redrawSlider","_redrawClear","_redrawAxis","_redrawDataGrid","_redrawDataLine","_redrawDataBar","_redrawDataDot","_redrawInfo","_redrawLegend","ctx","getContext","clearRect","widthMin","widthMax","dotSize","right","lineWidth","font","ymin","ymax","_hsv2rgb","strokeStyle","beginPath","moveTo","lineTo","strokeRect","fillStyle","closePath","gridLineLen","step","start","getCurrent","end","textAlign","textBaseline","fillText","visible","setValues","setPlayInterval","onchange","getIndex","selectValue","setOnChangeCallback","lineStyle","getLabel","getSelectedValue","prettyStep","text","xText","yText","zText","xMin2d","xMax2d","gridLenX","gridLenY","textMargin","armAngle","H","S","V","R","G","B","C","Hi","X","cross","topSideVisible","zAvg","lineJoin","lineCap","transBottom","dist","sortDepth","aDiff","bDiff","crossproduct","crossProduct","_getStrokeWidth","radius","arc","PI","surface","corners","xWidth","yWidth","surfaces","center","avg","transCenter","leftButtonDown","_onMouseUp","which","button","touchDown","startMouseX","startMouseY","startStart","startEnd","startArmRotation","cursor","onmousemove","_onMouseMove","onmouseup","diffX","diffY","horizontalNew","verticalNew","snapAngle","snapValue","parameters","emit","boundingRect","mouseX","mouseY","tooltipTimeout","_hideTooltip","dataPoint","_dataPointFromXY","_showTooltip","ontouchmove","_onTouchMove","ontouchend","_onTouchEnd","wheelDelta","detail","oldLength","newLength","_insideTriangle","triangle","bs","cs","distMax","closestDataPoint","closestDist","triangle1","triangle2","distX","distY","sqrt","line","dot","dom","borderRadius","boxShadow","borderLeft","contentWidth","offsetWidth","contentHeight","offsetHeight","lineHeight","dotWidth","dotHeight","mixin","_callbacks","once","self","removeListener","removeAllListeners","callbacks","cb","listeners","hasListeners","sub","sum","armLocation","armRotation","armLength","cameraLocation","cameraRotation","calculateCameraOrientation","rot","graph","onLoadCallback","loadInBackground","isLoaded","getLoadedProgress","getColumn","getValues","getValue","dataView","progress","prev","bar","MozBorderRadius","slide","onclick","togglePlay","onChangeCallback","playTimeout","playInterval","playLoop","setIndex","playNext","interval","clearInterval","getPlayInterval","setPlayLoop","doLoop","onChange","indexToLeft","startClientX","startSlideX","leftToIndex","_start","_end","_step","precision","_current","setRange","setStep","calculatePrettyStep","log10","log","LN10","step1","step2","step5","toPrecision","getStep","groups","forthArgument","defaultOptions","autoResize","throttleRedraw","orientation","axis","maxHeight","minHeight","_create","body","domProps","emitter","bind","hiddenDates","getScale","timeAxis","toScreen","_toScreen","toGlobalScreen","_toGlobalScreen","toTime","_toTime","toGlobalTime","_toGlobalTime","range","timeAxis2","currentTime","itemSet","itemsData","groupsData","getEventProperties","oncontextmenu","fitDone","getItemRange","setWindow","animation","fit","setGroups","setItems","_redraw","Configurator","Validator","printStyle","configureOptions","_createConfigurator","markDirty","refreshItems","errorFound","validate","selection","getSelection","setSelection","newDataSet","focus","itemData","_this","getDataRange","minItem","maxItem","factor","lhs","rhs","getStart","getEnd","show","repositionX","getWidthLeft","getWidthRight","dataset","centerContainer","itemFromTarget","group","groupFromTarget","customTime","customTimeFromTarget","snap","snappedTime","what","foreground","labelSet","groupId","pageX","srcEvent","pageY","propagating","__WEBPACK_AMD_DEFINE_FACTORY__","__WEBPACK_AMD_DEFINE_ARRAY__","__WEBPACK_AMD_DEFINE_RESULT__","_firstTarget","hammer","events","propagatedHandler","_handled","stopped","stopPropagation","srcStop","firstTarget","elemHammer","_handlers","Manager","PropagatingHammer","o","assign","wrapper","pointerType","isFirst","handler","eventType","hammers","idx","exportName","setTimeoutContext","bindFn","invokeArrayArg","arg","each","iterator","message","deprecationMessage","inherit","child","properties","childP","baseP","_super","boolOrFn","TYPE_FUNCTION","ifUndefined","val1","val2","addEventListeners","splitStr","removeEventListeners","inStr","str","find","inArray","src","findByKey","uniqueArray","results","prefixed","property","prefix","camelProp","VENDOR_PREFIXES","uniqueId","_uniqueId","getWindowForElement","doc","ownerDocument","defaultView","parentWindow","Input","manager","inputTarget","domHandler","ev","enable","init","createInputInstance","Type","inputClass","SUPPORT_POINTER_EVENTS","PointerEventInput","SUPPORT_ONLY_TOUCH","TouchInput","SUPPORT_TOUCH","TouchMouseInput","MouseInput","inputHandler","pointersLen","pointers","changedPointersLen","changedPointers","INPUT_START","isFinal","INPUT_END","INPUT_CANCEL","session","computeInputData","recognize","prevInput","pointersLength","firstInput","simpleCloneInputData","firstMultiple","offsetCenter","getCenter","timeStamp","deltaTime","angle","getAngle","getDistance","computeDeltaXY","offsetDirection","getDirection","deltaX","deltaY","overallVelocity","getVelocity","overallVelocityX","overallVelocityY","rotation","getRotation","maxPointers","computeIntervalInputData","offsetDelta","prevDelta","velocity","velocityX","velocityY","last","lastInterval","COMPUTE_INTERVAL","DIRECTION_NONE","DIRECTION_LEFT","DIRECTION_RIGHT","DIRECTION_UP","DIRECTION_DOWN","PROPS_XY","atan2","PROPS_CLIENT_XY","evEl","MOUSE_ELEMENT_EVENTS","evWin","MOUSE_WINDOW_EVENTS","allow","pressed","POINTER_ELEMENT_EVENTS","POINTER_WINDOW_EVENTS","store","pointerEvents","SingleTouchInput","evTarget","SINGLE_TOUCH_TARGET_EVENTS","SINGLE_TOUCH_WINDOW_EVENTS","started","normalizeSingleTouches","all","touches","changed","changedTouches","TOUCH_TARGET_EVENTS","targetIds","getTouches","allTouches","INPUT_MOVE","identifier","changedTargetTouches","touch","mouse","TouchAction","cleanTouchActions","actions","TOUCH_ACTION_NONE","hasPanX","TOUCH_ACTION_PAN_X","hasPanY","TOUCH_ACTION_PAN_Y","TOUCH_ACTION_MANIPULATION","TOUCH_ACTION_AUTO","Recognizer","state","STATE_POSSIBLE","simultaneous","requireFail","stateStr","STATE_CANCELLED","STATE_ENDED","STATE_CHANGED","STATE_BEGAN","directionStr","getRecognizerByNameIfManager","otherRecognizer","recognizer","AttrRecognizer","PanRecognizer","pX","pY","PinchRecognizer","PressRecognizer","_timer","_input","RotateRecognizer","SwipeRecognizer","TapRecognizer","pTime","pCenter","recognizers","preset","handlers","touchAction","toggleCssProps","recognizeWith","requireFailure","cssProps","triggerDomEvent","gestureEvent","createEvent","initEvent","gesture","dispatchEvent","TEST_ELEMENT","nextKey","dest","merge","MOBILE_REGEX","INPUT_TYPE_TOUCH","INPUT_TYPE_PEN","INPUT_TYPE_MOUSE","INPUT_TYPE_KINECT","DIRECTION_HORIZONTAL","DIRECTION_VERTICAL","DIRECTION_ALL","MOUSE_INPUT_MAP","mousedown","mousemove","mouseup","POINTER_INPUT_MAP","pointerdown","pointermove","pointerup","pointercancel","pointerout","IE10_POINTER_TYPE_ENUM",2,3,4,5,"MSPointerEvent","PointerEvent","removePointer","eventTypeNormalized","isTouch","storeIndex","pointerId","SINGLE_TOUCH_INPUT_MAP","touchstart","touchmove","touchend","touchcancel","TOUCH_INPUT_MAP","inputEvent","inputData","isMouse","PREFIXED_TOUCH_ACTION","NATIVE_TOUCH_ACTION","TOUCH_ACTION_COMPUTE","compute","getTouchAction","preventDefaults","prevented","hasNone","isTapPointer","isTapMovement","isTapTouchTime","preventSrc","STATE_RECOGNIZED","STATE_FAILED","dropRecognizeWith","dropRequireFailure","hasRequireFailures","canRecognizeWith","additionalEvent","tryEmit","canEmit","inputDataClone","process","reset","attrTest","optionPointers","isRecognized","directionTest","hasMoved","inOut","validPointers","validMovement","validTime","taps","posThreshold","validTouchTime","failTimeout","validInterval","validMultiTap","tapCount","VERSION","domEvents","userSelect","touchSelect","touchCallout","contentZooming","userDrag","tapHighlightColor","STOP","FORCED_STOP","force","curRecognizer","existing","Tap","Pan","Swipe","Pinch","Rotate","Press","freeGlobal","deltaDifference","scaleOffset","startToFront","endToFront","moveable","zoomable","zoomMin","zoomMax","animationTimer","_onDragStart","_onDrag","_onDragEnd","_onMouseWheel","_onTouch","_onPinch","validateDirection","getPointer","byUser","finalStart","finalEnd","_cancelAnimation","initStart","initEnd","easingName","easingFunction","initTime","anyChanged","dragging","ease","done","_applyRange","updateHiddenDates","newStart","newEnd","getRange","conversion","totalHidden","previousDelta","_isInsideRange","allowDragging","getHiddenDurationBetween","diffRange","safeStart","snapAwayFromHidden","safeEnd","startDate","endDate","zoomKey","pointer","pointerDate","_pointerToDate","zoom","centerDate","hiddenDuration","hiddenDurationBefore","getHiddenDurationBefore","hiddenDurationAfter","move","onTouch","onRelease","offTouch","offRelease","_isResized","resized","_previousWidth","_previousHeight","convertHiddenOptions","repeat","dateItem","totalRange","pixelTime","runUntil","dayOffset","removeDuplicates","startHidden","isHidden","endHidden","rangeStart","rangeEnd","hidden","safeDates","printDates","stepOverHiddenDates","timeStep","previousTime","stepInHidden","currentValue","current","switchedYear","switchedMonth","switchedDay","correctTimeForHidden","totalDuration","partialDuration","accumulatedHiddenDuration","getAccumulatedHiddenDuration","newTime","timeOffset","requiredDuration","previousPoint","correctionEnabled","hammerUtil","Activator","onMouseWheel","isActive","backgroundVertical","backgroundHorizontal","leftContainer","rightContainer","shadowTop","shadowBottom","shadowTopLeft","shadowBottomLeft","shadowTopRight","shadowBottomRight","initialDrawDone","_redrawTimer","scrollTop","scrollTopMin","customTimes","redrawCount","drawPoints","onRender","clickToUse","activator","_initAutoResize","component","configurator","configure","appliedOptions","setModuleOptions","_origRedraw","active","_stopAutoResize","setCustomTime","getCustomTime","setCustomTimeTitle","title","setCustomTitle","addCustomTime","timestamp","some","removeCustomTime","getVisibleItems","getWindow","borderRootHeight","borderRootWidth","autoHeight","containerHeight","centerWidth","_updateScrollTop","visibilityTop","visibilityBottom","visibility","MAX_REDRAW","repaint","setCurrentTime","getCurrentTime","_startAutoResize","_onResize","lastWidth","lastHeight","watchTimer","setInterval","initialScrollTop","oldScrollTop","_getScrollTop","newScrollTop","_setScrollTop","align","groupOrderSwap","fromGroup","toGroup","targetOrder","groupOrder","selectable","multiselect","itemsAlwaysDraggable","editable","updateTime","updateGroup","groupEditable","onAdd","onUpdate","onMove","onRemove","onMoving","onAddGroup","onMoveGroup","onRemoveGroup","itemOptions","itemListeners","_onAdd","_onUpdate","_onRemove","groupListeners","_onAddGroups","_onUpdateGroups","_onRemoveGroups","groupIds","stackDirty","touchParams","groupTouchParams","UNGROUPED","BACKGROUND","box","_updateUngrouped","backgroundGroup","_onSelectItem","_onMultiSelectItem","_onAddItem","groupHammer","_onGroupDragStart","_onGroupDrag","_onGroupDragEnd","addCallback","dirty","displayed","hide","unselect","select","rawVisibleItems","visibleItems","_deselect","_orderGroups","visibleInterval","zoomed","lastVisibleInterval","restack","firstGroup","_firstGroup","firstMargin","nonFirstMargin","groupMargin","groupResized","firstGroupIndex","firstGroupId","ungrouped","_getGroupId","getLabelSet","oldItemsData","getItems","_order","getGroups","removeItem","_getType","selected","_removeItem","groupData","groupOptions","oldGroupId","oldSubGroupId","subgroup","oldGroup","_constructByEndArray","endArray","dragLeftItem","dragRightItem","itemProps","_getGroupIndex","initialX","dragLeft","_cloneItemData","dragRight","selectedItem","baseGroupIndex","itemsToDrag","groupIndex","groupOffset","ctrlKey","metaKey","_onDragStartAddItem","xAbs","newItem","offsetLeft","updateGroupAllowed","newGroupBase","initial","updateTimeAllowed","initialStart","initialEnd","newOffset","_moveToGroup","originalOrder","movingUp","targetGroupTop","draggedGroupHeight","targetGroupHeight","targetGroup","draggedGroup","newOrder","origOrder","draggedId","numGroups","curPos","orgOffset","slippedPosition","switchGroup","shouldBeGroup","switchGroupId","shiftKey","oldSelection","newSelection","newItemData","itemGroup","lastSelectedGroup","multiselectPerGroup","_getItemRange","_item","itemSetFromTarget","minimumStep","autoScale","FORMAT","minorLabels","majorLabels","setMoment","setFormat","setMinimumStep","roundToMinor","hasNext","setScale","setAutoScale","stepYear","stepMonth","stepDay","stepHour","stepMinute","stepSecond","stepMillisecond","isMajor","getLabelMinor","getLabelMajor","getClassName","even","today","currentWeek","currentMonth","currentYear","subgroups","subgroupIndex","subgroupOrderer","subgroupOrder","byStart","byEnd","checkRangedItems","inner","marker","Element","getLabelWidth","markerHeight","lastMarkerHeight","_calculateSubGroupHeights","limitSize","customOrderedItems","_updateVisibleItems","nostack","_calculateHeight","offsetTop","repositionY","resetSubgroups","setParent","orderSubgroups","_checkIfVisible","sortArray","sortField","itemIndex","removeFromDataSet","startArray","orderByStart","orderByEnd","oldVisibleItems","visibleItemsLookup","lowerBound","upperBound","searchFunction","_checkIfVisibleWithReference","initialPosByStart","_traceVisible","initialPosByEnd","initialPos","breakCondition","isVisible","EPSILON","aTime","bTime","iMax","collidingItem","jj","collision","newTop","baseClassName","_updateContents","_updateTitle","_updateDataAttributes","_updateStyle","getComputedStyle","maxWidth","_repaintDeleteButton","_repaintDragLeft","_repaintDragRight","contentLeft","parentWidth","boxWidth","groupChanged","deleteButton","template","_contentToString","removeAttribute","dataAttributes","attributes","setAttribute","outerHTML","itemSetHeight","marginLeft","onTop","itemSubgroup","totalHeight","newHeight","lines","majorTexts","minorTexts","lineTop","showMinorLabels","showMajorLabels","maxMinorChars","parentChanged","_calculateCharSize","minorLabelHeight","minorCharHeight","majorLabelHeight","majorCharHeight","minorLineHeight","minorLineWidth","majorLineHeight","majorLineWidth","foregroundNextSibling","nextSibling","backgroundNextSibling","_repaintLabels","timeLabelsize","minorCharWidth","xNext","nextIsMajor","prevWidth","labelMinor","xFirstMajorLabel","MAX","showMinorGrid","_repaintMinorText","_repaintMajorText","_repaintMajorLine","_repaintMinorLine","warnedForOverflow","leftTime","leftText","widthText","majorCharWidth","pop","createTextNode","childNodes","nodeValue","measureCharMinor","measureCharMajor","overlay","_onTapOverlay","onClick","_hasParent","deactivate","escListener","activate","display","unbind","_exportFunctions","_bound","keydown","keyup","_keys","fromCharCode","down","handleEvent","up","keyCode","bound","bindAll","getKey","newBindings","eventParams","drag","warned","substring","showCurrentTime","currentTimeTimer","_interopRequireDefault","__esModule","default","_classCallCheck","instance","Constructor","defineProperty","_createClass","defineProperties","descriptor","enumerable","configurable","writable","protoProps","staticProps","_ColorPicker","_ColorPicker2","parentModule","defaultContainer","pixelRatio","changedOptions","allowCreation","initialized","popupCounter","showButton","moduleOptions","domElements","popupDiv","popupLimit","popupHistory","colorPicker","_removePopup","_clean","_handleObject","_makeItem","_makeHeader","generateButton","_printOptions","onmouseover","onmouseout","optionsContainer","_push","_showPopupIfNeeded","path","_arguments","_this2","_len","_key","_ret2","div","objectLabel","selectedValue","_update","_makeLabel","err","popupString","popupValue","oninput","_setupPopup","_this3","html","hideTimeout","deleteTimeout","_this4","correspondingElement","checkbox","checked","_this5","defaultColor","_showColorPicker","_this6","insertTo","setColor","setUpdateCallback","colorString","setCloseCallback","checkOnly","visibleInSet","subObj","newPath","_getValue","_handleArray","_makeTextInput","_makeCheckbox","draw","physics","solver","enabledPath","enabledValue","error","_makeColorField","_makeDropdown","_makeRange","_constructOptions","optionsObj","getOptions","ColorPicker","generated","centerCoordinates","hueCircle","initialColor","previousColor","applied","updateCallback","closeCallback","_bindHammer","_setSize","htmlColors","black","navy","darkblue","mediumblue","darkgreen","teal","darkcyan","deepskyblue","darkturquoise","mediumspringgreen","lime","springgreen","aqua","cyan","midnightblue","dodgerblue","lightseagreen","forestgreen","seagreen","darkslategray","limegreen","mediumseagreen","turquoise","royalblue","steelblue","darkslateblue","mediumturquoise","indigo","darkolivegreen","cadetblue","cornflowerblue","mediumaquamarine","dimgray","slateblue","olivedrab","slategray","lightslategray","mediumslateblue","lawngreen","chartreuse","aquamarine","maroon","purple","olive","gray","skyblue","lightskyblue","blueviolet","darkred","darkmagenta","saddlebrown","darkseagreen","lightgreen","mediumpurple","darkviolet","palegreen","darkorchid","yellowgreen","sienna","brown","darkgray","lightblue","greenyellow","paleturquoise","lightsteelblue","powderblue","firebrick","darkgoldenrod","mediumorchid","rosybrown","darkkhaki","silver","mediumvioletred","indianred","peru","chocolate","tan","lightgrey","palevioletred","thistle","orchid","goldenrod","crimson","gainsboro","plum","burlywood","lightcyan","lavender","darksalmon","violet","palegoldenrod","lightcoral","khaki","aliceblue","honeydew","azure","sandybrown","wheat","beige","whitesmoke","mintcream","ghostwhite","salmon","antiquewhite","linen","lightgoldenrodyellow","oldlace","fuchsia","magenta","deeppink","orangered","tomato","hotpink","coral","darkorange","lightsalmon","orange","lightpink","pink","gold","peachpuff","navajowhite","moccasin","bisque","mistyrose","blanchedalmond","papayawhip","lavenderblush","seashell","cornsilk","lemonchiffon","floralwhite","snow","yellow","lightyellow","ivory","white","setInitial","htmlColor","_isColorString","rgbaArray","rgbObj","alpha","_setColor","_generateHueCircle","storePrevious","_hide","_updatePicker","alert","angleConvert","colorPickerSelector","colorPickerCanvas","pixelRation","devicePixelRatio","webkitBackingStorePixelRatio","mozBackingStorePixelRatio","msBackingStorePixelRatio","oBackingStorePixelRatio","backingStorePixelRatio","setTransform","putImageData","circle","brightnessRange","opacityRange","initialColorDiv","newColorDiv","colorPickerDiv","opacityDiv","brightnessDiv","arrowDiv","_setOpacity","_setBrightness","brightnessLabel","opacityLabel","cancelButton","applyButton","_apply","saveButton","_save","loadButton","_loadLast","pinch","_moveSelector","sat","hfac","sfac","fillRect","getImageData","centerY","centerX","newLeft","referenceOptions","subObject","usedOptions","check","__any__","getSuggestion","__type__","checkFields","referenceOption","refOptionObj","optionType","refOptionType","print","printLocation","localSearch","findInOptions","globalSearch","localSearchThreshold","globalSearchThreshold","indexMatch","closestMatch","recursive","closestMatchPath","lowerCaseOption","op","levenshteinDistance","matrix","boolean","any","function","null","groupsDraggable","linegraph","initialLoad","getLegend","isGroupVisible","yAxisLeft","yAxisRight","legendLeft","legendRight","screenToValue","yAxisOrientation","defaultGroup","sampling","graphHeight","shaded","barChart","sideBySide","interpolation","parametrization","dataAxis","legend","abortedGraphUpdate","updateSVGheight","updateSVGheightOnResize","forceGraphUpdate","lastStart","svgElements","groupsUsingDefaultStyles","svg","framework","Bars","Lines","Points","_removeGroup","_updateAllGroupData","removeGroup","_updateGroup","addGroup","groupsContent","groupCounts","extended","orginalY","_updateGraph","rangePerPixelInv","_getSortedGroupIds","grouplist","zIndex","bz","groupRanges","changeCalled","minDate","maxDate","_getRelevantData","_applySampling","_convertXcoordinates","_getYRanges","_updateYAxis","below","excludeFromStacking","_stack","_convertYcoordinates","calcPath","subGroupId","drawShading","subData","subPrevPoint","subNextPoint","dateComparator","first","dataContainer","increment","amountOfPoints","xDistance","pointsPerPixel","sampledData","combinedDataLeft","combinedDataRight","getYRange","getStackedYRange","minVal","maxVal","yAxisLeftUsed","yAxisRightUsed","minLeft","minRight","maxLeft","maxRight","ignore","_toggleAxisVisiblity","drawIcons","master","masterAxis","lineOffset","tempGroups","axisUsed","datapoints","screen_x","screen_y","svgHeight","convertValue","setZeroPosition","linegraphOptions","icons","majorLinesOffset","minorLinesOffset","labelOffsetX","labelOffsetY","iconWidth","alignZeros","linegraphSVG","DOMelements","labels","conversionFactor","minWidth","stepPixels","zeroCrossing","amountOfSteps","iconsRemoved","amountOfGroups","lineContainer","graphOptions","_redrawGroupIcons","iconHeight","iconOffset","groupArray","_cleanupIcons","activeGroups","_redrawLabels","_redrawTitle","customRange","autoScaleEnd","autoScaleStart","followScale","maxLabelSize","getLines","major","_redrawLabel","_redrawLine","titleWidth","titleCharHeight","characterHeight","largestWidth","textMinor","textMajor","textTitle","measureCharTitle","titleCharWidth","zeroAlign","formattingFunction","majorSteps","minorSteps","customLines","minorStepIdx","magnitudefactor","determineScale","rounded","setCharHeight","setHeight","minimumStepValue","orderOfMagnitude","solutionFound","stepSize","is_major","getFirstMajor","majorStep","formatValue","bottomOffset","oldStepIdx","oldStart","oldEnd","increaseMagnitude","decreaseMagnitude","otherZero","otherStep","newRange","myOriginalZero","majorOffset","zeroOffset","pixels","usingDefaultStyle","zeroPosition","drawIcon","icon","Bargraph","fillHeight","outline","barWidth","originalWidth","bar1Height","bar2Height","processedGroupData","coreDistance","drawData","combinedData","intersections","barPoints","_getDataIntersections","heightOffset","_getSafeDrawData","amount","resolved","accumulatedNegative","accumulatedPositive","pointData","groupLabel","_getStackedYRange","xpos","getGroupTemplate","callbackResult","getCallback","Line","_catmullRom","_linear","fillPath","pathArray","subPathArray","dFill","zero","serializePath","inverse","_catmullRomUniform","p0","bp1","bp2","normalization","d1","d2","d3","A","N","d3powA","d2powA","d3pow2A","d2pow2A","d1pow2A","d1powA","side","iconSize","iconSpacing","excludeFromLegend","textArea","scrollableHeight","drawLegendIcons","paddingTop","nodes","nodeIndices","edges","edgeIndices","eventListeners","onTap","onDoubleTap","onHold","onDragStart","onDrag","onDragEnd","onPinch","onMouseMove","onContext","functions","createNode","createEdge","view","bindEventListeners","images","_modulesGroups2","_modulesCanvas2","selectionHandler","_modulesSelectionHandler2","interactionHandler","_modulesInteractionHandler2","_modulesView2","renderer","_modulesCanvasRenderer2","_modulesPhysicsEngine2","layoutEngine","_modulesLayoutEngine2","clustering","_modulesClustering2","manipulation","_modulesManipulationSystem2","nodesHandler","_modulesNodesHandler2","edgesHandler","_modulesEdgesHandler2","_modulesKamadaKawaiJs2","_modulesGroups","_modulesNodesHandler","_modulesEdgesHandler","_modulesPhysicsEngine","_modulesClustering","_modulesCanvasRenderer","_modulesCanvas","_modulesView","_modulesInteractionHandler","_modulesSelectionHandler","_modulesLayoutEngine","_modulesManipulationSystem","_sharedConfigurator","_sharedConfigurator2","_sharedValidator","_sharedValidator2","_optionsJs","_modulesKamadaKawaiJs","layout","interaction","networkOptions","_updateVisibleIndices","nodeId","edgeId","_updateValueRange","unselectAll","dotData","gephi","gephiData","valueTotal","setValueRange","canvasToDOM","DOMtoCanvas","findNode","isCluster","openCluster","cluster","getNodesInCluster","clusterByConnection","clusterByHubsize","clusterOutliers","getSeed","enableEditMode","disableEditMode","addNodeMode","editNode","editNodeMode","addEdgeMode","editEdgeMode","deleteSelected","getPositions","storePositions","moveNode","getBoundingBox","getConnectedNodes","objectId","getConnectedEdges","startSimulation","stopSimulation","stabilize","getSelectedNodes","getSelectedEdges","getNodeAt","getEdgeAt","edge","selectNodes","selectEdges","getViewPosition","releaseNode","getOptionsFromConfigurator","Groups","defaultIndex","groupsArray","defaultGroups","useDefaultGroups","optionFields","groupName","groupname","_componentsNode","_componentsNode2","_componentsSharedLabel","_componentsSharedLabel2","NodesHandler","nodesListeners","borderWidthSelected","brokenImage","fixed","face","strokeColor","image","labelHighlightBold","level","mass","scaling","maxVisible","drawThreshold","customScalingFunction","shadow","shape","shapeProperties","borderDashes","useImageSize","useBorderWithImage","parseOptions","updateShape","updateLabelModule","_reset","doNotEmit","oldNodesData","newNodes","positionInitially","changedData","dataChanged","constructorClass","clearPositions","dataArray","boundingBox","nodeList","nodeObj","toId","fromId","edgeList","_sharedLabel","_sharedLabel2","_nodesShapesBox","_nodesShapesBox2","_nodesShapesCircle","_nodesShapesCircle2","_nodesShapesCircularImage","_nodesShapesCircularImage2","_nodesShapesDatabase","_nodesShapesDatabase2","_nodesShapesDiamond","_nodesShapesDiamond2","_nodesShapesDot","_nodesShapesDot2","_nodesShapesEllipse","_nodesShapesEllipse2","_nodesShapesIcon","_nodesShapesIcon2","_nodesShapesImage","_nodesShapesImage2","_nodesShapesSquare","_nodesShapesSquare2","_nodesShapesStar","_nodesShapesStar2","_nodesShapesText","_nodesShapesText2","_nodesShapesTriangle","_nodesShapesTriangle2","_nodesShapesTriangleDown","_nodesShapesTriangleDown2","Node","imagelist","baseSize","baseFontSize","predefinedPosition","labelModule","currentShape","groupObj","imageObj","load","distanceToBorder","sizeDiff","fontDiff","updateBoundingBox","resize","parentOptions","newOptions","parsedColor","_slicedToArray","sliceIterator","_arr","_n","_e","_s","Symbol","Label","pointToSelf","fontOptions","yLine","nodeOptions","labelDirty","baseline","viewFontSize","calculateLabelSize","_drawBackground","_drawText","lineMargin","fontSize","_getColor2","_getColor","_getColor22","fontColor","_setAlignment2","_setAlignment","_setAlignment22","lineCount","strokeText","_processLabel","measureText","newOptionsArray","_inherits","subClass","superClass","setPrototypeOf","__proto__","_get","_x","_x2","_x3","_again","receiver","desc","getOwnPropertyDescriptor","getPrototypeOf","_utilNodeBase","_utilNodeBase2","Box","_NodeBase","textSize","getTextSize","selectionLineWidth","roundRect","enableShadow","disableShadow","save","enableBorderDashes","disableBorderDashes","restore","NodeBase","shadowColor","shadowBlur","shadowOffsetX","shadowOffsetY","setLineDash","dashes","_utilCircleImageBase","_utilCircleImageBase2","Circle","_CircleImageBase","diameter","_drawRawCircle","CircleImageBase","labelOffset","imageLoaded","ratio","neutralborderWidth","globalAlpha","drawImage","labelDimensions","CircularImage","_swapToImageResizeWhenImageLoaded","_resizeImage","clip","_drawImageAtPosition","_drawImageLabel","Database","database","_distanceToBorder","_utilShapeBase","_utilShapeBase2","Diamond","_ShapeBase","_resizeShape","_drawShape","ShapeBase","sizeMultiplier","Dot","Ellipse","ellipse","Icon","_icon","iconTextSpacing","Image","Square","Star","Text","Triangle","TriangleDown","_componentsEdge","_componentsEdge2","EdgesHandler","edgesListeners","arrows","scaleFactor","arrowStrikethrough","hoverWidth","selectionWidth","selfReferenceSize","smooth","forceDirection","roundness","emitChange","edgeData","edgeOptions","reconnectEdges","markAllEdgesAsDirty","updateEdgeType","oldEdgesData","edgesData","oldEdge","disconnect","showInternalIds","connect","cleanup","edgeType","colorDirty","_edgesCubicBezierEdge","_edgesCubicBezierEdge2","_edgesBezierEdgeDynamic","_edgesBezierEdgeDynamic2","_edgesBezierEdgeStatic","_edgesBezierEdgeStatic2","_edgesStraightEdge","_edgesStraightEdge2","Edge","baseWidth","connected","_setInteractionWidths","changeInType","attachEdge","detachEdge","widthDiff","viaNode","getViaNode","arrowData","fromPoint","toPoint","getArrowData","core","drawLine","drawArrows","drawLabel","drawArrowHead","node1","node2","getPoint","translate","_rotateForLabelAlignment","_pointOnCircle","xFrom","yFrom","xTo","yTo","xObj","yObj","getDistanceToEdge","angleInDegrees","rotate","percentage","colorsDefined","_x4","_x5","_utilCubicBezierEdgeBase","_utilCubicBezierEdgeBase2","CubicBezierEdge","_CubicBezierEdgeBase","viaNodes","via1","via2","bezierCurveTo","x1","y1","x2","y2","_getViaCoordinates","nearNode","_findBorderPositionBezier","x3","y3","_ref","_ref2","_getDistanceToBezierEdge","_ref3","_ref32","vec","_BezierEdgeBase2","_BezierEdgeBase3","CubicBezierEdgeBase","_BezierEdgeBase","minDistance","lastX","lastY","_getDistanceToLine","_EdgeBase2","_EdgeBase3","BezierEdgeBase","_EdgeBase","distanceToPoint","difference","via","EdgeBase","getColor","getLineWidth","_drawDashedLine","_drawLine","_line","_getCircleData2","_getCircleData","_getCircleData22","_circle","pattern","lineDashOffset","_getCircleData3","_getCircleData32","dashedLine","_getCircleData4","_getCircleData42","_findBorderPosition","_findBorderPositionCircle","_getCircleData5","_getCircleData52","colorOptions","grd","createLinearGradient","fromColor","toColor","addColorStop","_getDistanceToEdge","_getCircleData6","_getCircleData62","px","py","something","u","arrowPoint","guideOffset","findBorderPosition","guidePos","_getCircleData7","_getCircleData72","xi","yi","arrowCore","arrow","_utilBezierEdgeBase","_utilBezierEdgeBase2","BezierEdgeDynamic","_boundFunction","positionBezierNode","physicsChange","setupSupportNode","parentEdgeId","quadraticCurveTo","_x6","BezierEdgeStatic","xVia","yVia","pi","originalAngle","myAngle","_utilEdgeBase","_utilEdgeBase2","StraightEdge","edgeSegmentLength","toBorderDist","toBorderPoint","borderPos","_componentsPhysicsBarnesHutSolver","_componentsPhysicsBarnesHutSolver2","_componentsPhysicsRepulsionSolver","_componentsPhysicsRepulsionSolver2","_componentsPhysicsHierarchicalRepulsionSolver","_componentsPhysicsHierarchicalRepulsionSolver2","_componentsPhysicsSpringSolver","_componentsPhysicsSpringSolver2","_componentsPhysicsHierarchicalSpringSolver","_componentsPhysicsHierarchicalSpringSolver2","_componentsPhysicsCentralGravitySolver","_componentsPhysicsCentralGravitySolver2","_componentsPhysicsFA2BasedRepulsionSolver","_componentsPhysicsFA2BasedRepulsionSolver2","_componentsPhysicsFA2BasedCentralGravitySolver","_componentsPhysicsFA2BasedCentralGravitySolver2","PhysicsEngine","physicsBody","physicsNodeIndices","physicsEdgeIndices","forces","velocities","physicsEnabled","simulationInterval","requiresTimeout","previousStates","referenceState","freezeCache","renderTimer","adaptiveTimestep","adaptiveTimestepEnabled","adaptiveCounter","adaptiveInterval","stabilized","startedStabilization","stabilizationIterations","ready","barnesHut","theta","gravitationalConstant","centralGravity","springLength","springConstant","damping","avoidOverlap","forceAtlas2Based","repulsion","nodeDistance","hierarchicalRepulsion","maxVelocity","minVelocity","stabilization","iterations","updateInterval","onlyDynamicEdges","timestep","layoutFailed","initPhysics","updatePhysicsData","nodesSolver","edgesSolver","gravitySolver","modelOptions","viewFunction","simulationStep","_emitStabilized","startTime","physicsTick","physicsTime","runDoubleSpeed","amountOfIterations","calculateForces","moveNodes","revert","_evaluateStepQuality","nodeIds","positions","vx","vy","dpos","reference","maxNodeVelocity","averageNodeVelocity","velocityAdaptiveThreshold","nodeVelocity","_performStep","totalVelocity","solve","targetIterations","_freezeNodes","_stabilizationBatch","_finalizeStabilization","_restoreFrozenNodes","colorFactor","forceSize","arrowSize","BarnesHutSolver","barnesHutTree","randomSeed","thetaInversed","overlapAvoidanceFactor","nodeCount","_formBarnesHutTree","_getForceContribution","NW","NE","SW","SE","parentBranch","childrenCount","centerOfMass","calcSize","_calculateForces","gravityForce","fx","fy","minX","minY","maxX","maxY","minimumTreeSize","rootSize","halfRootSize","_splitBranch","_placeInTree","totalMass","totalMassInv","biggestSize","skipMassUpdate","_updateBranchMass","_placeInRegion","region","seededRandom","containedNode","_insertRegion","childSize","_drawBranch","branch","RepulsionSolver","repulsingForce","HierarchicalRepulsionSolver","steepness","SpringSolver","edgeLength","node3","_calculateSpringForce","springForce","HierarchicalSpringSolver","springFx","springFy","totalFx","totalFy","correctionFx","correctionFy","CentralGravitySolver","_BarnesHutSolver2","_BarnesHutSolver3","ForceAtlas2BasedRepulsionSolver","_BarnesHutSolver","degree","_CentralGravitySolver2","_CentralGravitySolver3","ForceAtlas2BasedCentralGravitySolver","_CentralGravitySolver","_NetworkUtil","_NetworkUtil2","_componentsNodesCluster","_componentsNodesCluster2","ClusterEngine","clusteredNodes","clusteredEdges","hubsize","_getHubSize","_checkOptions","nodesToCluster","refreshData","joinCondition","childNodesObj","childEdgesObj","clonedOptions","cloneOptions","_cluster","edgeCount","clusters","usedNodes","relevantEdgeCount","gatheringSuccessful","childNodeId","_getConnectedId","clusterByEdgeCount","clusterNodeProperties","parentNodeId","parentClonedOptions","childClonedOptions","clusterEdgeProperties","childNode","otherNodeId","childKeys","createEdges","_edge","newEdge","clusteringEdgeReplacingId","_backupEdgeOptions","processProperties","childNodesOptions","childEdgesOptions","clusterId","_getClusterPosition","clusterNode","containedNodes","containedEdges","_createClusterEdges","originalOptions","clusterNodeId","releaseFunction","clusterPosition","newPositions","edgesToBeDeleted","otherCluster","transferEdge","replacedEdge","_restoreEdge","nodesArray","reverse","average","averageSquared","hubCounter","largestHub","variance","standardDeviation","hubThreshold","NetworkUtil","allNodes","specificNodes","amountOfConnections","_Node2","_Node3","Cluster","_Node","requestAnimationFrame","mozRequestAnimationFrame","webkitRequestAnimationFrame","msRequestAnimationFrame","CanvasRenderer","redrawRequested","renderingActive","renderRequests","allowRedraw","hideEdgesOnDrag","hideNodesOnDrag","_determineBrowserMethod","_resizeNodes","_requestRedraw","_startRendering","cancelAnimationFrame","_renderStep","_drawEdges","_drawNodes","alwaysShow","topLeft","bottomRight","viewableArea","isSelected","isBoundingBoxOverlappingWith","browserType","Canvas","resizeTimer","resizeFunction","cameraState","hammerFrame","_cleanUp","previousWidth","previousHeight","widthRatio","heightRatio","newScale","currentViewCenter","distanceFromCenter","tabIndex","_prepareValue","emitEvent","oldWidth","oldHeight","previousRatio","_getCameraState","_setCameraState","_XconvertCanvasToDOM","_YconvertCanvasToDOM","_XconvertDOMtoCanvas","_YconvertDOMtoCanvas","View","animationSpeed","renderRefreshRate","animationEasingFunction","easingTime","sourceScale","targetScale","sourceTranslation","targetTranslation","lockedOnNodeId","lockedOnNodeOffset","touchTime","initialZoom","zoomLevel","positionDefined","numberOfNodes","yDistance","xZoomLevel","yZoomLevel","findCenter","animationOptions","nodePosition","lockedOnNode","animateView","locked","_transitionRedraw","viewCenter","_lockedRedraw","finished","_componentsNavigationHandler","_componentsNavigationHandler2","_componentsPopup","_componentsPopup2","InteractionHandler","navigationHandler","popup","popupObj","popupTimer","dragNodes","dragView","keyboard","speed","bindToWindow","navigationButtons","tooltipDelay","zoomView","pinched","checkSelectionChanges","_generateClickEvent","previouslySelectedEdgeCount","_getSelectedEdgeCount","previouslySelectedNodeCount","_getSelectedNodeCount","previousSelection","selectAdditionalOnPoint","selectOnPoint","selectedEdgesCount","selectedNodesCount","currentSelection","_determineIfDifferent2","_determineIfDifferent","nodesChanges","edgesChanges","nodeSelected","selectObject","selectionObj","xFixed","yFixed","scaleOld","preScaleDragPointer","scaleFrac","tx","ty","postScaleDragPointer","popupVisible","_checkHidePopup","setPosition","_checkShowPopup","hoverObject","pointerObj","previousPopupObjId","nodeUnderCursor","popupType","overlappingNodes","isOverlappingWith","getTitle","overlappingEdges","popupTargetType","popupTargetId","setText","_pointerToPositionObject","stillOnObj","overNode","NavigationHandler","iconsCreated","navigationHammers","boundFunctions","activated","configureKeyboardBindings","loadNavigationElements","cleanNavigation","navigationDOM","navigationDivs","navigationDivActions","_fit","bindToRedraw","_stopMovement","boundAction","unbindFromRedraw","Popup","doShow","SelectionHandler","hoverObj","selectConnectedEdges","hoverConnectedEdges","updateSelection","selectionChanged","deselectObject","emptySelection","DOM","highlightEdges","_selectConnectedEdges","_addToSelection","_removeFromSelection","canvasPos","returnNode","positionObject","_getAllNodesOverlappingWith","_getEdgesOverlappingWith","returnEdge","_getAllEdgesOverlappingWith","_unselectConnectedEdges","clusterSize","_addToHover","hoverChanged","blurObject","_hoverConnectedEdges","edgeIds","idArray","RangeError","LayoutEngine","initialRandomSeed","setPhysics","optionsBackup","improvedLayout","hierarchical","levelSeparation","nodeSpacing","treeSpacing","blockShifting","edgeMinimization","sortMethod","setupHierarchicalLayout","layoutNetwork","prevHierarchicalState","adaptAllOptionsForHierarchicalLayout","MAX_LEVELS","clusterThreshold","startLength","before","clusterBridges","after","_declusterAll","info","kamadaKawai","_shiftToCenter","getRangeCore","clustersPresent","definedLevel","definedPositions","undefinedLevel","hierarchicalLevels","lastNodeOnLevel","hierarchicalParents","hierarchicalChildren","hierarchicalTrees","treeIndex","distributionOrdering","distributionIndex","distributionOrderingPresence","_determineLevelsByHubsize","_determineLevelsDirected","_determineLevelsCustomCallback","distribution","_getDistribution","_generateMap","_placeNodesByHierarchy","_condenseHierarchy","stillShifting","branches","shiftTrees","treeSizes","getTreeSizes","shiftTree","_setPositionForHierarchy","getTreeSize","_getPositionForHierarchy","treeWidths","getBranchNodes","getBranchBoundary","branchMap","maxLevel","minSpace","maxSpace","branchNode","_getSpaceAroundNode2","_getSpaceAroundNode","_getSpaceAroundNode22","minSpaceNode","maxSpaceNode","getMaxLevel","getCollisionLevel","maxLevel1","maxLevel2","hasSameParent","parents1","parents2","parents","shiftElementsCloser","levels","centerParents","levelNodes","branchShiftCallback","centerParent","diffAbs","branchNodes1","branchNodes2","_getBranchBoundary","_getBranchBoundary2","max1","_getBranchBoundary3","_getBranchBoundary32","min2","minSpace2","diffBranch","_shiftBlock","_centerParent","minimizeEdgeLength","allEdges","nodeLevel","C2","referenceNodes","aboveEdges","otherNode","getFx","getDFx","getGuess","guess","guessMap","dfx","moveBranch","branchNodes","_getBranchBoundary4","_getBranchBoundary42","minSpaceBranch","maxSpaceBranch","branchOffset","_getSpaceAroundNode3","_getSpaceAroundNode32","newPosition","minimizeEdgeLengthBottomUp","shiftBranchesCloserBottomUp","centerAllParents","useMap","prevNode","prevPos","nextNode","nextPos","parentId","minPos","maxPos","_getSpaceAroundNode4","_getSpaceAroundNode42","positionedNodes","nodeArray","_indexArrayToNodes","_sortNodeArray","_placeBranchNodes","hubSize","levelDownstream","nodeA","nodeB","_crawlNetwork","minLevel","customCallback","levelByDirection","levelA","_setMinLevelToZero","fillInRelations","startingNodeId","crawler","parentLevel","childNodeLevel","previousPos","sharedParent","_findCommonParent","withChild","childA","childB","_this7","iterateParents","_parent","findParent","_parent2","foundParent","doNotUpdate","tree","ManipulationSystem","editMode","manipulationDiv","editModeDiv","closeDiv","manipulationHammers","temporaryUIFunctions","temporaryEventFunctions","temporaryIds","guiEnabled","inMode","selectedControlNode","initiallyActive","addNode","addEdge","editEdge","deleteNode","deleteEdge","controlNodeStyle","_restore","_setup","showManipulatorToolbar","_createEditButton","manipulationDOM","selectedNodeCount","selectedEdgeCount","selectedTotalCount","needSeperator","_createAddNodeButton","_createSeperator","_createAddEdgeButton","_createEditNodeButton","_createEditEdgeButton","_createDeleteButton","_bindHammerToDiv","toggleEditMode","_temporaryBindEvent","_createBackButton","_createDescription","_performAddNode","_getSelectedNode","finalizedData","_temporaryBindUI","_handleConnect","_finishConnect","_dragControlNode","edgeBeingEditedId","controlNodeFrom","_getNewTargetNode","controlNodeTo","_controlNodeTouch","_controlNodeDragStart","_controlNodeDrag","_controlNodeDragEnd","findBorderPositions","selectedNodes","selectedEdges","deleteFunction","_createWrappers","_removeManipulationDOM","_createButton","_cleanManipulatorHammers","_cleanupTemporaryNodesAndEdges","_unbindTemporaryUIs","_unbindTemporaryEvents","labelClassName","newFunction","boundFunction","UIfunctionName","functionName","eventName","domElement","indexTempEdge","indexTempNode","lastTouch","fromSelect","toSelect","overlappingNodeIds","_performEditEdge","targetNode","connectionEdge","connectFromId","_performAddEdge","clickData","defaultData","sourceNodeId","targetNodeId","_componentsAlgorithmsFloydWarshallJs","_componentsAlgorithmsFloydWarshallJs2","KamadaKawai","edgeStrength","distanceSolver","edgesArray","ignoreClusters","D_matrix","getDistances","_createL_matrix","_createK_matrix","innerThreshold","maxInnerIterations","maxEnergy","highE_nodeId","dE_dx","dE_dy","delta_m","subIterations","_getHighestEnergyNode2","_getHighestEnergyNode","_getHighestEnergyNode22","_moveNode","_getEnergy2","_getEnergy","_getEnergy22","maxEnergyNodeId","dE_dx_max","dE_dy_max","nodeIdx","_getEnergy3","_getEnergy32","x_m","y_m","iIdx","x_i","y_i","denominator","K_matrix","L_matrix","d2E_dx2","d2E_dxdy","d2E_dy2","FloydWarshall","CanvasRenderingContext2D","square","s2","ir","triangleDown","star","diamond","r2d","kappa","ox","oy","xe","ye","xm","ym","wEllipse","hEllipse","ymb","yeb","xt","yt","xl","yl","xr","yr","patternLength","slope","distRemaining","patternIndex","dashLength","parseDOT","parseGraph","nextPreview","isAlphaNumeric","regexAlphaNumeric","setValue","graphs","attr","getToken","tokenType","TOKENTYPE","NULL","isComment","DELIMITER","c2","DELIMITERS","IDENTIFIER","newSyntaxError","UNKNOWN","chop","parseStatements","parseStatement","subgraph","parseSubgraph","parseEdge","parseAttributeStatement","parseNodeStatement","subgraphs","parseAttributeList","maxLength","forEach2","elem1","elem2","setProp","convertAttr","mapping","visProp","visPropI","graphData","dotNode","graphNode","NODE_ATTR_MAPPING","convertEdge","dotEdge","graphEdge","EDGE_ATTR_MAPPING","subEdge","fontsize","fontcolor","labelfontcolor","fontname","fillcolor","labeltooltip","{","}","[","]",";","=",",","->","--","gephiJSON","inheritColor","gEdges","gNodes","gEdge","gNode","imageBroken","url","imageToCache","brokenUrl","imageToLoadBrokenUrlOn","onerror","_addImageToCache","imageToRedrawWith","cachedImage","img","onload","_redrawWithImage","_tryloadBrokenUrl","edit","del","back","addDescription","edgeDescription","editEdgeDescription","createEdgeError","deleteClusterError","editClusterError"],"mappings":"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","file":"vis.map"} \ No newline at end of file diff --git a/lib/vis/dist/vis.min.css b/lib/vis/dist/vis.min.css index ea6d1b6d77..cd227e3ffc 100644 --- a/lib/vis/dist/vis.min.css +++ b/lib/vis/dist/vis.min.css @@ -1 +1 @@ -.vis-panel,.vis-timeline{margin:0;padding:0;box-sizing:border-box}.vis-background,.vis-labelset,.vis-timeline{overflow:hidden}.vis .overlay{position:absolute;top:0;left:0;width:100%;height:100%;z-index:10}.vis-active{box-shadow:0 0 10px #86d5f8}.vis [class*=span]{min-height:0;width:auto}.vis-timeline{position:relative;border:1px solid #bfbfbf}.vis-panel{position:absolute}.vis-panel.vis-bottom,.vis-panel.vis-center,.vis-panel.vis-left,.vis-panel.vis-right,.vis-panel.vis-top{border:1px #bfbfbf}.vis-panel.vis-center,.vis-panel.vis-left,.vis-panel.vis-right{border-top-style:solid;border-bottom-style:solid;overflow:hidden}.vis-panel.vis-bottom,.vis-panel.vis-center,.vis-panel.vis-top{border-left-style:solid;border-right-style:solid}.vis-panel>.vis-content{position:relative}.vis-panel .vis-shadow{position:absolute;width:100%;height:1px;box-shadow:0 0 10px rgba(0,0,0,.8)}.vis-itemset,.vis-labelset,.vis-labelset .vis-label{box-sizing:border-box;position:relative}.vis-panel .vis-shadow.vis-top{top:-1px;left:0}.vis-panel .vis-shadow.vis-bottom{bottom:-1px;left:0}.vis-labelset .vis-label{left:0;top:0;width:100%;color:#4d4d4d;border-bottom:1px solid #bfbfbf}.vis-labelset .vis-label:last-child{border-bottom:none}.vis-labelset .vis-label .vis-inner{display:inline-block;padding:5px}.vis-labelset .vis-label .vis-inner.vis-hidden{padding:0}.vis-itemset{padding:0;margin:0}.vis-itemset .vis-background,.vis-itemset .vis-foreground{position:absolute;width:100%;height:100%;overflow:visible}.vis-axis{position:absolute;width:100%;height:0;left:0;z-index:1}.vis-foreground .vis-group{position:relative;box-sizing:border-box;border-bottom:1px solid #bfbfbf}.vis-foreground .vis-group:last-child{border-bottom:none}.vis-overlay{position:absolute;top:0;left:0;width:100%;height:100%;z-index:10}.vis-item{position:absolute;color:#1A1A1A;border-color:#97B0F8;border-width:1px;background-color:#D5DDF6;display:inline-block}.vis-item.vis-point.vis-selected,.vis-item.vis-selected{background-color:#FFF785}.vis-item.vis-selected{border-color:#FFC200;z-index:2}.vis-editable.vis-selected{cursor:move}.vis-item.vis-box{text-align:center;border-style:solid;border-radius:2px}.vis-item.vis-point{background:0 0}.vis-item.vis-dot{position:absolute;padding:0;border-width:4px;border-style:solid;border-radius:4px}.vis-item.vis-range{border-style:solid;border-radius:2px;box-sizing:border-box}.vis-item.vis-background{border:none;background-color:rgba(213,221,246,.4);box-sizing:border-box;padding:0;margin:0}.vis-item .vis-item-overflow{position:relative;width:100%;height:100%;padding:0;margin:0;overflow:hidden}.vis-item.vis-range .vis-item-content{position:relative;display:inline-block}.vis-item.vis-background .vis-item-content{position:absolute;display:inline-block}.vis-item.vis-line{padding:0;position:absolute;width:0;border-left-width:1px;border-left-style:solid}.vis-item .vis-item-content{white-space:nowrap;box-sizing:border-box;padding:5px}.vis-item .vis-delete{background:url(img/timeline/delete.png) center no-repeat;position:absolute;width:24px;height:24px;top:-4px;right:-24px;cursor:pointer}.vis-item.vis-range .vis-drag-left{position:absolute;width:24px;max-width:20%;min-width:2px;height:100%;top:0;left:-4px;cursor:w-resize}.vis-item.vis-range .vis-drag-right{position:absolute;width:24px;max-width:20%;min-width:2px;height:100%;top:0;right:-4px;cursor:e-resize}.vis-time-axis{position:relative;overflow:hidden}.vis-time-axis.vis-foreground{top:0;left:0;width:100%}.vis-time-axis.vis-background{position:absolute;top:0;left:0;width:100%;height:100%}.vis-time-axis .vis-text{position:absolute;color:#4d4d4d;padding:3px;overflow:hidden;box-sizing:border-box;white-space:nowrap}.vis-time-axis .vis-text.vis-measure{position:absolute;padding-left:0;padding-right:0;margin-left:0;margin-right:0;visibility:hidden}.vis-time-axis .vis-grid.vis-vertical{position:absolute;border-left:1px solid}.vis-time-axis .vis-grid.vis-minor{border-color:#e5e5e5}.vis-time-axis .vis-grid.vis-major{border-color:#bfbfbf}.vis-current-time{background-color:#FF7F6E;width:2px;z-index:1}.vis-custom-time{background-color:#6E94FF;width:2px;cursor:move;z-index:1}.vis-panel.vis-background.vis-horizontal .vis-grid.vis-horizontal{position:absolute;width:100%;height:0;border-bottom:1px solid}.vis-panel.vis-background.vis-horizontal .vis-grid.vis-minor{border-color:#e5e5e5}.vis-panel.vis-background.vis-horizontal .vis-grid.vis-major{border-color:#bfbfbf}.vis-data-axis .vis-y-axis.vis-major{width:100%;position:absolute;color:#4d4d4d;white-space:nowrap}.vis-data-axis .vis-y-axis.vis-major.vis-measure{padding:0;margin:0;border:0;visibility:hidden;width:auto}.vis-data-axis .vis-y-axis.vis-minor{position:absolute;width:100%;color:#bebebe;white-space:nowrap}.vis-data-axis .vis-y-axis.vis-minor.vis-measure{padding:0;margin:0;border:0;visibility:hidden;width:auto}.vis-data-axis .vis-y-axis.vis-title{position:absolute;color:#4d4d4d;white-space:nowrap;bottom:20px;text-align:center}.vis-data-axis .vis-y-axis.vis-title.vis-measure{padding:0;margin:0;visibility:hidden;width:auto}.vis-data-axis .vis-y-axis.vis-title.vis-left{bottom:0;-webkit-transform-origin:left top;-moz-transform-origin:left top;-ms-transform-origin:left top;-o-transform-origin:left top;transform-origin:left bottom;-webkit-transform:rotate(-90deg);-moz-transform:rotate(-90deg);-ms-transform:rotate(-90deg);-o-transform:rotate(-90deg);transform:rotate(-90deg)}.vis-data-axis .vis-y-axis.vis-title.vis-right{bottom:0;-webkit-transform-origin:right bottom;-moz-transform-origin:right bottom;-ms-transform-origin:right bottom;-o-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.vis-legend{background-color:rgba(247,252,255,.65);padding:5px;border:1px solid #b3b3b3;box-shadow:2px 2px 10px rgba(154,154,154,.55)}.vis-legend-text{white-space:nowrap;display:inline-block}.vis-graph-group0{fill:#4f81bd;fill-opacity:0;stroke-width:2px;stroke:#4f81bd}.vis-graph-group1{fill:#f79646;fill-opacity:0;stroke-width:2px;stroke:#f79646}.vis-graph-group2{fill:#8c51cf;fill-opacity:0;stroke-width:2px;stroke:#8c51cf}.vis-graph-group3{fill:#75c841;fill-opacity:0;stroke-width:2px;stroke:#75c841}.vis-graph-group4{fill:#ff0100;fill-opacity:0;stroke-width:2px;stroke:#ff0100}.vis-graph-group5{fill:#37d8e6;fill-opacity:0;stroke-width:2px;stroke:#37d8e6}.vis-graph-group6{fill:#042662;fill-opacity:0;stroke-width:2px;stroke:#042662}.vis-graph-group7{fill:#00ff26;fill-opacity:0;stroke-width:2px;stroke:#00ff26}.vis-graph-group8{fill:#f0f;fill-opacity:0;stroke-width:2px;stroke:#f0f}.vis-graph-group9{fill:#8f3938;fill-opacity:0;stroke-width:2px;stroke:#8f3938}.vis-timeline .vis-fill{fill-opacity:.1;stroke:none}.vis-timeline .vis-bar{fill-opacity:.5;stroke-width:1px}.vis-timeline .vis-point{stroke-width:2px;fill-opacity:1}.vis-timeline .vis-legend-background{stroke-width:1px;fill-opacity:.9;fill:#fff;stroke:#c2c2c2}.vis-timeline .vis-outline{stroke-width:1px;fill-opacity:1;fill:#fff;stroke:#e5e5e5}.vis-timeline .vis-icon-fill{fill-opacity:.3;stroke:none}div.vis-network div.vis-manipulation{border-width:0;border-bottom:1px;border-style:solid;border-color:#d6d9d8;background:#fff;background:-moz-linear-gradient(top,#fff 0,#fcfcfc 48%,#fafafa 50%,#fcfcfc 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0,#fff),color-stop(48%,#fcfcfc),color-stop(50%,#fafafa),color-stop(100%,#fcfcfc));background:-webkit-linear-gradient(top,#fff 0,#fcfcfc 48%,#fafafa 50%,#fcfcfc 100%);background:-o-linear-gradient(top,#fff 0,#fcfcfc 48%,#fafafa 50%,#fcfcfc 100%);background:-ms-linear-gradient(top,#fff 0,#fcfcfc 48%,#fafafa 50%,#fcfcfc 100%);background:linear-gradient(to bottom,#fff 0,#fcfcfc 48%,#fafafa 50%,#fcfcfc 100%);filter:progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffffff', endColorstr='#fcfcfc', GradientType=0 );position:absolute;left:0;top:0;width:100%;height:30px}div.vis-network div.vis-edit-mode{position:absolute;left:0;top:15px;height:30px}div.vis-network div.vis-close{position:absolute;right:0;top:0;width:30px;height:30px;background-position:20px 3px;background-repeat:no-repeat;background-image:url(img/network/cross.png);cursor:pointer;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}div.vis-network div.vis-close:hover{opacity:.6}div.vis-network div.vis-edit-mode div.vis-button,div.vis-network div.vis-manipulation div.vis-button{position:relative;top:-7px;font-family:verdana;font-size:12px;-moz-border-radius:15px;border-radius:15px;background-position:0 0;height:24px;margin:0 0 0 10px;vertical-align:middle;cursor:pointer;padding:0 8px;user-select:none}div.vis-network div.vis-edit-mode div.vis-button,div.vis-network div.vis-manipulation div.vis-button,div.vis-network div.vis-navigation div.vis-button{display:inline-block;background-repeat:no-repeat;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none}div.vis-network div.vis-manipulation div.vis-button:hover{box-shadow:1px 1px 8px rgba(0,0,0,.2)}div.vis-network div.vis-manipulation div.vis-button:active{box-shadow:1px 1px 8px rgba(0,0,0,.5)}div.vis-network div.vis-manipulation div.vis-button.vis-back{background-image:url(img/network/backIcon.png)}div.vis-network div.vis-manipulation div.vis-button.vis-none:hover{box-shadow:1px 1px 8px transparent;cursor:default}div.vis-network div.vis-manipulation div.vis-button.vis-none:active{box-shadow:1px 1px 8px transparent}div.vis-network div.vis-manipulation div.vis-button.vis-none{padding:0}div.vis-network div.vis-manipulation div.notification{margin:2px;font-weight:700}div.vis-network div.vis-manipulation div.vis-button.vis-add{background-image:url(img/network/addNodeIcon.png)}div.vis-network div.vis-edit-mode div.vis-button.vis-edit,div.vis-network div.vis-manipulation div.vis-button.vis-edit{background-image:url(img/network/editIcon.png)}div.vis-network div.vis-edit-mode div.vis-button.vis-edit.vis-edit-mode{background-color:#fcfcfc;border:1px solid #ccc}div.vis-network div.vis-manipulation div.vis-button.vis-connect{background-image:url(img/network/connectIcon.png)}div.vis-network div.vis-manipulation div.vis-button.vis-delete{background-image:url(img/network/deleteIcon.png)}div.vis-network div.vis-edit-mode div.vis-label,div.vis-network div.vis-manipulation div.vis-label{margin:0 0 0 23px;line-height:25px}div.vis-network div.vis-manipulation div.vis-separator-line{display:inline-block;width:1px;height:20px;background-color:#bdbdbd;margin:5px 7px 0 15px}div.vis-network div.vis-navigation div.vis-button{width:34px;height:34px;-moz-border-radius:17px;border-radius:17px;position:absolute;background-position:2px 2px;cursor:pointer;user-select:none}div.vis-network div.vis-navigation div.vis-button:hover{box-shadow:0 0 3px 3px rgba(56,207,21,.3)}div.vis-network div.vis-navigation div.vis-button:active{box-shadow:0 0 1px 3px rgba(56,207,21,.95)}div.vis-network div.vis-navigation div.vis-button.vis-up{background-image:url(img/network/upArrow.png);bottom:50px;left:55px}div.vis-network div.vis-navigation div.vis-button.vis-down{background-image:url(img/network/downArrow.png);bottom:10px;left:55px}div.vis-network div.vis-navigation div.vis-button.vis-left{background-image:url(img/network/leftArrow.png);bottom:10px;left:15px}div.vis-network div.vis-navigation div.vis-button.vis-right{background-image:url(img/network/rightArrow.png);bottom:10px;left:95px}div.vis-network div.vis-navigation div.vis-button.vis-zoomIn{background-image:url(img/network/plus.png);bottom:10px;right:15px}div.vis-network div.vis-navigation div.vis-button.vis-zoomOut{background-image:url(img/network/minus.png);bottom:10px;right:55px}div.vis-network div.vis-navigation div.vis-button.vis-zoomExtends{background-image:url(img/network/zoomExtends.png);bottom:50px;right:15px}div.vis-network-tooltip{position:absolute;visibility:hidden;padding:5px;white-space:nowrap;font-family:verdana;font-size:14px;font-color:#000;background-color:#f5f4ed;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;border:1px solid #808074;box-shadow:3px 3px 10px rgba(0,0,0,.2);pointer-events:none}div.vis-network-configuration{position:relative;display:block;float:left;font-size:12px}div.vis-network-configuration-wrapper{display:block;width:700px}div.vis-network-configuration.vis-option-container{display:block;width:495px;background-color:#fff;border:2px solid #f7f8fa;border-radius:4px;margin-top:20px;left:10px;padding-left:5px}div.vis-network-configuration.button{display:block;width:495px;height:25px;vertical-align:middle;line-height:25px;background-color:#f7f8fa;border:2px solid #ceced0;border-radius:4px;margin-top:20px;left:10px;padding-left:5px;cursor:pointer;margin-bottom:30px}div.vis-network-configuration.button.hover{background-color:#4588e6;border:2px solid #214373;color:#fff}div.vis-network-configuration.item{display:block;float:left;width:495px;height:25px;vertical-align:middle;line-height:25px}div.vis-network-configuration.item.s2{left:10px;background-color:#f7f8fa;padding-left:5px;border-radius:3px}div.vis-network-configuration.item.s3{left:20px;background-color:#e4e9f0;padding-left:5px;border-radius:3px}div.vis-network-configuration.item.s4{left:30px;background-color:#cfd8e6;padding-left:5px;border-radius:3px}div.vis-network-configuration.header{font-size:18px;font-weight:700}div.vis-network-configuration.label{width:120px;height:25px;line-height:25px}div.vis-network-configuration.label.s3{width:110px}div.vis-network-configuration.label.s4{width:100px}div.vis-network-configuration.colorBlock{top:1px;width:30px;height:19px;border:1px solid #444;border-radius:2px;padding:0;margin:0;cursor:pointer}input.vis-network-configuration.checkbox{left:-5px}input.vis-network-configuration.rangeinput{position:relative;top:-5px;width:60px;height:13px;padding:1px;margin:0;pointer-events:none}input.vis-network-configuration.range{-webkit-appearance:none;border:0 solid #fff;background-color:transparent;width:300px;height:20px}input.vis-network-configuration.range::-webkit-slider-runnable-track{width:300px;height:5px;background:#dedede;background:-moz-linear-gradient(top,#dedede 0,#c8c8c8 99%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0,#dedede),color-stop(99%,#c8c8c8));background:-webkit-linear-gradient(top,#dedede 0,#c8c8c8 99%);background:-o-linear-gradient(top,#dedede 0,#c8c8c8 99%);background:-ms-linear-gradient(top,#dedede 0,#c8c8c8 99%);background:linear-gradient(to bottom,#dedede 0,#c8c8c8 99%);filter:progid:DXImageTransform.Microsoft.gradient( startColorstr='#dedede', endColorstr='#c8c8c8', GradientType=0 );border:1px solid #999;box-shadow:#aaa 0 0 3px 0;border-radius:3px}input.vis-network-configuration.range::-webkit-slider-thumb{-webkit-appearance:none;border:1px solid #14334b;height:17px;width:17px;border-radius:50%;background:#3876c2;background:-moz-linear-gradient(top,#3876c2 0,#385380 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0,#3876c2),color-stop(100%,#385380));background:-webkit-linear-gradient(top,#3876c2 0,#385380 100%);background:-o-linear-gradient(top,#3876c2 0,#385380 100%);background:-ms-linear-gradient(top,#3876c2 0,#385380 100%);background:linear-gradient(to bottom,#3876c2 0,#385380 100%);filter:progid:DXImageTransform.Microsoft.gradient( startColorstr='#3876c2', endColorstr='#385380', GradientType=0 );box-shadow:#111927 0 0 1px 0;margin-top:-7px}input.vis-network-configuration.range:focus{outline:0}input.vis-network-configuration.range:focus::-webkit-slider-runnable-track{background:#9d9d9d;background:-moz-linear-gradient(top,#9d9d9d 0,#c8c8c8 99%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0,#9d9d9d),color-stop(99%,#c8c8c8));background:-webkit-linear-gradient(top,#9d9d9d 0,#c8c8c8 99%);background:-o-linear-gradient(top,#9d9d9d 0,#c8c8c8 99%);background:-ms-linear-gradient(top,#9d9d9d 0,#c8c8c8 99%);background:linear-gradient(to bottom,#9d9d9d 0,#c8c8c8 99%);filter:progid:DXImageTransform.Microsoft.gradient( startColorstr='#9d9d9d', endColorstr='#c8c8c8', GradientType=0 )}input.vis-network-configuration.range::-moz-range-track{width:300px;height:10px;background:#dedede;background:-moz-linear-gradient(top,#dedede 0,#c8c8c8 99%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0,#dedede),color-stop(99%,#c8c8c8));background:-webkit-linear-gradient(top,#dedede 0,#c8c8c8 99%);background:-o-linear-gradient(top,#dedede 0,#c8c8c8 99%);background:-ms-linear-gradient(top,#dedede 0,#c8c8c8 99%);background:linear-gradient(to bottom,#dedede 0,#c8c8c8 99%);filter:progid:DXImageTransform.Microsoft.gradient( startColorstr='#dedede', endColorstr='#c8c8c8', GradientType=0 );border:1px solid #999;box-shadow:#aaa 0 0 3px 0;border-radius:3px}input.vis-network-configuration.range::-moz-range-thumb{border:none;height:16px;width:16px;border-radius:50%;background:#385380}input.vis-network-configuration.range:-moz-focusring{outline:#fff solid 1px;outline-offset:-1px}input.vis-network-configuration.range::-ms-track{width:300px;height:5px;background:0 0;border-color:transparent;border-width:6px 0;color:transparent}input.vis-network-configuration.range::-ms-fill-lower{background:#777;border-radius:10px}input.vis-network-configuration.range::-ms-fill-upper{background:#ddd;border-radius:10px}input.vis-network-configuration.range::-ms-thumb{border:none;height:16px;width:16px;border-radius:50%;background:#385380}input.vis-network-configuration.range:focus::-ms-fill-lower{background:#888}input.vis-network-configuration.range:focus::-ms-fill-upper{background:#ccc}div.vis-color-picker{position:absolute;margin-top:-140px;margin-left:30px;width:293px;height:425px;padding:10px;border-radius:15px;background-color:#fff;display:none;box-shadow:rgba(0,0,0,.5) 0 0 10px 0}div.vis-color-picker div.vis-arrow{position:absolute;top:147px;left:5px}div.vis-color-picker div.vis-arrow:after,div.vis-color-picker div.vis-arrow:before{right:100%;top:50%;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none}div.vis-color-picker div.vis-arrow:after{border-color:rgba(255,255,255,0);border-right-color:#fff;border-width:30px;margin-top:-30px}div.vis-color-picker div.vis-color{position:absolute;width:289px;height:289px;cursor:pointer}div.vis-color-picker div.vis-brightness{position:absolute;top:313px}div.vis-color-picker div.vis-opacity{position:absolute;top:350px}div.vis-color-picker div.vis-selector{position:absolute;top:137px;left:137px;width:15px;height:15px;border-radius:15px;border:1px solid #fff;background:#4c4c4c;background:-moz-linear-gradient(top,#4c4c4c 0,#595959 12%,#666 25%,#474747 39%,#2c2c2c 50%,#000 51%,#111 60%,#2b2b2b 76%,#1c1c1c 91%,#131313 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0,#4c4c4c),color-stop(12%,#595959),color-stop(25%,#666),color-stop(39%,#474747),color-stop(50%,#2c2c2c),color-stop(51%,#000),color-stop(60%,#111),color-stop(76%,#2b2b2b),color-stop(91%,#1c1c1c),color-stop(100%,#131313));background:-webkit-linear-gradient(top,#4c4c4c 0,#595959 12%,#666 25%,#474747 39%,#2c2c2c 50%,#000 51%,#111 60%,#2b2b2b 76%,#1c1c1c 91%,#131313 100%);background:-o-linear-gradient(top,#4c4c4c 0,#595959 12%,#666 25%,#474747 39%,#2c2c2c 50%,#000 51%,#111 60%,#2b2b2b 76%,#1c1c1c 91%,#131313 100%);background:-ms-linear-gradient(top,#4c4c4c 0,#595959 12%,#666 25%,#474747 39%,#2c2c2c 50%,#000 51%,#111 60%,#2b2b2b 76%,#1c1c1c 91%,#131313 100%);background:linear-gradient(to bottom,#4c4c4c 0,#595959 12%,#666 25%,#474747 39%,#2c2c2c 50%,#000 51%,#111 60%,#2b2b2b 76%,#1c1c1c 91%,#131313 100%);filter:progid:DXImageTransform.Microsoft.gradient( startColorstr='#4c4c4c', endColorstr='#131313', GradientType=0 )}div.vis-color-picker div.vis-initial-color,div.vis-color-picker div.vis-new-color{position:absolute;vertical-align:middle;width:140px;height:20px;top:380px;font-size:10px;color:rgba(0,0,0,.4);line-height:20px}div.vis-color-picker div.vis-new-color{border:1px solid rgba(0,0,0,.1);border-radius:5px;left:159px;text-align:right;padding-right:2px}div.vis-color-picker div.vis-initial-color{border:1px solid rgba(0,0,0,.1);border-radius:5px;left:10px;text-align:left;padding-left:2px}div.vis-color-picker div.vis-label{position:absolute;width:300px;left:10px}div.vis-color-picker div.vis-label.vis-brightness{top:300px}div.vis-color-picker div.vis-label.vis-opacity{top:338px}div.vis-color-picker div.vis-button{position:absolute;width:68px;height:25px;border-radius:10px;vertical-align:middle;text-align:center;line-height:25px;top:410px;border:2px solid #d9d9d9;background-color:#f7f7f7;cursor:pointer}div.vis-color-picker div.vis-button.vis-cancel{left:5px}div.vis-color-picker div.vis-button.vis-load{left:82px}div.vis-color-picker div.vis-button.vis-apply{left:159px}div.vis-color-picker div.vis-button.vis-save{left:236px}div.vis-color-picker input.vis-range{width:290px;height:20px} \ No newline at end of file +.vis-background,.vis-labelset,.vis-timeline{overflow:hidden}.vis .overlay{position:absolute;top:0;left:0;width:100%;height:100%;z-index:10}.vis-active{box-shadow:0 0 10px #86d5f8}.vis [class*=span]{min-height:0;width:auto}div.vis-configuration{position:relative;display:block;float:left;font-size:12px}div.vis-configuration-wrapper{display:block;width:700px}div.vis-configuration-wrapper::after{clear:both;content:"";display:block}div.vis-configuration.vis-config-option-container{display:block;width:495px;background-color:#fff;border:2px solid #f7f8fa;border-radius:4px;margin-top:20px;left:10px;padding-left:5px}div.vis-configuration.vis-config-button{display:block;width:495px;height:25px;vertical-align:middle;line-height:25px;background-color:#f7f8fa;border:2px solid #ceced0;border-radius:4px;margin-top:20px;left:10px;padding-left:5px;cursor:pointer;margin-bottom:30px}div.vis-configuration.vis-config-button.hover{background-color:#4588e6;border:2px solid #214373;color:#fff}div.vis-configuration.vis-config-item{display:block;float:left;width:495px;height:25px;vertical-align:middle;line-height:25px}div.vis-configuration.vis-config-item.vis-config-s2{left:10px;background-color:#f7f8fa;padding-left:5px;border-radius:3px}div.vis-configuration.vis-config-item.vis-config-s3{left:20px;background-color:#e4e9f0;padding-left:5px;border-radius:3px}div.vis-configuration.vis-config-item.vis-config-s4{left:30px;background-color:#cfd8e6;padding-left:5px;border-radius:3px}div.vis-configuration.vis-config-header{font-size:18px;font-weight:700}div.vis-configuration.vis-config-label{width:120px;height:25px;line-height:25px}div.vis-configuration.vis-config-label.vis-config-s3{width:110px}div.vis-configuration.vis-config-label.vis-config-s4{width:100px}div.vis-configuration.vis-config-colorBlock{top:1px;width:30px;height:19px;border:1px solid #444;border-radius:2px;padding:0;margin:0;cursor:pointer}input.vis-configuration.vis-config-checkbox{left:-5px}input.vis-configuration.vis-config-rangeinput{position:relative;top:-5px;width:60px;padding:1px;margin:0;pointer-events:none}.vis-panel,.vis-timeline{padding:0;box-sizing:border-box}input.vis-configuration.vis-config-range{-webkit-appearance:none;border:0 solid #fff;background-color:rgba(0,0,0,0);width:300px;height:20px}input.vis-configuration.vis-config-range::-webkit-slider-runnable-track{width:300px;height:5px;background:#dedede;background:-moz-linear-gradient(top,#dedede 0,#c8c8c8 99%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0,#dedede),color-stop(99%,#c8c8c8));background:-webkit-linear-gradient(top,#dedede 0,#c8c8c8 99%);background:-o-linear-gradient(top,#dedede 0,#c8c8c8 99%);background:-ms-linear-gradient(top,#dedede 0,#c8c8c8 99%);background:linear-gradient(to bottom,#dedede 0,#c8c8c8 99%);filter:progid:DXImageTransform.Microsoft.gradient( startColorstr='#dedede', endColorstr='#c8c8c8', GradientType=0 );border:1px solid #999;box-shadow:#aaa 0 0 3px 0;border-radius:3px}input.vis-configuration.vis-config-range::-webkit-slider-thumb{-webkit-appearance:none;border:1px solid #14334b;height:17px;width:17px;border-radius:50%;background:#3876c2;background:-moz-linear-gradient(top,#3876c2 0,#385380 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0,#3876c2),color-stop(100%,#385380));background:-webkit-linear-gradient(top,#3876c2 0,#385380 100%);background:-o-linear-gradient(top,#3876c2 0,#385380 100%);background:-ms-linear-gradient(top,#3876c2 0,#385380 100%);background:linear-gradient(to bottom,#3876c2 0,#385380 100%);filter:progid:DXImageTransform.Microsoft.gradient( startColorstr='#3876c2', endColorstr='#385380', GradientType=0 );box-shadow:#111927 0 0 1px 0;margin-top:-7px}input.vis-configuration.vis-config-range:focus{outline:0}input.vis-configuration.vis-config-range:focus::-webkit-slider-runnable-track{background:#9d9d9d;background:-moz-linear-gradient(top,#9d9d9d 0,#c8c8c8 99%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0,#9d9d9d),color-stop(99%,#c8c8c8));background:-webkit-linear-gradient(top,#9d9d9d 0,#c8c8c8 99%);background:-o-linear-gradient(top,#9d9d9d 0,#c8c8c8 99%);background:-ms-linear-gradient(top,#9d9d9d 0,#c8c8c8 99%);background:linear-gradient(to bottom,#9d9d9d 0,#c8c8c8 99%);filter:progid:DXImageTransform.Microsoft.gradient( startColorstr='#9d9d9d', endColorstr='#c8c8c8', GradientType=0 )}input.vis-configuration.vis-config-range::-moz-range-track{width:300px;height:10px;background:#dedede;background:-moz-linear-gradient(top,#dedede 0,#c8c8c8 99%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0,#dedede),color-stop(99%,#c8c8c8));background:-webkit-linear-gradient(top,#dedede 0,#c8c8c8 99%);background:-o-linear-gradient(top,#dedede 0,#c8c8c8 99%);background:-ms-linear-gradient(top,#dedede 0,#c8c8c8 99%);background:linear-gradient(to bottom,#dedede 0,#c8c8c8 99%);filter:progid:DXImageTransform.Microsoft.gradient( startColorstr='#dedede', endColorstr='#c8c8c8', GradientType=0 );border:1px solid #999;box-shadow:#aaa 0 0 3px 0;border-radius:3px}input.vis-configuration.vis-config-range::-moz-range-thumb{border:none;height:16px;width:16px;border-radius:50%;background:#385380}input.vis-configuration.vis-config-range:-moz-focusring{outline:#fff solid 1px;outline-offset:-1px}input.vis-configuration.vis-config-range::-ms-track{width:300px;height:5px;background:0 0;border-color:transparent;border-width:6px 0;color:transparent}input.vis-configuration.vis-config-range::-ms-fill-lower{background:#777;border-radius:10px}input.vis-configuration.vis-config-range::-ms-fill-upper{background:#ddd;border-radius:10px}input.vis-configuration.vis-config-range::-ms-thumb{border:none;height:16px;width:16px;border-radius:50%;background:#385380}input.vis-configuration.vis-config-range:focus::-ms-fill-lower{background:#888}input.vis-configuration.vis-config-range:focus::-ms-fill-upper{background:#ccc}.vis-configuration-popup{position:absolute;background:rgba(57,76,89,.85);border:2px solid #f2faff;line-height:30px;height:30px;width:150px;text-align:center;color:#fff;font-size:14px;border-radius:4px;-webkit-transition:opacity .3s ease-in-out;-moz-transition:opacity .3s ease-in-out;transition:opacity .3s ease-in-out}.vis-configuration-popup:after,.vis-configuration-popup:before{left:100%;top:50%;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none}.vis-configuration-popup:after{border-color:rgba(136,183,213,0);border-left-color:rgba(57,76,89,.85);border-width:8px;margin-top:-8px}.vis-configuration-popup:before{border-color:rgba(194,225,245,0);border-left-color:#f2faff;border-width:12px;margin-top:-12px}.vis-timeline{position:relative;border:1px solid #bfbfbf;margin:0}.vis-panel{position:absolute;margin:0}.vis-panel.vis-bottom,.vis-panel.vis-center,.vis-panel.vis-left,.vis-panel.vis-right,.vis-panel.vis-top{border:1px #bfbfbf}.vis-panel.vis-center,.vis-panel.vis-left,.vis-panel.vis-right{border-top-style:solid;border-bottom-style:solid;overflow:hidden}.vis-panel.vis-bottom,.vis-panel.vis-center,.vis-panel.vis-top{border-left-style:solid;border-right-style:solid}.vis-panel>.vis-content{position:relative}.vis-panel .vis-shadow{position:absolute;width:100%;height:1px;box-shadow:0 0 10px rgba(0,0,0,.8)}.vis-itemset,.vis-labelset,.vis-labelset .vis-label{position:relative;box-sizing:border-box}.vis-panel .vis-shadow.vis-top{top:-1px;left:0}.vis-panel .vis-shadow.vis-bottom{bottom:-1px;left:0}.vis-labelset .vis-label{left:0;top:0;width:100%;color:#4d4d4d;border-bottom:1px solid #bfbfbf}.vis-labelset .vis-label.draggable{cursor:pointer}.vis-labelset .vis-label:last-child{border-bottom:none}.vis-labelset .vis-label .vis-inner{display:inline-block;padding:5px}.vis-labelset .vis-label .vis-inner.vis-hidden{padding:0}.vis-itemset{padding:0;margin:0}.vis-itemset .vis-background,.vis-itemset .vis-foreground{position:absolute;width:100%;height:100%;overflow:visible}.vis-axis{position:absolute;width:100%;height:0;left:0;z-index:1}.vis-foreground .vis-group{position:relative;box-sizing:border-box;border-bottom:1px solid #bfbfbf}.vis-foreground .vis-group:last-child{border-bottom:none}.vis-overlay{position:absolute;top:0;left:0;width:100%;height:100%;z-index:10}.vis-item{position:absolute;color:#1A1A1A;border-color:#97B0F8;border-width:1px;background-color:#D5DDF6;display:inline-block}.vis-item.vis-point.vis-selected,.vis-item.vis-selected{background-color:#FFF785}.vis-item.vis-selected{border-color:#FFC200;z-index:2}.vis-editable.vis-selected{cursor:move}.vis-item.vis-box{text-align:center;border-style:solid;border-radius:2px}.vis-item.vis-point{background:0 0}.vis-item.vis-dot{position:absolute;padding:0;border-width:4px;border-style:solid;border-radius:4px}.vis-item.vis-range{border-style:solid;border-radius:2px;box-sizing:border-box}.vis-item.vis-background{border:none;background-color:rgba(213,221,246,.4);box-sizing:border-box;padding:0;margin:0}.vis-item .vis-item-overflow{position:relative;width:100%;height:100%;padding:0;margin:0;overflow:hidden}.vis-item.vis-range .vis-item-content{position:relative;display:inline-block}.vis-item.vis-background .vis-item-content{position:absolute;display:inline-block}.vis-item.vis-line{padding:0;position:absolute;width:0;border-left-width:1px;border-left-style:solid}.vis-item .vis-item-content{white-space:nowrap;box-sizing:border-box;padding:5px}.vis-item .vis-delete{background:url(img/timeline/delete.png) center no-repeat;position:absolute;width:24px;height:24px;top:-4px;right:-24px;cursor:pointer}.vis-item.vis-range .vis-drag-left{position:absolute;width:24px;max-width:20%;min-width:2px;height:100%;top:0;left:-4px;cursor:w-resize}.vis-item.vis-range .vis-drag-right{position:absolute;width:24px;max-width:20%;min-width:2px;height:100%;top:0;right:-4px;cursor:e-resize}.vis-range.vis-item.vis-readonly .vis-drag-left,.vis-range.vis-item.vis-readonly .vis-drag-right{cursor:auto}.vis-time-axis{position:relative;overflow:hidden}.vis-time-axis.vis-foreground{top:0;left:0;width:100%}.vis-time-axis.vis-background{position:absolute;top:0;left:0;width:100%;height:100%}.vis-time-axis .vis-text{position:absolute;color:#4d4d4d;padding:3px;overflow:hidden;box-sizing:border-box;white-space:nowrap}.vis-time-axis .vis-text.vis-measure{position:absolute;padding-left:0;padding-right:0;margin-left:0;margin-right:0;visibility:hidden}.vis-time-axis .vis-grid.vis-vertical{position:absolute;border-left:1px solid}.vis-time-axis .vis-grid.vis-minor{border-color:#e5e5e5}.vis-time-axis .vis-grid.vis-major{border-color:#bfbfbf}.vis-current-time{background-color:#FF7F6E;width:2px;z-index:1}.vis-custom-time{background-color:#6E94FF;width:2px;cursor:move;z-index:1}div.vis-network div.vis-close,div.vis-network div.vis-edit-mode div.vis-button,div.vis-network div.vis-manipulation div.vis-button{cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-webkit-touch-callout:none;-khtml-user-select:none}.vis-panel.vis-background.vis-horizontal .vis-grid.vis-horizontal{position:absolute;width:100%;height:0;border-bottom:1px solid}.vis-panel.vis-background.vis-horizontal .vis-grid.vis-minor{border-color:#e5e5e5}.vis-panel.vis-background.vis-horizontal .vis-grid.vis-major{border-color:#bfbfbf}.vis-data-axis .vis-y-axis.vis-major{width:100%;position:absolute;color:#4d4d4d;white-space:nowrap}.vis-data-axis .vis-y-axis.vis-major.vis-measure{padding:0;margin:0;border:0;visibility:hidden;width:auto}.vis-data-axis .vis-y-axis.vis-minor{position:absolute;width:100%;color:#bebebe;white-space:nowrap}.vis-data-axis .vis-y-axis.vis-minor.vis-measure{padding:0;margin:0;border:0;visibility:hidden;width:auto}.vis-data-axis .vis-y-axis.vis-title{position:absolute;color:#4d4d4d;white-space:nowrap;bottom:20px;text-align:center}.vis-data-axis .vis-y-axis.vis-title.vis-measure{padding:0;margin:0;visibility:hidden;width:auto}.vis-data-axis .vis-y-axis.vis-title.vis-left{bottom:0;-webkit-transform-origin:left top;-moz-transform-origin:left top;-ms-transform-origin:left top;-o-transform-origin:left top;transform-origin:left bottom;-webkit-transform:rotate(-90deg);-moz-transform:rotate(-90deg);-ms-transform:rotate(-90deg);-o-transform:rotate(-90deg);transform:rotate(-90deg)}.vis-data-axis .vis-y-axis.vis-title.vis-right{bottom:0;-webkit-transform-origin:right bottom;-moz-transform-origin:right bottom;-ms-transform-origin:right bottom;-o-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.vis-legend{background-color:rgba(247,252,255,.65);padding:5px;border:1px solid #b3b3b3;box-shadow:2px 2px 10px rgba(154,154,154,.55)}.vis-legend-text{white-space:nowrap;display:inline-block}.vis-graph-group0{fill:#4f81bd;fill-opacity:0;stroke-width:2px;stroke:#4f81bd}.vis-graph-group1{fill:#f79646;fill-opacity:0;stroke-width:2px;stroke:#f79646}.vis-graph-group2{fill:#8c51cf;fill-opacity:0;stroke-width:2px;stroke:#8c51cf}.vis-graph-group3{fill:#75c841;fill-opacity:0;stroke-width:2px;stroke:#75c841}.vis-graph-group4{fill:#ff0100;fill-opacity:0;stroke-width:2px;stroke:#ff0100}.vis-graph-group5{fill:#37d8e6;fill-opacity:0;stroke-width:2px;stroke:#37d8e6}.vis-graph-group6{fill:#042662;fill-opacity:0;stroke-width:2px;stroke:#042662}.vis-graph-group7{fill:#00ff26;fill-opacity:0;stroke-width:2px;stroke:#00ff26}.vis-graph-group8{fill:#f0f;fill-opacity:0;stroke-width:2px;stroke:#f0f}.vis-graph-group9{fill:#8f3938;fill-opacity:0;stroke-width:2px;stroke:#8f3938}.vis-timeline .vis-fill{fill-opacity:.1;stroke:none}.vis-timeline .vis-bar{fill-opacity:.5;stroke-width:1px}.vis-timeline .vis-point{stroke-width:2px;fill-opacity:1}.vis-timeline .vis-legend-background{stroke-width:1px;fill-opacity:.9;fill:#fff;stroke:#c2c2c2}.vis-timeline .vis-outline{stroke-width:1px;fill-opacity:1;fill:#fff;stroke:#e5e5e5}.vis-timeline .vis-icon-fill{fill-opacity:.3;stroke:none}div.vis-network div.vis-manipulation{border-width:0;border-bottom:1px;border-style:solid;border-color:#d6d9d8;background:#fff;background:-moz-linear-gradient(top,#fff 0,#fcfcfc 48%,#fafafa 50%,#fcfcfc 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0,#fff),color-stop(48%,#fcfcfc),color-stop(50%,#fafafa),color-stop(100%,#fcfcfc));background:-webkit-linear-gradient(top,#fff 0,#fcfcfc 48%,#fafafa 50%,#fcfcfc 100%);background:-o-linear-gradient(top,#fff 0,#fcfcfc 48%,#fafafa 50%,#fcfcfc 100%);background:-ms-linear-gradient(top,#fff 0,#fcfcfc 48%,#fafafa 50%,#fcfcfc 100%);background:linear-gradient(to bottom,#fff 0,#fcfcfc 48%,#fafafa 50%,#fcfcfc 100%);filter:progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffffff', endColorstr='#fcfcfc', GradientType=0 );padding-top:4px;position:absolute;left:0;top:0;width:100%;height:28px}div.vis-network div.vis-edit-mode{position:absolute;left:0;top:5px;height:30px}div.vis-network div.vis-close{position:absolute;right:0;top:0;width:30px;height:30px;background-position:20px 3px;background-repeat:no-repeat;background-image:url(img/network/cross.png);user-select:none}div.vis-network div.vis-close:hover{opacity:.6}div.vis-network div.vis-edit-mode div.vis-button,div.vis-network div.vis-manipulation div.vis-button{float:left;font-family:verdana;font-size:12px;-moz-border-radius:15px;border-radius:15px;display:inline-block;background-position:0 0;background-repeat:no-repeat;height:24px;margin-left:10px;padding:0 8px;user-select:none}div.vis-network div.vis-manipulation div.vis-button:hover{box-shadow:1px 1px 8px rgba(0,0,0,.2)}div.vis-network div.vis-manipulation div.vis-button:active{box-shadow:1px 1px 8px rgba(0,0,0,.5)}div.vis-network div.vis-manipulation div.vis-button.vis-back{background-image:url(img/network/backIcon.png)}div.vis-network div.vis-manipulation div.vis-button.vis-none:hover{box-shadow:1px 1px 8px transparent;cursor:default}div.vis-network div.vis-manipulation div.vis-button.vis-none:active{box-shadow:1px 1px 8px transparent}div.vis-network div.vis-manipulation div.vis-button.vis-none{padding:0}div.vis-network div.vis-manipulation div.notification{margin:2px;font-weight:700}div.vis-network div.vis-manipulation div.vis-button.vis-add{background-image:url(img/network/addNodeIcon.png)}div.vis-network div.vis-edit-mode div.vis-button.vis-edit,div.vis-network div.vis-manipulation div.vis-button.vis-edit{background-image:url(img/network/editIcon.png)}div.vis-network div.vis-edit-mode div.vis-button.vis-edit.vis-edit-mode{background-color:#fcfcfc;border:1px solid #ccc}div.vis-network div.vis-manipulation div.vis-button.vis-connect{background-image:url(img/network/connectIcon.png)}div.vis-network div.vis-manipulation div.vis-button.vis-delete{background-image:url(img/network/deleteIcon.png)}div.vis-network div.vis-edit-mode div.vis-label,div.vis-network div.vis-manipulation div.vis-label{margin:0 0 0 23px;line-height:25px}div.vis-network div.vis-manipulation div.vis-separator-line{float:left;display:inline-block;width:1px;height:21px;background-color:#bdbdbd;margin:0 7px 0 15px}div.vis-network-tooltip{position:absolute;visibility:hidden;padding:5px;white-space:nowrap;font-family:verdana;font-size:14px;font-color:#000;background-color:#f5f4ed;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;border:1px solid #808074;box-shadow:3px 3px 10px rgba(0,0,0,.2);pointer-events:none}div.vis-network div.vis-navigation div.vis-button{width:34px;height:34px;-moz-border-radius:17px;border-radius:17px;position:absolute;display:inline-block;background-position:2px 2px;background-repeat:no-repeat;cursor:pointer;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}div.vis-network div.vis-navigation div.vis-button:hover{box-shadow:0 0 3px 3px rgba(56,207,21,.3)}div.vis-network div.vis-navigation div.vis-button:active{box-shadow:0 0 1px 3px rgba(56,207,21,.95)}div.vis-network div.vis-navigation div.vis-button.vis-up{background-image:url(img/network/upArrow.png);bottom:50px;left:55px}div.vis-network div.vis-navigation div.vis-button.vis-down{background-image:url(img/network/downArrow.png);bottom:10px;left:55px}div.vis-network div.vis-navigation div.vis-button.vis-left{background-image:url(img/network/leftArrow.png);bottom:10px;left:15px}div.vis-network div.vis-navigation div.vis-button.vis-right{background-image:url(img/network/rightArrow.png);bottom:10px;left:95px}div.vis-network div.vis-navigation div.vis-button.vis-zoomIn{background-image:url(img/network/plus.png);bottom:10px;right:15px}div.vis-network div.vis-navigation div.vis-button.vis-zoomOut{background-image:url(img/network/minus.png);bottom:10px;right:55px}div.vis-network div.vis-navigation div.vis-button.vis-zoomExtends{background-image:url(img/network/zoomExtends.png);bottom:50px;right:15px}div.vis-color-picker{position:absolute;top:0;left:30px;margin-top:-140px;margin-left:30px;width:310px;height:444px;z-index:1;padding:10px;border-radius:15px;background-color:#fff;display:none;box-shadow:rgba(0,0,0,.5) 0 0 10px 0}div.vis-color-picker div.vis-arrow{position:absolute;top:147px;left:5px}div.vis-color-picker div.vis-arrow::after,div.vis-color-picker div.vis-arrow::before{right:100%;top:50%;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none}div.vis-color-picker div.vis-arrow:after{border-color:rgba(255,255,255,0);border-right-color:#fff;border-width:30px;margin-top:-30px}div.vis-color-picker div.vis-color{position:absolute;width:289px;height:289px;cursor:pointer}div.vis-color-picker div.vis-brightness{position:absolute;top:313px}div.vis-color-picker div.vis-opacity{position:absolute;top:350px}div.vis-color-picker div.vis-selector{position:absolute;top:137px;left:137px;width:15px;height:15px;border-radius:15px;border:1px solid #fff;background:#4c4c4c;background:-moz-linear-gradient(top,#4c4c4c 0,#595959 12%,#666 25%,#474747 39%,#2c2c2c 50%,#000 51%,#111 60%,#2b2b2b 76%,#1c1c1c 91%,#131313 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0,#4c4c4c),color-stop(12%,#595959),color-stop(25%,#666),color-stop(39%,#474747),color-stop(50%,#2c2c2c),color-stop(51%,#000),color-stop(60%,#111),color-stop(76%,#2b2b2b),color-stop(91%,#1c1c1c),color-stop(100%,#131313));background:-webkit-linear-gradient(top,#4c4c4c 0,#595959 12%,#666 25%,#474747 39%,#2c2c2c 50%,#000 51%,#111 60%,#2b2b2b 76%,#1c1c1c 91%,#131313 100%);background:-o-linear-gradient(top,#4c4c4c 0,#595959 12%,#666 25%,#474747 39%,#2c2c2c 50%,#000 51%,#111 60%,#2b2b2b 76%,#1c1c1c 91%,#131313 100%);background:-ms-linear-gradient(top,#4c4c4c 0,#595959 12%,#666 25%,#474747 39%,#2c2c2c 50%,#000 51%,#111 60%,#2b2b2b 76%,#1c1c1c 91%,#131313 100%);background:linear-gradient(to bottom,#4c4c4c 0,#595959 12%,#666 25%,#474747 39%,#2c2c2c 50%,#000 51%,#111 60%,#2b2b2b 76%,#1c1c1c 91%,#131313 100%);filter:progid:DXImageTransform.Microsoft.gradient( startColorstr='#4c4c4c', endColorstr='#131313', GradientType=0 )}div.vis-color-picker div.vis-initial-color,div.vis-color-picker div.vis-new-color{width:140px;height:20px;top:380px;font-size:10px;color:rgba(0,0,0,.4);line-height:20px;position:absolute;vertical-align:middle}div.vis-color-picker div.vis-new-color{border:1px solid rgba(0,0,0,.1);border-radius:5px;left:159px;text-align:right;padding-right:2px}div.vis-color-picker div.vis-initial-color{border:1px solid rgba(0,0,0,.1);border-radius:5px;left:10px;text-align:left;padding-left:2px}div.vis-color-picker div.vis-label{position:absolute;width:300px;left:10px}div.vis-color-picker div.vis-label.vis-brightness{top:300px}div.vis-color-picker div.vis-label.vis-opacity{top:338px}div.vis-color-picker div.vis-button{position:absolute;width:68px;height:25px;border-radius:10px;vertical-align:middle;text-align:center;line-height:25px;top:410px;border:2px solid #d9d9d9;background-color:#f7f7f7;cursor:pointer}div.vis-color-picker div.vis-button.vis-cancel{left:5px}div.vis-color-picker div.vis-button.vis-load{left:82px}div.vis-color-picker div.vis-button.vis-apply{left:159px}div.vis-color-picker div.vis-button.vis-save{left:236px}div.vis-color-picker input.vis-range{width:290px;height:20px} \ No newline at end of file diff --git a/lib/vis/dist/vis.min.js b/lib/vis/dist/vis.min.js index 85a22bc468..e81b83eecb 100644 --- a/lib/vis/dist/vis.min.js +++ b/lib/vis/dist/vis.min.js @@ -4,11 +4,11 @@ * * A dynamic, browser-based visualization library. * - * @version 4.5.0 - * @date 2015-07-17 + * @version 4.14.0 + * @date 2016-02-04 * * @license - * Copyright (C) 2011-2014 Almende B.V, http://almende.com + * Copyright (C) 2011-2016 Almende B.V, http://almende.com * * Vis.js is dual licensed under both * @@ -22,22 +22,24 @@ * * Vis.js may be distributed under either license. */ -"use strict";!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):"object"==typeof exports?exports.vis=e():t.vis=e()}(this,function(){return function(t){function e(o){if(i[o])return i[o].exports;var n=i[o]={exports:{},id:o,loaded:!1};return t[o].call(n.exports,n,n.exports,e),n.loaded=!0,n.exports}var i={};return e.m=t,e.c=i,e.p="",e(0)}([function(t,e,i){e.util=i(7),e.DOMutil=i(13),e.DataSet=i(14),e.DataView=i(16),e.Queue=i(15),e.Graph3d=i(17),e.graph3d={Camera:i(21),Filter:i(22),Point2d:i(18),Point3d:i(20),Slider:i(23),StepNumber:i(24)},e.Timeline=i(25),e.Graph2d=i(49),e.timeline={DateUtil:i(31),DataStep:i(52),Range:i(29),stack:i(35),TimeStep:i(37),components:{items:{Item:i(2),BackgroundItem:i(40),BoxItem:i(39),PointItem:i(1),RangeItem:i(36)},Component:i(27),CurrentTime:i(26),CustomTime:i(44),DataAxis:i(51),GraphGroup:i(53),Group:i(34),BackgroundGroup:i(38),ItemSet:i(33),Legend:i(57),LineGraph:i(50),TimeAxis:i(41)}},e.Network=i(59),e.network={Images:i(112),dotparser:i(110),gephiParser:i(111),allOptions:i(108)},e.network.convertDot=function(t){return e.network.dotparser.DOTToGraph(t)},e.network.convertGephi=function(t,i){return e.network.gephiParser.parseGephi(t,i)},e.Graph=function(){throw new Error("Graph is renamed to Network. Please create a graph as new vis.Network(...)")},e.moment=i(8),e.hammer=i(3),e.Hammer=i(3),e.keycharm=i(43)},function(t,e,i){function o(t,e,i){if(this.props={dot:{top:0,width:0,height:0},content:{height:0,marginLeft:0}},t&&void 0==t.start)throw new Error('Property "start" missing in item '+t);n.call(this,t,e,i)}var n=i(2);o.prototype=new n(null,null,null),o.prototype.isVisible=function(t){var e=(t.end-t.start)/4;return this.data.start>t.start-e&&this.data.start0){var e=[];if(Array.isArray(this.options.dataAttributes))e=this.options.dataAttributes;else{if("all"!=this.options.dataAttributes)return;e=Object.keys(this.data)}for(var i=0;i0?d._handlers[t]=o:(i.off(t,s),delete d._handlers[t]))}),d},d.emit=function(e,o){t=o.target,i.emit(e,o)},d.destroy=function(){delete i.element.hammer,d._handlers={},i.destroy()},d}})},function(t,e,i){var o;!function(n,s,r,a){function h(t,e,i){return setTimeout(f(t,i),e)}function d(t,e,i){return Array.isArray(t)?(l(t,i[e],i),!0):!1}function l(t,e,i){var o;if(t)if(t.forEach)t.forEach(e,i);else if(t.length!==a)for(o=0;o-1}function _(t){return t.trim().split(/\s+/g)}function x(t,e,i){if(t.indexOf&&!i)return t.indexOf(e);for(var o=0;oi[e]}):o.sort()),o}function O(t,e){for(var i,o,n=e[0].toUpperCase()+e.slice(1),s=0;s1&&!i.firstMultiple?i.firstMultiple=N(e):1===n&&(i.firstMultiple=!1);var s=i.firstInput,r=i.firstMultiple,a=r?r.center:s.center,h=e.center=L(o);e.timeStamp=gt(),e.deltaTime=e.timeStamp-s.timeStamp,e.angle=R(a,h),e.distance=F(a,h),I(i,e),e.offsetDirection=B(e.deltaX,e.deltaY),e.scale=r?H(r.pointers,o):1,e.rotation=r?j(r.pointers,o):0,z(i,e);var d=t.element;b(e.srcEvent.target,d)&&(d=e.srcEvent.target),e.target=d}function I(t,e){var i=e.center,o=t.offsetDelta||{},n=t.prevDelta||{},s=t.prevInput||{};(e.eventType===Tt||s.eventType===St)&&(n=t.prevDelta={x:s.deltaX||0,y:s.deltaY||0},o=t.offsetDelta={x:i.x,y:i.y}),e.deltaX=n.x+(i.x-o.x),e.deltaY=n.y+(i.y-o.y)}function z(t,e){var i,o,n,s,r=t.lastInterval||e,h=e.timeStamp-r.timeStamp;if(e.eventType!=Pt&&(h>Ct||r.velocity===a)){var d=r.deltaX-e.deltaX,l=r.deltaY-e.deltaY,u=A(h,d,l);o=u.x,n=u.y,i=vt(u.x)>vt(u.y)?u.x:u.y,s=B(d,l),t.lastInterval=e}else i=r.velocity,o=r.velocityX,n=r.velocityY,s=r.direction;e.velocity=i,e.velocityX=o,e.velocityY=n,e.direction=s}function N(t){for(var e=[],i=0;in;)i+=t[n].clientX,o+=t[n].clientY,n++;return{x:mt(i/e),y:mt(o/e)}}function A(t,e,i){return{x:e/t||0,y:i/t||0}}function B(t,e){return t===e?It:vt(t)>=vt(e)?t>0?zt:Nt:e>0?Lt:At}function F(t,e,i){i||(i=jt);var o=e[i[0]]-t[i[0]],n=e[i[1]]-t[i[1]];return Math.sqrt(o*o+n*n)}function R(t,e,i){i||(i=jt);var o=e[i[0]]-t[i[0]],n=e[i[1]]-t[i[1]];return 180*Math.atan2(n,o)/Math.PI}function j(t,e){return R(e[1],e[0],Ht)-R(t[1],t[0],Ht)}function H(t,e){return F(e[0],e[1],Ht)/F(t[0],t[1],Ht)}function Y(){this.evEl=Wt,this.evWin=Gt,this.allow=!0,this.pressed=!1,T.apply(this,arguments)}function W(){this.evEl=qt,this.evWin=Xt,T.apply(this,arguments),this.store=this.manager.session.pointerEvents=[]}function G(){this.evTarget=Kt,this.evWin=Jt,this.started=!1,T.apply(this,arguments)}function U(t,e){var i=k(t.touches),o=k(t.changedTouches);return e&(St|Pt)&&(i=M(i.concat(o),"identifier",!0)),[i,o]}function V(){this.evTarget=$t,this.targetIds={},T.apply(this,arguments)}function q(t,e){var i=k(t.touches),o=this.targetIds;if(e&(Tt|Et)&&1===i.length)return o[i[0].identifier]=!0,[i,i];var n,s,r=k(t.changedTouches),a=[],h=this.target;if(s=i.filter(function(t){return b(t.target,h)}),e===Tt)for(n=0;na&&(e.push(t),a=e.length-1):n&(St|Pt)&&(i=!0),0>a||(e[a]=t,this.callback(this.manager,n,{pointers:e,changedPointers:[t],pointerType:s,srcEvent:t}),i&&e.splice(a,1))}});var Zt={touchstart:Tt,touchmove:Et,touchend:St,touchcancel:Pt},Kt="touchstart",Jt="touchstart touchmove touchend touchcancel";p(G,T,{handler:function(t){var e=Zt[t.type];if(e===Tt&&(this.started=!0),this.started){var i=U.call(this,t,e);e&(St|Pt)&&i[0].length-i[1].length===0&&(this.started=!1),this.callback(this.manager,e,{pointers:i[0],changedPointers:i[1],pointerType:kt,srcEvent:t})}}});var Qt={touchstart:Tt,touchmove:Et,touchend:St,touchcancel:Pt},$t="touchstart touchmove touchend touchcancel";p(V,T,{handler:function(t){var e=Qt[t.type],i=q.call(this,t,e);i&&this.callback(this.manager,e,{pointers:i[0],changedPointers:i[1],pointerType:kt,srcEvent:t})}}),p(X,T,{handler:function(t,e,i){var o=i.pointerType==kt,n=i.pointerType==Ot;if(o)this.mouse.allow=!1;else if(n&&!this.mouse.allow)return;e&(St|Pt)&&(this.mouse.allow=!0),this.callback(t,e,i)},destroy:function(){this.touch.destroy(),this.mouse.destroy()}});var te=O(pt.style,"touchAction"),ee=te!==a,ie="compute",oe="auto",ne="manipulation",se="none",re="pan-x",ae="pan-y";Z.prototype={set:function(t){t==ie&&(t=this.compute()),ee&&(this.manager.element.style[te]=t),this.actions=t.toLowerCase().trim()},update:function(){this.set(this.manager.options.touchAction)},compute:function(){var t=[];return l(this.manager.recognizers,function(e){m(e.options.enable,[e])&&(t=t.concat(e.getTouchAction()))}),K(t.join(" "))},preventDefaults:function(t){if(!ee){var e=t.srcEvent,i=t.offsetDirection;if(this.manager.session.prevented)return void e.preventDefault();var o=this.actions,n=w(o,se),s=w(o,ae),r=w(o,re);return n||s&&i&Bt||r&&i&Ft?this.preventSrc(e):void 0}},preventSrc:function(t){this.manager.session.prevented=!0,t.preventDefault()}};var he=1,de=2,le=4,ue=8,ce=ue,pe=16,fe=32;J.prototype={defaults:{},set:function(t){return u(this.options,t),this.manager&&this.manager.touchAction.update(),this},recognizeWith:function(t){if(d(t,"recognizeWith",this))return this;var e=this.simultaneous;return t=tt(t,this),e[t.id]||(e[t.id]=t,t.recognizeWith(this)),this},dropRecognizeWith:function(t){return d(t,"dropRecognizeWith",this)?this:(t=tt(t,this),delete this.simultaneous[t.id],this)},requireFailure:function(t){if(d(t,"requireFailure",this))return this;var e=this.requireFail;return t=tt(t,this),-1===x(e,t)&&(e.push(t),t.requireFailure(this)),this},dropRequireFailure:function(t){if(d(t,"dropRequireFailure",this))return this;t=tt(t,this);var e=x(this.requireFail,t);return e>-1&&this.requireFail.splice(e,1),this},hasRequireFailures:function(){return this.requireFail.length>0},canRecognizeWith:function(t){return!!this.simultaneous[t.id]},emit:function(t){function e(e){i.manager.emit(i.options.event+(e?Q(o):""),t)}var i=this,o=this.state;ue>o&&e(!0),e(),o>=ue&&e(!0)},tryEmit:function(t){return this.canEmit()?this.emit(t):void(this.state=fe)},canEmit:function(){for(var t=0;ts?zt:Nt,i=s!=this.pX,o=Math.abs(t.deltaX)):(n=0===r?It:0>r?Lt:At,i=r!=this.pY,o=Math.abs(t.deltaY))),t.direction=n,i&&o>e.threshold&&n&e.direction},attrTest:function(t){return et.prototype.attrTest.call(this,t)&&(this.state&de||!(this.state&de)&&this.directionTest(t))},emit:function(t){this.pX=t.deltaX,this.pY=t.deltaY;var e=$(t.direction);e&&this.manager.emit(this.options.event+e,t),this._super.emit.call(this,t)}}),p(ot,et,{defaults:{event:"pinch",threshold:0,pointers:2},getTouchAction:function(){return[se]},attrTest:function(t){return this._super.attrTest.call(this,t)&&(Math.abs(t.scale-1)>this.options.threshold||this.state&de)},emit:function(t){if(this._super.emit.call(this,t),1!==t.scale){var e=t.scale<1?"in":"out";this.manager.emit(this.options.event+e,t)}}}),p(nt,J,{defaults:{event:"press",pointers:1,time:500,threshold:5},getTouchAction:function(){return[oe]},process:function(t){var e=this.options,i=t.pointers.length===e.pointers,o=t.distancee.time;if(this._input=t,!o||!i||t.eventType&(St|Pt)&&!n)this.reset();else if(t.eventType&Tt)this.reset(),this._timer=h(function(){this.state=ce,this.tryEmit()},e.time,this);else if(t.eventType&St)return ce;return fe},reset:function(){clearTimeout(this._timer)},emit:function(t){this.state===ce&&(t&&t.eventType&St?this.manager.emit(this.options.event+"up",t):(this._input.timeStamp=gt(),this.manager.emit(this.options.event,this._input)))}}),p(st,et,{defaults:{event:"rotate",threshold:0,pointers:2},getTouchAction:function(){return[se]},attrTest:function(t){return this._super.attrTest.call(this,t)&&(Math.abs(t.rotation)>this.options.threshold||this.state&de)}}),p(rt,et,{defaults:{event:"swipe",threshold:10,velocity:.65,direction:Bt|Ft,pointers:1},getTouchAction:function(){return it.prototype.getTouchAction.call(this)},attrTest:function(t){var e,i=this.options.direction;return i&(Bt|Ft)?e=t.velocity:i&Bt?e=t.velocityX:i&Ft&&(e=t.velocityY),this._super.attrTest.call(this,t)&&i&t.direction&&t.distance>this.options.threshold&&vt(e)>this.options.velocity&&t.eventType&St},emit:function(t){var e=$(t.direction);e&&this.manager.emit(this.options.event+e,t),this.manager.emit(this.options.event,t)}}),p(at,J,{defaults:{event:"tap",pointers:1,taps:1,interval:300,time:250,threshold:2,posThreshold:10},getTouchAction:function(){return[ne]},process:function(t){var e=this.options,i=t.pointers.length===e.pointers,o=t.distancei;i++)if(t[i]!=e[i])return!1;return!0},e.convert=function(t,i){var n;if(void 0===t)return void 0;if(null===t)return null;if(!i)return t;if("string"!=typeof i&&!(i instanceof String))throw new Error("Type must be a string");switch(i){case"boolean":case"Boolean":return Boolean(t);case"number":case"Number":return Number(t.valueOf());case"string":case"String":return String(t);case"Date":if(e.isNumber(t))return new Date(t);if(t instanceof Date)return new Date(t.valueOf());if(o.isMoment(t))return new Date(t.valueOf());if(e.isString(t))return n=s.exec(t),n?new Date(Number(n[1])):o(t).toDate();throw new Error("Cannot convert object of type "+e.getType(t)+" to type Date");case"Moment":if(e.isNumber(t))return o(t);if(t instanceof Date)return o(t.valueOf());if(o.isMoment(t))return o(t);if(e.isString(t))return n=s.exec(t),o(n?Number(n[1]):t);throw new Error("Cannot convert object of type "+e.getType(t)+" to type Date");case"ISODate":if(e.isNumber(t))return new Date(t);if(t instanceof Date)return t.toISOString();if(o.isMoment(t))return t.toDate().toISOString();if(e.isString(t))return n=s.exec(t),n?new Date(Number(n[1])).toISOString():new Date(t).toISOString();throw new Error("Cannot convert object of type "+e.getType(t)+" to type ISODate");case"ASPDate":if(e.isNumber(t))return"/Date("+t+")/";if(t instanceof Date)return"/Date("+t.valueOf()+")/";if(e.isString(t)){n=s.exec(t);var r;return r=n?new Date(Number(n[1])).valueOf():new Date(t).valueOf(),"/Date("+r+")/"}throw new Error("Cannot convert object of type "+e.getType(t)+" to type ASPDate");default:throw new Error('Unknown type "'+i+'"')}};var s=/^\/?Date\((\-?\d+)/i;e.getType=function(t){var e=typeof t;return"object"==e?null===t?"null":t instanceof Boolean?"Boolean":t instanceof Number?"Number":t instanceof String?"String":Array.isArray(t)?"Array":t instanceof Date?"Date":"Object":"number"==e?"Number":"boolean"==e?"Boolean":"string"==e?"String":void 0===e?"undefined":e; -},e.copyAndExtendArray=function(t,e){for(var i=[],o=0;oi;i++)e(t[i],i,t);else for(i in t)t.hasOwnProperty(i)&&e(t[i],i,t)},e.toArray=function(t){var e=[];for(var i in t)t.hasOwnProperty(i)&&e.push(t[i]);return e},e.updateProperty=function(t,e,i){return t[e]!==i?(t[e]=i,!0):!1},e.addEventListener=function(t,e,i,o){t.addEventListener?(void 0===o&&(o=!1),"mousewheel"===e&&navigator.userAgent.indexOf("Firefox")>=0&&(e="DOMMouseScroll"),t.addEventListener(e,i,o)):t.attachEvent("on"+e,i)},e.removeEventListener=function(t,e,i,o){t.removeEventListener?(void 0===o&&(o=!1),"mousewheel"===e&&navigator.userAgent.indexOf("Firefox")>=0&&(e="DOMMouseScroll"),t.removeEventListener(e,i,o)):t.detachEvent("on"+e,i)},e.preventDefault=function(t){t||(t=window.event),t.preventDefault?t.preventDefault():t.returnValue=!1},e.getTarget=function(t){t||(t=window.event);var e;return t.target?e=t.target:t.srcElement&&(e=t.srcElement),void 0!=e.nodeType&&3==e.nodeType&&(e=e.parentNode),e},e.hasParent=function(t,e){for(var i=t;i;){if(i===e)return!0;i=i.parentNode}return!1},e.option={},e.option.asBoolean=function(t,e){return"function"==typeof t&&(t=t()),null!=t?0!=t:e||null},e.option.asNumber=function(t,e){return"function"==typeof t&&(t=t()),null!=t?Number(t)||e||null:e||null},e.option.asString=function(t,e){return"function"==typeof t&&(t=t()),null!=t?String(t):e||null},e.option.asSize=function(t,i){return"function"==typeof t&&(t=t()),e.isString(t)?t:e.isNumber(t)?t+"px":i||null},e.option.asElement=function(t,e){return"function"==typeof t&&(t=t()),t||e||null},e.hexToRGB=function(t){var e=/^#?([a-f\d])([a-f\d])([a-f\d])$/i;t=t.replace(e,function(t,e,i,o){return e+e+i+i+o+o});var i=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(t);return i?{r:parseInt(i[1],16),g:parseInt(i[2],16),b:parseInt(i[3],16)}:null},e.overrideOpacity=function(t,i){if(-1!=t.indexOf("rgba"))return t;if(-1!=t.indexOf("rgb")){var o=t.substr(t.indexOf("(")+1).replace(")","").split(",");return"rgba("+o[0]+","+o[1]+","+o[2]+","+i+")"}var o=e.hexToRGB(t);return null==o?t:"rgba("+o.r+","+o.g+","+o.b+","+i+")"},e.RGBToHex=function(t,e,i){return"#"+((1<<24)+(t<<16)+(e<<8)+i).toString(16).slice(1)},e.parseColor=function(t){var i;if(e.isString(t)===!0){if(e.isValidRGB(t)===!0){var o=t.substr(4).substr(0,t.length-5).split(",").map(function(t){return parseInt(t)});t=e.RGBToHex(o[0],o[1],o[2])}if(e.isValidHex(t)===!0){var n=e.hexToHSV(t),s={h:n.h,s:.8*n.s,v:Math.min(1,1.02*n.v)},r={h:n.h,s:Math.min(1,1.25*n.s),v:.8*n.v},a=e.HSVToHex(r.h,r.s,r.v),h=e.HSVToHex(s.h,s.s,s.v);i={background:t,border:a,highlight:{background:h,border:a},hover:{background:h,border:a}}}else i={background:t,border:t,highlight:{background:t,border:t},hover:{background:t,border:t}}}else i={},i.background=t.background||void 0,i.border=t.border||void 0,e.isString(t.highlight)?i.highlight={border:t.highlight,background:t.highlight}:(i.highlight={},i.highlight.background=t.highlight&&t.highlight.background||void 0,i.highlight.border=t.highlight&&t.highlight.border||void 0),e.isString(t.hover)?i.hover={border:t.hover,background:t.hover}:(i.hover={},i.hover.background=t.hover&&t.hover.background||void 0,i.hover.border=t.hover&&t.hover.border||void 0);return i},e.RGBToHSV=function(t,e,i){t/=255,e/=255,i/=255;var o=Math.min(t,Math.min(e,i)),n=Math.max(t,Math.max(e,i));if(o==n)return{h:0,s:0,v:o};var s=t==o?e-i:i==o?t-e:i-t,r=t==o?3:i==o?1:5,a=60*(r-s/(n-o))/360,h=(n-o)/n,d=n;return{h:a,s:h,v:d}};var r={split:function(t){var e={};return t.split(";").forEach(function(t){if(""!=t.trim()){var i=t.split(":"),o=i[0].trim(),n=i[1].trim();e[o]=n}}),e},join:function(t){return Object.keys(t).map(function(e){return e+": "+t[e]}).join("; ")}};e.addCssText=function(t,i){var o=r.split(t.style.cssText),n=r.split(i),s=e.extend(o,n);t.style.cssText=r.join(s)},e.removeCssText=function(t,e){var i=r.split(t.style.cssText),o=r.split(e);for(var n in o)o.hasOwnProperty(n)&&delete i[n];t.style.cssText=r.join(i)},e.HSVToRGB=function(t,e,i){var o,n,s,r=Math.floor(6*t),a=6*t-r,h=i*(1-e),d=i*(1-a*e),l=i*(1-(1-a)*e);switch(r%6){case 0:o=i,n=l,s=h;break;case 1:o=d,n=i,s=h;break;case 2:o=h,n=i,s=l;break;case 3:o=h,n=d,s=i;break;case 4:o=l,n=h,s=i;break;case 5:o=i,n=h,s=d}return{r:Math.floor(255*o),g:Math.floor(255*n),b:Math.floor(255*s)}},e.HSVToHex=function(t,i,o){var n=e.HSVToRGB(t,i,o);return e.RGBToHex(n.r,n.g,n.b)},e.hexToHSV=function(t){var i=e.hexToRGB(t);return e.RGBToHSV(i.r,i.g,i.b)},e.isValidHex=function(t){var e=/(^#[0-9A-F]{6}$)|(^#[0-9A-F]{3}$)/i.test(t);return e},e.isValidRGB=function(t){t=t.replace(" ","");var e=/rgb\((\d{1,3}),(\d{1,3}),(\d{1,3})\)/i.test(t);return e},e.isValidRGBA=function(t){t=t.replace(" ","");var e=/rgba\((\d{1,3}),(\d{1,3}),(\d{1,3}),(.{1,3})\)/i.test(t);return e},e.selectiveBridgeObject=function(t,i){if("object"==typeof i){for(var o=Object.create(i),n=0;n=r&&n>s;){var h=Math.floor((r+a)/2),d=t[h],l=void 0===o?d[i]:d[i][o],u=e(l);if(0==u)return h;-1==u?r=h+1:a=h-1,s++}return-1},e.binarySearchValue=function(t,e,i,o){for(var n,s,r,a,h=1e4,d=0,l=0,u=t.length-1;u>=l&&h>d;){if(a=Math.floor(.5*(u+l)),n=t[Math.max(0,a-1)][i],s=t[a][i],r=t[Math.min(t.length-1,a+1)][i],s==e)return a;if(e>n&&s>e)return"before"==o?Math.max(0,a-1):a;if(e>s&&r>e)return"before"==o?a:Math.min(t.length-1,a+1);e>s?l=a+1:u=a-1,d++}return-1},e.easingFunctions={linear:function(t){return t},easeInQuad:function(t){return t*t},easeOutQuad:function(t){return t*(2-t)},easeInOutQuad:function(t){return.5>t?2*t*t:-1+(4-2*t)*t},easeInCubic:function(t){return t*t*t},easeOutCubic:function(t){return--t*t*t+1},easeInOutCubic:function(t){return.5>t?4*t*t*t:(t-1)*(2*t-2)*(2*t-2)+1},easeInQuart:function(t){return t*t*t*t},easeOutQuart:function(t){return 1- --t*t*t*t},easeInOutQuart:function(t){return.5>t?8*t*t*t*t:1-8*--t*t*t*t},easeInQuint:function(t){return t*t*t*t*t},easeOutQuint:function(t){return 1+--t*t*t*t*t},easeInOutQuint:function(t){return.5>t?16*t*t*t*t*t:1+16*--t*t*t*t*t}}},function(t,e,i){t.exports="undefined"!=typeof window&&window.moment||i(9)},function(t,e,i){(function(t){!function(e,i){t.exports=i()}(this,function(){function e(){return Si.apply(null,arguments)}function i(t){Si=t}function o(t){return"[object Array]"===Object.prototype.toString.call(t)}function n(t){return t instanceof Date||"[object Date]"===Object.prototype.toString.call(t)}function s(t,e){var i,o=[];for(i=0;i0)for(i in Ii)o=Ii[i],n=e[o],"undefined"!=typeof n&&(t[o]=n);return t}function f(t){p(this,t),this._d=new Date(+t._d),zi===!1&&(zi=!0,e.updateOffset(this),zi=!1)}function m(t){return t instanceof f||null!=t&&null!=t._isAMomentObject}function v(t){var e=+t,i=0;return 0!==e&&isFinite(e)&&(i=e>=0?Math.floor(e):Math.ceil(e)),i}function g(t,e,i){var o,n=Math.min(t.length,e.length),s=Math.abs(t.length-e.length),r=0;for(o=0;n>o;o++)(i&&t[o]!==e[o]||!i&&v(t[o])!==v(e[o]))&&r++;return r+s}function y(){}function b(t){return t?t.toLowerCase().replace("_","-"):t}function w(t){for(var e,i,o,n,s=0;s0;){if(o=_(n.slice(0,e).join("-")))return o;if(i&&i.length>=e&&g(n,i,!0)>=e-1)break;e--}s++}return null}function _(e){var i=null;if(!Ni[e]&&"undefined"!=typeof t&&t&&t.exports)try{i=Pi._abbr,!function(){var t=new Error('Cannot find module "./locale"');throw t.code="MODULE_NOT_FOUND",t}(),x(i)}catch(o){}return Ni[e]}function x(t,e){var i;return t&&(i="undefined"==typeof e?M(t):k(t,e),i&&(Pi=i)),Pi._abbr}function k(t,e){return null!==e?(e.abbr=t,Ni[t]||(Ni[t]=new y),Ni[t].set(e),x(t),Ni[t]):(delete Ni[t],null)}function M(t){var e;if(t&&t._locale&&t._locale._abbr&&(t=t._locale._abbr),!t)return Pi;if(!o(t)){if(e=_(t))return e;t=[t]}return w(t)}function O(t,e){var i=t.toLowerCase();Li[i]=Li[i+"s"]=Li[e]=t}function D(t){return"string"==typeof t?Li[t]||Li[t.toLowerCase()]:void 0}function C(t){var e,i,o={};for(i in t)r(t,i)&&(e=D(i),e&&(o[e]=t[i]));return o}function T(t,i){return function(o){return null!=o?(S(this,t,o),e.updateOffset(this,i),this):E(this,t)}}function E(t,e){return t._d["get"+(t._isUTC?"UTC":"")+e]()}function S(t,e,i){return t._d["set"+(t._isUTC?"UTC":"")+e](i)}function P(t,e){var i;if("object"==typeof t)for(i in t)this.set(i,t[i]);else if(t=D(t),"function"==typeof this[t])return this[t](e);return this}function I(t,e,i){for(var o=""+Math.abs(t),n=t>=0;o.lengthe;e++)Ri[o[e]]?o[e]=Ri[o[e]]:o[e]=N(o[e]);return function(n){var s="";for(e=0;i>e;e++)s+=o[e]instanceof Function?o[e].call(n,t):o[e];return s}}function A(t,e){return t.isValid()?(e=B(e,t.localeData()),Fi[e]||(Fi[e]=L(e)),Fi[e](t)):t.localeData().invalidDate()}function B(t,e){function i(t){return e.longDateFormat(t)||t}var o=5;for(Bi.lastIndex=0;o>=0&&Bi.test(t);)t=t.replace(Bi,i),Bi.lastIndex=0,o-=1;return t}function F(t,e,i){to[t]="function"==typeof e?e:function(t){return t&&i?i:e}}function R(t,e){return r(to,t)?to[t](e._strict,e._locale):new RegExp(j(t))}function j(t){return t.replace("\\","").replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,function(t,e,i,o,n){return e||i||o||n}).replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}function H(t,e){var i,o=e;for("string"==typeof t&&(t=[t]),"number"==typeof e&&(o=function(t,i){i[e]=v(t)}),i=0;io;o++){if(n=h([2e3,o]),i&&!this._longMonthsParse[o]&&(this._longMonthsParse[o]=new RegExp("^"+this.months(n,"").replace(".","")+"$","i"),this._shortMonthsParse[o]=new RegExp("^"+this.monthsShort(n,"").replace(".","")+"$","i")),i||this._monthsParse[o]||(s="^"+this.months(n,"")+"|^"+this.monthsShort(n,""),this._monthsParse[o]=new RegExp(s.replace(".",""),"i")),i&&"MMMM"===e&&this._longMonthsParse[o].test(t))return o;if(i&&"MMM"===e&&this._shortMonthsParse[o].test(t))return o;if(!i&&this._monthsParse[o].test(t))return o}}function X(t,e){var i;return"string"==typeof e&&(e=t.localeData().monthsParse(e),"number"!=typeof e)?t:(i=Math.min(t.date(),G(t.year(),e)),t._d["set"+(t._isUTC?"UTC":"")+"Month"](e,i),t)}function Z(t){return null!=t?(X(this,t),e.updateOffset(this,!0),this):E(this,"Month")}function K(){return G(this.year(),this.month())}function J(t){var e,i=t._a;return i&&-2===l(t).overflow&&(e=i[oo]<0||i[oo]>11?oo:i[no]<1||i[no]>G(i[io],i[oo])?no:i[so]<0||i[so]>24||24===i[so]&&(0!==i[ro]||0!==i[ao]||0!==i[ho])?so:i[ro]<0||i[ro]>59?ro:i[ao]<0||i[ao]>59?ao:i[ho]<0||i[ho]>999?ho:-1,l(t)._overflowDayOfYear&&(io>e||e>no)&&(e=no),l(t).overflow=e),t}function Q(t){e.suppressDeprecationWarnings===!1&&"undefined"!=typeof console&&console.warn&&console.warn("Deprecation warning: "+t)}function $(t,e){var i=!0,o=t+"\n"+(new Error).stack;return a(function(){return i&&(Q(o),i=!1),e.apply(this,arguments)},e)}function tt(t,e){co[t]||(Q(e),co[t]=!0)}function et(t){var e,i,o=t._i,n=po.exec(o);if(n){for(l(t).iso=!0,e=0,i=fo.length;i>e;e++)if(fo[e][1].exec(o)){t._f=fo[e][0]+(n[6]||" ");break}for(e=0,i=mo.length;i>e;e++)if(mo[e][1].exec(o)){t._f+=mo[e][0];break}o.match(Ji)&&(t._f+="Z"),wt(t)}else t._isValid=!1}function it(t){var i=vo.exec(t._i);return null!==i?void(t._d=new Date(+i[1])):(et(t),void(t._isValid===!1&&(delete t._isValid,e.createFromInputFallback(t))))}function ot(t,e,i,o,n,s,r){var a=new Date(t,e,i,o,n,s,r);return 1970>t&&a.setFullYear(t),a}function nt(t){var e=new Date(Date.UTC.apply(null,arguments));return 1970>t&&e.setUTCFullYear(t),e}function st(t){return rt(t)?366:365}function rt(t){return t%4===0&&t%100!==0||t%400===0}function at(){return rt(this.year())}function ht(t,e,i){var o,n=i-e,s=i-t.day();return s>n&&(s-=7),n-7>s&&(s+=7),o=Ct(t).add(s,"d"),{week:Math.ceil(o.dayOfYear()/7),year:o.year()}}function dt(t){return ht(t,this._week.dow,this._week.doy).week}function lt(){return this._week.dow}function ut(){return this._week.doy}function ct(t){var e=this.localeData().week(this);return null==t?e:this.add(7*(t-e),"d")}function pt(t){var e=ht(this,1,4).week;return null==t?e:this.add(7*(t-e),"d")}function ft(t,e,i,o,n){var s,r,a=nt(t,0,1).getUTCDay();return a=0===a?7:a,i=null!=i?i:n,s=n-a+(a>o?7:0)-(n>a?7:0),r=7*(e-1)+(i-n)+s+1,{year:r>0?t:t-1,dayOfYear:r>0?r:st(t-1)+r}}function mt(t){var e=Math.round((this.clone().startOf("day")-this.clone().startOf("year"))/864e5)+1;return null==t?e:this.add(t-e,"d")}function vt(t,e,i){return null!=t?t:null!=e?e:i}function gt(t){var e=new Date;return t._useUTC?[e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate()]:[e.getFullYear(),e.getMonth(),e.getDate()]}function yt(t){var e,i,o,n,s=[];if(!t._d){for(o=gt(t),t._w&&null==t._a[no]&&null==t._a[oo]&&bt(t),t._dayOfYear&&(n=vt(t._a[io],o[io]),t._dayOfYear>st(n)&&(l(t)._overflowDayOfYear=!0),i=nt(n,0,t._dayOfYear),t._a[oo]=i.getUTCMonth(),t._a[no]=i.getUTCDate()),e=0;3>e&&null==t._a[e];++e)t._a[e]=s[e]=o[e];for(;7>e;e++)t._a[e]=s[e]=null==t._a[e]?2===e?1:0:t._a[e];24===t._a[so]&&0===t._a[ro]&&0===t._a[ao]&&0===t._a[ho]&&(t._nextDay=!0,t._a[so]=0),t._d=(t._useUTC?nt:ot).apply(null,s),null!=t._tzm&&t._d.setUTCMinutes(t._d.getUTCMinutes()-t._tzm),t._nextDay&&(t._a[so]=24)}}function bt(t){var e,i,o,n,s,r,a;e=t._w,null!=e.GG||null!=e.W||null!=e.E?(s=1,r=4,i=vt(e.GG,t._a[io],ht(Ct(),1,4).year),o=vt(e.W,1),n=vt(e.E,1)):(s=t._locale._week.dow,r=t._locale._week.doy,i=vt(e.gg,t._a[io],ht(Ct(),s,r).year),o=vt(e.w,1),null!=e.d?(n=e.d,s>n&&++o):n=null!=e.e?e.e+s:s),a=ft(i,o,n,r,s),t._a[io]=a.year,t._dayOfYear=a.dayOfYear}function wt(t){if(t._f===e.ISO_8601)return void et(t);t._a=[],l(t).empty=!0;var i,o,n,s,r,a=""+t._i,h=a.length,d=0;for(n=B(t._f,t._locale).match(Ai)||[],i=0;i0&&l(t).unusedInput.push(r),a=a.slice(a.indexOf(o)+o.length),d+=o.length),Ri[s]?(o?l(t).empty=!1:l(t).unusedTokens.push(s),W(s,o,t)):t._strict&&!o&&l(t).unusedTokens.push(s);l(t).charsLeftOver=h-d,a.length>0&&l(t).unusedInput.push(a),l(t).bigHour===!0&&t._a[so]<=12&&t._a[so]>0&&(l(t).bigHour=void 0),t._a[so]=_t(t._locale,t._a[so],t._meridiem),yt(t),J(t)}function _t(t,e,i){var o;return null==i?e:null!=t.meridiemHour?t.meridiemHour(e,i):null!=t.isPM?(o=t.isPM(i),o&&12>e&&(e+=12),o||12!==e||(e=0),e):e}function xt(t){var e,i,o,n,s;if(0===t._f.length)return l(t).invalidFormat=!0,void(t._d=new Date(NaN));for(n=0;ns)&&(o=s,i=e));a(t,i||e)}function kt(t){if(!t._d){var e=C(t._i);t._a=[e.year,e.month,e.day||e.date,e.hour,e.minute,e.second,e.millisecond],yt(t)}}function Mt(t){var e,i=t._i,s=t._f;return t._locale=t._locale||M(t._l),null===i||void 0===s&&""===i?c({nullInput:!0}):("string"==typeof i&&(t._i=i=t._locale.preparse(i)),m(i)?new f(J(i)):(o(s)?xt(t):s?wt(t):n(i)?t._d=i:Ot(t),e=new f(J(t)),e._nextDay&&(e.add(1,"d"),e._nextDay=void 0),e))}function Ot(t){var i=t._i;void 0===i?t._d=new Date:n(i)?t._d=new Date(+i):"string"==typeof i?it(t):o(i)?(t._a=s(i.slice(0),function(t){return parseInt(t,10)}),yt(t)):"object"==typeof i?kt(t):"number"==typeof i?t._d=new Date(i):e.createFromInputFallback(t)}function Dt(t,e,i,o,n){var s={};return"boolean"==typeof i&&(o=i,i=void 0),s._isAMomentObject=!0,s._useUTC=s._isUTC=n,s._l=i,s._i=t,s._f=e,s._strict=o,Mt(s)}function Ct(t,e,i,o){return Dt(t,e,i,o,!1)}function Tt(t,e){var i,n;if(1===e.length&&o(e[0])&&(e=e[0]),!e.length)return Ct();for(i=e[0],n=1;nt&&(t=-t,i="-"),i+I(~~(t/60),2)+e+I(~~t%60,2)})}function Nt(t){var e=(t||"").match(Ji)||[],i=e[e.length-1]||[],o=(i+"").match(_o)||["-",0,0],n=+(60*o[1])+v(o[2]);return"+"===o[0]?n:-n}function Lt(t,i){var o,s;return i._isUTC?(o=i.clone(),s=(m(t)||n(t)?+t:+Ct(t))-+o,o._d.setTime(+o._d+s),e.updateOffset(o,!1),o):Ct(t).local()}function At(t){return 15*-Math.round(t._d.getTimezoneOffset()/15)}function Bt(t,i){var o,n=this._offset||0;return null!=t?("string"==typeof t&&(t=Nt(t)),Math.abs(t)<16&&(t=60*t),!this._isUTC&&i&&(o=At(this)),this._offset=t,this._isUTC=!0,null!=o&&this.add(o,"m"),n!==t&&(!i||this._changeInProgress?$t(this,Xt(t-n,"m"),1,!1):this._changeInProgress||(this._changeInProgress=!0,e.updateOffset(this,!0),this._changeInProgress=null)),this):this._isUTC?n:At(this)}function Ft(t,e){return null!=t?("string"!=typeof t&&(t=-t),this.utcOffset(t,e),this):-this.utcOffset()}function Rt(t){return this.utcOffset(0,t)}function jt(t){return this._isUTC&&(this.utcOffset(0,t),this._isUTC=!1,t&&this.subtract(At(this),"m")),this}function Ht(){return this._tzm?this.utcOffset(this._tzm):"string"==typeof this._i&&this.utcOffset(Nt(this._i)),this}function Yt(t){return t=t?Ct(t).utcOffset():0,(this.utcOffset()-t)%60===0}function Wt(){return this.utcOffset()>this.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()}function Gt(){if(this._a){var t=this._isUTC?h(this._a):Ct(this._a);return this.isValid()&&g(this._a,t.toArray())>0}return!1}function Ut(){return!this._isUTC}function Vt(){return this._isUTC}function qt(){return this._isUTC&&0===this._offset}function Xt(t,e){var i,o,n,s=t,a=null;return It(t)?s={ms:t._milliseconds,d:t._days,M:t._months}:"number"==typeof t?(s={},e?s[e]=t:s.milliseconds=t):(a=xo.exec(t))?(i="-"===a[1]?-1:1,s={y:0,d:v(a[no])*i,h:v(a[so])*i,m:v(a[ro])*i,s:v(a[ao])*i,ms:v(a[ho])*i}):(a=ko.exec(t))?(i="-"===a[1]?-1:1,s={y:Zt(a[2],i),M:Zt(a[3],i),d:Zt(a[4],i),h:Zt(a[5],i),m:Zt(a[6],i),s:Zt(a[7],i),w:Zt(a[8],i)}):null==s?s={}:"object"==typeof s&&("from"in s||"to"in s)&&(n=Jt(Ct(s.from),Ct(s.to)),s={},s.ms=n.milliseconds,s.M=n.months),o=new Pt(s),It(t)&&r(t,"_locale")&&(o._locale=t._locale),o}function Zt(t,e){var i=t&&parseFloat(t.replace(",","."));return(isNaN(i)?0:i)*e}function Kt(t,e){var i={milliseconds:0,months:0};return i.months=e.month()-t.month()+12*(e.year()-t.year()),t.clone().add(i.months,"M").isAfter(e)&&--i.months,i.milliseconds=+e-+t.clone().add(i.months,"M"),i}function Jt(t,e){var i;return e=Lt(e,t),t.isBefore(e)?i=Kt(t,e):(i=Kt(e,t),i.milliseconds=-i.milliseconds,i.months=-i.months),i}function Qt(t,e){return function(i,o){var n,s;return null===o||isNaN(+o)||(tt(e,"moment()."+e+"(period, number) is deprecated. Please use moment()."+e+"(number, period)."),s=i,i=o,o=s),i="string"==typeof i?+i:i,n=Xt(i,o),$t(this,n,t),this}}function $t(t,i,o,n){var s=i._milliseconds,r=i._days,a=i._months;n=null==n?!0:n,s&&t._d.setTime(+t._d+s*o),r&&S(t,"Date",E(t,"Date")+r*o),a&&X(t,E(t,"Month")+a*o),n&&e.updateOffset(t,r||a)}function te(t){var e=t||Ct(),i=Lt(e,this).startOf("day"),o=this.diff(i,"days",!0),n=-6>o?"sameElse":-1>o?"lastWeek":0>o?"lastDay":1>o?"sameDay":2>o?"nextDay":7>o?"nextWeek":"sameElse";return this.format(this.localeData().calendar(n,this,Ct(e)))}function ee(){return new f(this)}function ie(t,e){var i;return e=D("undefined"!=typeof e?e:"millisecond"),"millisecond"===e?(t=m(t)?t:Ct(t),+this>+t):(i=m(t)?+t:+Ct(t),i<+this.clone().startOf(e))}function oe(t,e){var i;return e=D("undefined"!=typeof e?e:"millisecond"),"millisecond"===e?(t=m(t)?t:Ct(t),+t>+this):(i=m(t)?+t:+Ct(t),+this.clone().endOf(e)t?Math.ceil(t):Math.floor(t)}function ae(t,e,i){var o,n,s=Lt(t,this),r=6e4*(s.utcOffset()-this.utcOffset());return e=D(e),"year"===e||"month"===e||"quarter"===e?(n=he(this,s),"quarter"===e?n/=3:"year"===e&&(n/=12)):(o=this-s,n="second"===e?o/1e3:"minute"===e?o/6e4:"hour"===e?o/36e5:"day"===e?(o-r)/864e5:"week"===e?(o-r)/6048e5:o),i?n:re(n)}function he(t,e){var i,o,n=12*(e.year()-t.year())+(e.month()-t.month()),s=t.clone().add(n,"months");return 0>e-s?(i=t.clone().add(n-1,"months"),o=(e-s)/(s-i)):(i=t.clone().add(n+1,"months"),o=(e-s)/(i-s)),-(n+o)}function de(){return this.clone().locale("en").format("ddd MMM DD YYYY HH:mm:ss [GMT]ZZ")}function le(){var t=this.clone().utc();return 0e;e++)if(this._weekdaysParse[e]||(i=Ct([2e3,1]).day(e),o="^"+this.weekdays(i,"")+"|^"+this.weekdaysShort(i,"")+"|^"+this.weekdaysMin(i,""),this._weekdaysParse[e]=new RegExp(o.replace(".",""),"i")),this._weekdaysParse[e].test(t))return e}function Re(t){var e=this._isUTC?this._d.getUTCDay():this._d.getDay();return null!=t?(t=Ne(t,this.localeData()),this.add(t-e,"d")):e}function je(t){var e=(this.day()+7-this.localeData()._week.dow)%7;return null==t?e:this.add(t-e,"d")}function He(t){return null==t?this.day()||7:this.day(this.day()%7?t:t-7)}function Ye(t,e){z(t,0,0,function(){return this.localeData().meridiem(this.hours(),this.minutes(),e)})}function We(t,e){return e._meridiemParse}function Ge(t){return"p"===(t+"").toLowerCase().charAt(0)}function Ue(t,e,i){return t>11?i?"pm":"PM":i?"am":"AM"}function Ve(t){z(0,[t,3],0,"millisecond")}function qe(){return this._isUTC?"UTC":""}function Xe(){return this._isUTC?"Coordinated Universal Time":""}function Ze(t){return Ct(1e3*t)}function Ke(){return Ct.apply(null,arguments).parseZone()}function Je(t,e,i){var o=this._calendar[t];return"function"==typeof o?o.call(e,i):o}function Qe(t){var e=this._longDateFormat[t];return!e&&this._longDateFormat[t.toUpperCase()]&&(e=this._longDateFormat[t.toUpperCase()].replace(/MMMM|MM|DD|dddd/g,function(t){return t.slice(1)}),this._longDateFormat[t]=e),e}function $e(){return this._invalidDate}function ti(t){return this._ordinal.replace("%d",t)}function ei(t){return t}function ii(t,e,i,o){var n=this._relativeTime[i];return"function"==typeof n?n(t,e,i,o):n.replace(/%d/i,t)}function oi(t,e){var i=this._relativeTime[t>0?"future":"past"];return"function"==typeof i?i(e):i.replace(/%s/i,e)}function ni(t){var e,i;for(i in t)e=t[i],"function"==typeof e?this[i]=e:this["_"+i]=e;this._ordinalParseLenient=new RegExp(this._ordinalParse.source+"|"+/\d{1,2}/.source)}function si(t,e,i,o){var n=M(),s=h().set(o,e);return n[i](s,t)}function ri(t,e,i,o,n){if("number"==typeof t&&(e=t,t=void 0),t=t||"",null!=e)return si(t,e,i,n);var s,r=[];for(s=0;o>s;s++)r[s]=si(t,s,i,n);return r}function ai(t,e){return ri(t,e,"months",12,"month")}function hi(t,e){return ri(t,e,"monthsShort",12,"month")}function di(t,e){return ri(t,e,"weekdays",7,"day")}function li(t,e){return ri(t,e,"weekdaysShort",7,"day")}function ui(t,e){return ri(t,e,"weekdaysMin",7,"day")}function ci(){var t=this._data;return this._milliseconds=Uo(this._milliseconds),this._days=Uo(this._days),this._months=Uo(this._months),t.milliseconds=Uo(t.milliseconds),t.seconds=Uo(t.seconds),t.minutes=Uo(t.minutes),t.hours=Uo(t.hours),t.months=Uo(t.months),t.years=Uo(t.years),this}function pi(t,e,i,o){var n=Xt(e,i);return t._milliseconds+=o*n._milliseconds,t._days+=o*n._days,t._months+=o*n._months,t._bubble()}function fi(t,e){return pi(this,t,e,1)}function mi(t,e){return pi(this,t,e,-1)}function vi(){var t,e,i,o=this._milliseconds,n=this._days,s=this._months,r=this._data,a=0;return r.milliseconds=o%1e3,t=re(o/1e3),r.seconds=t%60,e=re(t/60),r.minutes=e%60,i=re(e/60),r.hours=i%24,n+=re(i/24),a=re(gi(n)),n-=re(yi(a)),s+=re(n/30),n%=30,a+=re(s/12),s%=12,r.days=n,r.months=s,r.years=a,this}function gi(t){return 400*t/146097}function yi(t){return 146097*t/400}function bi(t){var e,i,o=this._milliseconds;if(t=D(t),"month"===t||"year"===t)return e=this._days+o/864e5,i=this._months+12*gi(e),"month"===t?i:i/12;switch(e=this._days+Math.round(yi(this._months/12)),t){case"week":return e/7+o/6048e5;case"day":return e+o/864e5;case"hour":return 24*e+o/36e5;case"minute":return 1440*e+o/6e4;case"second":return 86400*e+o/1e3;case"millisecond":return Math.floor(864e5*e)+o;default:throw new Error("Unknown unit "+t)}}function wi(){return this._milliseconds+864e5*this._days+this._months%12*2592e6+31536e6*v(this._months/12)}function _i(t){return function(){return this.as(t)}}function xi(t){return t=D(t),this[t+"s"]()}function ki(t){return function(){return this._data[t]}}function Mi(){return re(this.days()/7)}function Oi(t,e,i,o,n){return n.relativeTime(e||1,!!i,t,o)}function Di(t,e,i){var o=Xt(t).abs(),n=hn(o.as("s")),s=hn(o.as("m")),r=hn(o.as("h")),a=hn(o.as("d")),h=hn(o.as("M")),d=hn(o.as("y")),l=n0,l[4]=i,Oi.apply(null,l)}function Ci(t,e){return void 0===dn[t]?!1:void 0===e?dn[t]:(dn[t]=e,!0)}function Ti(t){var e=this.localeData(),i=Di(this,!t,e);return t&&(i=e.pastFuture(+this,i)),e.postformat(i)}function Ei(){var t=ln(this.years()),e=ln(this.months()),i=ln(this.days()),o=ln(this.hours()),n=ln(this.minutes()),s=ln(this.seconds()+this.milliseconds()/1e3),r=this.asSeconds();return r?(0>r?"-":"")+"P"+(t?t+"Y":"")+(e?e+"M":"")+(i?i+"D":"")+(o||n||s?"T":"")+(o?o+"H":"")+(n?n+"M":"")+(s?s+"S":""):"P0D"}var Si,Pi,Ii=e.momentProperties=[],zi=!1,Ni={},Li={},Ai=/(\[[^\[]*\])|(\\)?(Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Q|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|mm?|ss?|S{1,4}|x|X|zz?|ZZ?|.)/g,Bi=/(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g,Fi={},Ri={},ji=/\d/,Hi=/\d\d/,Yi=/\d{3}/,Wi=/\d{4}/,Gi=/[+-]?\d{6}/,Ui=/\d\d?/,Vi=/\d{1,3}/,qi=/\d{1,4}/,Xi=/[+-]?\d{1,6}/,Zi=/\d+/,Ki=/[+-]?\d+/,Ji=/Z|[+-]\d\d:?\d\d/gi,Qi=/[+-]?\d+(\.\d{1,3})?/,$i=/[0-9]*['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+|[\u0600-\u06FF\/]+(\s*?[\u0600-\u06FF]+){1,2}/i,to={},eo={},io=0,oo=1,no=2,so=3,ro=4,ao=5,ho=6;z("M",["MM",2],"Mo",function(){return this.month()+1}),z("MMM",0,0,function(t){return this.localeData().monthsShort(this,t)}),z("MMMM",0,0,function(t){return this.localeData().months(this,t); -}),O("month","M"),F("M",Ui),F("MM",Ui,Hi),F("MMM",$i),F("MMMM",$i),H(["M","MM"],function(t,e){e[oo]=v(t)-1}),H(["MMM","MMMM"],function(t,e,i,o){var n=i._locale.monthsParse(t,o,i._strict);null!=n?e[oo]=n:l(i).invalidMonth=t});var lo="January_February_March_April_May_June_July_August_September_October_November_December".split("_"),uo="Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),co={};e.suppressDeprecationWarnings=!1;var po=/^\s*(?:[+-]\d{6}|\d{4})-(?:(\d\d-\d\d)|(W\d\d$)|(W\d\d-\d)|(\d\d\d))((T| )(\d\d(:\d\d(:\d\d(\.\d+)?)?)?)?([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/,fo=[["YYYYYY-MM-DD",/[+-]\d{6}-\d{2}-\d{2}/],["YYYY-MM-DD",/\d{4}-\d{2}-\d{2}/],["GGGG-[W]WW-E",/\d{4}-W\d{2}-\d/],["GGGG-[W]WW",/\d{4}-W\d{2}/],["YYYY-DDD",/\d{4}-\d{3}/]],mo=[["HH:mm:ss.SSSS",/(T| )\d\d:\d\d:\d\d\.\d+/],["HH:mm:ss",/(T| )\d\d:\d\d:\d\d/],["HH:mm",/(T| )\d\d:\d\d/],["HH",/(T| )\d\d/]],vo=/^\/?Date\((\-?\d+)/i;e.createFromInputFallback=$("moment construction falls back to js Date. This is discouraged and will be removed in upcoming major release. Please refer to https://github.com/moment/moment/issues/1407 for more info.",function(t){t._d=new Date(t._i+(t._useUTC?" UTC":""))}),z(0,["YY",2],0,function(){return this.year()%100}),z(0,["YYYY",4],0,"year"),z(0,["YYYYY",5],0,"year"),z(0,["YYYYYY",6,!0],0,"year"),O("year","y"),F("Y",Ki),F("YY",Ui,Hi),F("YYYY",qi,Wi),F("YYYYY",Xi,Gi),F("YYYYYY",Xi,Gi),H(["YYYY","YYYYY","YYYYYY"],io),H("YY",function(t,i){i[io]=e.parseTwoDigitYear(t)}),e.parseTwoDigitYear=function(t){return v(t)+(v(t)>68?1900:2e3)};var go=T("FullYear",!1);z("w",["ww",2],"wo","week"),z("W",["WW",2],"Wo","isoWeek"),O("week","w"),O("isoWeek","W"),F("w",Ui),F("ww",Ui,Hi),F("W",Ui),F("WW",Ui,Hi),Y(["w","ww","W","WW"],function(t,e,i,o){e[o.substr(0,1)]=v(t)});var yo={dow:0,doy:6};z("DDD",["DDDD",3],"DDDo","dayOfYear"),O("dayOfYear","DDD"),F("DDD",Vi),F("DDDD",Yi),H(["DDD","DDDD"],function(t,e,i){i._dayOfYear=v(t)}),e.ISO_8601=function(){};var bo=$("moment().min is deprecated, use moment.min instead. https://github.com/moment/moment/issues/1548",function(){var t=Ct.apply(null,arguments);return this>t?this:t}),wo=$("moment().max is deprecated, use moment.max instead. https://github.com/moment/moment/issues/1548",function(){var t=Ct.apply(null,arguments);return t>this?this:t});zt("Z",":"),zt("ZZ",""),F("Z",Ji),F("ZZ",Ji),H(["Z","ZZ"],function(t,e,i){i._useUTC=!0,i._tzm=Nt(t)});var _o=/([\+\-]|\d\d)/gi;e.updateOffset=function(){};var xo=/(\-)?(?:(\d*)\.)?(\d+)\:(\d+)(?:\:(\d+)\.?(\d{3})?)?/,ko=/^(-)?P(?:(?:([0-9,.]*)Y)?(?:([0-9,.]*)M)?(?:([0-9,.]*)D)?(?:T(?:([0-9,.]*)H)?(?:([0-9,.]*)M)?(?:([0-9,.]*)S)?)?|([0-9,.]*)W)$/;Xt.fn=Pt.prototype;var Mo=Qt(1,"add"),Oo=Qt(-1,"subtract");e.defaultFormat="YYYY-MM-DDTHH:mm:ssZ";var Do=$("moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.",function(t){return void 0===t?this.localeData():this.locale(t)});z(0,["gg",2],0,function(){return this.weekYear()%100}),z(0,["GG",2],0,function(){return this.isoWeekYear()%100}),Ce("gggg","weekYear"),Ce("ggggg","weekYear"),Ce("GGGG","isoWeekYear"),Ce("GGGGG","isoWeekYear"),O("weekYear","gg"),O("isoWeekYear","GG"),F("G",Ki),F("g",Ki),F("GG",Ui,Hi),F("gg",Ui,Hi),F("GGGG",qi,Wi),F("gggg",qi,Wi),F("GGGGG",Xi,Gi),F("ggggg",Xi,Gi),Y(["gggg","ggggg","GGGG","GGGGG"],function(t,e,i,o){e[o.substr(0,2)]=v(t)}),Y(["gg","GG"],function(t,i,o,n){i[n]=e.parseTwoDigitYear(t)}),z("Q",0,0,"quarter"),O("quarter","Q"),F("Q",ji),H("Q",function(t,e){e[oo]=3*(v(t)-1)}),z("D",["DD",2],"Do","date"),O("date","D"),F("D",Ui),F("DD",Ui,Hi),F("Do",function(t,e){return t?e._ordinalParse:e._ordinalParseLenient}),H(["D","DD"],no),H("Do",function(t,e){e[no]=v(t.match(Ui)[0],10)});var Co=T("Date",!0);z("d",0,"do","day"),z("dd",0,0,function(t){return this.localeData().weekdaysMin(this,t)}),z("ddd",0,0,function(t){return this.localeData().weekdaysShort(this,t)}),z("dddd",0,0,function(t){return this.localeData().weekdays(this,t)}),z("e",0,0,"weekday"),z("E",0,0,"isoWeekday"),O("day","d"),O("weekday","e"),O("isoWeekday","E"),F("d",Ui),F("e",Ui),F("E",Ui),F("dd",$i),F("ddd",$i),F("dddd",$i),Y(["dd","ddd","dddd"],function(t,e,i){var o=i._locale.weekdaysParse(t);null!=o?e.d=o:l(i).invalidWeekday=t}),Y(["d","e","E"],function(t,e,i,o){e[o]=v(t)});var To="Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),Eo="Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),So="Su_Mo_Tu_We_Th_Fr_Sa".split("_");z("H",["HH",2],0,"hour"),z("h",["hh",2],0,function(){return this.hours()%12||12}),Ye("a",!0),Ye("A",!1),O("hour","h"),F("a",We),F("A",We),F("H",Ui),F("h",Ui),F("HH",Ui,Hi),F("hh",Ui,Hi),H(["H","HH"],so),H(["a","A"],function(t,e,i){i._isPm=i._locale.isPM(t),i._meridiem=t}),H(["h","hh"],function(t,e,i){e[so]=v(t),l(i).bigHour=!0});var Po=/[ap]\.?m?\.?/i,Io=T("Hours",!0);z("m",["mm",2],0,"minute"),O("minute","m"),F("m",Ui),F("mm",Ui,Hi),H(["m","mm"],ro);var zo=T("Minutes",!1);z("s",["ss",2],0,"second"),O("second","s"),F("s",Ui),F("ss",Ui,Hi),H(["s","ss"],ao);var No=T("Seconds",!1);z("S",0,0,function(){return~~(this.millisecond()/100)}),z(0,["SS",2],0,function(){return~~(this.millisecond()/10)}),Ve("SSS"),Ve("SSSS"),O("millisecond","ms"),F("S",Vi,ji),F("SS",Vi,Hi),F("SSS",Vi,Yi),F("SSSS",Zi),H(["S","SS","SSS","SSSS"],function(t,e){e[ho]=v(1e3*("0."+t))});var Lo=T("Milliseconds",!1);z("z",0,0,"zoneAbbr"),z("zz",0,0,"zoneName");var Ao=f.prototype;Ao.add=Mo,Ao.calendar=te,Ao.clone=ee,Ao.diff=ae,Ao.endOf=be,Ao.format=ue,Ao.from=ce,Ao.fromNow=pe,Ao.to=fe,Ao.toNow=me,Ao.get=P,Ao.invalidAt=De,Ao.isAfter=ie,Ao.isBefore=oe,Ao.isBetween=ne,Ao.isSame=se,Ao.isValid=Me,Ao.lang=Do,Ao.locale=ve,Ao.localeData=ge,Ao.max=wo,Ao.min=bo,Ao.parsingFlags=Oe,Ao.set=P,Ao.startOf=ye,Ao.subtract=Oo,Ao.toArray=ke,Ao.toDate=xe,Ao.toISOString=le,Ao.toJSON=le,Ao.toString=de,Ao.unix=_e,Ao.valueOf=we,Ao.year=go,Ao.isLeapYear=at,Ao.weekYear=Ee,Ao.isoWeekYear=Se,Ao.quarter=Ao.quarters=ze,Ao.month=Z,Ao.daysInMonth=K,Ao.week=Ao.weeks=ct,Ao.isoWeek=Ao.isoWeeks=pt,Ao.weeksInYear=Ie,Ao.isoWeeksInYear=Pe,Ao.date=Co,Ao.day=Ao.days=Re,Ao.weekday=je,Ao.isoWeekday=He,Ao.dayOfYear=mt,Ao.hour=Ao.hours=Io,Ao.minute=Ao.minutes=zo,Ao.second=Ao.seconds=No,Ao.millisecond=Ao.milliseconds=Lo,Ao.utcOffset=Bt,Ao.utc=Rt,Ao.local=jt,Ao.parseZone=Ht,Ao.hasAlignedHourOffset=Yt,Ao.isDST=Wt,Ao.isDSTShifted=Gt,Ao.isLocal=Ut,Ao.isUtcOffset=Vt,Ao.isUtc=qt,Ao.isUTC=qt,Ao.zoneAbbr=qe,Ao.zoneName=Xe,Ao.dates=$("dates accessor is deprecated. Use date instead.",Co),Ao.months=$("months accessor is deprecated. Use month instead",Z),Ao.years=$("years accessor is deprecated. Use year instead",go),Ao.zone=$("moment().zone is deprecated, use moment().utcOffset instead. https://github.com/moment/moment/issues/1779",Ft);var Bo=Ao,Fo={sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},Ro={LTS:"h:mm:ss A",LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY LT",LLLL:"dddd, MMMM D, YYYY LT"},jo="Invalid date",Ho="%d",Yo=/\d{1,2}/,Wo={future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},Go=y.prototype;Go._calendar=Fo,Go.calendar=Je,Go._longDateFormat=Ro,Go.longDateFormat=Qe,Go._invalidDate=jo,Go.invalidDate=$e,Go._ordinal=Ho,Go.ordinal=ti,Go._ordinalParse=Yo,Go.preparse=ei,Go.postformat=ei,Go._relativeTime=Wo,Go.relativeTime=ii,Go.pastFuture=oi,Go.set=ni,Go.months=U,Go._months=lo,Go.monthsShort=V,Go._monthsShort=uo,Go.monthsParse=q,Go.week=dt,Go._week=yo,Go.firstDayOfYear=ut,Go.firstDayOfWeek=lt,Go.weekdays=Le,Go._weekdays=To,Go.weekdaysMin=Be,Go._weekdaysMin=So,Go.weekdaysShort=Ae,Go._weekdaysShort=Eo,Go.weekdaysParse=Fe,Go.isPM=Ge,Go._meridiemParse=Po,Go.meridiem=Ue,x("en",{ordinalParse:/\d{1,2}(th|st|nd|rd)/,ordinal:function(t){var e=t%10,i=1===v(t%100/10)?"th":1===e?"st":2===e?"nd":3===e?"rd":"th";return t+i}}),e.lang=$("moment.lang is deprecated. Use moment.locale instead.",x),e.langData=$("moment.langData is deprecated. Use moment.localeData instead.",M);var Uo=Math.abs,Vo=_i("ms"),qo=_i("s"),Xo=_i("m"),Zo=_i("h"),Ko=_i("d"),Jo=_i("w"),Qo=_i("M"),$o=_i("y"),tn=ki("milliseconds"),en=ki("seconds"),on=ki("minutes"),nn=ki("hours"),sn=ki("days"),rn=ki("months"),an=ki("years"),hn=Math.round,dn={s:45,m:45,h:22,d:26,M:11},ln=Math.abs,un=Pt.prototype;un.abs=ci,un.add=fi,un.subtract=mi,un.as=bi,un.asMilliseconds=Vo,un.asSeconds=qo,un.asMinutes=Xo,un.asHours=Zo,un.asDays=Ko,un.asWeeks=Jo,un.asMonths=Qo,un.asYears=$o,un.valueOf=wi,un._bubble=vi,un.get=xi,un.milliseconds=tn,un.seconds=en,un.minutes=on,un.hours=nn,un.days=sn,un.weeks=Mi,un.months=rn,un.years=an,un.humanize=Ti,un.toISOString=Ei,un.toString=Ei,un.toJSON=Ei,un.locale=ve,un.localeData=ge,un.toIsoString=$("toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)",Ei),un.lang=Do,z("X",0,0,"unix"),z("x",0,0,"valueOf"),F("x",Ki),F("X",Qi),H("X",function(t,e,i){i._d=new Date(1e3*parseFloat(t,10))}),H("x",function(t,e,i){i._d=new Date(v(t))}),e.version="2.10.3",i(Ct),e.fn=Bo,e.min=Et,e.max=St,e.utc=h,e.unix=Ze,e.months=ai,e.isDate=n,e.locale=x,e.invalid=c,e.duration=Xt,e.isMoment=m,e.weekdays=di,e.parseZone=Ke,e.localeData=M,e.isDuration=It,e.monthsShort=hi,e.weekdaysMin=ui,e.defineLocale=k,e.weekdaysShort=li,e.normalizeUnits=D,e.relativeTimeThreshold=Ci;var cn=e;return cn})}).call(e,i(10)(t))},function(t,e){t.exports=function(t){return t.webpackPolyfill||(t.deprecate=function(){},t.paths=[],t.children=[],t.webpackPolyfill=1),t}},function(t,e){function i(t){throw new Error("Cannot find module '"+t+"'.")}i.keys=function(){return[]},i.resolve=i,t.exports=i,i.id=11},function(t,e){(function(e){function i(t,e,i){var o=e&&i||0,n=0;for(e=e||[],t.toLowerCase().replace(/[0-9a-f]{2}/g,function(t){16>n&&(e[o+n++]=u[t])});16>n;)e[o+n++]=0;return e}function o(t,e){var i=e||0,o=l;return o[t[i++]]+o[t[i++]]+o[t[i++]]+o[t[i++]]+"-"+o[t[i++]]+o[t[i++]]+"-"+o[t[i++]]+o[t[i++]]+"-"+o[t[i++]]+o[t[i++]]+"-"+o[t[i++]]+o[t[i++]]+o[t[i++]]+o[t[i++]]+o[t[i++]]+o[t[i++]]}function n(t,e,i){var n=e&&i||0,s=e||[];t=t||{};var r=void 0!==t.clockseq?t.clockseq:m,a=void 0!==t.msecs?t.msecs:(new Date).getTime(),h=void 0!==t.nsecs?t.nsecs:g+1,d=a-v+(h-g)/1e4;if(0>d&&void 0===t.clockseq&&(r=r+1&16383),(0>d||a>v)&&void 0===t.nsecs&&(h=0),h>=1e4)throw new Error("uuid.v1(): Can't create more than 10M uuids/sec");v=a,g=h,m=r,a+=122192928e5;var l=(1e4*(268435455&a)+h)%4294967296;s[n++]=l>>>24&255,s[n++]=l>>>16&255,s[n++]=l>>>8&255,s[n++]=255&l;var u=a/4294967296*1e4&268435455;s[n++]=u>>>8&255,s[n++]=255&u,s[n++]=u>>>24&15|16,s[n++]=u>>>16&255,s[n++]=r>>>8|128,s[n++]=255&r;for(var c=t.node||f,p=0;6>p;p++)s[n+p]=c[p];return e?e:o(s)}function s(t,e,i){var n=e&&i||0;"string"==typeof t&&(e="binary"==t?new Array(16):null,t=null),t=t||{};var s=t.random||(t.rng||r)();if(s[6]=15&s[6]|64,s[8]=63&s[8]|128,e)for(var a=0;16>a;a++)e[n+a]=s[a];return e||o(s)}var r,a="undefined"!=typeof window?window:"undefined"!=typeof e?e:null;if(a&&a.crypto&&crypto.getRandomValues){var h=new Uint8Array(16);r=function(){return crypto.getRandomValues(h),h}}if(!r){var d=new Array(16);r=function(){for(var t,e=0;16>e;e++)0===(3&e)&&(t=4294967296*Math.random()),d[e]=t>>>((3&e)<<3)&255;return d}}for(var l=[],u={},c=0;256>c;c++)l[c]=(c+256).toString(16).substr(1),u[l[c]]=c;var p=r(),f=[1|p[0],p[1],p[2],p[3],p[4],p[5]],m=16383&(p[6]<<8|p[7]),v=0,g=0,y=s;y.v1=n,y.v4=s,y.parse=i,y.unparse=o,t.exports=y}).call(e,function(){return this}())},function(t,e){e.prepareElements=function(t){for(var e in t)t.hasOwnProperty(e)&&(t[e].redundant=t[e].used,t[e].used=[])},e.cleanupElements=function(t){for(var e in t)if(t.hasOwnProperty(e)&&t[e].redundant){for(var i=0;i0?(o=e[t].redundant[0],e[t].redundant.shift()):(o=document.createElementNS("http://www.w3.org/2000/svg",t),i.appendChild(o)):(o=document.createElementNS("http://www.w3.org/2000/svg",t),e[t]={used:[],redundant:[]},i.appendChild(o)),e[t].used.push(o),o},e.getDOMElement=function(t,e,i,o){var n;return e.hasOwnProperty(t)?e[t].redundant.length>0?(n=e[t].redundant[0],e[t].redundant.shift()):(n=document.createElement(t),void 0!==o?i.insertBefore(n,o):i.appendChild(n)):(n=document.createElement(t),e[t]={used:[],redundant:[]},void 0!==o?i.insertBefore(n,o):i.appendChild(n)),e[t].used.push(n),n},e.drawPoint=function(t,i,o,n,s,r){var a;if("circle"==o.style?(a=e.getSVGElement("circle",n,s),a.setAttributeNS(null,"cx",t),a.setAttributeNS(null,"cy",i),a.setAttributeNS(null,"r",.5*o.size)):(a=e.getSVGElement("rect",n,s),a.setAttributeNS(null,"x",t-.5*o.size),a.setAttributeNS(null,"y",i-.5*o.size),a.setAttributeNS(null,"width",o.size),a.setAttributeNS(null,"height",o.size)),void 0!==o.style&&a.setAttributeNS(null,"style",o.style),a.setAttributeNS(null,"class",o.className+" vis-point"),r){var h=e.getSVGElement("text",n,s);r.xOffset&&(t+=r.xOffset),r.yOffset&&(i+=r.yOffset),r.content&&(h.textContent=r.content),r.className&&h.setAttributeNS(null,"class",r.className+" vis-label"),h.setAttributeNS(null,"x",t),h.setAttributeNS(null,"y",i)}return a},e.drawBar=function(t,i,o,n,s,r,a,h){if(0!=n){0>n&&(n*=-1,i-=n);var d=e.getSVGElement("rect",r,a);d.setAttributeNS(null,"x",t-.5*o),d.setAttributeNS(null,"y",i),d.setAttributeNS(null,"width",o),d.setAttributeNS(null,"height",n),d.setAttributeNS(null,"class",s),h&&d.setAttributeNS(null,"style",h)}}},function(t,e,i){function o(t,e){if(t&&!Array.isArray(t)&&(e=t,t=null),this._options=e||{},this._data={},this.length=0,this._fieldId=this._options.fieldId||"id",this._type={},this._options.type)for(var i in this._options.type)if(this._options.type.hasOwnProperty(i)){var o=this._options.type[i];"Date"==o||"ISODate"==o||"ASPDate"==o?this._type[i]="Date":this._type[i]=o}if(this._options.convert)throw new Error('Option "convert" is deprecated. Use "type" instead.');this._subscribers={},t&&this.add(t),this.setOptions(e)}var n=i(7),s=i(15);o.prototype.setOptions=function(t){t&&void 0!==t.queue&&(t.queue===!1?this._queue&&(this._queue.destroy(),delete this._queue):(this._queue||(this._queue=s.extend(this,{replace:["add","update","remove"]})),"object"==typeof t.queue&&this._queue.setOptions(t.queue)))},o.prototype.on=function(t,e){var i=this._subscribers[t];i||(i=[],this._subscribers[t]=i),i.push({callback:e})},o.prototype.subscribe=function(){throw new Error("DataSet.subscribe is deprecated. Use DataSet.on instead.")},o.prototype.off=function(t,e){var i=this._subscribers[t];i&&(this._subscribers[t]=i.filter(function(t){return t.callback!=e}))},o.prototype.unsubscribe=function(){throw new Error("DataSet.unsubscribe is deprecated. Use DataSet.off instead.")},o.prototype._trigger=function(t,e,i){if("*"==t)throw new Error("Cannot trigger event *");var o=[];t in this._subscribers&&(o=o.concat(this._subscribers[t])),"*"in this._subscribers&&(o=o.concat(this._subscribers["*"]));for(var n=0;ns;s++)i=n._addItem(t[s]),o.push(i);else{if(!(t instanceof Object))throw new Error("Unknown dataType");i=n._addItem(t),o.push(i)}return o.length&&this._trigger("add",{items:o},e),o},o.prototype.update=function(t,e){var i=[],o=[],n=[],s=this,r=s._fieldId,a=function(t){var e=t[r];s._data[e]?(e=s._updateItem(t),o.push(e),n.push(t)):(e=s._addItem(t),i.push(e))};if(Array.isArray(t))for(var h=0,d=t.length;d>h;h++)a(t[h]);else{if(!(t instanceof Object))throw new Error("Unknown dataType");a(t)}return i.length&&this._trigger("add",{items:i},e),o.length&&this._trigger("update",{items:o,data:n},e),i.concat(o)},o.prototype.get=function(t){var e,i,o,s=this,r=n.getType(arguments[0]);"String"==r||"Number"==r?(e=arguments[0],o=arguments[1]):"Array"==r?(i=arguments[0],o=arguments[1]):o=arguments[0];var a;if(o&&o.returnType){var h=["Array","Object"];a=-1==h.indexOf(o.returnType)?"Array":o.returnType}else a="Array";var d,l,u,c,p=o&&o.type||this._options.type,f=o&&o.filter,m=[];if(void 0!=e)d=s._getItem(e,p),f&&!f(d)&&(d=null);else if(void 0!=i)for(u=0,c=i.length;c>u;u++)d=s._getItem(i[u],p),(!f||f(d))&&m.push(d);else for(l in this._data)this._data.hasOwnProperty(l)&&(d=s._getItem(l,p),(!f||f(d))&&m.push(d));if(o&&o.order&&void 0==e&&this._sort(m,o.order),o&&o.fields){var v=o.fields;if(void 0!=e)d=this._filterFields(d,v);else for(u=0,c=m.length;c>u;u++)m[u]=this._filterFields(m[u],v)}if("Object"==a){var g={};for(u=0;ue;e++)l[e]=s[e][this._fieldId]}else for(o in r)r.hasOwnProperty(o)&&(n=this._getItem(o,d),a(n)&&l.push(n[this._fieldId]));else if(h){s=[];for(o in r)r.hasOwnProperty(o)&&s.push(r[o]);for(this._sort(s,h),e=0,i=s.length;i>e;e++)l[e]=s[e][this._fieldId]}else for(o in r)r.hasOwnProperty(o)&&(n=r[o],l.push(n[this._fieldId]));return l},o.prototype.getDataSet=function(){return this},o.prototype.forEach=function(t,e){var i,o,n=e&&e.filter,s=e&&e.type||this._options.type,r=this._data;if(e&&e.order)for(var a=this.get(e),h=0,d=a.length;d>h;h++)i=a[h],o=i[this._fieldId],t(i,o);else for(o in r)r.hasOwnProperty(o)&&(i=this._getItem(o,s),(!n||n(i))&&t(i,o))},o.prototype.map=function(t,e){var i,o=e&&e.filter,n=e&&e.type||this._options.type,s=[],r=this._data;for(var a in r)r.hasOwnProperty(a)&&(i=this._getItem(a,n),(!o||o(i))&&s.push(t(i,a)));return e&&e.order&&this._sort(s,e.order),s},o.prototype._filterFields=function(t,e){if(!t)return t;var i={};if(Array.isArray(e))for(var o in t)t.hasOwnProperty(o)&&-1!=e.indexOf(o)&&(i[o]=t[o]);else for(var o in t)t.hasOwnProperty(o)&&e.hasOwnProperty(o)&&(i[e[o]]=t[o]);return i},o.prototype._sort=function(t,e){if(n.isString(e)){var i=e;t.sort(function(t,e){var o=t[i],n=e[i];return o>n?1:n>o?-1:0})}else{if("function"!=typeof e)throw new TypeError("Order must be a function or a string");t.sort(e)}},o.prototype.remove=function(t,e){var i,o,n,s=[];if(Array.isArray(t))for(i=0,o=t.length;o>i;i++)n=this._remove(t[i]),null!=n&&s.push(n);else n=this._remove(t),null!=n&&s.push(n);return s.length&&this._trigger("remove",{items:s},e),s},o.prototype._remove=function(t){if(n.isNumber(t)||n.isString(t)){if(this._data[t])return delete this._data[t],this.length--,t}else if(t instanceof Object){var e=t[this._fieldId];if(e&&this._data[e])return delete this._data[e],this.length--,e}return null},o.prototype.clear=function(t){var e=Object.keys(this._data);return this._data={},this.length=0,this._trigger("remove",{items:e},t),e},o.prototype.max=function(t){var e=this._data,i=null,o=null;for(var n in e)if(e.hasOwnProperty(n)){var s=e[n],r=s[t];null!=r&&(!i||r>o)&&(i=s,o=r)}return i},o.prototype.min=function(t){var e=this._data,i=null,o=null;for(var n in e)if(e.hasOwnProperty(n)){var s=e[n],r=s[t];null!=r&&(!i||o>r)&&(i=s,o=r)}return i},o.prototype.distinct=function(t){var e,i=this._data,o=[],s=this._options.type&&this._options.type[t]||null,r=0;for(var a in i)if(i.hasOwnProperty(a)){var h=i[a],d=h[t],l=!1;for(e=0;r>e;e++)if(o[e]==d){l=!0;break}l||void 0===d||(o[r]=d,r++)}if(s)for(e=0;ethis.max&&this.flush(),clearTimeout(this._timeout),this.queue.length>0&&"number"==typeof this.delay){var t=this;this._timeout=setTimeout(function(){t.flush()},this.delay)}},i.prototype.flush=function(){for(;this._queue.length>0;){var t=this._queue.shift();t.fn.apply(t.context||t.fn,t.args||[])}},t.exports=i},function(t,e,i){function o(t,e){this._data=null,this._ids={},this.length=0,this._options=e||{},this._fieldId="id",this._subscribers={};var i=this;this.listener=function(){i._onEvent.apply(i,arguments)},this.setData(t)}var n=i(7),s=i(14);o.prototype.setData=function(t){var e,i,o;if(this._data){this._data.off&&this._data.off("*",this.listener),e=[];for(var n in this._ids)this._ids.hasOwnProperty(n)&&e.push(n);this._ids={},this.length=0,this._trigger("remove",{items:e})}if(this._data=t,this._data){for(this._fieldId=this._options.fieldId||this._data&&this._data.options&&this._data.options.fieldId||"id",e=this._data.getIds({filter:this._options&&this._options.filter}),i=0,o=e.length;o>i;i++)n=e[i],this._ids[n]=!0;this.length=e.length,this._trigger("add",{items:e}),this._data.on&&this._data.on("*",this.listener)}},o.prototype.refresh=function(){for(var t,e=this._data.getIds({filter:this._options&&this._options.filter}),i={},o=[],n=[],s=0;so;o++)s=a[o],r=this.get(s),r&&(this._ids[s]=!0,l.push(s));break;case"update":for(o=0,n=a.length;n>o;o++)s=a[o],r=this.get(s),r?this._ids[s]?(u.push(s),d.push(e.data[o])):(this._ids[s]=!0,l.push(s)):this._ids[s]&&(delete this._ids[s],c.push(s));break;case"remove":for(o=0,n=a.length;n>o;o++)s=a[o],this._ids[s]&&(delete this._ids[s],c.push(s))}this.length+=l.length-c.length,l.length&&this._trigger("add",{items:l},i),u.length&&this._trigger("update",{items:u,data:d},i),c.length&&this._trigger("remove",{items:c},i)}},o.prototype.on=s.prototype.on,o.prototype.off=s.prototype.off,o.prototype._trigger=s.prototype._trigger,o.prototype.subscribe=o.prototype.on,o.prototype.unsubscribe=o.prototype.off,t.exports=o},function(t,e,i){function o(t,e,i){if(!(this instanceof o))throw new SyntaxError("Constructor must be called with the new operator");this.containerElement=t,this.width="400px",this.height="400px",this.margin=10,this.defaultXCenter="55%",this.defaultYCenter="50%",this.xLabel="x",this.yLabel="y",this.zLabel="z";var n=function(t){return t};this.xValueLabel=n,this.yValueLabel=n,this.zValueLabel=n,this.filterLabel="time",this.legendLabel="value",this.style=o.STYLE.DOT,this.showPerspective=!0,this.showGrid=!0,this.keepAspectRatio=!0,this.showShadow=!1,this.showGrayBottom=!1,this.showTooltip=!1,this.verticalRatio=.5,this.animationInterval=1e3,this.animationPreload=!1,this.camera=new c,this.camera.setArmRotation(1,.5),this.camera.setArmLength(1.7),this.eye=new l(0,0,-1),this.dataTable=null,this.dataPoints=null,this.colX=void 0,this.colY=void 0,this.colZ=void 0,this.colValue=void 0,this.colFilter=void 0,this.xMin=0,this.xStep=void 0,this.xMax=1,this.yMin=0,this.yStep=void 0,this.yMax=1,this.zMin=0,this.zStep=void 0,this.zMax=1,this.valueMin=0,this.valueMax=1,this.xBarWidth=1,this.yBarWidth=1,this.axisColor="#4D4D4D",this.gridColor="#D3D3D3",this.dataColor={fill:"#7DC1FF",stroke:"#3267D2",strokeWidth:1},this.create(),this.setOptions(i),e&&this.setData(e)}function n(t){return"clientX"in t?t.clientX:t.targetTouches[0]&&t.targetTouches[0].clientX||0}function s(t){return"clientY"in t?t.clientY:t.targetTouches[0]&&t.targetTouches[0].clientY||0}var r=i(19),a=i(14),h=i(16),d=i(7),l=i(20),u=i(18),c=i(21),p=i(22),f=i(23),m=i(24);r(o.prototype),o.prototype._setScale=function(){this.scale=new l(1/(this.xMax-this.xMin),1/(this.yMax-this.yMin),1/(this.zMax-this.zMin)),this.keepAspectRatio&&(this.scale.x3&&(this.colFilter=3);else{if(this.style!==o.STYLE.DOTCOLOR&&this.style!==o.STYLE.DOTSIZE&&this.style!==o.STYLE.BARCOLOR&&this.style!==o.STYLE.BARSIZE)throw'Unknown style "'+this.style+'"';this.colX=0,this.colY=1,this.colZ=2,this.colValue=3,t.getNumberOfColumns()>4&&(this.colFilter=4)}},o.prototype.getNumberOfRows=function(t){return t.length},o.prototype.getNumberOfColumns=function(t){var e=0;for(var i in t[0])t[0].hasOwnProperty(i)&&e++;return e},o.prototype.getDistinctValues=function(t,e){for(var i=[],o=0;ot[o][e]&&(i.min=t[o][e]),i.maxt;t++){var f=(t-c)/(p-c),v=240*f,g=this._hsv2rgb(v,1,1);u.strokeStyle=g,u.beginPath(),u.moveTo(h,r+t),u.lineTo(a,r+t),u.stroke()}u.strokeStyle=this.axisColor,u.strokeRect(h,r,i,s)}if(this.style===o.STYLE.DOTSIZE&&(u.strokeStyle=this.axisColor,u.fillStyle=this.dataColor.fill,u.beginPath(),u.moveTo(h,r),u.lineTo(a,r),u.lineTo(a-i+e,d),u.lineTo(h,d),u.closePath(),u.fill(),u.stroke()),this.style===o.STYLE.DOTCOLOR||this.style===o.STYLE.DOTSIZE){var y=5,b=new m(this.valueMin,this.valueMax,(this.valueMax-this.valueMin)/5,!0);for(b.start(),b.getCurrent()0?this.yMin:this.yMax,n=this._convert3Dto2D(new l(_,r,this.zMin)),Math.cos(2*w)>0?(v.textAlign="center",v.textBaseline="top",n.y+=b):Math.sin(2*w)<0?(v.textAlign="right",v.textBaseline="middle"):(v.textAlign="left",v.textBaseline="middle"),v.fillStyle=this.axisColor,v.fillText(" "+this.xValueLabel(i.getCurrent())+" ",n.x,n.y),i.next()}for(v.lineWidth=1,o=void 0===this.defaultYStep,i=new m(this.yMin,this.yMax,this.yStep,o),i.start(),i.getCurrent()0?this.xMin:this.xMax,n=this._convert3Dto2D(new l(s,i.getCurrent(),this.zMin)),Math.cos(2*w)<0?(v.textAlign="center",v.textBaseline="top",n.y+=b):Math.sin(2*w)>0?(v.textAlign="right",v.textBaseline="middle"):(v.textAlign="left",v.textBaseline="middle"),v.fillStyle=this.axisColor,v.fillText(" "+this.yValueLabel(i.getCurrent())+" ",n.x,n.y),i.next();for(v.lineWidth=1,o=void 0===this.defaultZStep,i=new m(this.zMin,this.zMax,this.zStep,o),i.start(),i.getCurrent()0?this.xMin:this.xMax,r=Math.sin(w)<0?this.yMin:this.yMax;!i.end();)t=this._convert3Dto2D(new l(s,r,i.getCurrent())),v.strokeStyle=this.axisColor,v.beginPath(),v.moveTo(t.x,t.y),v.lineTo(t.x-b,t.y),v.stroke(),v.textAlign="right",v.textBaseline="middle",v.fillStyle=this.axisColor,v.fillText(this.zValueLabel(i.getCurrent())+" ",t.x-5,t.y),i.next();v.lineWidth=1,t=this._convert3Dto2D(new l(s,r,this.zMin)),e=this._convert3Dto2D(new l(s,r,this.zMax)),v.strokeStyle=this.axisColor,v.beginPath(),v.moveTo(t.x,t.y),v.lineTo(e.x,e.y),v.stroke(),v.lineWidth=1,c=this._convert3Dto2D(new l(this.xMin,this.yMin,this.zMin)),p=this._convert3Dto2D(new l(this.xMax,this.yMin,this.zMin)),v.strokeStyle=this.axisColor,v.beginPath(),v.moveTo(c.x,c.y),v.lineTo(p.x,p.y),v.stroke(),c=this._convert3Dto2D(new l(this.xMin,this.yMax,this.zMin)),p=this._convert3Dto2D(new l(this.xMax,this.yMax,this.zMin)),v.strokeStyle=this.axisColor,v.beginPath(),v.moveTo(c.x,c.y),v.lineTo(p.x,p.y),v.stroke(),v.lineWidth=1,t=this._convert3Dto2D(new l(this.xMin,this.yMin,this.zMin)),e=this._convert3Dto2D(new l(this.xMin,this.yMax,this.zMin)),v.strokeStyle=this.axisColor,v.beginPath(),v.moveTo(t.x,t.y),v.lineTo(e.x,e.y),v.stroke(),t=this._convert3Dto2D(new l(this.xMax,this.yMin,this.zMin)),e=this._convert3Dto2D(new l(this.xMax,this.yMax,this.zMin)),v.strokeStyle=this.axisColor,v.beginPath(),v.moveTo(t.x,t.y),v.lineTo(e.x,e.y),v.stroke();var x=this.xLabel;x.length>0&&(u=.1/this.scale.y,s=(this.xMin+this.xMax)/2,r=Math.cos(w)>0?this.yMin-u:this.yMax+u,n=this._convert3Dto2D(new l(s,r,this.zMin)),Math.cos(2*w)>0?(v.textAlign="center",v.textBaseline="top"):Math.sin(2*w)<0?(v.textAlign="right",v.textBaseline="middle"):(v.textAlign="left",v.textBaseline="middle"),v.fillStyle=this.axisColor,v.fillText(x,n.x,n.y));var k=this.yLabel;k.length>0&&(d=.1/this.scale.x,s=Math.sin(w)>0?this.xMin-d:this.xMax+d,r=(this.yMin+this.yMax)/2,n=this._convert3Dto2D(new l(s,r,this.zMin)),Math.cos(2*w)<0?(v.textAlign="center",v.textBaseline="top"):Math.sin(2*w)>0?(v.textAlign="right",v.textBaseline="middle"):(v.textAlign="left",v.textBaseline="middle"),v.fillStyle=this.axisColor,v.fillText(k,n.x,n.y));var M=this.zLabel;M.length>0&&(h=30,s=Math.cos(w)>0?this.xMin:this.xMax,r=Math.sin(w)<0?this.yMin:this.yMax,a=(this.zMin+this.zMax)/2,n=this._convert3Dto2D(new l(s,r,a)),v.textAlign="right",v.textBaseline="middle",v.fillStyle=this.axisColor,v.fillText(M,n.x-h,n.y))},o.prototype._hsv2rgb=function(t,e,i){var o,n,s,r,a,h;switch(r=i*e,a=Math.floor(t/60),h=r*(1-Math.abs(t/60%2-1)),a){case 0:o=r,n=h,s=0;break;case 1:o=h,n=r,s=0;break;case 2:o=0,n=r,s=h;break;case 3:o=0,n=h,s=r;break;case 4:o=h,n=0,s=r;break;case 5:o=r,n=0,s=h;break;default:o=0,n=0,s=0}return"RGB("+parseInt(255*o)+","+parseInt(255*n)+","+parseInt(255*s)+")"},o.prototype._redrawDataGrid=function(){var t,e,i,n,s,r,a,h,d,u,c,p,f=this.frame.canvas,m=f.getContext("2d");if(m.lineJoin="round",m.lineCap="round",!(void 0===this.dataPoints||this.dataPoints.length<=0)){for(s=0;s0}else r=!0;r?(p=(t.point.z+e.point.z+i.point.z+n.point.z)/4,d=240*(1-(p-this.zMin)*this.scale.z/this.verticalRatio),u=1,this.showShadow?(c=Math.min(1+x.x/k/2,1),a=this._hsv2rgb(d,u,c),h=a):(c=1,a=this._hsv2rgb(d,u,c),h=this.axisColor)):(a="gray",h=this.axisColor),m.lineWidth=this._getStrokeWidth(t),m.fillStyle=a,m.strokeStyle=h,m.beginPath(),m.moveTo(t.screen.x,t.screen.y),m.lineTo(e.screen.x,e.screen.y),m.lineTo(n.screen.x,n.screen.y),m.lineTo(i.screen.x,i.screen.y),m.closePath(),m.fill(),m.stroke()}}else for(s=0;sc&&(c=0);var p,f,m;this.style===o.STYLE.DOTCOLOR?(p=240*(1-(d.point.value-this.valueMin)*this.scale.value),f=this._hsv2rgb(p,1,1),m=this._hsv2rgb(p,1,.8)):this.style===o.STYLE.DOTSIZE?(f=this.dataColor.fill,m=this.dataColor.stroke):(p=240*(1-(d.point.z-this.zMin)*this.scale.z/this.verticalRatio),f=this._hsv2rgb(p,1,1),m=this._hsv2rgb(p,1,.8)),i.lineWidth=this._getStrokeWidth(d),i.strokeStyle=m,i.fillStyle=f,i.beginPath(),i.arc(d.screen.x,d.screen.y,c,0,2*Math.PI,!0),i.fill(),i.stroke()}}},o.prototype._redrawDataBar=function(){var t,e,i,n,s=this.frame.canvas,r=s.getContext("2d");if(!(void 0===this.dataPoints||this.dataPoints.length<=0)){for(t=0;t0){for(t=this.dataPoints[0],o.lineWidth=this._getStrokeWidth(t),o.lineJoin="round",o.lineCap="round",o.strokeStyle=this.dataColor.stroke,o.beginPath(),o.moveTo(t.screen.x,t.screen.y),e=1;e0?1:0>t?-1:0}var o=e[0],n=e[1],s=e[2],r=i((n.x-o.x)*(t.y-o.y)-(n.y-o.y)*(t.x-o.x)),a=i((s.x-n.x)*(t.y-n.y)-(s.y-n.y)*(t.x-n.x)),h=i((o.x-s.x)*(t.y-s.y)-(o.y-s.y)*(t.x-s.x));return!(0!=r&&0!=a&&r!=a||0!=a&&0!=h&&a!=h||0!=r&&0!=h&&r!=h)},o.prototype._dataPointFromXY=function(t,e){var i,n=100,s=null,r=null,a=null,h=new u(t,e);if(this.style===o.STYLE.BAR||this.style===o.STYLE.BARCOLOR||this.style===o.STYLE.BARSIZE)for(i=this.dataPoints.length-1;i>=0;i--){s=this.dataPoints[i];var d=s.surfaces;if(d)for(var l=d.length-1;l>=0;l--){var c=d[l],p=c.corners,f=[p[0].screen,p[1].screen,p[2].screen],m=[p[2].screen,p[3].screen,p[0].screen];if(this._insideTriangle(h,f)||this._insideTriangle(h,m))return s}}else for(i=0;ib)&&n>b&&(a=b,r=s)}}return r},o.prototype._showTooltip=function(t){var e,i,o;this.tooltip?(e=this.tooltip.dom.content,i=this.tooltip.dom.line,o=this.tooltip.dom.dot):(e=document.createElement("div"),e.style.position="absolute",e.style.padding="10px",e.style.border="1px solid #4d4d4d",e.style.color="#1a1a1a",e.style.background="rgba(255,255,255,0.7)",e.style.borderRadius="2px",e.style.boxShadow="5px 5px 10px rgba(128,128,128,0.5)",i=document.createElement("div"),i.style.position="absolute",i.style.height="40px",i.style.width="0",i.style.borderLeft="1px solid #4d4d4d",o=document.createElement("div"),o.style.position="absolute",o.style.height="0",o.style.width="0",o.style.border="5px solid #4d4d4d",o.style.borderRadius="5px",this.tooltip={dataPoint:null,dom:{content:e,line:i,dot:o}}),this._hideTooltip(),this.tooltip.dataPoint=t,"function"==typeof this.showTooltip?e.innerHTML=this.showTooltip(t.point):e.innerHTML="
x:"+t.point.x+"
y:"+t.point.y+"
z:"+t.point.z+"
",e.style.left="0",e.style.top="0",this.frame.appendChild(e),this.frame.appendChild(i),this.frame.appendChild(o);var n=e.offsetWidth,s=e.offsetHeight,r=i.offsetHeight,a=o.offsetWidth,h=o.offsetHeight,d=t.screen.x-n/2;d=Math.min(Math.max(d,10),this.frame.clientWidth-10-n),i.style.left=t.screen.x+"px",i.style.top=t.screen.y-r+"px",e.style.left=d+"px",e.style.top=t.screen.y-r-s+"px",o.style.left=t.screen.x-a/2+"px",o.style.top=t.screen.y-h/2+"px"},o.prototype._hideTooltip=function(){if(this.tooltip){this.tooltip.dataPoint=null;for(var t in this.tooltip.dom)if(this.tooltip.dom.hasOwnProperty(t)){var e=this.tooltip.dom[t];e&&e.parentNode&&e.parentNode.removeChild(e)}}},t.exports=o},function(t,e){function i(t,e){this.x=void 0!==t?t:0,this.y=void 0!==e?e:0}t.exports=i},function(t,e){function i(t){return t?o(t):void 0}function o(t){for(var e in i.prototype)t[e]=i.prototype[e];return t}t.exports=i,i.prototype.on=i.prototype.addEventListener=function(t,e){return this._callbacks=this._callbacks||{},(this._callbacks[t]=this._callbacks[t]||[]).push(e),this},i.prototype.once=function(t,e){function i(){o.off(t,i),e.apply(this,arguments)}var o=this;return this._callbacks=this._callbacks||{},i.fn=e,this.on(t,i),this},i.prototype.off=i.prototype.removeListener=i.prototype.removeAllListeners=i.prototype.removeEventListener=function(t,e){if(this._callbacks=this._callbacks||{},0==arguments.length)return this._callbacks={},this;var i=this._callbacks[t];if(!i)return this;if(1==arguments.length)return delete this._callbacks[t],this;for(var o,n=0;no;++o)i[o].apply(this,e)}return this},i.prototype.listeners=function(t){return this._callbacks=this._callbacks||{},this._callbacks[t]||[]},i.prototype.hasListeners=function(t){return!!this.listeners(t).length}},function(t,e){function i(t,e,i){this.x=void 0!==t?t:0,this.y=void 0!==e?e:0,this.z=void 0!==i?i:0}i.subtract=function(t,e){var o=new i;return o.x=t.x-e.x,o.y=t.y-e.y,o.z=t.z-e.z,o},i.add=function(t,e){var o=new i;return o.x=t.x+e.x,o.y=t.y+e.y,o.z=t.z+e.z,o},i.avg=function(t,e){return new i((t.x+e.x)/2,(t.y+e.y)/2,(t.z+e.z)/2)},i.crossProduct=function(t,e){var o=new i;return o.x=t.y*e.z-t.z*e.y,o.y=t.z*e.x-t.x*e.z,o.z=t.x*e.y-t.y*e.x,o},i.prototype.length=function(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z)},t.exports=i},function(t,e,i){function o(){this.armLocation=new n,this.armRotation={},this.armRotation.horizontal=0,this.armRotation.vertical=0,this.armLength=1.7,this.cameraLocation=new n,this.cameraRotation=new n(.5*Math.PI,0,0),this.calculateCameraOrientation()}var n=i(20);o.prototype.setArmLocation=function(t,e,i){this.armLocation.x=t,this.armLocation.y=e,this.armLocation.z=i,this.calculateCameraOrientation()},o.prototype.setArmRotation=function(t,e){void 0!==t&&(this.armRotation.horizontal=t),void 0!==e&&(this.armRotation.vertical=e,this.armRotation.vertical<0&&(this.armRotation.vertical=0),this.armRotation.vertical>.5*Math.PI&&(this.armRotation.vertical=.5*Math.PI)),(void 0!==t||void 0!==e)&&this.calculateCameraOrientation()},o.prototype.getArmRotation=function(){var t={};return t.horizontal=this.armRotation.horizontal,t.vertical=this.armRotation.vertical,t},o.prototype.setArmLength=function(t){void 0!==t&&(this.armLength=t,this.armLength<.71&&(this.armLength=.71),this.armLength>5&&(this.armLength=5),this.calculateCameraOrientation())},o.prototype.getArmLength=function(){return this.armLength},o.prototype.getCameraLocation=function(){return this.cameraLocation},o.prototype.getCameraRotation=function(){return this.cameraRotation},o.prototype.calculateCameraOrientation=function(){this.cameraLocation.x=this.armLocation.x-this.armLength*Math.sin(this.armRotation.horizontal)*Math.cos(this.armRotation.vertical),this.cameraLocation.y=this.armLocation.y-this.armLength*Math.cos(this.armRotation.horizontal)*Math.cos(this.armRotation.vertical),this.cameraLocation.z=this.armLocation.z+this.armLength*Math.sin(this.armRotation.vertical),this.cameraRotation.x=Math.PI/2-this.armRotation.vertical,this.cameraRotation.y=0,this.cameraRotation.z=-this.armRotation.horizontal},t.exports=o},function(t,e,i){function o(t,e,i){this.data=t, -this.column=e,this.graph=i,this.index=void 0,this.value=void 0,this.values=i.getDistinctValues(t.get(),this.column),this.values.sort(function(t,e){return t>e?1:e>t?-1:0}),this.values.length>0&&this.selectValue(0),this.dataPoints=[],this.loaded=!1,this.onLoadCallback=void 0,i.animationPreload?(this.loaded=!1,this.loadInBackground()):this.loaded=!0}var n=i(16);o.prototype.isLoaded=function(){return this.loaded},o.prototype.getLoadedProgress=function(){for(var t=this.values.length,e=0;this.dataPoints[e];)e++;return Math.round(e/t*100)},o.prototype.getLabel=function(){return this.graph.filterLabel},o.prototype.getColumn=function(){return this.column},o.prototype.getSelectedValue=function(){return void 0===this.index?void 0:this.values[this.index]},o.prototype.getValues=function(){return this.values},o.prototype.getValue=function(t){if(t>=this.values.length)throw"Error: index out of range";return this.values[t]},o.prototype._getDataPoints=function(t){if(void 0===t&&(t=this.index),void 0===t)return[];var e;if(this.dataPoints[t])e=this.dataPoints[t];else{var i={};i.column=this.column,i.value=this.values[t];var o=new n(this.data,{filter:function(t){return t[i.column]==i.value}}).get();e=this.graph._getDataPoints(o),this.dataPoints[t]=e}return e},o.prototype.setOnLoadCallback=function(t){this.onLoadCallback=t},o.prototype.selectValue=function(t){if(t>=this.values.length)throw"Error: index out of range";this.index=t,this.value=this.values[t]},o.prototype.loadInBackground=function(t){void 0===t&&(t=0);var e=this.graph.frame;if(t0&&(t--,this.setIndex(t))},o.prototype.next=function(){var t=this.getIndex();t0?this.setIndex(0):this.index=void 0},o.prototype.setIndex=function(t){if(!(to&&(o=0),o>this.values.length-1&&(o=this.values.length-1),o},o.prototype.indexToLeft=function(t){var e=parseFloat(this.frame.bar.style.width)-this.frame.slide.clientWidth-10,i=t/(this.values.length-1)*e,o=i+3;return o},o.prototype._onMouseMove=function(t){var e=t.clientX-this.startClientX,i=this.startSlideX+e,o=this.leftToIndex(i);this.setIndex(o),n.preventDefault()},o.prototype._onMouseUp=function(t){this.frame.style.cursor="auto",n.removeEventListener(document,"mousemove",this.onmousemove),n.removeEventListener(document,"mouseup",this.onmouseup),n.preventDefault()},t.exports=o},function(t,e){function i(t,e,i,o){this._start=0,this._end=0,this._step=1,this.prettyStep=!0,this.precision=5,this._current=0,this.setRange(t,e,i,o)}i.prototype.setRange=function(t,e,i,o){this._start=t?t:0,this._end=e?e:0,this.setStep(i,o)},i.prototype.setStep=function(t,e){void 0===t||0>=t||(void 0!==e&&(this.prettyStep=e),this.prettyStep===!0?this._step=i.calculatePrettyStep(t):this._step=t)},i.calculatePrettyStep=function(t){var e=function(t){return Math.log(t)/Math.LN10},i=Math.pow(10,Math.round(e(t))),o=2*Math.pow(10,Math.round(e(t/2))),n=5*Math.pow(10,Math.round(e(t/5))),s=i;return Math.abs(o-t)<=Math.abs(s-t)&&(s=o),Math.abs(n-t)<=Math.abs(s-t)&&(s=n),0>=s&&(s=1),s},i.prototype.getCurrent=function(){return parseFloat(this._current.toPrecision(this.precision))},i.prototype.getStep=function(){return this._step},i.prototype.start=function(){this._current=this._start-this._start%this._step},i.prototype.next=function(){this._current+=this._step},i.prototype.end=function(){return this._current>this._end},t.exports=i},function(t,e,i){function o(t,e,i,h){if(!(this instanceof o))throw new SyntaxError("Constructor must be called with the new operator");if(!(Array.isArray(i)||i instanceof s||i instanceof r)&&i instanceof Object){var u=h;h=i,i=u}var p=this;this.defaultOptions={start:null,end:null,autoResize:!0,orientation:{axis:"bottom",item:"bottom"},width:null,height:null,maxHeight:null,minHeight:null},this.options=n.deepExtend({},this.defaultOptions),this._create(t),this.components=[],this.body={dom:this.dom,domProps:this.props,emitter:{on:this.on.bind(this),off:this.off.bind(this),emit:this.emit.bind(this)},hiddenDates:[],util:{getScale:function(){return p.timeAxis.step.scale},getStep:function(){return p.timeAxis.step.step},toScreen:p._toScreen.bind(p),toGlobalScreen:p._toGlobalScreen.bind(p),toTime:p._toTime.bind(p),toGlobalTime:p._toGlobalTime.bind(p)}},this.range=new a(this.body),this.components.push(this.range),this.body.range=this.range,this.timeAxis=new d(this.body),this.timeAxis2=null,this.components.push(this.timeAxis),this.currentTime=new l(this.body),this.components.push(this.currentTime),this.itemSet=new c(this.body),this.components.push(this.itemSet),this.itemsData=null,this.groupsData=null,this.on("tap",function(t){p.emit("click",p.getEventProperties(t))}),this.on("doubletap",function(t){p.emit("doubleClick",p.getEventProperties(t))}),this.dom.root.oncontextmenu=function(t){p.emit("contextmenu",p.getEventProperties(t))},h&&this.setOptions(h),i&&this.setGroups(i),e?this.setItems(e):this._redraw()}var n=(i(19),i(3),i(7)),s=i(14),r=i(16),a=i(29),h=i(32),d=i(41),l=i(26),u=i(44),c=i(33),p=i(45),f=i(47)["default"],m=i(47).printStyle,v=i(48).allOptions,g=i(48).configureOptions;o.prototype=new h,o.prototype._createConfigurator=function(){return new p(this,this.dom.container,g)},o.prototype.redraw=function(){this.itemSet&&this.itemSet.markDirty({refreshItems:!0}),this._redraw()},o.prototype.setOptions=function(t){var e=f.validate(t,v);if(e===!0&&console.log("%cErrors have been found in the supplied options object.",m),h.prototype.setOptions.call(this,t),"type"in t&&t.type!==this.options.type){this.options.type=t.type;var i=this.itemsData;if(i){var o=this.getSelection();this.setItems(null),this.setItems(i),this.setSelection(o)}}},o.prototype.setItems=function(t){var e,i=null==this.itemsData;if(e=t?t instanceof s||t instanceof r?t:new s(t,{type:{start:"Date",end:"Date"}}):null,this.itemsData=e,this.itemSet&&this.itemSet.setItems(e),i)if(void 0!=this.options.start||void 0!=this.options.end){if(void 0==this.options.start||void 0==this.options.end)var o=this.getItemRange();var n=void 0!=this.options.start?this.options.start:o.min,a=void 0!=this.options.end?this.options.end:o.max;this.setWindow(n,a,{animation:!1})}else this.fit({animation:!1})},o.prototype.setGroups=function(t){var e;e=t?t instanceof s||t instanceof r?t:new s(t):null,this.groupsData=e,this.itemSet.setGroups(e)},o.prototype.setData=function(t){t&&t.groups&&this.setGroups(t.groups),t&&t.items&&this.setItems(t.items)},o.prototype.setSelection=function(t,e){this.itemSet&&this.itemSet.setSelection(t),e&&e.focus&&this.focus(t,e)},o.prototype.getSelection=function(){return this.itemSet&&this.itemSet.getSelection()||[]},o.prototype.focus=function(t,e){if(this.itemsData&&void 0!=t){var i=Array.isArray(t)?t:[t],o=this.itemsData.getDataSet().get(i,{type:{start:"Date",end:"Date"}}),n=null,s=null;if(o.forEach(function(t){var e=t.start.valueOf(),i="end"in t?t.end.valueOf():t.start.valueOf();(null===n||n>e)&&(n=e),(null===s||i>s)&&(s=i)}),null!==n&&null!==s){var r=(n+s)/2,a=Math.max(this.range.end-this.range.start,1.1*(s-n)),h=e&&void 0!==e.animation?e.animation:!0;this.range.setRange(r-a/2,r+a/2,h)}}},o.prototype.fit=function(t){var e=t&&void 0!==t.animation?t.animation:!0,i=this.getItemRange();this.range.setRange(i.min,i.max,e)},o.prototype.getItemRange=function(){var t=this,e=this.getDataRange(),i=e.min,o=e.max,s=null,r=null;if(null!=i&&null!=o){var a,h,d,l,u;!function(){var e=function(t){return n.convert(t.data.start,"Date").valueOf()},c=function(t){var e=void 0!=t.data.end?t.data.end:t.data.start;return n.convert(e,"Date").valueOf()};a=o-i,0>=a&&(a=10),h=a/t.props.center.width,n.forEach(t.itemSet.items,function(t){t.show();var n=e(t),a=c(t),d=new Date(n-(t.getWidthLeft()+10)*h),l=new Date(a+(t.getWidthRight()+10)*h);i>d&&(i=d,s=t),l>o&&(o=l,r=t)}.bind(t)),s&&r&&(d=s.getWidthLeft()+10,l=r.getWidthRight()+10,u=t.props.center.width-d-l,u>0&&(i=e(s)-d*a/u,o=c(r)+l*a/u))}()}return{min:null!=i?new Date(i):null,max:null!=o?new Date(o):null}},o.prototype.getDataRange=function(){var t=null,e=null,i=this.itemsData&&this.itemsData.getDataSet();return i&&i.forEach(function(i){var o=n.convert(i.start,"Date").valueOf(),s=n.convert(void 0!=i.end?i.end:i.start,"Date").valueOf();(null===t||t>o)&&(t=o),(null===e||s>e)&&(e=o)}),{min:null!=t?new Date(t):null,max:null!=e?new Date(e):null}},o.prototype.getEventProperties=function(t){var e=t.center?t.center.x:t.clientX,i=t.center?t.center.y:t.clientY,o=e-n.getAbsoluteLeft(this.dom.centerContainer),s=i-n.getAbsoluteTop(this.dom.centerContainer),r=this.itemSet.itemFromTarget(t),a=this.itemSet.groupFromTarget(t),h=u.customTimeFromTarget(t),d=this.itemSet.options.snap||null,l=this.body.util.getScale(),c=this.body.util.getStep(),p=this._toTime(o),f=d?d(p,l,c):p,m=n.getTarget(t),v=null;return null!=r?v="item":null!=h?v="custom-time":n.hasParent(m,this.timeAxis.dom.foreground)?v="axis":this.timeAxis2&&n.hasParent(m,this.timeAxis2.dom.foreground)?v="axis":n.hasParent(m,this.itemSet.dom.labelSet)?v="group-label":n.hasParent(m,this.currentTime.bar)?v="current-time":n.hasParent(m,this.dom.center)&&(v="background"),{event:t,item:r?r.id:null,group:a?a.groupId:null,what:v,pageX:t.srcEvent?t.srcEvent.pageX:t.pageX,pageY:t.srcEvent?t.srcEvent.pageY:t.pageY,x:o,y:s,time:p,snappedTime:f}},t.exports=o},function(t,e,i){function o(t,e){this.body=t,this.defaultOptions={showCurrentTime:!0,locales:a,locale:"en"},this.options=n.extend({},this.defaultOptions),this.offset=0,this._create(),this.setOptions(e)}var n=i(7),s=i(27),r=i(8),a=i(28);o.prototype=new s,o.prototype._create=function(){var t=document.createElement("div");t.className="vis-current-time",t.style.position="absolute",t.style.top="0px",t.style.height="100%",this.bar=t},o.prototype.destroy=function(){this.options.showCurrentTime=!1,this.redraw(),this.body=null},o.prototype.setOptions=function(t){t&&n.selectiveExtend(["showCurrentTime","locale","locales"],this.options,t)},o.prototype.redraw=function(){if(this.options.showCurrentTime){var t=this.body.dom.backgroundVertical;this.bar.parentNode!=t&&(this.bar.parentNode&&this.bar.parentNode.removeChild(this.bar),t.appendChild(this.bar),this.start());var e=new Date((new Date).valueOf()+this.offset),i=this.body.util.toScreen(e),o=this.options.locales[this.options.locale];o||(this.warned||(console.log("WARNING: options.locales['"+this.options.locale+"'] not found. See http://visjs.org/docs/timeline.html#Localization"),this.warned=!0),o=this.options.locales.en);var n=o.current+" "+o.time+": "+r(e).format("dddd, MMMM Do YYYY, H:mm:ss");n=n.charAt(0).toUpperCase()+n.substring(1),this.bar.style.left=i+"px",this.bar.title=n}else this.bar.parentNode&&this.bar.parentNode.removeChild(this.bar),this.stop();return!1},o.prototype.start=function(){function t(){e.stop();var i=e.body.range.conversion(e.body.domProps.center.width).scale,o=1/i/10;30>o&&(o=30),o>1e3&&(o=1e3),e.redraw(),e.currentTimeTimer=setTimeout(t,o)}var e=this;t()},o.prototype.stop=function(){void 0!==this.currentTimeTimer&&(clearTimeout(this.currentTimeTimer),delete this.currentTimeTimer)},o.prototype.setCurrentTime=function(t){var e=n.convert(t,"Date").valueOf(),i=(new Date).valueOf();this.offset=e-i,this.redraw()},o.prototype.getCurrentTime=function(){return new Date((new Date).valueOf()+this.offset)},t.exports=o},function(t,e){function i(t,e){this.options=null,this.props=null}i.prototype.setOptions=function(t){t&&util.extend(this.options,t)},i.prototype.redraw=function(){return!1},i.prototype.destroy=function(){},i.prototype._isResized=function(){var t=this.props._previousWidth!==this.props.width||this.props._previousHeight!==this.props.height;return this.props._previousWidth=this.props.width,this.props._previousHeight=this.props.height,t},t.exports=i},function(t,e){e.en={current:"current",time:"time"},e.en_EN=e.en,e.en_US=e.en,e.nl={current:"huidige",time:"tijd"},e.nl_NL=e.nl,e.nl_BE=e.nl},function(t,e,i){function o(t,e){var i=a().hours(0).minutes(0).seconds(0).milliseconds(0);this.start=i.clone().add(-3,"days").valueOf(),this.end=i.clone().add(4,"days").valueOf(),this.body=t,this.deltaDifference=0,this.scaleOffset=0,this.startToFront=!1,this.endToFront=!0,this.defaultOptions={start:null,end:null,direction:"horizontal",moveable:!0,zoomable:!0,min:null,max:null,zoomMin:10,zoomMax:31536e10},this.options=r.extend({},this.defaultOptions),this.props={touch:{}},this.animationTimer=null,this.body.emitter.on("panstart",this._onDragStart.bind(this)),this.body.emitter.on("panmove",this._onDrag.bind(this)),this.body.emitter.on("panend",this._onDragEnd.bind(this)),this.body.emitter.on("mousewheel",this._onMouseWheel.bind(this)),this.body.emitter.on("touch",this._onTouch.bind(this)),this.body.emitter.on("pinch",this._onPinch.bind(this)),this.setOptions(e)}function n(t){if("horizontal"!=t&&"vertical"!=t)throw new TypeError('Unknown direction "'+t+'". Choose "horizontal" or "vertical".')}function s(t,e){return{x:t.x-r.getAbsoluteLeft(e),y:t.y-r.getAbsoluteTop(e)}}var r=i(7),a=(i(30),i(8)),h=i(27),d=i(31);o.prototype=new h,o.prototype.setOptions=function(t){if(t){var e=["direction","min","max","zoomMin","zoomMax","moveable","zoomable","activate","hiddenDates","zoomKey"];r.selectiveExtend(e,this.options,t),("start"in t||"end"in t)&&this.setRange(t.start,t.end)}},o.prototype.setRange=function(t,e,i,o){o!==!0&&(o=!1);var n=void 0!=t?r.convert(t,"Date").valueOf():null,s=void 0!=e?r.convert(e,"Date").valueOf():null;if(this._cancelAnimation(),i){var a=this,h=this.start,l=this.end,u="object"==typeof i&&"duration"in i?i.duration:500,c="object"==typeof i&&"easingFunction"in i?i.easingFunction:"easeInOutQuad",p=r.easingFunctions[c];if(!p)throw new Error("Unknown easing function "+JSON.stringify(c)+". Choose from: "+Object.keys(r.easingFunctions).join(", "));var f=(new Date).valueOf(),m=!1,v=function b(){if(!a.props.touch.dragging){var t=(new Date).valueOf(),e=t-f,i=p(e/u),r=e>u,c=r||null===n?n:h+(n-h)*i,v=r||null===s?s:l+(s-l)*i;g=a._applyRange(c,v),d.updateHiddenDates(a.body,a.options.hiddenDates),m=m||g,g&&a.body.emitter.emit("rangechange",{start:new Date(a.start),end:new Date(a.end),byUser:o}),r?m&&a.body.emitter.emit("rangechanged",{start:new Date(a.start),end:new Date(a.end),byUser:o}):a.animationTimer=setTimeout(b,20)}};return v()}var g=this._applyRange(n,s);if(d.updateHiddenDates(this.body,this.options.hiddenDates),g){var y={start:new Date(this.start),end:new Date(this.end),byUser:o};this.body.emitter.emit("rangechange",y),this.body.emitter.emit("rangechanged",y)}},o.prototype._cancelAnimation=function(){this.animationTimer&&(clearTimeout(this.animationTimer),this.animationTimer=null)},o.prototype._applyRange=function(t,e){var i,o=null!=t?r.convert(t,"Date").valueOf():this.start,n=null!=e?r.convert(e,"Date").valueOf():this.end,s=null!=this.options.max?r.convert(this.options.max,"Date").valueOf():null,a=null!=this.options.min?r.convert(this.options.min,"Date").valueOf():null;if(isNaN(o)||null===o)throw new Error('Invalid start "'+t+'"');if(isNaN(n)||null===n)throw new Error('Invalid end "'+e+'"');if(o>n&&(n=o),null!==a&&a>o&&(i=a-o,o+=i,n+=i,null!=s&&n>s&&(n=s)),null!==s&&n>s&&(i=n-s,o-=i,n-=i,null!=a&&a>o&&(o=a)),null!==this.options.zoomMin){var h=parseFloat(this.options.zoomMin);0>h&&(h=0),h>n-o&&(this.end-this.start===h&&o>this.start&&nd&&(d=0),n-o>d&&(this.end-this.start===d&&othis.end?(o=this.start,n=this.end):(i=n-o-d,o+=i/2,n-=i/2))}var l=this.start!=o||this.end!=n;return o>=this.start&&o<=this.end||n>=this.start&&n<=this.end||this.start>=o&&this.start<=n||this.end>=o&&this.end<=n||this.body.emitter.emit("checkRangedItems"),this.start=o,this.end=n,l},o.prototype.getRange=function(){return{start:this.start,end:this.end}},o.prototype.conversion=function(t,e){return o.conversion(this.start,this.end,t,e)},o.conversion=function(t,e,i,o){return void 0===o&&(o=0),0!=i&&e-t!=0?{offset:t,scale:i/(e-t-o)}:{offset:0,scale:1}},o.prototype._onDragStart=function(t){this.deltaDifference=0,this.previousDelta=0,this.options.moveable&&this._isInsideRange(t)&&this.props.touch.allowDragging&&(this.props.touch.start=this.start,this.props.touch.end=this.end,this.props.touch.dragging=!0,this.body.dom.root&&(this.body.dom.root.style.cursor="move"))},o.prototype._onDrag=function(t){if(this.props.touch.dragging&&this.options.moveable&&this.props.touch.allowDragging){var e=this.options.direction;n(e);var i="horizontal"==e?t.deltaX:t.deltaY;i-=this.deltaDifference;var o=this.props.touch.end-this.props.touch.start,s=d.getHiddenDurationBetween(this.body.hiddenDates,this.start,this.end);o-=s;var r="horizontal"==e?this.body.domProps.center.width:this.body.domProps.center.height,a=-i/r*o,h=this.props.touch.start+a,l=this.props.touch.end+a,u=d.snapAwayFromHidden(this.body.hiddenDates,h,this.previousDelta-i,!0),c=d.snapAwayFromHidden(this.body.hiddenDates,l,this.previousDelta-i,!0);if(u!=h||c!=l)return this.deltaDifference+=i,this.props.touch.start=u,this.props.touch.end=c,void this._onDrag(t);this.previousDelta=i,this._applyRange(h,l),this.body.emitter.emit("rangechange",{start:new Date(this.start),end:new Date(this.end),byUser:!0})}},o.prototype._onDragEnd=function(t){this.props.touch.dragging&&this.options.moveable&&this.props.touch.allowDragging&&(this.props.touch.dragging=!1,this.body.dom.root&&(this.body.dom.root.style.cursor="auto"),this.body.emitter.emit("rangechanged",{start:new Date(this.start),end:new Date(this.end),byUser:!0}))},o.prototype._onMouseWheel=function(t){if(this.options.zoomable&&this.options.moveable&&this._isInsideRange(t)&&(!this.options.zoomKey||t[this.options.zoomKey])){var e=0;if(t.wheelDelta?e=t.wheelDelta/120:t.detail&&(e=-t.detail/3),e){var i;i=0>e?1-e/5:1/(1+e/5);var o=s({x:t.clientX,y:t.clientY},this.body.dom.center),n=this._pointerToDate(o);this.zoom(i,n,e)}t.preventDefault()}},o.prototype._onTouch=function(t){this.props.touch.start=this.start,this.props.touch.end=this.end,this.props.touch.allowDragging=!0,this.props.touch.center=null,this.scaleOffset=0,this.deltaDifference=0},o.prototype._onPinch=function(t){if(this.options.zoomable&&this.options.moveable){this.props.touch.allowDragging=!1,this.props.touch.center||(this.props.touch.center=s(t.center,this.body.dom.center));var e=1/(t.scale+this.scaleOffset),i=this._pointerToDate(this.props.touch.center),o=d.getHiddenDurationBetween(this.body.hiddenDates,this.start,this.end),n=d.getHiddenDurationBefore(this.body.hiddenDates,this,i),r=o-n,a=i-n+(this.props.touch.start-(i-n))*e,h=i+r+(this.props.touch.end-(i+r))*e;this.startToFront=0>=1-e,this.endToFront=0>=e-1;var l=d.snapAwayFromHidden(this.body.hiddenDates,a,1-e,!0),u=d.snapAwayFromHidden(this.body.hiddenDates,h,e-1,!0);(l!=a||u!=h)&&(this.props.touch.start=l,this.props.touch.end=u,this.scaleOffset=1-t.scale,a=l,h=u),this.setRange(a,h,!1,!0),this.startToFront=!1,this.endToFront=!0}},o.prototype._isInsideRange=function(t){var e=t.center?t.center.x:t.clientX,i=e-r.getAbsoluteLeft(this.body.dom.centerContainer),o=this.body.util.toTime(i);return o>=this.start&&o<=this.end},o.prototype._pointerToDate=function(t){var e,i=this.options.direction;if(n(i),"horizontal"==i)return this.body.util.toTime(t.x).valueOf();var o=this.body.domProps.center.height;return e=this.conversion(o),t.y/e.scale+e.offset},o.prototype.zoom=function(t,e,i){null==e&&(e=(this.start+this.end)/2);var o=d.getHiddenDurationBetween(this.body.hiddenDates,this.start,this.end),n=d.getHiddenDurationBefore(this.body.hiddenDates,this,e),s=o-n,r=e-n+(this.start-(e-n))*t,a=e+s+(this.end-(e+s))*t;this.startToFront=i>0?!1:!0,this.endToFront=-i>0?!1:!0;var h=d.snapAwayFromHidden(this.body.hiddenDates,r,i,!0),l=d.snapAwayFromHidden(this.body.hiddenDates,a,-i,!0);(h!=r||l!=a)&&(r=h,a=l),this.setRange(r,a,!1,!0),this.startToFront=!1,this.endToFront=!0},o.prototype.move=function(t){var e=this.end-this.start,i=this.start+e*t,o=this.end+e*t;this.start=i,this.end=o},o.prototype.moveTo=function(t){var e=(this.start+this.end)/2,i=e-t,o=this.start-i,n=this.end-i;this.setRange(o,n)},t.exports=o},function(t,e,i){i(3);e.onTouch=function(t,e){e.inputHandler=function(t){t.isFirst&&!o&&(e(t),o=!0,setTimeout(function(){o=!1},0))},t.on("hammer.input",e.inputHandler)};var o=!1;e.onRelease=function(t,e){return e.inputHandler=function(t){t.isFinal&&!n&&(e(t),n=!0,setTimeout(function(){n=!1},0))},t.on("hammer.input",e.inputHandler)};var n=!1;e.offTouch=function(t,e){t.off("hammer.input",e.inputHandler)},e.offRelease=e.offTouch},function(t,e,i){var o=i(8);e.convertHiddenOptions=function(t,e){if(t.hiddenDates=[],e&&1==Array.isArray(e)){for(var i=0;i=4*a){var c=0,p=s.clone();switch(i[h].repeat){case"daily":d.day()!=l.day()&&(c=1),d.dayOfYear(n.dayOfYear()),d.year(n.year()),d.subtract(7,"days"),l.dayOfYear(n.dayOfYear()),l.year(n.year()),l.subtract(7-c,"days"),p.add(1,"weeks");break;case"weekly":var f=l.diff(d,"days"),m=d.day();d.date(n.date()),d.month(n.month()),d.year(n.year()),l=d.clone(),d.day(m),l.day(m),l.add(f,"days"),d.subtract(1,"weeks"),l.subtract(1,"weeks"),p.add(1,"weeks");break;case"monthly":d.month()!=l.month()&&(c=1),d.month(n.month()),d.year(n.year()),d.subtract(1,"months"),l.month(n.month()),l.year(n.year()),l.subtract(1,"months"),l.add(c,"months"),p.add(1,"months");break;case"yearly":d.year()!=l.year()&&(c=1),d.year(n.year()),d.subtract(1,"years"),l.year(n.year()),l.subtract(1,"years"),l.add(c,"years"),p.add(1,"years");break;default:return void console.log("Wrong repeat format, allowed are: daily, weekly, monthly, yearly. Given:",i[h].repeat)}for(;p>d;)switch(t.hiddenDates.push({start:d.valueOf(),end:l.valueOf()}),i[h].repeat){case"daily":d.add(1,"days"),l.add(1,"days");break;case"weekly":d.add(1,"weeks"),l.add(1,"weeks");break;case"monthly":d.add(1,"months"),l.add(1,"months");break;case"yearly":d.add(1,"y"),l.add(1,"y");break;default:return void console.log("Wrong repeat format, allowed are: daily, weekly, monthly, yearly. Given:",i[h].repeat)}t.hiddenDates.push({start:d.valueOf(),end:l.valueOf()})}}e.removeDuplicates(t);var v=e.isHidden(t.range.start,t.hiddenDates),g=e.isHidden(t.range.end,t.hiddenDates),y=t.range.start,b=t.range.end;1==v.hidden&&(y=1==t.range.startToFront?v.startDate-1:v.endDate+1),1==g.hidden&&(b=1==t.range.endToFront?g.startDate-1:g.endDate+1),(1==v.hidden||1==g.hidden)&&t.range._applyRange(y,b)}},e.removeDuplicates=function(t){for(var e=t.hiddenDates,i=[],o=0;o=e[o].start&&e[n].end<=e[o].end?e[n].remove=!0:e[n].start>=e[o].start&&e[n].start<=e[o].end?(e[o].end=e[n].end,e[n].remove=!0):e[n].end>=e[o].start&&e[n].end<=e[o].end&&(e[o].start=e[n].start,e[n].remove=!0));for(var o=0;o=r&&a>n){i=!0;break}}if(1==i&&n=e&&i>r&&(o+=r-s)}return o},e.correctTimeForHidden=function(t,i,n){return n=o(n).toDate().valueOf(),n-=e.getHiddenDurationBefore(t,i,n)},e.getHiddenDurationBefore=function(t,e,i){var n=0;i=o(i).toDate().valueOf();for(var s=0;s=e.start&&a=a&&(n+=a-r)}return n},e.getAccumulatedHiddenDuration=function(t,e,i){for(var o=0,n=0,s=e.start,r=0;r=e.start&&h=i)break;o+=h-a}}return o},e.snapAwayFromHidden=function(t,i,o,n){var s=e.isHidden(i,t);return 1==s.hidden?0>o?1==n?s.startDate-(s.endDate-i)-1:s.startDate-1:1==n?s.endDate+(i-s.startDate)+1:s.endDate+1:i},e.isHidden=function(t,e){for(var i=0;i=o&&n>t)return{hidden:!0,startDate:o,endDate:n}}return{hidden:!1,startDate:o,endDate:n}}},function(t,e,i){function o(){}var n=i(19),s=i(3),r=i(30),a=i(7),h=(i(14),i(16),i(29),i(33),i(41)),d=i(42),l=i(31),u=i(44);n(o.prototype),o.prototype._create=function(t){function e(t){i.isActive()&&i.emit("mousewheel",t)}this.dom={},this.dom.container=t,this.dom.root=document.createElement("div"),this.dom.background=document.createElement("div"),this.dom.backgroundVertical=document.createElement("div"),this.dom.backgroundHorizontal=document.createElement("div"),this.dom.centerContainer=document.createElement("div"),this.dom.leftContainer=document.createElement("div"),this.dom.rightContainer=document.createElement("div"),this.dom.center=document.createElement("div"),this.dom.left=document.createElement("div"),this.dom.right=document.createElement("div"),this.dom.top=document.createElement("div"),this.dom.bottom=document.createElement("div"),this.dom.shadowTop=document.createElement("div"),this.dom.shadowBottom=document.createElement("div"),this.dom.shadowTopLeft=document.createElement("div"),this.dom.shadowBottomLeft=document.createElement("div"),this.dom.shadowTopRight=document.createElement("div"),this.dom.shadowBottomRight=document.createElement("div"),this.dom.root.className="vis-timeline",this.dom.background.className="vis-panel vis-background",this.dom.backgroundVertical.className="vis-panel vis-background vis-vertical",this.dom.backgroundHorizontal.className="vis-panel vis-background vis-horizontal",this.dom.centerContainer.className="vis-panel vis-center",this.dom.leftContainer.className="vis-panel vis-left",this.dom.rightContainer.className="vis-panel vis-right",this.dom.top.className="vis-panel vis-top",this.dom.bottom.className="vis-panel vis-bottom", -this.dom.left.className="vis-content",this.dom.center.className="vis-content",this.dom.right.className="vis-content",this.dom.shadowTop.className="vis-shadow vis-top",this.dom.shadowBottom.className="vis-shadow vis-bottom",this.dom.shadowTopLeft.className="vis-shadow vis-top",this.dom.shadowBottomLeft.className="vis-shadow vis-bottom",this.dom.shadowTopRight.className="vis-shadow vis-top",this.dom.shadowBottomRight.className="vis-shadow vis-bottom",this.dom.root.appendChild(this.dom.background),this.dom.root.appendChild(this.dom.backgroundVertical),this.dom.root.appendChild(this.dom.backgroundHorizontal),this.dom.root.appendChild(this.dom.centerContainer),this.dom.root.appendChild(this.dom.leftContainer),this.dom.root.appendChild(this.dom.rightContainer),this.dom.root.appendChild(this.dom.top),this.dom.root.appendChild(this.dom.bottom),this.dom.centerContainer.appendChild(this.dom.center),this.dom.leftContainer.appendChild(this.dom.left),this.dom.rightContainer.appendChild(this.dom.right),this.dom.centerContainer.appendChild(this.dom.shadowTop),this.dom.centerContainer.appendChild(this.dom.shadowBottom),this.dom.leftContainer.appendChild(this.dom.shadowTopLeft),this.dom.leftContainer.appendChild(this.dom.shadowBottomLeft),this.dom.rightContainer.appendChild(this.dom.shadowTopRight),this.dom.rightContainer.appendChild(this.dom.shadowBottomRight),this.on("rangechange",this.redraw.bind(this)),this.on("touch",this._onTouch.bind(this)),this.on("pan",this._onDrag.bind(this));var i=this;this.on("change",function(t){t&&1==t.queue?i._redrawTimer||(i._redrawTimer=setTimeout(function(){i._redrawTimer=null,i._redraw()},0)):i._redraw()}),this.hammer=new s(this.dom.root),this.hammer.get("pinch").set({enable:!0}),this.hammer.get("pan").set({threshold:5,direction:30}),this.listeners={};var o=["tap","doubletap","press","pinch","pan","panstart","panmove","panend"];if(o.forEach(function(t){var e=function(e){i.isActive()&&i.emit(t,e)};i.hammer.on(t,e),i.listeners[t]=e}),r.onTouch(this.hammer,function(t){i.emit("touch",t)}.bind(this)),r.onRelease(this.hammer,function(t){i.emit("release",t)}.bind(this)),this.dom.root.addEventListener("mousewheel",e),this.dom.root.addEventListener("DOMMouseScroll",e),this.props={root:{},background:{},centerContainer:{},leftContainer:{},rightContainer:{},center:{},left:{},right:{},top:{},bottom:{},border:{},scrollTop:0,scrollTopMin:0},this.customTimes=[],this.touch={},this.redrawCount=0,!t)throw new Error("No container provided");t.appendChild(this.dom.root)},o.prototype.setOptions=function(t){if(t){var e=["width","height","minHeight","maxHeight","autoResize","start","end","clickToUse","dataAttributes","hiddenDates"];if(a.selectiveExtend(e,this.options,t),"orientation"in t&&("string"==typeof t.orientation?this.options.orientation={item:t.orientation,axis:t.orientation}:"object"==typeof t.orientation&&("item"in t.orientation&&(this.options.orientation.item=t.orientation.item),"axis"in t.orientation&&(this.options.orientation.axis=t.orientation.axis))),"both"===this.options.orientation.axis){if(!this.timeAxis2){var i=this.timeAxis2=new h(this.body);i.setOptions=function(t){var e=t?a.extend({},t):{};e.orientation="top",h.prototype.setOptions.call(i,e)},this.components.push(i)}}else if(this.timeAxis2){var o=this.components.indexOf(this.timeAxis2);-1!==o&&this.components.splice(o,1),this.timeAxis2.destroy(),this.timeAxis2=null}if("function"==typeof t.drawPoints&&(t.drawPoints={onRender:t.drawPoints}),"hiddenDates"in this.options&&l.convertHiddenOptions(this.body,this.options.hiddenDates),"clickToUse"in t&&(t.clickToUse?this.activator||(this.activator=new d(this.dom.root)):this.activator&&(this.activator.destroy(),delete this.activator)),"showCustomTime"in t)throw new Error("Option `showCustomTime` is deprecated. Create a custom time bar via timeline.addCustomTime(time [, id])");this._initAutoResize()}if(this.components.forEach(function(e){return e.setOptions(t)}),"configure"in t){this.configurator||(this.configurator=this._createConfigurator()),this.configurator.setOptions(t.configure);var n=a.deepExtend({},this.options);this.components.forEach(function(t){a.deepExtend(n,t.options)}),this.configurator.setModuleOptions({global:n})}this._redraw()},o.prototype.isActive=function(){return!this.activator||this.activator.active},o.prototype.destroy=function(){this.setItems(null),this.setGroups(null),this.off(),this._stopAutoResize(),this.dom.root.parentNode&&this.dom.root.parentNode.removeChild(this.dom.root),this.dom=null,this.activator&&(this.activator.destroy(),delete this.activator);for(var t in this.listeners)this.listeners.hasOwnProperty(t)&&delete this.listeners[t];this.listeners=null,this.hammer=null,this.components.forEach(function(t){return t.destroy()}),this.body=null},o.prototype.setCustomTime=function(t,e){var i=this.customTimes.filter(function(t){return e===t.options.id});if(0===i.length)throw new Error("No custom time bar found with id "+JSON.stringify(e));i.length>0&&i[0].setCustomTime(t)},o.prototype.getCustomTime=function(t){var e=this.customTimes.filter(function(e){return e.options.id===t});if(0===e.length)throw new Error("No custom time bar found with id "+JSON.stringify(t));return e[0].getCustomTime()},o.prototype.getEventProperties=function(t){return{event:t}},o.prototype.addCustomTime=function(t,e){var i=void 0!==t?a.convert(t,"Date").valueOf():new Date,o=this.customTimes.some(function(t){return t.options.id===e});if(o)throw new Error("A custom time with id "+JSON.stringify(e)+" already exists");var n=new u(this.body,{time:i,id:e});return this.customTimes.push(n),this.components.push(n),this.redraw(),e},o.prototype.removeCustomTime=function(t){var e=this.customTimes.filter(function(e){return e.options.id===t});if(0===e.length)throw new Error("No custom time bar found with id "+JSON.stringify(t));e.forEach(function(t){this.customTimes.splice(this.customTimes.indexOf(t),1),this.components.splice(this.components.indexOf(t),1),t.destroy()}.bind(this))},o.prototype.getVisibleItems=function(){return this.itemSet&&this.itemSet.getVisibleItems()||[]},o.prototype.fit=function(t){var e=this.getDataRange();if(null!==e.min||null!==e.max){var i=e.max-e.min,o=new Date(e.min.valueOf()-.01*i),n=new Date(e.max.valueOf()+.01*i),s=t&&void 0!==t.animation?t.animation:!0;this.range.setRange(o,n,s)}},o.prototype.getDataRange=function(){throw new Error("Cannot invoke abstract method getDataRange")},o.prototype.setWindow=function(t,e,i){var o;if(1==arguments.length){var n=arguments[0];o=void 0!==n.animation?n.animation:!0,this.range.setRange(n.start,n.end,o)}else o=i&&void 0!==i.animation?i.animation:!0,this.range.setRange(t,e,o)},o.prototype.moveTo=function(t,e){var i=this.range.end-this.range.start,o=a.convert(t,"Date").valueOf(),n=o-i/2,s=o+i/2,r=e&&void 0!==e.animation?e.animation:!0;this.range.setRange(n,s,r)},o.prototype.getWindow=function(){var t=this.range.getRange();return{start:new Date(t.start),end:new Date(t.end)}},o.prototype.redraw=function(){this._redraw()},o.prototype._redraw=function(){var t=!1,e=this.options,i=this.props,o=this.dom;if(o){l.updateHiddenDates(this.body,this.options.hiddenDates),"top"==e.orientation?(a.addClassName(o.root,"vis-top"),a.removeClassName(o.root,"vis-bottom")):(a.removeClassName(o.root,"vis-top"),a.addClassName(o.root,"vis-bottom")),o.root.style.maxHeight=a.option.asSize(e.maxHeight,""),o.root.style.minHeight=a.option.asSize(e.minHeight,""),o.root.style.width=a.option.asSize(e.width,""),i.border.left=(o.centerContainer.offsetWidth-o.centerContainer.clientWidth)/2,i.border.right=i.border.left,i.border.top=(o.centerContainer.offsetHeight-o.centerContainer.clientHeight)/2,i.border.bottom=i.border.top;var n=o.root.offsetHeight-o.root.clientHeight,s=o.root.offsetWidth-o.root.clientWidth;0===o.centerContainer.clientHeight&&(i.border.left=i.border.top,i.border.right=i.border.left),0===o.root.clientHeight&&(s=n),i.center.height=o.center.offsetHeight,i.left.height=o.left.offsetHeight,i.right.height=o.right.offsetHeight,i.top.height=o.top.clientHeight||-i.border.top,i.bottom.height=o.bottom.clientHeight||-i.border.bottom;var r=Math.max(i.left.height,i.center.height,i.right.height),h=i.top.height+r+i.bottom.height+n+i.border.top+i.border.bottom;o.root.style.height=a.option.asSize(e.height,h+"px"),i.root.height=o.root.offsetHeight,i.background.height=i.root.height-n;var d=i.root.height-i.top.height-i.bottom.height-n;i.centerContainer.height=d,i.leftContainer.height=d,i.rightContainer.height=i.leftContainer.height,i.root.width=o.root.offsetWidth,i.background.width=i.root.width-s,i.left.width=o.leftContainer.clientWidth||-i.border.left,i.leftContainer.width=i.left.width,i.right.width=o.rightContainer.clientWidth||-i.border.right,i.rightContainer.width=i.right.width;var u=i.root.width-i.left.width-i.right.width-s;i.center.width=u,i.centerContainer.width=u,i.top.width=u,i.bottom.width=u,o.background.style.height=i.background.height+"px",o.backgroundVertical.style.height=i.background.height+"px",o.backgroundHorizontal.style.height=i.centerContainer.height+"px",o.centerContainer.style.height=i.centerContainer.height+"px",o.leftContainer.style.height=i.leftContainer.height+"px",o.rightContainer.style.height=i.rightContainer.height+"px",o.background.style.width=i.background.width+"px",o.backgroundVertical.style.width=i.centerContainer.width+"px",o.backgroundHorizontal.style.width=i.background.width+"px",o.centerContainer.style.width=i.center.width+"px",o.top.style.width=i.top.width+"px",o.bottom.style.width=i.bottom.width+"px",o.background.style.left="0",o.background.style.top="0",o.backgroundVertical.style.left=i.left.width+i.border.left+"px",o.backgroundVertical.style.top="0",o.backgroundHorizontal.style.left="0",o.backgroundHorizontal.style.top=i.top.height+"px",o.centerContainer.style.left=i.left.width+"px",o.centerContainer.style.top=i.top.height+"px",o.leftContainer.style.left="0",o.leftContainer.style.top=i.top.height+"px",o.rightContainer.style.left=i.left.width+i.center.width+"px",o.rightContainer.style.top=i.top.height+"px",o.top.style.left=i.left.width+"px",o.top.style.top="0",o.bottom.style.left=i.left.width+"px",o.bottom.style.top=i.top.height+i.centerContainer.height+"px",this._updateScrollTop();var c=this.props.scrollTop;"top"!=e.orientation.item&&(c+=Math.max(this.props.centerContainer.height-this.props.center.height-this.props.border.top-this.props.border.bottom,0)),o.center.style.left="0",o.center.style.top=c+"px",o.left.style.left="0",o.left.style.top=c+"px",o.right.style.left="0",o.right.style.top=c+"px";var p=0==this.props.scrollTop?"hidden":"",f=this.props.scrollTop==this.props.scrollTopMin?"hidden":"";if(o.shadowTop.style.visibility=p,o.shadowBottom.style.visibility=f,o.shadowTopLeft.style.visibility=p,o.shadowBottomLeft.style.visibility=f,o.shadowTopRight.style.visibility=p,o.shadowBottomRight.style.visibility=f,this.components.forEach(function(e){t=e.redraw()||t}),t){var m=3;this.redrawCount0&&(this.props.scrollTop=0),this.props.scrollTope;e++)o=this.selection[e],n=this.items[o],n&&n.unselect();for(this.selection=[],e=0,i=t.length;i>e;e++)o=t[e],n=this.items[o],n&&(this.selection.push(o),n.select())},o.prototype.getSelection=function(){return this.selection.concat([])},o.prototype.getVisibleItems=function(){var t=this.body.range.getRange(),e=this.body.util.toScreen(t.start),i=this.body.util.toScreen(t.end),o=[];for(var n in this.groups)if(this.groups.hasOwnProperty(n))for(var s=this.groups[n],r=s.visibleItems,a=0;ae&&o.push(h.id)}return o},o.prototype._deselect=function(t){for(var e=this.selection,i=0,o=e.length;o>i;i++)if(e[i]==t){e.splice(i,1);break}},o.prototype.redraw=function(){var t=this.options.margin,e=this.body.range,i=s.option.asSize,o=this.options,n=o.orientation.item,r=!1,a=this.dom.frame;this.props.top=this.body.domProps.top.height+this.body.domProps.border.top,this.props.left=this.body.domProps.left.width+this.body.domProps.border.left,a.className="vis-itemset",r=this._orderGroups()||r;var h=e.end-e.start,d=h!=this.lastVisibleInterval||this.props.width!=this.props.lastWidth;d&&(this.stackDirty=!0),this.lastVisibleInterval=h,this.props.lastWidth=this.props.width;var l=this.stackDirty,u=this._firstGroup(),c={item:t.item,axis:t.axis},p={item:t.item,axis:t.item.vertical/2},f=0,m=t.axis+t.item.vertical;return this.groups[g].redraw(e,p,l),s.forEach(this.groups,function(t){var i=t==u?c:p,o=t.redraw(e,i,l);r=o||r,f+=t.height}),f=Math.max(f,m),this.stackDirty=!1,a.style.height=i(f),this.props.width=a.offsetWidth,this.props.height=f,this.dom.axis.style.top=i("top"==n?this.body.domProps.top.height+this.body.domProps.border.top:this.body.domProps.top.height+this.body.domProps.centerContainer.height),this.dom.axis.style.left="0",r=this._isResized()||r},o.prototype._firstGroup=function(){var t="top"==this.options.orientation.item?0:this.groupIds.length-1,e=this.groupIds[t],i=this.groups[e]||this.groups[v];return i||null},o.prototype._updateUngrouped=function(){var t,e,i=this.groups[v];this.groups[g];if(this.groupsData){if(i){i.hide(),delete this.groups[v];for(e in this.items)if(this.items.hasOwnProperty(e)){t=this.items[e],t.parent&&t.parent.remove(t);var o=this._getGroupId(t.data),n=this.groups[o];n&&n.add(t)||t.hide()}}}else if(!i){var s=null,r=null;i=new l(s,r,this),this.groups[v]=i;for(e in this.items)this.items.hasOwnProperty(e)&&(t=this.items[e],i.add(t));i.show()}},o.prototype.getLabelSet=function(){return this.dom.labelSet},o.prototype.setItems=function(t){var e,i=this,o=this.itemsData;if(t){if(!(t instanceof r||t instanceof a))throw new TypeError("Data must be an instance of DataSet or DataView");this.itemsData=t}else this.itemsData=null;if(o&&(s.forEach(this.itemListeners,function(t,e){o.off(e,t)}),e=o.getIds(),this._onRemove(e)),this.itemsData){var n=this.id;s.forEach(this.itemListeners,function(t,e){i.itemsData.on(e,t,n)}),e=this.itemsData.getIds(),this._onAdd(e),this._updateUngrouped()}},o.prototype.getItems=function(){return this.itemsData},o.prototype.setGroups=function(t){var e,i=this;if(this.groupsData&&(s.forEach(this.groupListeners,function(t,e){i.groupsData.off(e,t)}),e=this.groupsData.getIds(),this.groupsData=null,this._onRemoveGroups(e)),t){if(!(t instanceof r||t instanceof a))throw new TypeError("Data must be an instance of DataSet or DataView");this.groupsData=t}else this.groupsData=null;if(this.groupsData){var o=this.id;s.forEach(this.groupListeners,function(t,e){i.groupsData.on(e,t,o)}),e=this.groupsData.getIds(),this._onAddGroups(e)}this._updateUngrouped(),this._order(),this.body.emitter.emit("change",{queue:!0})},o.prototype.getGroups=function(){return this.groupsData},o.prototype.removeItem=function(t){var e=this.itemsData.get(t),i=this.itemsData.getDataSet();e&&this.options.onRemove(e,function(e){e&&i.remove(t)})},o.prototype._getType=function(t){return t.type||this.options.type||(t.end?"range":"box")},o.prototype._getGroupId=function(t){var e=this._getType(t);return"background"==e&&void 0==t.group?g:this.groupsData?t.group:v},o.prototype._onUpdate=function(t){var e=this;t.forEach(function(t){var i,n=e.itemsData.get(t,e.itemOptions),s=e.items[t],r=e._getType(n),a=o.types[r];if(s&&(a&&s instanceof a?e._updateItem(s,n):(i=s.selected,e._removeItem(s),s=null)),!s){if(!a)throw"rangeoverflow"==r?new TypeError('Item type "rangeoverflow" is deprecated. Use css styling instead: .vis-item.vis-range .vis-item-content {overflow: visible;}'):new TypeError('Unknown item type "'+r+'"');s=new a(n,e.conversion,e.options),s.id=t,e._addItem(s),i&&(this.selection.push(t),s.select())}}.bind(this)),this._order(),this.stackDirty=!0,this.body.emitter.emit("change",{queue:!0})},o.prototype._onAdd=o.prototype._onUpdate,o.prototype._onRemove=function(t){var e=0,i=this;t.forEach(function(t){var o=i.items[t];o&&(e++,i._removeItem(o))}),e&&(this._order(),this.stackDirty=!0,this.body.emitter.emit("change",{queue:!0}))},o.prototype._order=function(){s.forEach(this.groups,function(t){t.order()})},o.prototype._onUpdateGroups=function(t){this._onAddGroups(t)},o.prototype._onAddGroups=function(t){var e=this;t.forEach(function(t){var i=e.groupsData.get(t),o=e.groups[t];if(o)o.setData(i);else{if(t==v||t==g)throw new Error("Illegal group id. "+t+" is a reserved id.");var n=Object.create(e.options);s.extend(n,{height:null}),o=new l(t,i,e),e.groups[t]=o;for(var r in e.items)if(e.items.hasOwnProperty(r)){var a=e.items[r];a.data.group==t&&o.add(a)}o.order(),o.show()}}),this.body.emitter.emit("change",{queue:!0})},o.prototype._onRemoveGroups=function(t){var e=this.groups;t.forEach(function(t){var i=e[t];i&&(i.hide(),delete e[t])}),this.markDirty(),this.body.emitter.emit("change",{queue:!0})},o.prototype._orderGroups=function(){if(this.groupsData){var t=this.groupsData.getIds({order:this.options.groupOrder}),e=!s.equalArray(t,this.groupIds);if(e){var i=this.groups;t.forEach(function(t){i[t].hide()}),t.forEach(function(t){i[t].show()}),this.groupIds=t}return e}return!1},o.prototype._addItem=function(t){this.items[t.id]=t;var e=this._getGroupId(t.data),i=this.groups[e];i&&i.add(t)},o.prototype._updateItem=function(t,e){var i=t.data.group,o=t.data.subgroup;if(t.setData(e),i!=t.data.group||o!=t.data.subgroup){var n=this.groups[i];n&&n.remove(t);var s=this._getGroupId(t.data),r=this.groups[s];r&&r.add(t)}},o.prototype._removeItem=function(t){t.hide(),delete this.items[t.id];var e=this.selection.indexOf(t.id);-1!=e&&this.selection.splice(e,1),t.parent&&t.parent.remove(t)},o.prototype._constructByEndArray=function(t){for(var e=[],i=0;i0||o.length>0)&&this.body.emitter.emit("select",{items:r,event:t})}},o.prototype._onAddItem=function(t){if(this.options.selectable&&this.options.editable.add){var e=this,i=this.options.snap||null,o=this.itemFromTarget(t);if(t.stopPropagation(),o){var n=e.itemsData.get(o.id);this.options.onUpdate(n,function(t){t&&e.itemsData.getDataSet().update(t)})}else{var r=s.getAbsoluteLeft(this.dom.frame),a=t.center.x-r,h=this.body.util.toTime(a),d=this.body.util.getScale(),l=this.body.util.getStep(),u={start:i?i(h,d,l):h,content:"new item"};if("range"===this.options.type){var c=this.body.util.toTime(a+this.props.width/5);u.end=i?i(c,d,l):c}u[this.itemsData._fieldId]=s.randomUUID();var p=this.groupFromTarget(t);p&&(u.group=p.groupId),this.options.onAdd(u,function(t){t&&e.itemsData.getDataSet().add(t)})}}},o.prototype._onMultiSelectItem=function(t){if(this.options.selectable){var e=this.itemFromTarget(t);if(e){var i=this.options.multiselect?this.getSelection():[],n=t.srcEvent&&t.srcEvent.shiftKey||!1;if(n&&this.options.multiselect){i.push(e.id);var s=o._getItemRange(this.itemsData.get(i,this.itemOptions));i=[];for(var r in this.items)if(this.items.hasOwnProperty(r)){var a=this.items[r],h=a.data.start,d=void 0!==a.data.end?a.data.end:h;h>=s.min&&d<=s.max&&!(a instanceof m)&&i.push(a.id)}}else{var l=i.indexOf(e.id);-1==l?i.push(e.id):i.splice(l,1)}this.setSelection(i),this.body.emitter.emit("select",{items:this.getSelection(),event:t})}}},o._getItemRange=function(t){var e=null,i=null;return t.forEach(function(t){(null==i||t.starte)&&(e=t.end):(null==e||t.start>e)&&(e=t.start)}),{min:i,max:e}},o.prototype.itemFromTarget=function(t){for(var e=t.target;e;){if(e.hasOwnProperty("timeline-item"))return e["timeline-item"];e=e.parentNode}return null},o.prototype.groupFromTarget=function(t){for(var e=t.center?t.center.y:t.clientY,i=0;ia&&ea)return n}else if(0===i&&ec;c++){var f=this.visibleItems[c];f.repositionY(e)}return o},o.prototype._calculateHeight=function(t){var e,i=this.visibleItems;this.resetSubgroups();var o=this;if(i.length>0){var s=i[0].top,r=i[0].top+i[0].height;if(n.forEach(i,function(t){s=Math.min(s,t.top),r=Math.max(r,t.top+t.height),void 0!==t.data.subgroup&&(o.subgroups[t.data.subgroup].height=Math.max(o.subgroups[t.data.subgroup].height,t.height),o.subgroups[t.data.subgroup].visible=!0)}),s>t.axis){var a=s-t.axis;r-=a,n.forEach(i,function(t){t.top-=a})}e=r+t.item.vertical/2}else e=0;return e=Math.max(e,this.props.label.height)},o.prototype.show=function(){this.dom.label.parentNode||this.itemSet.dom.labelSet.appendChild(this.dom.label),this.dom.foreground.parentNode||this.itemSet.dom.foreground.appendChild(this.dom.foreground),this.dom.background.parentNode||this.itemSet.dom.background.appendChild(this.dom.background),this.dom.axis.parentNode||this.itemSet.dom.axis.appendChild(this.dom.axis)},o.prototype.hide=function(){var t=this.dom.label;t.parentNode&&t.parentNode.removeChild(t);var e=this.dom.foreground;e.parentNode&&e.parentNode.removeChild(e);var i=this.dom.background;i.parentNode&&i.parentNode.removeChild(i);var o=this.dom.axis;o.parentNode&&o.parentNode.removeChild(o)},o.prototype.add=function(t){if(this.items[t.id]=t,t.setParent(this),void 0!==t.data.subgroup&&(void 0===this.subgroups[t.data.subgroup]&&(this.subgroups[t.data.subgroup]={height:0,visible:!1,index:this.subgroupIndex,items:[]},this.subgroupIndex++),this.subgroups[t.data.subgroup].items.push(t)),this.orderSubgroups(),-1==this.visibleItems.indexOf(t)){var e=this.itemSet.body.range;this._checkIfVisible(t,this.visibleItems,e)}},o.prototype.orderSubgroups=function(){if(void 0!==this.subgroupOrderer){var t=[];if("string"==typeof this.subgroupOrderer){for(var e in this.subgroups)t.push({subgroup:e,sortField:this.subgroups[e].items[0].data[this.subgroupOrderer]});t.sort(function(t,e){return t.sortField-e.sortField})}else if("function"==typeof this.subgroupOrderer){for(var e in this.subgroups)t.push(this.subgroups[e].items[0].data);t.sort(this.subgroupOrderer)}if(t.length>0)for(var i=0;it?-1:l>=t?0:1};if(e.length>0)for(s=0;sl}),1==this.checkRangedItems)for(this.checkRangedItems=!1,s=0;sl})}for(s=0;s=0&&(s=e[r],!n(s));r--)void 0===o[s.id]&&(o[s.id]=!0,i.push(s));for(r=t+1;rn;n++)t[n].top=null;for(n=0,s=t.length;s>n;n++){var r=t[n];if(r.stack&&null===r.top){r.top=i.axis;do{for(var a=null,h=0,d=t.length;d>h;h++){var l=t[h];if(null!==l.top&&l!==r&&l.stack&&e.collision(r,l,i.item)){a=l;break}}null!=a&&(r.top=a.top+a.height+i.item.vertical)}while(a)}}},e.nostack=function(t,e,i){var o,n,s;for(o=0,n=t.length;n>o;o++)if(void 0!==t[o].data.subgroup){s=e.axis;for(var r in i)i.hasOwnProperty(r)&&1==i[r].visible&&i[r].indexe.left&&t.top-o.vertical+ie.top}},function(t,e,i){function o(t,e,i){if(this.props={content:{width:0}},this.overflow=!1,t){if(void 0==t.start)throw new Error('Property "start" missing in item '+t.id);if(void 0==t.end)throw new Error('Property "end" missing in item '+t.id)}n.call(this,t,e,i)}var n=(i(3),i(2));o.prototype=new n(null,null,null),o.prototype.baseClassName="vis-item vis-range",o.prototype.isVisible=function(t){return this.data.startt.start},o.prototype.redraw=function(){var t=this.dom;if(t||(this.dom={},t=this.dom,t.box=document.createElement("div"),t.frame=document.createElement("div"),t.frame.className="vis-item-overflow",t.box.appendChild(t.frame),t.content=document.createElement("div"),t.content.className="vis-item-content",t.frame.appendChild(t.content),t.box["timeline-item"]=this,this.dirty=!0),!this.parent)throw new Error("Cannot redraw item: no parent attached");if(!t.box.parentNode){var e=this.parent.dom.foreground;if(!e)throw new Error("Cannot redraw item: parent has no foreground container element");e.appendChild(t.box)}if(this.displayed=!0,this.dirty){this._updateContents(this.dom.content),this._updateTitle(this.dom.box),this._updateDataAttributes(this.dom.box),this._updateStyle(this.dom.box);var i=(this.options.editable.updateTime||this.options.editable.updateGroup||this.editable===!0)&&this.editable!==!1,o=(this.data.className?" "+this.data.className:"")+(this.selected?" vis-selected":"")+(i?" vis-editable":" vis-readonly");t.box.className=this.baseClassName+o,this.overflow="hidden"!==window.getComputedStyle(t.frame).overflow,this.dom.content.style.maxWidth="none",this.props.content.width=this.dom.content.offsetWidth,this.height=this.dom.box.offsetHeight,this.dom.content.style.maxWidth="",this.dirty=!1}this._repaintDeleteButton(t.box),this._repaintDragLeft(),this._repaintDragRight()},o.prototype.show=function(){this.displayed||this.redraw()},o.prototype.hide=function(){if(this.displayed){var t=this.dom.box;t.parentNode&&t.parentNode.removeChild(t),this.displayed=!1}},o.prototype.repositionX=function(t){var e,i,o=this.parent.width,n=this.conversion.toScreen(this.data.start),s=this.conversion.toScreen(this.data.end);(void 0===t||t===!0)&&(-o>n&&(n=-o),s>2*o&&(s=2*o));var r=Math.max(s-n,1);switch(this.overflow?(this.left=n,this.width=r+this.props.content.width,i=this.props.content.width):(this.left=n,this.width=r,i=Math.min(s-n,this.props.content.width)),this.dom.box.style.left=this.left+"px",this.dom.box.style.width=r+"px",this.options.align){case"left":this.dom.content.style.left="0";break;case"right":this.dom.content.style.left=Math.max(r-i,0)+"px";break;case"center":this.dom.content.style.left=Math.max((r-i)/2,0)+"px";break;default:e=this.overflow?s>0?Math.max(-n,0):-i:0>n?-n:0,this.dom.content.style.left=e+"px"}},o.prototype.repositionY=function(){var t=this.options.orientation.item,e=this.dom.box;"top"==t?e.style.top=this.top+"px":e.style.top=this.parent.height-this.top-this.height+"px"},o.prototype._repaintDragLeft=function(){if(this.selected&&this.options.editable.updateTime&&!this.dom.dragLeft){var t=document.createElement("div");t.className="vis-drag-left",t.dragLeftItem=this,this.dom.box.appendChild(t),this.dom.dragLeft=t}else!this.selected&&this.dom.dragLeft&&(this.dom.dragLeft.parentNode&&this.dom.dragLeft.parentNode.removeChild(this.dom.dragLeft),this.dom.dragLeft=null)},o.prototype._repaintDragRight=function(){if(this.selected&&this.options.editable.updateTime&&!this.dom.dragRight){var t=document.createElement("div");t.className="vis-drag-right",t.dragRightItem=this,this.dom.box.appendChild(t),this.dom.dragRight=t}else!this.selected&&this.dom.dragRight&&(this.dom.dragRight.parentNode&&this.dom.dragRight.parentNode.removeChild(this.dom.dragRight),this.dom.dragRight=null)},t.exports=o},function(t,e,i){function o(t,e,i,n){this.current=new Date,this._start=new Date,this._end=new Date,this.autoScale=!0,this.scale="day",this.step=1,this.setRange(t,e,i),this.switchedDay=!1,this.switchedMonth=!1,this.switchedYear=!1,this.hiddenDates=n,void 0===n&&(this.hiddenDates=[]),this.format=o.FORMAT}var n=i(8),s=i(31),r=i(7);o.FORMAT={minorLabels:{millisecond:"SSS",second:"s",minute:"HH:mm",hour:"HH:mm",weekday:"ddd D",day:"D",month:"MMM",year:"YYYY"},majorLabels:{millisecond:"HH:mm:ss",second:"D MMMM HH:mm",minute:"ddd D MMMM",hour:"ddd D MMMM",weekday:"MMMM YYYY",day:"MMMM YYYY",month:"YYYY",year:""}},o.prototype.setFormat=function(t){var e=r.deepExtend({},o.FORMAT);this.format=r.deepExtend(e,t)},o.prototype.setRange=function(t,e,i){if(!(t instanceof Date&&e instanceof Date))throw"No legal start or end date in method setRange";this._start=void 0!=t?new Date(t.valueOf()):new Date,this._end=void 0!=e?new Date(e.valueOf()):new Date,this.autoScale&&this.setMinimumStep(i)},o.prototype.first=function(){this.current=new Date(this._start.valueOf()),this.roundToMinor()},o.prototype.roundToMinor=function(){switch(this.scale){case"year":this.current.setFullYear(this.step*Math.floor(this.current.getFullYear()/this.step)),this.current.setMonth(0);case"month":this.current.setDate(1);case"day":case"weekday":this.current.setHours(0);case"hour":this.current.setMinutes(0);case"minute":this.current.setSeconds(0);case"second":this.current.setMilliseconds(0)}if(1!=this.step)switch(this.scale){case"millisecond":this.current.setMilliseconds(this.current.getMilliseconds()-this.current.getMilliseconds()%this.step);break;case"second":this.current.setSeconds(this.current.getSeconds()-this.current.getSeconds()%this.step);break;case"minute":this.current.setMinutes(this.current.getMinutes()-this.current.getMinutes()%this.step);break;case"hour":this.current.setHours(this.current.getHours()-this.current.getHours()%this.step);break;case"weekday":case"day":this.current.setDate(this.current.getDate()-1-(this.current.getDate()-1)%this.step+1);break;case"month":this.current.setMonth(this.current.getMonth()-this.current.getMonth()%this.step);break;case"year":this.current.setFullYear(this.current.getFullYear()-this.current.getFullYear()%this.step)}},o.prototype.hasNext=function(){return this.current.valueOf()<=this._end.valueOf()},o.prototype.next=function(){var t=this.current.valueOf();if(this.current.getMonth()<6)switch(this.scale){case"millisecond":this.current=new Date(this.current.valueOf()+this.step);break;case"second":this.current=new Date(this.current.valueOf()+1e3*this.step);break;case"minute":this.current=new Date(this.current.valueOf()+1e3*this.step*60);break;case"hour":this.current=new Date(this.current.valueOf()+1e3*this.step*60*60);var e=this.current.getHours();this.current.setHours(e-e%this.step);break;case"weekday":case"day":this.current.setDate(this.current.getDate()+this.step);break;case"month":this.current.setMonth(this.current.getMonth()+this.step);break;case"year":this.current.setFullYear(this.current.getFullYear()+this.step)}else switch(this.scale){case"millisecond":this.current=new Date(this.current.valueOf()+this.step);break;case"second":this.current.setSeconds(this.current.getSeconds()+this.step);break;case"minute":this.current.setMinutes(this.current.getMinutes()+this.step);break;case"hour":this.current.setHours(this.current.getHours()+this.step);break;case"weekday":case"day":this.current.setDate(this.current.getDate()+this.step);break;case"month":this.current.setMonth(this.current.getMonth()+this.step);break;case"year":this.current.setFullYear(this.current.getFullYear()+this.step)}if(1!=this.step)switch(this.scale){case"millisecond":this.current.getMilliseconds()0?t.step:1,this.autoScale=!1)},o.prototype.setAutoScale=function(t){this.autoScale=t},o.prototype.setMinimumStep=function(t){if(void 0!=t){var e=31104e6,i=2592e6,o=864e5,n=36e5,s=6e4,r=1e3,a=1;1e3*e>t&&(this.scale="year",this.step=1e3),500*e>t&&(this.scale="year",this.step=500),100*e>t&&(this.scale="year",this.step=100),50*e>t&&(this.scale="year",this.step=50),10*e>t&&(this.scale="year",this.step=10),5*e>t&&(this.scale="year",this.step=5),e>t&&(this.scale="year",this.step=1),3*i>t&&(this.scale="month",this.step=3),i>t&&(this.scale="month",this.step=1),5*o>t&&(this.scale="day",this.step=5),2*o>t&&(this.scale="day",this.step=2),o>t&&(this.scale="day",this.step=1),o/2>t&&(this.scale="weekday",this.step=1),4*n>t&&(this.scale="hour",this.step=4),n>t&&(this.scale="hour",this.step=1),15*s>t&&(this.scale="minute",this.step=15),10*s>t&&(this.scale="minute",this.step=10),5*s>t&&(this.scale="minute",this.step=5),s>t&&(this.scale="minute",this.step=1),15*r>t&&(this.scale="second",this.step=15),10*r>t&&(this.scale="second",this.step=10),5*r>t&&(this.scale="second",this.step=5),r>t&&(this.scale="second",this.step=1),200*a>t&&(this.scale="millisecond",this.step=200),100*a>t&&(this.scale="millisecond",this.step=100),50*a>t&&(this.scale="millisecond",this.step=50),10*a>t&&(this.scale="millisecond",this.step=10),5*a>t&&(this.scale="millisecond",this.step=5),a>t&&(this.scale="millisecond",this.step=1)}},o.snap=function(t,e,i){var o=new Date(t.valueOf());if("year"==e){var n=o.getFullYear()+Math.round(o.getMonth()/12);o.setFullYear(Math.round(n/i)*i),o.setMonth(0),o.setDate(0),o.setHours(0),o.setMinutes(0),o.setSeconds(0),o.setMilliseconds(0)}else if("month"==e)o.getDate()>15?(o.setDate(1),o.setMonth(o.getMonth()+1)):o.setDate(1),o.setHours(0),o.setMinutes(0),o.setSeconds(0),o.setMilliseconds(0);else if("day"==e){switch(i){case 5:case 2:o.setHours(24*Math.round(o.getHours()/24));break;default:o.setHours(12*Math.round(o.getHours()/12))}o.setMinutes(0),o.setSeconds(0),o.setMilliseconds(0)}else if("weekday"==e){switch(i){case 5:case 2:o.setHours(12*Math.round(o.getHours()/12));break;default:o.setHours(6*Math.round(o.getHours()/6))}o.setMinutes(0),o.setSeconds(0),o.setMilliseconds(0)}else if("hour"==e){switch(i){case 4:o.setMinutes(60*Math.round(o.getMinutes()/60));break;default:o.setMinutes(30*Math.round(o.getMinutes()/30))}o.setSeconds(0),o.setMilliseconds(0)}else if("minute"==e){switch(i){case 15:case 10:o.setMinutes(5*Math.round(o.getMinutes()/5)),o.setSeconds(0);break;case 5:o.setSeconds(60*Math.round(o.getSeconds()/60));break;default:o.setSeconds(30*Math.round(o.getSeconds()/30))}o.setMilliseconds(0)}else if("second"==e)switch(i){case 15:case 10:o.setSeconds(5*Math.round(o.getSeconds()/5)),o.setMilliseconds(0);break;case 5:o.setMilliseconds(1e3*Math.round(o.getMilliseconds()/1e3));break;default:o.setMilliseconds(500*Math.round(o.getMilliseconds()/500))}else if("millisecond"==e){var s=i>5?i/2:1;o.setMilliseconds(Math.round(o.getMilliseconds()/s)*s)}return o},o.prototype.isMajor=function(){if(1==this.switchedYear)switch(this.switchedYear=!1,this.scale){case"year":case"month":case"weekday":case"day":case"hour":case"minute":case"second":case"millisecond":return!0;default:return!1}else if(1==this.switchedMonth)switch(this.switchedMonth=!1,this.scale){case"weekday":case"day":case"hour":case"minute":case"second":case"millisecond":return!0;default:return!1}else if(1==this.switchedDay)switch(this.switchedDay=!1,this.scale){case"millisecond":case"second":case"minute":case"hour":return!0;default:return!1}switch(this.scale){case"millisecond":return 0==this.current.getMilliseconds();case"second":return 0==this.current.getSeconds();case"minute":return 0==this.current.getHours()&&0==this.current.getMinutes();case"hour":return 0==this.current.getHours();case"weekday":case"day":return 1==this.current.getDate();case"month":return 0==this.current.getMonth();case"year":return!1;default:return!1}},o.prototype.getLabelMinor=function(t){void 0==t&&(t=this.current);var e=this.format.minorLabels[this.scale];return e&&e.length>0?n(t).format(e):""},o.prototype.getLabelMajor=function(t){void 0==t&&(t=this.current);var e=this.format.majorLabels[this.scale];return e&&e.length>0?n(t).format(e):""},o.prototype.getClassName=function(){function t(t){return t/h%2==0?" vis-even":" vis-odd"}function e(t){return t.isSame(new Date,"day")?" vis-today":t.isSame(n().add(1,"day"),"day")?" vis-tomorrow":t.isSame(n().add(-1,"day"),"day")?" vis-yesterday":""}function i(t){return t.isSame(new Date,"week")?" vis-current-week":""}function o(t){return t.isSame(new Date,"month")?" vis-current-month":""}function s(t){return t.isSame(new Date,"year")?" vis-current-year":""}var r=n(this.current),a=r.locale?r.locale("en"):r.lang("en"),h=this.step;switch(this.scale){case"millisecond":return t(a.milliseconds()).trim();case"second":return t(a.seconds()).trim();case"minute":return t(a.minutes()).trim();case"hour":var d=a.hours();return 4==this.step&&(d=d+"-h"+(d+4)),"vis-h"+d+e(a)+t(a.hours());case"weekday":return"vis-"+a.format("dddd").toLowerCase()+e(a)+i(a)+t(a.date());case"day":var l=a.date(),u=a.format("MMMM").toLowerCase();return"vis-day"+l+" vis-"+u+o(a)+t(l-1);case"month":return"vis-"+a.format("MMMM").toLowerCase()+o(a)+t(a.month());case"year":var c=a.year();return"vis-year"+c+s(a)+t(c);default:return""}},t.exports=o},function(t,e,i){function o(t,e,i){n.call(this,t,e,i),this.width=0,this.height=0,this.top=0,this.left=0}var n=(i(7),i(34));o.prototype=Object.create(n.prototype),o.prototype.redraw=function(t,e,i){var o=!1;this.visibleItems=this._updateVisibleItems(this.orderedItems,this.visibleItems,t),this.width=this.dom.background.offsetWidth,this.dom.background.style.height="0";for(var n=0,s=this.visibleItems.length;s>n;n++){var r=this.visibleItems[n];r.repositionY(e)}return o},o.prototype.show=function(){this.dom.background.parentNode||this.itemSet.dom.background.appendChild(this.dom.background)},t.exports=o},function(t,e,i){function o(t,e,i){if(this.props={dot:{width:0,height:0},line:{width:0,height:0}},t&&void 0==t.start)throw new Error('Property "start" missing in item '+t);n.call(this,t,e,i)}var n=i(2);i(7);o.prototype=new n(null,null,null),o.prototype.isVisible=function(t){var e=(t.end-t.start)/4;return this.data.start>t.start-e&&this.data.startt.start},o.prototype.redraw=function(){var t=this.dom;if(t||(this.dom={},t=this.dom,t.box=document.createElement("div"),t.frame=document.createElement("div"),t.frame.className="vis-item-overflow",t.box.appendChild(t.frame),t.content=document.createElement("div"),t.content.className="vis-item-content",t.frame.appendChild(t.content),this.dirty=!0),!this.parent)throw new Error("Cannot redraw item: no parent attached");if(!t.box.parentNode){var e=this.parent.dom.background;if(!e)throw new Error("Cannot redraw item: parent has no background container element");e.appendChild(t.box)}if(this.displayed=!0,this.dirty){this._updateContents(this.dom.content),this._updateTitle(this.dom.content),this._updateDataAttributes(this.dom.content),this._updateStyle(this.dom.box);var i=(this.data.className?" "+this.data.className:"")+(this.selected?" vis-selected":"");t.box.className=this.baseClassName+i,this.overflow="hidden"!==window.getComputedStyle(t.content).overflow,this.props.content.width=this.dom.content.offsetWidth,this.height=0,this.dirty=!1}},o.prototype.show=r.prototype.show,o.prototype.hide=r.prototype.hide,o.prototype.repositionX=r.prototype.repositionX,o.prototype.repositionY=function(t){var e="top"===this.options.orientation.item;this.dom.content.style.top=e?"":"0",this.dom.content.style.bottom=e?"0":"";var i;if(void 0!==this.data.subgroup){var o=this.data.subgroup,n=this.parent.subgroups,r=n[o].index;if(1==e){i=this.parent.subgroups[o].height+t.item.vertical,i+=0==r?t.axis-.5*t.item.vertical:0;var a=this.parent.top;for(var h in n)n.hasOwnProperty(h)&&1==n[h].visible&&n[h].indexr&&(a+=l)}i=this.parent.subgroups[o].height+t.item.vertical,this.dom.box.style.top=this.parent.height-d+a+"px",this.dom.box.style.bottom=""}}else this.parent instanceof s?(i=Math.max(this.parent.height,this.parent.itemSet.body.domProps.center.height,this.parent.itemSet.body.domProps.centerContainer.height),this.dom.box.style.top=e?"0":"",this.dom.box.style.bottom=e?"":"0"):(i=this.parent.height,this.dom.box.style.top=this.parent.top+"px",this.dom.box.style.bottom="");this.dom.box.style.height=i+"px"},t.exports=o},function(t,e,i){function o(t,e){this.dom={foreground:null,lines:[],majorTexts:[],minorTexts:[],redundant:{lines:[],majorTexts:[],minorTexts:[]}},this.props={range:{start:0,end:0,minimumStep:0},lineTop:0},this.defaultOptions={orientation:{axis:"bottom"},showMinorLabels:!0,showMajorLabels:!0,format:r.FORMAT,timeAxis:null},this.options=n.extend({},this.defaultOptions),this.body=t,this._create(),this.setOptions(e)}var n=i(7),s=i(27),r=i(37),a=i(31),h=i(8);o.prototype=new s,o.prototype.setOptions=function(t){t&&(n.selectiveExtend(["showMinorLabels","showMajorLabels","hiddenDates","timeAxis"],this.options,t),n.selectiveDeepExtend(["format"],this.options,t),"orientation"in t&&("string"==typeof t.orientation?this.options.orientation.axis=t.orientation:"object"==typeof t.orientation&&"axis"in t.orientation&&(this.options.orientation.axis=t.orientation.axis)),"locale"in t&&("function"==typeof h.locale?h.locale(t.locale):h.lang(t.locale)))},o.prototype._create=function(){this.dom.foreground=document.createElement("div"),this.dom.background=document.createElement("div"),this.dom.foreground.className="vis-time-axis vis-foreground",this.dom.background.className="vis-time-axis vis-background"},o.prototype.destroy=function(){this.dom.foreground.parentNode&&this.dom.foreground.parentNode.removeChild(this.dom.foreground),this.dom.background.parentNode&&this.dom.background.parentNode.removeChild(this.dom.background),this.body=null},o.prototype.redraw=function(){var t=this.props,e=this.dom.foreground,i=this.dom.background,o="top"==this.options.orientation.axis?this.body.dom.top:this.body.dom.bottom,n=e.parentNode!==o;this._calculateCharSize();var s=this.options.showMinorLabels&&"none"!==this.options.orientation.axis,r=this.options.showMajorLabels&&"none"!==this.options.orientation.axis;t.minorLabelHeight=s?t.minorCharHeight:0,t.majorLabelHeight=r?t.majorCharHeight:0,t.height=t.minorLabelHeight+t.majorLabelHeight,t.width=e.offsetWidth,t.minorLineHeight=this.body.domProps.root.height-t.majorLabelHeight-("top"==this.options.orientation.axis?this.body.domProps.bottom.height:this.body.domProps.top.height),t.minorLineWidth=1,t.majorLineHeight=t.minorLineHeight+t.majorLabelHeight,t.majorLineWidth=1;var a=e.nextSibling,h=i.nextSibling;return e.parentNode&&e.parentNode.removeChild(e),i.parentNode&&i.parentNode.removeChild(i),e.style.height=this.props.height+"px",this._repaintLabels(),a?o.insertBefore(e,a):o.appendChild(e),h?this.body.dom.backgroundVertical.insertBefore(i,h):this.body.dom.backgroundVertical.appendChild(i),this._isResized()||n},o.prototype._repaintLabels=function(){var t=this.options.orientation.axis,e=n.convert(this.body.range.start,"Number"),i=n.convert(this.body.range.end,"Number"),o=this.body.util.toTime(7*(this.props.minorCharWidth||10)).valueOf(),s=o-a.getHiddenDurationBefore(this.body.hiddenDates,this.body.range,o);s-=this.body.util.toTime(0).valueOf();var h=new r(new Date(e),new Date(i),s,this.body.hiddenDates);this.options.format&&h.setFormat(this.options.format),this.options.timeAxis&&h.setScale(this.options.timeAxis),this.step=h;var d=this.dom;d.redundant.lines=d.lines,d.redundant.majorTexts=d.majorTexts,d.redundant.minorTexts=d.minorTexts,d.lines=[],d.majorTexts=[],d.minorTexts=[];var l,u,c,p,f,m,v,g,y,b=void 0,w=0;for(h.first(),u=h.getCurrent(),p=this.body.util.toScreen(u);h.hasNext()&&1e3>w;){w++, -f=h.isMajor(),y=h.getClassName(),g=h.getLabelMinor(),l=u,c=p,h.next(),u=h.getCurrent(),p=this.body.util.toScreen(u),m=p-c;var _=g.length*this.props.minorCharWidth0&&(void 0==b&&(b=c),this._repaintMajorText(c,h.getLabelMajor(),t,y)),v=this._repaintMajorLine(c,m,t,y)):_?v=this._repaintMinorLine(c,m,t,y):v&&(v.style.width=parseInt(v.style.width)+m+"px")}if(this.options.showMajorLabels){var x=this.body.util.toTime(0),k=h.getLabelMajor(x),M=k.length*(this.props.majorCharWidth||10)+10;(void 0==b||b>M)&&this._repaintMajorText(0,k,t,y)}n.forEach(this.dom.redundant,function(t){for(;t.length;){var e=t.pop();e&&e.parentNode&&e.parentNode.removeChild(e)}})},o.prototype._repaintMinorText=function(t,e,i,o){var n=this.dom.redundant.minorTexts.shift();if(!n){var s=document.createTextNode("");n=document.createElement("div"),n.appendChild(s),this.dom.foreground.appendChild(n)}return this.dom.minorTexts.push(n),n.childNodes[0].nodeValue=e,n.style.top="top"==i?this.props.majorLabelHeight+"px":"0",n.style.left=t+"px",n.className="vis-text vis-minor "+o,n},o.prototype._repaintMajorText=function(t,e,i,o){var n=this.dom.redundant.majorTexts.shift();if(!n){var s=document.createTextNode(e);n=document.createElement("div"),n.appendChild(s),this.dom.foreground.appendChild(n)}return this.dom.majorTexts.push(n),n.childNodes[0].nodeValue=e,n.className="vis-text vis-major "+o,n.style.top="top"==i?"0":this.props.minorLabelHeight+"px",n.style.left=t+"px",n},o.prototype._repaintMinorLine=function(t,e,i,o){var n=this.dom.redundant.lines.shift();n||(n=document.createElement("div"),this.dom.background.appendChild(n)),this.dom.lines.push(n);var s=this.props;return"top"==i?n.style.top=s.majorLabelHeight+"px":n.style.top=this.body.domProps.top.height+"px",n.style.height=s.minorLineHeight+"px",n.style.left=t-s.minorLineWidth/2+"px",n.style.width=e+"px",n.className="vis-grid vis-vertical vis-minor "+o,n},o.prototype._repaintMajorLine=function(t,e,i,o){var n=this.dom.redundant.lines.shift();n||(n=document.createElement("div"),this.dom.background.appendChild(n)),this.dom.lines.push(n);var s=this.props;return"top"==i?n.style.top="0":n.style.top=this.body.domProps.top.height+"px",n.style.left=t-s.majorLineWidth/2+"px",n.style.height=s.majorLineHeight+"px",n.style.width=e+"px",n.className="vis-grid vis-vertical vis-major "+o,n},o.prototype._calculateCharSize=function(){this.dom.measureCharMinor||(this.dom.measureCharMinor=document.createElement("DIV"),this.dom.measureCharMinor.className="vis-text vis-minor vis-measure",this.dom.measureCharMinor.style.position="absolute",this.dom.measureCharMinor.appendChild(document.createTextNode("0")),this.dom.foreground.appendChild(this.dom.measureCharMinor)),this.props.minorCharHeight=this.dom.measureCharMinor.clientHeight,this.props.minorCharWidth=this.dom.measureCharMinor.clientWidth,this.dom.measureCharMajor||(this.dom.measureCharMajor=document.createElement("DIV"),this.dom.measureCharMajor.className="vis-text vis-major vis-measure",this.dom.measureCharMajor.style.position="absolute",this.dom.measureCharMajor.appendChild(document.createTextNode("0")),this.dom.foreground.appendChild(this.dom.measureCharMajor)),this.props.majorCharHeight=this.dom.measureCharMajor.clientHeight,this.props.majorCharWidth=this.dom.measureCharMajor.clientWidth},t.exports=o},function(t,e,i){function o(t){this.active=!1,this.dom={container:t},this.dom.overlay=document.createElement("div"),this.dom.overlay.className="vis-overlay",this.dom.container.appendChild(this.dom.overlay),this.hammer=a(this.dom.overlay),this.hammer.on("tap",this._onTapOverlay.bind(this));var e=this,i=["tap","doubletap","press","pinch","pan","panstart","panmove","panend"];i.forEach(function(t){e.hammer.on(t,function(t){t.stopPropagation()})}),document&&document.body&&(this.onClick=function(i){n(i.target,t)||e.deactivate()},document.body.addEventListener("click",this.onClick)),void 0!==this.keycharm&&this.keycharm.destroy(),this.keycharm=s(),this.escListener=this.deactivate.bind(this)}function n(t,e){for(;t;){if(t===e)return!0;t=t.parentNode}return!1}var s=i(43),r=i(19),a=i(3),h=i(7);r(o.prototype),o.current=null,o.prototype.destroy=function(){this.deactivate(),this.dom.overlay.parentNode.removeChild(this.dom.overlay),this.onClick&&document.body.removeEventListener("click",this.onClick),this.hammer.destroy(),this.hammer=null},o.prototype.activate=function(){o.current&&o.current.deactivate(),o.current=this,this.active=!0,this.dom.overlay.style.display="none",h.addClassName(this.dom.container,"vis-active"),this.emit("change"),this.emit("activate"),this.keycharm.bind("esc",this.escListener)},o.prototype.deactivate=function(){this.active=!1,this.dom.overlay.style.display="",h.removeClassName(this.dom.container,"vis-active"),this.keycharm.unbind("esc",this.escListener),this.emit("change"),this.emit("deactivate")},o.prototype._onTapOverlay=function(t){this.activate(),t.stopPropagation()},t.exports=o},function(t,e,i){var o,n,s;!function(i,r){n=[],o=r,s="function"==typeof o?o.apply(e,n):o,!(void 0!==s&&(t.exports=s))}(this,function(){function t(t){var e,i=t&&t.preventDefault||!1,o=t&&t.container||window,n={},s={keydown:{},keyup:{}},r={};for(e=97;122>=e;e++)r[String.fromCharCode(e)]={code:65+(e-97),shift:!1};for(e=65;90>=e;e++)r[String.fromCharCode(e)]={code:e,shift:!0};for(e=0;9>=e;e++)r[""+e]={code:48+e,shift:!1};for(e=1;12>=e;e++)r["F"+e]={code:111+e,shift:!1};for(e=0;9>=e;e++)r["num"+e]={code:96+e,shift:!1};r["num*"]={code:106,shift:!1},r["num+"]={code:107,shift:!1},r["num-"]={code:109,shift:!1},r["num/"]={code:111,shift:!1},r["num."]={code:110,shift:!1},r.left={code:37,shift:!1},r.up={code:38,shift:!1},r.right={code:39,shift:!1},r.down={code:40,shift:!1},r.space={code:32,shift:!1},r.enter={code:13,shift:!1},r.shift={code:16,shift:void 0},r.esc={code:27,shift:!1},r.backspace={code:8,shift:!1},r.tab={code:9,shift:!1},r.ctrl={code:17,shift:!1},r.alt={code:18,shift:!1},r["delete"]={code:46,shift:!1},r.pageup={code:33,shift:!1},r.pagedown={code:34,shift:!1},r["="]={code:187,shift:!1},r["-"]={code:189,shift:!1},r["]"]={code:221,shift:!1},r["["]={code:219,shift:!1};var a=function(t){d(t,"keydown")},h=function(t){d(t,"keyup")},d=function(t,e){if(void 0!==s[e][t.keyCode]){for(var o=s[e][t.keyCode],n=0;n0&&this._makeItem([]),this._makeHeader(n),this._handleObject(this.configureOptions[n],[n])),i++);this.options.showButton===!0&&!function(){var e=document.createElement("div");e.className="vis-network-configuration button",e.innerHTML="generate options",e.onclick=function(){t._printOptions()},e.onmouseover=function(){e.className="vis-network-configuration button hover"},e.onmouseout=function(){e.className="vis-network-configuration button"},t.optionsContainer=document.createElement("div"),t.optionsContainer.className="vis-network-configuration vis-option-container",t.domElements.push(t.optionsContainer),t.domElements.push(e)}(),this._push(),this.colorPicker.insertTo(this.container)}},{key:"_push",value:function(){this.wrapper=document.createElement("div"),this.wrapper.className="vis-network-configuration-wrapper",this.container.appendChild(this.wrapper);for(var t=0;t1?o-1:0),s=1;o>s;s++)n[s-1]=e[s];n.forEach(function(t){r.appendChild(t)}),i.domElements.push(r)}()}}},{key:"_makeHeader",value:function(t){var e=document.createElement("div");e.className="vis-network-configuration header",e.innerHTML=t,this._makeItem([],e)}},{key:"_makeLabel",value:function(t,e){var i=arguments.length<=2||void 0===arguments[2]?!1:arguments[2],o=document.createElement("div");return o.className="vis-network-configuration label s"+e.length,i===!0?o.innerHTML=""+t+":":o.innerHTML=t+":",o}},{key:"_makeDropdown",value:function(t,e,i){var o=document.createElement("select");o.className="vis-network-configuration select";var n=0;void 0!==e&&-1!==t.indexOf(e)&&(n=t.indexOf(e));for(var s=0;se&&n>2*e?a.min=2*e:n>.1*e&&(a.min=e/10),2*e>s&&1!==s&&(a.max=2*e),a.value=e):a.value=o;var d=document.createElement("input");d.className="vis-network-configuration rangeinput",d.value=a.value;var l=this;a.onchange=function(){d.value=this.value,l._update(Number(this.value),i)},a.oninput=function(){d.value=this.value};var u=this._makeLabel(i[i.length-1],i);this._makeItem(i,u,a,d)}},{key:"_makeCheckbox",value:function(t,e,i){var o=document.createElement("input");o.type="checkbox",o.className="vis-network-configuration checkbox",o.checked=t,void 0!==e&&(o.checked=e,e!==t&&("object"==typeof t?e!==t.enabled&&this.changedOptions.push({path:i,value:e}):this.changedOptions.push({path:i,value:e})));var n=this;o.onchange=function(){n._update(this.checked,i)};var s=this._makeLabel(i[i.length-1],i);this._makeItem(i,s,o)}},{key:"_makeTextInput",value:function(t,e,i){var o=document.createElement("input");o.type="text",o.className="vis-network-configuration text",o.value=e,e!==t&&this.changedOptions.push({path:i,value:e});var n=this;o.onchange=function(){n._update(this.value,i)};var s=this._makeLabel(i[i.length-1],i);this._makeItem(i,s,o)}},{key:"_makeColorField",value:function(t,e,i){var o=this,n=t[1],s=document.createElement("div");e=void 0===e?n:e,"none"!==e?(s.className="vis-network-configuration colorBlock",s.style.backgroundColor=e):s.className="vis-network-configuration colorBlock none",e=void 0===e?n:e,s.onclick=function(){o._showColorPicker(e,s,i)};var r=this._makeLabel(i[i.length-1],i);this._makeItem(i,r,s)}},{key:"_showColorPicker",value:function(t,e,i){var o=this,n=e.getBoundingClientRect(),s=document.body.getBoundingClientRect(),r=n.left+n.width+5,a=n.top-s.top+.5*n.height;this.colorPicker.show(r,a),this.colorPicker.setColor(t),this.colorPicker.setCallback(function(t){var n="rgba("+t.r+","+t.g+","+t.b+","+t.a+")";e.style.backgroundColor=n,o._update(n,i)})}},{key:"_handleObject",value:function(t){var e=arguments.length<=1||void 0===arguments[1]?[]:arguments[1],i=arguments.length<=2||void 0===arguments[2]?!1:arguments[2],o=!1,n=this.options.filter,s=!1;for(var r in t)if(t.hasOwnProperty(r)){o=!0;var a=t[r],d=h.copyAndExtendArray(e,r);if("function"==typeof n&&(o=n(r,e),o===!1&&!(a instanceof Array)&&"string"!=typeof a&&"boolean"!=typeof a&&a instanceof Object&&(this.allowCreation=!1,o=this._handleObject(a,d,!0),this.allowCreation=i===!1)),o!==!1){s=!0;var l=this._getValue(d);if(a instanceof Array)this._handleArray(a,l,d);else if("string"==typeof a)this._makeTextInput(a,l,d);else if("boolean"==typeof a)this._makeCheckbox(a,l,d);else if(a instanceof Object){var u=!0;if(-1!==e.indexOf("physics")&&this.moduleOptions.physics.solver!==r&&(u=!1),u===!0)if(void 0!==a.enabled){var c=h.copyAndExtendArray(d,"enabled"),p=this._getValue(c);if(p===!0){var f=this._makeLabel(r,d,!0);this._makeItem(d,f),s=this._handleObject(a,d)||s}else this._makeCheckbox(a,p,d)}else{var f=this._makeLabel(r,d,!0);this._makeItem(d,f),s=this._handleObject(a,d)||s}}else console.error("dont know how to handle",a,r,d)}}return s}},{key:"_handleArray",value:function(t,e,i){"string"==typeof t[0]&&"color"===t[0]?(this._makeColorField(t,e,i),t[1]!==e&&this.changedOptions.push({path:i,value:e})):"string"==typeof t[0]?(this._makeDropdown(t,e,i),t[0]!==e&&this.changedOptions.push({path:i,value:e})):"number"==typeof t[0]&&(this._makeRange(t,e,i),t[0]!==e&&this.changedOptions.push({path:i,value:Number(e)}))}},{key:"_update",value:function(t,e){var i=this._constructOptions(t,e);this.parent.body&&this.parent.body.emitter&&this.parent.body.emitter.emit&&this.parent.body.emitter.emit("configChange",i),this.parent.setOptions(i)}},{key:"_constructOptions",value:function(t,e){var i=arguments.length<=2||void 0===arguments[2]?{}:arguments[2],o=i;t="true"===t?!0:t,t="false"===t?!1:t;for(var n=0;nvar options = "+JSON.stringify(t,null,2)+""}},{key:"getOptions",value:function(){for(var t={},e=0;es;s++)for(r=0;rp?p+1:p;var f=l/this.r,m=a.RGBToHSV(this.color.r,this.color.g,this.color.b);m.h=p,m.s=f;var v=a.HSVToRGB(m.h,m.s,m.v);v.a=this.color.a,this.color=v,this.initialColorDiv.style.backgroundColor="rgba("+this.initialColor.r+","+this.initialColor.g+","+this.initialColor.b+","+this.initialColor.a+")",this.newColorDiv.style.backgroundColor="rgba("+this.color.r+","+this.color.g+","+this.color.b+","+this.color.a+")"}}]),t}();e["default"]=h,t.exports=e["default"]},function(t,e,i){function o(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var n=function(){function t(t,e){for(var i=0;is.distance?console.log('%cUnknown option detected: "'+e+'" in '+t.printLocation(n.path,e,"")+"Perhaps it was misplaced? Matching option found at: "+t.printLocation(s.path,s.closestMatch,""),h):n.distance<=d?console.log('%cUnknown option detected: "'+e+'". Did you mean "'+n.closestMatch+'"?'+t.printLocation(n.path,e),h):console.log('%cUnknown option detected: "'+e+'". Did you mean one of these: '+t.print(Object.keys(i))+t.printLocation(o,e),h),r=!0}},{key:"findInOptions",value:function(e,i,o){var n=arguments.length<=3||void 0===arguments[3]?!1:arguments[3],r=1e9,a="",h=[],d=e.toLowerCase(),l=void 0;for(var u in i){var c=void 0;if(void 0!==i[u].__type__&&n===!0){var p=t.findInOptions(e,i[u],s.copyAndExtendArray(o,u));r>p.distance&&(a=p.closestMatch,h=p.path,r=p.distance,l=p.indexMatch)}else-1!==u.toLowerCase().indexOf(d)&&(l=u),c=t.levenshteinDistance(e,u),r>c&&(a=u,h=s.copyArray(o),r=c)}return{closestMatch:a,path:h,distance:r,indexMatch:l}}},{key:"printLocation",value:function(t,e){for(var i=arguments.length<=2||void 0===arguments[2]?"Problem value found at: \n":arguments[2],o="\n\n"+i+"options = {\n",n=0;ns;s++)o+=" ";o+=t[n]+": {\n"}for(var s=0;sr?r:t,e=null==e?r:r>e?r:e}return{min:null!=t?new Date(t):null,max:null!=e?new Date(e):null}},o.prototype.getEventProperties=function(t){var e=t.center?t.center.x:t.clientX,i=t.center?t.center.y:t.clientY,o=e-n.getAbsoluteLeft(this.dom.centerContainer),s=i-n.getAbsoluteTop(this.dom.centerContainer),r=this._toTime(o),a=u.customTimeFromTarget(t),h=n.getTarget(t),d=null;n.hasParent(h,this.timeAxis.dom.foreground)?d="axis":this.timeAxis2&&n.hasParent(h,this.timeAxis2.dom.foreground)?d="axis":n.hasParent(h,this.linegraph.yAxisLeft.dom.frame)?d="data-axis":n.hasParent(h,this.linegraph.yAxisRight.dom.frame)?d="data-axis":n.hasParent(h,this.linegraph.legendLeft.dom.frame)?d="legend":n.hasParent(h,this.linegraph.legendRight.dom.frame)?d="legend":null!=a?d="custom-time":n.hasParent(h,this.currentTime.bar)?d="current-time":n.hasParent(h,this.dom.center)&&(d="background");var l=[],c=this.linegraph.yAxisLeft,p=this.linegraph.yAxisRight;return c.hidden||l.push(c.screenToValue(s)),p.hidden||l.push(p.screenToValue(s)),{event:t,what:d,pageX:t.srcEvent?t.srcEvent.pageX:t.pageX,pageY:t.srcEvent?t.srcEvent.pageY:t.pageY,x:o,y:s,time:r,value:l}},o.prototype._createConfigurator=function(){return new p(this,this.dom.container,g)},t.exports=o},function(t,e,i){function o(t,e){this.id=n.randomUUID(),this.body=t,this.defaultOptions={yAxisOrientation:"left",defaultGroup:"default",sort:!0,sampling:!0,stack:!1,graphHeight:"400px",shaded:{enabled:!1,orientation:"bottom"},style:"line",barChart:{width:50,sideBySide:!1,align:"center"},interpolation:{enabled:!0,parametrization:"centripetal",alpha:.5},drawPoints:{enabled:!0,size:6,style:"square"},dataAxis:{showMinorLabels:!0,showMajorLabels:!0,icons:!1,width:"40px",visible:!0,alignZeros:!0,left:{range:{min:void 0,max:void 0},format:function(t){return t},title:{text:void 0,style:void 0}},right:{range:{min:void 0,max:void 0},format:function(t){return t},title:{text:void 0,style:void 0}}},legend:{enabled:!1,icons:!0,left:{visible:!0,position:"top-left"},right:{visible:!0,position:"top-right"}},groups:{visibility:{}}},this.options=n.extend({},this.defaultOptions),this.dom={},this.props={},this.hammer=null,this.groups={},this.abortedGraphUpdate=!1,this.updateSVGheight=!1,this.updateSVGheightOnResize=!1;var i=this;this.itemsData=null,this.groupsData=null,this.itemListeners={add:function(t,e,o){i._onAdd(e.items)},update:function(t,e,o){i._onUpdate(e.items)},remove:function(t,e,o){i._onRemove(e.items)}},this.groupListeners={add:function(t,e,o){i._onAddGroups(e.items)},update:function(t,e,o){i._onUpdateGroups(e.items)},remove:function(t,e,o){i._onRemoveGroups(e.items)}},this.items={},this.selection=[],this.lastStart=this.body.range.start,this.touchParams={},this.svgElements={},this.setOptions(e),this.groupsUsingDefaultStyles=[0],this.COUNTER=0,this.body.emitter.on("rangechanged",function(){i.lastStart=i.body.range.start,i.svg.style.left=n.option.asSize(-i.props.width),i.redraw.call(i,!0)}),this._create(),this.framework={svg:this.svg,svgElements:this.svgElements,options:this.options,groups:this.groups},this.body.emitter.emit("change")}var n=i(7),s=i(13),r=i(14),a=i(16),h=i(27),d=i(51),l=i(53),u=i(57),c=i(56),p=(i(54),"__ungrouped__");o.prototype=new h,o.prototype._create=function(){var t=document.createElement("div");t.className="vis-line-graph",this.dom.frame=t,this.svg=document.createElementNS("http://www.w3.org/2000/svg","svg"),this.svg.style.position="relative",this.svg.style.height=(""+this.options.graphHeight).replace("px","")+"px",this.svg.style.display="block",t.appendChild(this.svg),this.options.dataAxis.orientation="left",this.yAxisLeft=new d(this.body,this.options.dataAxis,this.svg,this.options.groups),this.options.dataAxis.orientation="right",this.yAxisRight=new d(this.body,this.options.dataAxis,this.svg,this.options.groups),delete this.options.dataAxis.orientation,this.legendLeft=new u(this.body,this.options.legend,"left",this.options.groups),this.legendRight=new u(this.body,this.options.legend,"right",this.options.groups),this.show()},o.prototype.setOptions=function(t){if(t){var e=["sampling","defaultGroup","stack","height","graphHeight","yAxisOrientation","style","barChart","dataAxis","sort","groups"];void 0===t.graphHeight&&void 0!==t.height&&void 0!==this.body.domProps.centerContainer.height?(this.updateSVGheight=!0,this.updateSVGheightOnResize=!0):void 0!==this.body.domProps.centerContainer.height&&void 0!==t.graphHeight&&parseInt((t.graphHeight+"").replace("px",""))0){var d=this.body.util.toGlobalTime(-this.body.domProps.root.width),l=this.body.util.toGlobalTime(2*this.body.domProps.root.width),u={};for(this._getRelevantData(a,u,d,l),this._applySampling(a,u),e=0;ep&&console.log("WARNING: there may be an infinite loop in the _updateGraph emitter cycle."),this.COUNTER=0,this.abortedGraphUpdate=!1,e=0;e0)for(r=0;ro){d.push(h);break}d.push(h)}}else for(a=0;ai&&h.x0)for(var o=0;o0){var s=1,r=n.length,a=this.body.util.toGlobalScreen(n[n.length-1].x)-this.body.util.toGlobalScreen(n[0].x),h=r/a;s=Math.min(Math.ceil(.2*r),Math.max(1,Math.round(h)));for(var d=[],l=0;r>l;l+=s)d.push(n[l]);e[t[o]]=d}}},o.prototype._getYRanges=function(t,e,i){var o,n,s,r,a=[],h=[];if(t.length>0){for(s=0;s0&&(n=this.groups[t[s]],r.stack===!0&&"bar"===r.style?"left"===r.yAxisOrientation?a=a.concat(n.getData(o)):h=h.concat(n.getData(o)):i[t[s]]=n.getYRange(o,t[s]));c.getStackedYRange(a,i,t,"__barStackLeft","left"),c.getStackedYRange(h,i,t,"__barStackRight","right")}},o.prototype._updateYAxis=function(t,e){var i,o,n=!1,s=!1,r=!1,a=1e9,h=1e9,d=-1e9,l=-1e9;if(t.length>0){for(var u=0;ui?i:a,d=o>d?o:d):(r=!0,h=h>i?i:h,l=o>l?o:l));1==s&&this.yAxisLeft.setRange(a,d),1==r&&this.yAxisRight.setRange(h,l)}n=this._toggleAxisVisiblity(s,this.yAxisLeft)||n,n=this._toggleAxisVisiblity(r,this.yAxisRight)||n,1==r&&1==s?(this.yAxisLeft.drawIcons=!0,this.yAxisRight.drawIcons=!0):(this.yAxisLeft.drawIcons=!1,this.yAxisRight.drawIcons=!1),this.yAxisRight.master=!s,0==this.yAxisRight.master?(1==r?this.yAxisLeft.lineOffset=this.yAxisRight.width:this.yAxisLeft.lineOffset=0,n=this.yAxisLeft.redraw()||n,this.yAxisRight.stepPixels=this.yAxisLeft.stepPixels,this.yAxisRight.zeroCrossing=this.yAxisLeft.zeroCrossing,this.yAxisRight.amountOfSteps=this.yAxisLeft.amountOfSteps,n=this.yAxisRight.redraw()||n):n=this.yAxisRight.redraw()||n;for(var p=["__barStackLeft","__barStackRight","__lineStackLeft","__lineStackRight"],u=0;ut?-1:1});for(var a=0;a0&&(t=0),this.range.start=t,this.range.end=e},o.prototype.redraw=function(){var t=!1,e=0;this.dom.lineContainer.style.top=this.body.domProps.scrollTop+"px";for(var i in this.groups)this.groups.hasOwnProperty(i)&&(this.groups[i].visible!==!0||void 0!==this.linegraphOptions.visibility[i]&&this.linegraphOptions.visibility[i]!==!0||e++);if(0===this.amountOfGroups||0===e)this.hide();else{this.show(),this.height=Number(this.linegraphSVG.style.height.replace("px","")), -this.dom.lineContainer.style.height=this.height+"px",this.width=this.options.visible===!0?Number((""+this.options.width).replace("px","")):0;var o=this.props,n=this.dom.frame;n.className="vis-data-axis",this._calculateCharSize();var s=this.options.orientation,r=this.options.showMinorLabels,a=this.options.showMajorLabels;o.minorLabelHeight=r?o.minorCharHeight:0,o.majorLabelHeight=a?o.majorCharHeight:0,o.minorLineWidth=this.body.dom.backgroundHorizontal.offsetWidth-this.lineOffset-this.width+2*this.options.minorLinesOffset,o.minorLineHeight=1,o.majorLineWidth=this.body.dom.backgroundHorizontal.offsetWidth-this.lineOffset-this.width+2*this.options.majorLinesOffset,o.majorLineHeight=1,"left"===s?(n.style.top="0",n.style.left="0",n.style.bottom="",n.style.width=this.width+"px",n.style.height=this.height+"px",this.props.width=this.body.domProps.left.width,this.props.height=this.body.domProps.left.height):(n.style.top="",n.style.bottom="0",n.style.left="0",n.style.width=this.width+"px",n.style.height=this.height+"px",this.props.width=this.body.domProps.right.width,this.props.height=this.body.domProps.right.height),t=this._redrawLabels(),t=this._isResized()||t,this.options.icons===!0?this._redrawGroupIcons():this._cleanupIcons(),this._redrawTitle(s)}return t},o.prototype._redrawLabels=function(){var t=!1;s.prepareElements(this.DOMelements.lines),s.prepareElements(this.DOMelements.labels);var e,i=this.options.orientation;if(this.master===!1){var o,n,r,h;-1!==this.zeroCrossing&&this.options.alignZeros===!0?this.range.end>0?(o=this.range.end/this.zeroCrossing,n=this.range.end-this.amountOfSteps*o,r=this.range.end):(o=-1*this.range.start/(this.amountOfSteps-this.zeroCrossing),n=this.range.start,r=this.range.start+o*this.amountOfSteps):(n=this.range.start,r=this.range.end),h=this.stepPixels}else h=this.props.majorCharHeight,n=this.range.start,r=this.range.end;if(this.step=e=new a(n,r,h,this.dom.frame.offsetHeight,this.options[this.options.orientation].range,this.options[this.options.orientation].format,this.master===!1&&this.options.alignZeros),this.master===!0)this.stepPixels=this.dom.frame.offsetHeight/e.marginRange*e.step,this.amountOfSteps=Math.ceil(this.dom.frame.offsetHeight/this.stepPixels);else if(this.options.alignZeros===!0&&-1!==this.zeroCrossing){var d=(e.current-this.zeroCrossing*e.step)/e.step;this.step.shift(d)}this.valueAtBottom=e.marginEnd,this.maxLabelSize=0;for(var l=0,u=0,c=!1;u0&&u!==this.amountOfSteps&&((this.options.showMinorLabels&&c===!1||this.master===!1&&this.options.showMinorLabels===!0)&&this._redrawLabel(l-2,e.getCurrent(),i,"vis-y-axis vis-minor",this.props.minorCharHeight),c&&this.options.showMajorLabels&&this.master===!0||this.options.showMinorLabels===!1&&this.master===!1&&c===!0?(l>=0&&this._redrawLabel(l-2,e.getCurrent(),i,"vis-y-axis vis-major",this.props.majorCharHeight),this._redrawLine(l,i,"vis-grid vis-horizontal vis-major",this.options.majorLinesOffset,this.props.majorLineWidth)):this._redrawLine(l,i,"vis-grid vis-horizontal vis-minor",this.options.minorLinesOffset,this.props.minorLineWidth)),this.master===!0&&0===e.current&&(this.zeroCrossing=u),e.next(),u+=1;this.master===!0&&0===e.current&&(this.zeroCrossing=u),this.conversionFactor=this.stepPixels/e.step;var p=0;void 0!==this.options[i].title&&void 0!==this.options[i].title.text&&(p=this.props.titleCharHeight);var f=this.options.icons===!0?Math.max(this.options.iconWidth,p)+this.options.labelOffsetX+15:p+this.options.labelOffsetX+15;return this.maxLabelSize>this.width-f&&this.options.visible===!0?(this.width=this.maxLabelSize+f,this.options.width=this.width+"px",s.cleanupElements(this.DOMelements.lines),s.cleanupElements(this.DOMelements.labels),this.redraw(),t=!0):this.maxLabelSizethis.minWidth?(this.width=Math.max(this.minWidth,this.maxLabelSize+f),this.options.width=this.width+"px",s.cleanupElements(this.DOMelements.lines),s.cleanupElements(this.DOMelements.labels),this.redraw(),t=!0):(s.cleanupElements(this.DOMelements.lines),s.cleanupElements(this.DOMelements.labels),t=!1),t},o.prototype.convertValue=function(t){var e=this.valueAtBottom-t,i=e*this.conversionFactor;return i},o.prototype.screenToValue=function(t){return this.valueAtBottom-t/this.conversionFactor},o.prototype._redrawLabel=function(t,e,i,o,n){var r=s.getDOMElement("div",this.DOMelements.labels,this.dom.frame);r.className=o,r.innerHTML=e,"left"===i?(r.style.left="-"+this.options.labelOffsetX+"px",r.style.textAlign="right"):(r.style.right="-"+this.options.labelOffsetX+"px",r.style.textAlign="left"),r.style.top=t-.5*n+this.options.labelOffsetY+"px",e+="";var a=Math.max(this.props.majorCharWidth,this.props.minorCharWidth);this.maxLabelSizes&&(h=s);for(var d=!1,l=h;Math.abs(l)<=Math.abs(s);l++){a=Math.pow(10,l);for(var u=0;u=n){d=!0,r=u;break}}if(d===!0)break}this.stepIndex=r,this.scale=a,this.step=a*this.minorSteps[r]},i.prototype.setFirst=function(t){void 0===t&&(t={});var e=void 0===t.min?this._start-2*this.scale*this.minorSteps[this.stepIndex]:t.min,i=void 0===t.max?this._end+this.scale*this.minorSteps[this.stepIndex]:t.max;this.marginEnd=void 0===t.max?this.roundToMinor(i):t.max,this.marginStart=void 0===t.min?this.roundToMinor(e):t.min,this.alignZeros===!0&&(this.marginEnd-this.marginStart)%this.step!=0&&(this.marginEnd+=this.marginEnd%this.step),this.deadSpace=this.roundToMinor(i)-i+this.roundToMinor(e)-e,this.marginRange=this.marginEnd-this.marginStart,this.current=this.marginEnd},i.prototype.roundToMinor=function(t){var e=t-t%(this.scale*this.minorSteps[this.stepIndex]);return t%(this.scale*this.minorSteps[this.stepIndex])>.5*this.scale*this.minorSteps[this.stepIndex]?e+this.scale*this.minorSteps[this.stepIndex]:e},i.prototype.hasNext=function(){return this.current>=this.marginStart},i.prototype.next=function(){var t=this.current;this.current-=this.step,this.current===t&&(this.current=this._end)},i.prototype.previous=function(){this.current+=this.step,this.marginEnd+=this.step,this.marginRange=this.marginEnd-this.marginStart},i.prototype.getCurrent=function(){var t=Math.abs(this.current)t)for(var e=0;-t>e;e++)this.previous();else if(t>0)for(var e=0;t>e;e++)this.next()},t.exports=i},function(t,e,i){function o(t,e,i,o){this.id=e;var s=["sampling","style","sort","yAxisOrientation","barChart","drawPoints","shaded","interpolation"];this.options=n.selectiveBridgeObject(s,i),this.usingDefaultStyle=void 0===t.className,this.groupsUsingDefaultStyles=o,this.zeroPosition=0,this.update(t),1==this.usingDefaultStyle&&(this.groupsUsingDefaultStyles[0]+=1),this.itemsData=[],this.visible=void 0===t.visible?!0:t.visible}var n=i(7),s=i(13),r=i(54),a=i(56),h=i(55);o.prototype.setItems=function(t){if(null!=t){this.itemsData=t,1==this.options.sort&&this.itemsData.sort(function(t,e){return t.x-e.x});for(var e=0;et[o].y?t[o].y:e,i=i0){t.sort(function(t,e){return t.x===e.x?t.groupIde[s].y?e[s].y:o,n=nt[r].accumulatedNegative?t[r].accumulatedNegative:o,o=o>t[r].accumulatedPositive?t[r].accumulatedPositive:o,n=n0&&(i=Math.min(i,Math.abs(e[o-1].x-e[o].x))),0===i&&(void 0===t[e[o].x]&&(t[e[o].x]={amount:0,resolved:0,accumulatedPositive:0,accumulatedNegative:0}),t[e[o].x].amount+=1)},o.prototype.draw=function(t,e,i){if(null!=t&&t.length>0){var r,a,h=Number(i.svg.style.height.replace("px",""));if(r=n.getSVGElement("path",i.svgElements,i.svg),r.setAttributeNS(null,"class",e.className),void 0!==e.style&&r.setAttributeNS(null,"style",e.style),a=1==e.options.interpolation.enabled?o._catmullRom(t,e):o._linear(t),1==e.options.shaded.enabled){var d,l=n.getSVGElement("path",i.svgElements,i.svg);d="top"==e.options.shaded.orientation?"M"+t[0].x+",0 "+a+"L"+t[t.length-1].x+",0":"M"+t[0].x+","+h+" "+a+"L"+t[t.length-1].x+","+h,l.setAttributeNS(null,"class",e.className+" vis-fill"),void 0!==e.options.shaded.style&&l.setAttributeNS(null,"style",e.options.shaded.style),l.setAttributeNS(null,"d",d)}r.setAttributeNS(null,"d","M"+a),1==e.options.drawPoints.enabled&&s.draw(t,e,i)}},o._catmullRomUniform=function(t){for(var e,i,o,n,s,r,a=Math.round(t[0].x)+","+Math.round(t[0].y)+" ",h=1/6,d=t.length,l=0;d-1>l;l++)e=0==l?t[0]:t[l-1],i=t[l],o=t[l+1],n=d>l+2?t[l+2]:o,s={x:(-e.x+6*i.x+o.x)*h,y:(-e.y+6*i.y+o.y)*h},r={x:(i.x+6*o.x-n.x)*h,y:(i.y+6*o.y-n.y)*h},a+="C"+s.x+","+s.y+" "+r.x+","+r.y+" "+o.x+","+o.y+" ";return a},o._catmullRom=function(t,e){var i=e.options.interpolation.alpha;if(0==i||void 0===i)return this._catmullRomUniform(t);for(var o,n,s,r,a,h,d,l,u,c,p,f,m,v,g,y,b,w,_,x=Math.round(t[0].x)+","+Math.round(t[0].y)+" ",k=t.length,M=0;k-1>M;M++)o=0==M?t[0]:t[M-1],n=t[M],s=t[M+1],r=k>M+2?t[M+2]:s,d=Math.sqrt(Math.pow(o.x-n.x,2)+Math.pow(o.y-n.y,2)),l=Math.sqrt(Math.pow(n.x-s.x,2)+Math.pow(n.y-s.y,2)),u=Math.sqrt(Math.pow(s.x-r.x,2)+Math.pow(s.y-r.y,2)),v=Math.pow(u,i),y=Math.pow(u,2*i),g=Math.pow(l,i),b=Math.pow(l,2*i),_=Math.pow(d,i),w=Math.pow(d,2*i),c=2*w+3*_*g+b,p=2*y+3*v*g+b,f=3*_*(_+g),f>0&&(f=1/f),m=3*v*(v+g),m>0&&(m=1/m),a={x:(-b*o.x+c*n.x+w*s.x)*f,y:(-b*o.y+c*n.y+w*s.y)*f},h={x:(y*n.x+p*s.x-b*r.x)*m,y:(y*n.y+p*s.y-b*r.y)*m},0==a.x&&0==a.y&&(a=n),0==h.x&&0==h.y&&(h=s),x+="C"+a.x+","+a.y+" "+h.x+","+h.y+" "+s.x+","+s.y+" ";return x},o._linear=function(t){for(var e="",i=0;it[o].y?t[o].y:e,i=it[o].y?t[o].y:e,i=i0&&(r=Math.min(r,Math.abs(c[l-1].x-a))),h=o._getSafeDrawData(r,d,m);else{var g=l+(p[a].amount-p[a].resolved),y=l-(p[a].resolved+1);g0&&(r=Math.min(r,Math.abs(c[y].x-a))),h=o._getSafeDrawData(r,d,m),p[a].resolved+=1,d.options.stack===!0?c[l].y0&&(i=Math.min(i,Math.abs(e[o-1].x-e[o].x))),0===i&&(void 0===t[e[o].x]&&(t[e[o].x]={amount:0,resolved:0,accumulatedPositive:0,accumulatedNegative:0}),t[e[o].x].amount+=1)},o._getSafeDrawData=function(t,e,i){var o,n;return t0?(o=i>t?i:t,n=0,"left"===e.options.barChart.align?n-=.5*t:"right"===e.options.barChart.align&&(n+=.5*t)):(o=e.options.barChart.width,n=0,"left"===e.options.barChart.align?n-=.5*e.options.barChart.width:"right"===e.options.barChart.align&&(n+=.5*e.options.barChart.width)),{width:o,offset:n}},o.getStackedYRange=function(t,e,i,n,s){if(t.length>0){t.sort(function(t,e){return t.x===e.x?t.groupIde[s].y?e[s].y:o,n=nt[r].accumulatedNegative?t[r].accumulatedNegative:o,o=o>t[r].accumulatedPositive?t[r].accumulatedPositive:o,n=nt?-1:1});for(var i=0;i")}this.dom.textArea.innerHTML=s,this.dom.textArea.style.lineHeight=.75*this.options.iconSize+this.options.iconSpacing+"px"}},o.prototype.drawLegendIcons=function(){if(this.dom.frame.parentNode){var t=Object.keys(this.groups);t.sort(function(t,e){return e>t?-1:1}),s.prepareElements(this.svgElements);var e=window.getComputedStyle(this.dom.frame).paddingTop,i=Number(e.replace("px","")),o=i,n=this.options.iconSize,r=.75*this.options.iconSize,a=i+.5*r+3;this.svg.style.width=n+5+i+"px";for(var h=0;h0){var i=this.groupIndex%this.groupsArray.length;this.groupIndex++,e={},e.color=this.groups[this.groupsArray[i]],this.groups[t]=e}else{var i=this.defaultIndex%this.defaultGroups.length;this.defaultIndex++,e={},e.color=this.defaultGroups[i],this.groups[t]=e}return e}},{key:"add",value:function(t,e){return this.groups[t]=e,this.groupsArray.push(t),e}}]),t}();e["default"]=r,t.exports=e["default"]},function(t,e,i){function o(t){return t&&t.__esModule?t:{"default":t}}function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var s=function(){function t(t,e){for(var i=0;it.left&&this.shape.topt.top}},{key:"isBoundingBoxOverlappingWith",value:function(t){return this.shape.boundingBox.leftt.left&&this.shape.boundingBox.topt.top}}],[{key:"parseOptions",value:function(t,e){var i=arguments.length<=2||void 0===arguments[2]?!1:arguments[2],o=["color","font","fixed","shadow"];if(B.selectiveNotDeepExtend(o,t,e,i),B.mergeOptions(t,e,"shadow"),void 0!==e.color&&null!==e.color){var n=B.parseColor(e.color);B.fillIfDefined(t.color,n)}else i===!0&&null===e.color&&(t.color=void 0,delete t.color);void 0!==e.fixed&&null!==e.fixed&&("boolean"==typeof e.fixed?(t.fixed.x=e.fixed,t.fixed.y=e.fixed):(void 0!==e.fixed.x&&"boolean"==typeof e.fixed.x&&(t.fixed.x=e.fixed.x),void 0!==e.fixed.y&&"boolean"==typeof e.fixed.y&&(t.fixed.y=e.fixed.y))),void 0!==e.font&&a["default"].parseOptions(t.font,e),void 0!==e.scaling&&B.mergeOptions(t.scaling,e.scaling,"label")}}]),t}();e["default"]=F,t.exports=e["default"]},function(t,e,i){function o(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var n=function(){function t(t,e){var i=[],o=!0,n=!1,s=void 0;try{for(var r,a=t[Symbol.iterator]();!(o=(r=a.next()).done)&&(i.push(r.value),!e||i.length!==e);o=!0);}catch(h){n=!0,s=h}finally{try{!o&&a["return"]&&a["return"]()}finally{if(n)throw s}}return i}return function(e,i){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,i);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),s=function(){function t(t,e){for(var i=0;i=this.options.scaling.label.maxVisible&&(r=Number(this.options.scaling.label.maxVisible)/this.body.view.scale);var h=this.size.yLine,d=this._getColor(a),l=n(d,2),u=l[0],c=l[1],p=this._setAlignment(t,i,h,s),f=n(p,2);i=f[0],h=f[1],t.font=(e&&this.options.labelHighlightBold?"bold ":"")+r+"px "+this.options.font.face,t.fillStyle=u,t.textAlign="center",this.options.font.strokeWidth>0&&(t.lineWidth=this.options.font.strokeWidth,t.strokeStyle=c,t.lineJoin="round");for(var m=0;m0&&t.strokeText(this.lines[m],i,h),t.fillText(this.lines[m],i,h),h+=r}},{key:"_setAlignment",value:function(t,e,i,o){if("horizontal"!==this.options.font.align&&this.pointToSelf===!1){e=0,i=0;var n=2;"top"===this.options.font.align?(t.textBaseline="alphabetic",i-=2*n):"bottom"===this.options.font.align?(t.textBaseline="hanging",i+=2*n):t.textBaseline="middle"}else t.textBaseline=o;return[e,i]}},{key:"_getColor",value:function(t){var e=this.options.font.color||"#000000",i=this.options.font.strokeColor||"#ffffff";if(t<=this.options.scaling.label.drawThreshold){var o=Math.max(0,Math.min(1,1-(this.options.scaling.label.drawThreshold-t)));e=r.overrideOpacity(e,o),i=r.overrideOpacity(i,o)}return[e,i]}},{key:"getTextSize",value:function(t){var e=arguments.length<=1||void 0===arguments[1]?!1:arguments[1],i={width:this._processLabel(t,e),height:this.options.font.size*this.lineCount,lineCount:this.lineCount};return i}},{key:"calculateLabelSize",value:function(t,e){var i=arguments.length<=2||void 0===arguments[2]?0:arguments[2],o=arguments.length<=3||void 0===arguments[3]?0:arguments[3],n=arguments.length<=4||void 0===arguments[4]?"middle":arguments[4];this.labelDirty===!0&&(this.size.width=this._processLabel(t,e)),this.size.height=this.options.font.size*this.lineCount,this.size.left=i-.5*this.size.width,this.size.top=o-.5*this.size.height,this.size.yLine=o+.5*(1-this.lineCount)*this.options.font.size,"hanging"===n&&(this.size.top+=.5*this.options.font.size,this.size.top+=4,this.size.yLine+=4),this.labelDirty=!1}},{key:"_processLabel",value:function(t,e){var i=0,o=[""],n=0;if(void 0!==this.options.label){o=String(this.options.label).split("\n"),n=o.length,t.font=(e&&this.options.labelHighlightBold?"bold ":"")+this.options.font.size+"px "+this.options.font.face,i=t.measureText(o[0]).width;for(var s=1;n>s;s++){var r=t.measureText(o[s]).width;i=r>i?r:i}}return this.lines=o,this.lineCount=n,i}}],[{key:"parseOptions",value:function(t,e){var i=arguments.length<=2||void 0===arguments[2]?!1:arguments[2];if("string"==typeof e.font){var o=e.font.split(" ");t.size=o[0].replace("px",""),t.face=o[1],t.color=o[2]}else"object"==typeof e.font&&r.fillIfDefined(t,e.font,i);t.size=Number(t.size)}}]),t}();e["default"]=a,t.exports=e["default"]},function(t,e,i){function o(t){return t&&t.__esModule?t:{"default":t}}function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function s(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e); -t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0});var r=function(){function t(t,e){for(var i=0;ithis.imageObj.height?(o=this.imageObj.width/this.imageObj.height,e=2*this.options.size*o||this.imageObj.width,i=2*this.options.size||this.imageObj.height):(o=this.imageObj.width&&this.imageObj.height?this.imageObj.height/this.imageObj.width:1,e=2*this.options.size||this.imageObj.width,i=2*this.options.size*o||this.imageObj.height),this.width=e,this.height=i,this.radius=.5*this.width}}},{key:"_drawRawCircle",value:function(t,e,i,o,n,s){var r=this.options.borderWidth,a=this.options.borderWidthSelected||2*this.options.borderWidth;t.strokeStyle=o?this.options.color.highlight.border:n?this.options.color.hover.border:this.options.color.border,t.lineWidth=o?a:r,t.lineWidth*=this.networkScaleInv,t.lineWidth=Math.min(this.width,t.lineWidth),t.fillStyle=o?this.options.color.highlight.background:n?this.options.color.hover.background:this.options.color.background,t.circle(e,i,s),this.enableBorderDashes(t),this.enableShadow(t),t.fill(),this.disableBorderDashes(t),this.disableShadow(t),t.stroke()}},{key:"_drawImageAtPosition",value:function(t){0!=this.imageObj.width&&(t.globalAlpha=1,this.enableShadow(t),t.drawImage(this.imageObj,this.left,this.top,this.width,this.height),this.disableShadow(t))}},{key:"_drawImageLabel",value:function(t,e,i,o){var n,s=0;if(void 0!==this.height){s=.5*this.height;var r=this.labelModule.getTextSize(t);r.lineCount>=1&&(s+=r.height/2)}n=i+s,this.options.label&&(this.labelOffset=s),this.labelModule.draw(t,e,n,o,"hanging")}}]),e}(d["default"]);e["default"]=l,t.exports=e["default"]},function(t,e,i){function o(t){return t&&t.__esModule?t:{"default":t}}function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function s(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0});var r=function(){function t(t,e){for(var i=0;i0&&(this.boundingBox.left=Math.min(this.boundingBox.left,this.labelModule.size.left),this.boundingBox.right=Math.max(this.boundingBox.right,this.labelModule.size.left+this.labelModule.size.width),this.boundingBox.bottom=Math.max(this.boundingBox.bottom,this.boundingBox.bottom+this.labelModule.size.height+3))}}]),e}(d["default"]);e["default"]=l,t.exports=e["default"]},function(t,e,i){function o(t){return t&&t.__esModule?t:{"default":t}}function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function s(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0});var r=function(){function t(t,e){for(var i=0;i0){var i=5;this.boundingBox.left=Math.min(this.boundingBox.left,this.labelModule.size.left),this.boundingBox.right=Math.max(this.boundingBox.right,this.labelModule.size.left+this.labelModule.size.width),this.boundingBox.bottom=Math.max(this.boundingBox.bottom,this.boundingBox.bottom+this.labelModule.size.height+i)}}},{key:"_icon",value:function(t,e,i,o){var n=Number(this.options.icon.size);void 0!==this.options.icon.code?(t.font=(o?"bold ":"")+n+"px "+this.options.icon.face,t.fillStyle=this.options.icon.color||"black",t.textAlign="center",t.textBaseline="middle",this.enableShadow(t),t.fillText(this.options.icon.code,e,i),this.disableShadow(t)):console.error("When using the icon shape, you need to define the code in the icon options object. This can be done per node or globally.")}},{key:"distanceToBorder",value:function(t,e){return this.resize(t),this._distanceToBorder(e)}}]),e}(d["default"]);e["default"]=l,t.exports=e["default"]},function(t,e,i){function o(t){return t&&t.__esModule?t:{"default":t}}function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function s(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0});var r=function(){function t(t,e){for(var i=0;i0&&(this.boundingBox.left=Math.min(this.boundingBox.left,this.labelModule.size.left),this.boundingBox.right=Math.max(this.boundingBox.right,this.labelModule.size.left+this.labelModule.size.width),this.boundingBox.bottom=Math.max(this.boundingBox.bottom,this.boundingBox.bottom+this.labelOffset))}},{key:"distanceToBorder",value:function(t,e){this.resize(t);var i=this.width/2,o=this.height/2,n=Math.sin(e)*i,s=Math.cos(e)*o;return i*o/Math.sqrt(n*n+s*s)}}]),e}(d["default"]);e["default"]=l,t.exports=e["default"]},function(t,e,i){function o(t){return t&&t.__esModule?t:{"default":t}}function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function s(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0});var r=function(){function t(t,e){for(var i=0;ii.shape.height?(r=i.x+.5*i.shape.width,a=i.y-h):(r=i.x+h,a=i.y-.5*i.shape.height),s=this._pointOnCircle(r,a,h,.125),this.labelModule.draw(t,s.x,s.y,n)}}}},{key:"isOverlappingWith",value:function(t){if(this.connected){var e=10,i=this.from.x,o=this.from.y,n=this.to.x,s=this.to.y,r=t.left,a=t.top,h=this.edgeType.getDistanceToEdge(i,o,n,s,r,a);return e>h}return!1}},{key:"_rotateForLabelAlignment",value:function(t){var e=this.from.y-this.to.y,i=this.from.x-this.to.x,o=Math.atan2(e,i);(-1>o&&0>i||o>0&&0>i)&&(o+=Math.PI),t.rotate(o)}},{key:"_pointOnCircle",value:function(t,e,i,o){var n=2*o*Math.PI;return{x:t+i*Math.cos(n),y:e-i*Math.sin(n)}}},{key:"select",value:function(){this.selected=!0}},{key:"unselect",value:function(){this.selected=!1}}],[{key:"parseOptions",value:function(t,e){var i=arguments.length<=2||void 0===arguments[2]?!1:arguments[2],o=["id","from","hidden","hoverWidth","label","labelHighlightBold","length","line","opacity","physics","selectionWidth","selfReferenceSize","to","title","value","width"];if(f.selectiveDeepExtend(o,t,e,i),f.mergeOptions(t,e,"smooth"),f.mergeOptions(t,e,"shadow"),void 0!==e.dashes&&null!==e.dashes?t.dashes=e.dashes:i===!0&&null===e.dashes&&(t.dashes=void 0,delete t.dashes),void 0!==e.scaling&&null!==e.scaling?(void 0!==e.scaling.min&&(t.scaling.min=e.scaling.min),void 0!==e.scaling.max&&(t.scaling.max=e.scaling.max),f.mergeOptions(t.scaling,e.scaling,"label")):i===!0&&null===e.scaling&&(t.scaling=void 0,delete t.scaling),void 0!==e.arrows&&null!==e.arrows)if("string"==typeof e.arrows){var n=e.arrows.toLowerCase();-1!=n.indexOf("to")&&(t.arrows.to.enabled=!0),-1!=n.indexOf("middle")&&(t.arrows.middle.enabled=!0),-1!=n.indexOf("from")&&(t.arrows.from.enabled=!0)}else{if("object"!=typeof e.arrows)throw new Error("The arrow newOptions can only be an object or a string. Refer to the documentation. You used:"+JSON.stringify(e.arrows));f.mergeOptions(t.arrows,e.arrows,"to"),f.mergeOptions(t.arrows,e.arrows,"middle"),f.mergeOptions(t.arrows,e.arrows,"from")}else i===!0&&null===e.arrows&&(t.arrows=void 0,delete t.arrows);if(void 0!==e.color&&null!==e.color)if(f.isString(e.color))t.color.color=e.color,t.color.highlight=e.color,t.color.hover=e.color,t.color.inherit=!1;else{var s=!1;void 0!==e.color.color&&(t.color.color=e.color.color,s=!0),void 0!==e.color.highlight&&(t.color.highlight=e.color.highlight,s=!0),void 0!==e.color.hover&&(t.color.hover=e.color.hover,s=!0),void 0!==e.color.inherit&&(t.color.inherit=e.color.inherit),void 0!==e.color.opacity&&(t.color.opacity=Math.min(1,Math.max(0,e.color.opacity))),void 0===e.color.inherit&&s===!0&&(t.color.inherit=!1)}else i===!0&&null===e.color&&(t.color=void 0,delete t.color);void 0!==e.font&&a["default"].parseOptions(t.font,e)}}]),t}();e["default"]=m,t.exports=e["default"]},function(t,e,i){function o(t){return t&&t.__esModule?t:{"default":t}}function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function s(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0});var r=function(){function t(t,e){for(var i=0;i=l&&h>d;){var m=.5*(l+u);if(i=this.getPoint(m,a),o=Math.atan2(p.y-i.y,p.x-i.x),n=p.distanceToBorder(e,o),s=Math.sqrt(Math.pow(i.x-p.x,2)+Math.pow(i.y-p.y,2)),r=n-s,Math.abs(r)r?f===!1?l=m:u=m:f===!1?u=m:l=m,d++}return i.t=m,i}},{key:"_getDistanceToBezierEdge",value:function(t,e,i,o,n,s,r){var a=void 0,h=void 0;a=r.x,h=r.y;var d=1e9,l=void 0,u=void 0,c=void 0,p=void 0,f=void 0,m=t,v=e;for(u=1;10>u;u++)c=.1*u,p=Math.pow(1-c,2)*t+2*c*(1-c)*a+Math.pow(c,2)*i,f=Math.pow(1-c,2)*e+2*c*(1-c)*h+Math.pow(c,2)*o,u>0&&(l=this._getDistanceToLine(m,v,p,f,n,s),d=d>l?l:d),m=p,v=f;return d}}]),e}(d["default"]);e["default"]=l,t.exports=e["default"]},function(t,e,i){function o(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var n=function(){function t(t,e){var i=[],o=!0,n=!1,s=void 0;try{for(var r,a=t[Symbol.iterator]();!(o=(r=a.next()).done)&&(i.push(r.value),!e||i.length!==e);o=!0);}catch(h){n=!0,s=h}finally{try{!o&&a["return"]&&a["return"]()}finally{if(n)throw s}}return i}return function(e,i){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,i);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),s=function(){function t(t,e){for(var i=0;io.shape.height?(e=o.x+.5*o.shape.width,i=o.y-n):(e=o.x+n,i=o.y-.5*o.shape.height),[e,i,n]}},{key:"_pointOnCircle",value:function(t,e,i,o){var n=2*o*Math.PI;return{x:t+i*Math.cos(n),y:e-i*Math.sin(n)}}},{key:"_findBorderPositionCircle",value:function(t,e,i){for(var o=i.x,n=i.y,s=i.low,r=i.high,a=i.direction,h=10,d=0,l=this.options.selfReferenceSize,u=void 0,c=void 0,p=void 0,f=void 0,m=void 0,v=.05,g=.5*(s+r);r>=s&&h>d&&(g=.5*(s+r),u=this._pointOnCircle(o,n,l,g),c=Math.atan2(t.y-u.y,t.x-u.x),p=t.distanceToBorder(e,c),f=Math.sqrt(Math.pow(u.x-t.x,2)+Math.pow(u.y-t.y,2)),m=p-f,!(Math.abs(m)0?a>0?s=g:r=g:a>0?r=g:s=g,d++;return u.t=g,u}},{key:"getLineWidth",value:function(t,e){return t===!0?Math.max(this.selectionWidth,.3/this.body.view.scale):e===!0?Math.max(this.hoverWidth,.3/this.body.view.scale):Math.max(this.options.width,.3/this.body.view.scale)}},{key:"getColor",value:function(t,e,i){var o=this.options.color;if(o.inherit!==!1){if("both"===o.inherit&&this.from.id!==this.to.id){var n=t.createLinearGradient(this.from.x,this.from.y,this.to.x,this.to.y),s=void 0,a=void 0;return s=this.from.options.color.highlight.border,a=this.to.options.color.highlight.border,this.from.selected===!1&&this.to.selected===!1?(s=r.overrideOpacity(this.from.options.color.border,this.options.color.opacity),a=r.overrideOpacity(this.to.options.color.border,this.options.color.opacity)):this.from.selected===!0&&this.to.selected===!1?a=this.to.options.color.border:this.from.selected===!1&&this.to.selected===!0&&(s=this.from.options.color.border),n.addColorStop(0,s),n.addColorStop(1,a),n}this.colorDirty===!0&&("to"===o.inherit?(this.color.highlight=this.to.options.color.highlight.border,this.color.hover=this.to.options.color.hover.border,this.color.color=r.overrideOpacity(this.to.options.color.border,o.opacity)):(this.color.highlight=this.from.options.color.highlight.border,this.color.hover=this.from.options.color.hover.border,this.color.color=r.overrideOpacity(this.from.options.color.border,o.opacity)))}else this.colorDirty===!0&&(this.color.highlight=o.highlight,this.color.hover=o.hover,this.color.color=r.overrideOpacity(o.color,o.opacity));return this.colorDirty=!1,e===!0?this.color.highlight:i===!0?this.color.hover:this.color.color}},{key:"_circle",value:function(t,e,i,o){this.enableShadow(t),t.beginPath(),t.arc(e,i,o,0,2*Math.PI,!1),t.stroke(),this.disableShadow(t)}},{key:"getDistanceToEdge",value:function(t,e,i,o,s,r,a){var h=0;if(this.from!=this.to)h=this._getDistanceToEdge(t,e,i,o,s,r,a);else{var d=this._getCircleData(),l=n(d,3),u=l[0],c=l[1],p=l[2],f=u-s,m=c-r;h=Math.abs(Math.sqrt(f*f+m*m)-p)}return this.labelModule.size.lefts&&this.labelModule.size.topr?0:h}},{key:"_getDistanceToLine",value:function(t,e,i,o,n,s){var r=i-t,a=o-e,h=r*r+a*a,d=((n-t)*r+(s-e)*a)/h;d>1?d=1:0>d&&(d=0);var l=t+d*r,u=e+d*a,c=l-n,p=u-s;return Math.sqrt(c*c+p*p)}},{key:"drawArrowHead",value:function(t,e,i,o,s){t.strokeStyle=this.getColor(t,o,s),t.fillStyle=t.strokeStyle,t.lineWidth=this.getLineWidth(o,s);var r=void 0,a=void 0,h=void 0,d=void 0,l=void 0,u=void 0,c=void 0;if("from"===e?(d=this.from,l=this.to,u=.1,c=this.options.arrows.from.scaleFactor):"to"===e?(d=this.to,l=this.from,u=-.1,c=this.options.arrows.to.scaleFactor):(d=this.to,l=this.from,c=this.options.arrows.middle.scaleFactor),d!=l){if("middle"!==e)if(this.options.smooth.enabled===!0){h=this.findBorderPosition(d,t,{via:i});var p=this.getPoint(Math.max(0,Math.min(1,h.t+u)),i);r=Math.atan2(h.y-p.y,h.x-p.x)}else r=Math.atan2(d.y-l.y,d.x-l.x),h=this.findBorderPosition(d,t);else r=Math.atan2(d.y-l.y,d.x-l.x),h=this.getPoint(.6,i);a=(10+5*this.options.width)*c,t.arrow(h.x,h.y,r,a),this.enableShadow(t),t.fill(),this.disableShadow(t),t.stroke()}else{var f=void 0,m=void 0,v=this._getCircleData(t),g=n(v,3),y=g[0],b=g[1],w=g[2];"from"===e?(m=this.findBorderPosition(this.from,t,{x:y,y:b,low:.25,high:.6,direction:-1}),f=-2*m.t*Math.PI+1.5*Math.PI+.1*Math.PI):"to"===e?(m=this.findBorderPosition(this.from,t,{x:y,y:b,low:.6,high:1,direction:1}),f=-2*m.t*Math.PI+1.5*Math.PI-1.1*Math.PI):(m=this._pointOnCircle(y,b,w,.175),f=3.9269908169872414);var _=(10+5*this.options.width)*c;t.arrow(m.x,m.y,f,_),this.enableShadow(t),t.fill(),this.disableShadow(t),t.stroke()}}},{key:"enableShadow",value:function(t){this.options.shadow.enabled===!0&&(t.shadowColor="rgba(0,0,0,0.5)",t.shadowBlur=this.options.shadow.size,t.shadowOffsetX=this.options.shadow.x,t.shadowOffsetY=this.options.shadow.y)}},{key:"disableShadow",value:function(t){this.options.shadow.enabled===!0&&(t.shadowColor="rgba(0,0,0,0)",t.shadowBlur=0,t.shadowOffsetX=0,t.shadowOffsetY=0)}}]),t}();e["default"]=a,t.exports=e["default"]},function(t,e,i){function o(t){return t&&t.__esModule?t:{"default":t}}function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function s(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0});var r=function(){function t(t,e){for(var i=0;i=this.to.y?this.from.x<=this.to.x?(t=this.from.x+i*s, -e=this.from.y-i*s):this.from.x>this.to.x&&(t=this.from.x-i*s,e=this.from.y-i*s):this.from.ythis.to.x&&(t=this.from.x-i*s,e=this.from.y+i*s)),"discrete"===o&&(t=i*s>n?this.from.x:t)):Math.abs(this.from.x-this.to.x)>Math.abs(this.from.y-this.to.y)&&(this.from.y>=this.to.y?this.from.x<=this.to.x?(t=this.from.x+i*n,e=this.from.y-i*n):this.from.x>this.to.x&&(t=this.from.x-i*n,e=this.from.y-i*n):this.from.ythis.to.x&&(t=this.from.x-i*n,e=this.from.y+i*n)),"discrete"===o&&(e=i*n>s?this.from.y:e));else if("straightCross"===o)Math.abs(this.from.x-this.to.x)<=Math.abs(this.from.y-this.to.y)?(t=this.from.x,e=this.from.yMath.abs(this.from.y-this.to.y)&&(t=this.from.x=this.to.y?this.from.x<=this.to.x?(t=this.from.x+i*s,e=this.from.y-i*s,t=this.to.xthis.to.x&&(t=this.from.x-i*s,e=this.from.y-i*s,t=this.to.x>t?this.to.x:t):this.from.ythis.to.x&&(t=this.from.x-i*s,e=this.from.y+i*s,t=this.to.x>t?this.to.x:t)):Math.abs(this.from.x-this.to.x)>Math.abs(this.from.y-this.to.y)&&(this.from.y>=this.to.y?this.from.x<=this.to.x?(t=this.from.x+i*n,e=this.from.y-i*n,e=this.to.y>e?this.to.y:e):this.from.x>this.to.x&&(t=this.from.x-i*n,e=this.from.y-i*n,e=this.to.y>e?this.to.y:e):this.from.ythis.to.x&&(t=this.from.x-i*n,e=this.from.y+i*n,e=this.to.y1&&(this.startedStabilization=!1),this.stopSimulation())}},{key:"_emitStabilized",value:function(){var t=this;(this.stabilizationIterations>1||this.initialStabilizationEmitted===!1)&&(this.initialStabilizationEmitted=!0,setTimeout(function(){t.body.emitter.emit("stabilized",{iterations:t.stabilizationIterations}),t.stabilizationIterations=0},0))}},{key:"physicsTick",value:function(){this.stabilized===!1&&(this.calculateForces(),this.stabilized=this.moveNodes(),this.stabilized===!0?this.revert():this.startedStabilization===!1&&(this.body.emitter.emit("startStabilizing"),this.startedStabilization=!0),this.stabilizationIterations++)}},{key:"updatePhysicsData",value:function(){this.physicsBody.forces={},this.physicsBody.physicsNodeIndices=[],this.physicsBody.physicsEdgeIndices=[];var t=this.body.nodes,e=this.body.edges;for(var i in t)t.hasOwnProperty(i)&&t[i].options.physics===!0&&this.physicsBody.physicsNodeIndices.push(i);for(var o in e)e.hasOwnProperty(o)&&e[o].options.physics===!0&&this.physicsBody.physicsEdgeIndices.push(o);for(var n=0;na&&o===!0,t=!0}return t===!0?n>.5*this.options.maxVelocity?!1:o:!0}},{key:"_performStep",value:function(t,e){var i=this.body.nodes[t],o=this.options.timestep,n=this.physicsBody.forces,s=this.physicsBody.velocities;if(this.previousStates[t]={x:i.x,y:i.y,vx:s[t].x,vy:s[t].y},i.options.fixed.x===!1){var r=this.modelOptions.damping*s[t].x,a=(n[t].x-r)/i.options.mass;s[t].x+=a*o,s[t].x=Math.abs(s[t].x)>e?s[t].x>0?e:-e:s[t].x,i.x+=s[t].x*o}else n[t].x=0,s[t].x=0;if(i.options.fixed.y===!1){var h=this.modelOptions.damping*s[t].y,d=(n[t].y-h)/i.options.mass;s[t].y+=d*o,s[t].y=Math.abs(s[t].y)>e?s[t].y>0?e:-e:s[t].y,i.y+=s[t].y*o}else n[t].y=0,s[t].y=0;var l=Math.sqrt(Math.pow(s[t].x,2)+Math.pow(s[t].y,2));return l}},{key:"calculateForces",value:function(){this.gravitySolver.solve(),this.nodesSolver.solve(),this.edgesSolver.solve()}},{key:"_freezeNodes",value:function(){var t=this.body.nodes;for(var e in t)t.hasOwnProperty(e)&&t[e].x&&t[e].y&&(this.freezeCache[e]={x:t[e].options.fixed.x,y:t[e].options.fixed.y},t[e].options.fixed.x=!0,t[e].options.fixed.y=!0)}},{key:"_restoreFrozenNodes",value:function(){var t=this.body.nodes;for(var e in t)t.hasOwnProperty(e)&&void 0!==this.freezeCache[e]&&(t[e].options.fixed.x=this.freezeCache[e].x,t[e].options.fixed.y=this.freezeCache[e].y);this.freezeCache={}}},{key:"stabilize",value:function(){var t=this,e=arguments.length<=0||void 0===arguments[0]?this.options.stabilization.iterations:arguments[0];return"number"!=typeof e&&(console.log("The stabilize method needs a numeric amount of iterations. Switching to default: ",this.options.stabilization.iterations),e=this.options.stabilization.iterations),0===this.physicsBody.physicsNodeIndices.length?void(this.ready=!0):(this.body.emitter.emit("_resizeNodes"),this.stopSimulation(),this.stabilized=!1,this.body.emitter.emit("_blockRedraw"),this.targetIterations=e,this.options.stabilization.onlyDynamicEdges===!0&&this._freezeNodes(),this.stabilizationIterations=0,void setTimeout(function(){return t._stabilizationBatch()},0))}},{key:"_stabilizationBatch",value:function(){for(var t=0;this.stabilized===!1&&t0){var t=void 0,e=this.body.nodes,i=this.physicsBody.physicsNodeIndices,o=i.length,n=this._formBarnesHutTree(e,i);this.barnesHutTree=n;for(var s=0;o>s;s++)t=e[i[s]],t.options.mass>0&&(this._getForceContribution(n.root.children.NW,t),this._getForceContribution(n.root.children.NE,t),this._getForceContribution(n.root.children.SW,t),this._getForceContribution(n.root.children.SE,t))}}},{key:"_getForceContribution",value:function(t,e){if(t.childrenCount>0){var i=void 0,o=void 0,n=void 0;i=t.centerOfMass.x-e.x,o=t.centerOfMass.y-e.y,n=Math.sqrt(i*i+o*o),n*t.calcSize>this.thetaInversed?this._calculateForces(n,i,o,e,t):4===t.childrenCount?(this._getForceContribution(t.children.NW,e),this._getForceContribution(t.children.NE,e),this._getForceContribution(t.children.SW,e),this._getForceContribution(t.children.SE,e)):t.children.data.id!=e.id&&this._calculateForces(n,i,o,e,t)}}},{key:"_calculateForces",value:function(t,e,i,o,n){0===t&&(t=.1,e=t),this.overlapAvoidanceFactor<1&&(t=Math.max(.1+this.overlapAvoidanceFactor*o.shape.radius,t-o.shape.radius));var s=this.options.gravitationalConstant*n.mass*o.options.mass/Math.pow(t,3),r=e*s,a=i*s;this.physicsBody.forces[o.id].x+=r,this.physicsBody.forces[o.id].y+=a}},{key:"_formBarnesHutTree",value:function(t,e){for(var i=void 0,o=e.length,n=t[e[0]].x,s=t[e[0]].y,r=t[e[0]].x,a=t[e[0]].y,h=1;o>h;h++){var d=t[e[h]].x,l=t[e[h]].y;t[e[h]].options.mass>0&&(n>d&&(n=d),d>r&&(r=d),s>l&&(s=l),l>a&&(a=l))}var u=Math.abs(r-n)-Math.abs(a-s);u>0?(s-=.5*u,a+=.5*u):(n+=.5*u,r-=.5*u);var c=1e-5,p=Math.max(c,Math.abs(r-n)),f=.5*p,m=.5*(n+r),v=.5*(s+a),g={root:{centerOfMass:{x:0,y:0},mass:0,range:{minX:m-f,maxX:m+f,minY:v-f,maxY:v+f},size:p,calcSize:1/p,children:{data:null},maxWidth:0,level:0,childrenCount:4}};this._splitBranch(g.root);for(var h=0;o>h;h++)i=t[e[h]],i.options.mass>0&&this._placeInTree(g.root,i);return g}},{key:"_updateBranchMass",value:function(t,e){var i=t.mass+e.options.mass,o=1/i;t.centerOfMass.x=t.centerOfMass.x*t.mass+e.x*e.options.mass,t.centerOfMass.x*=o,t.centerOfMass.y=t.centerOfMass.y*t.mass+e.y*e.options.mass,t.centerOfMass.y*=o,t.mass=i;var n=Math.max(Math.max(e.height,e.radius),e.width);t.maxWidth=t.maxWidthe.x?t.children.NW.range.maxY>e.y?this._placeInRegion(t,e,"NW"):this._placeInRegion(t,e,"SW"):t.children.NW.range.maxY>e.y?this._placeInRegion(t,e,"NE"):this._placeInRegion(t,e,"SE")}},{key:"_placeInRegion",value:function(t,e,i){switch(t.children[i].childrenCount){case 0:t.children[i].children.data=e,t.children[i].childrenCount=1,this._updateBranchMass(t.children[i],e);break;case 1:t.children[i].children.data.x===e.x&&t.children[i].children.data.y===e.y?(e.x+=this.seededRandom(),e.y+=this.seededRandom()):(this._splitBranch(t.children[i]),this._placeInTree(t.children[i],e));break;case 4:this._placeInTree(t.children[i],e)}}},{key:"_splitBranch",value:function(t){var e=null;1===t.childrenCount&&(e=t.children.data,t.mass=0,t.centerOfMass.x=0,t.centerOfMass.y=0),t.childrenCount=4,t.children.data=null,this._insertRegion(t,"NW"),this._insertRegion(t,"NE"),this._insertRegion(t,"SW"),this._insertRegion(t,"SE"),null!=e&&this._placeInTree(t,e)}},{key:"_insertRegion",value:function(t,e){var i=void 0,o=void 0,n=void 0,s=void 0,r=.5*t.size;switch(e){case"NW":i=t.range.minX,o=t.range.minX+r,n=t.range.minY,s=t.range.minY+r;break;case"NE":i=t.range.minX+r,o=t.range.maxX,n=t.range.minY,s=t.range.minY+r;break;case"SW":i=t.range.minX,o=t.range.minX+r,n=t.range.minY+r,s=t.range.maxY;break;case"SE":i=t.range.minX+r,o=t.range.maxX,n=t.range.minY+r,s=t.range.maxY}t.children[e]={centerOfMass:{x:0,y:0},mass:0,range:{minX:i,maxX:o,minY:n,maxY:s},size:.5*t.size,calcSize:2*t.calcSize,children:{data:null},maxWidth:0,level:t.level+1,childrenCount:0}}},{key:"_debug",value:function(t,e){void 0!==this.barnesHutTree&&(t.lineWidth=1,this._drawBranch(this.barnesHutTree.root,t,e))}},{key:"_drawBranch",value:function(t,e,i){void 0===i&&(i="#FF0000"),4===t.childrenCount&&(this._drawBranch(t.children.NW,e),this._drawBranch(t.children.NE,e),this._drawBranch(t.children.SE,e),this._drawBranch(t.children.SW,e)),e.strokeStyle=i,e.beginPath(),e.moveTo(t.range.minX,t.range.minY),e.lineTo(t.range.maxX,t.range.minY),e.stroke(),e.beginPath(),e.moveTo(t.range.maxX,t.range.minY),e.lineTo(t.range.maxX,t.range.maxY),e.stroke(),e.beginPath(),e.moveTo(t.range.maxX,t.range.maxY),e.lineTo(t.range.minX,t.range.maxY),e.stroke(),e.beginPath(),e.moveTo(t.range.minX,t.range.maxY),e.lineTo(t.range.minX,t.range.minY),e.stroke()}}]),t}();e["default"]=n,t.exports=e["default"]},function(t,e){function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var o=function(){function t(t,e){for(var i=0;ii&&(s=.5*u>i?1:c*i+p,s/=i,o=t*s,n=e*s,l[r.id].x-=o,l[r.id].y-=n,l[a.id].x+=o,l[a.id].y+=n)}}}]),t}();e["default"]=n,t.exports=e["default"]},function(t,e){function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var o=function(){function t(t,e){for(var i=0;ii?-Math.pow(f*i,2)+Math.pow(f*p,2):0,0===i?i=.01:s/=i,o=t*s,n=e*s,c[r.id].x-=o,c[r.id].y-=n,c[a.id].x+=o,c[a.id].y+=n}}}]),t}();e["default"]=n,t.exports=e["default"]},function(t,e){function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var o=function(){function t(t,e){for(var i=0;i0){var s=n.edges.length+1,r=this.options.centralGravity*s*n.options.mass;o[n.id].x=e*r,o[n.id].y=i*r}}}]),e}(d["default"]);e["default"]=l,t.exports=e["default"]},function(t,e,i){function o(t){return t&&t.__esModule?t:{"default":t}}function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var s=function(){function t(t,e){for(var i=0;i=t&&i.push(n.id)}for(var o=0;o0&&Object.keys(s).length>0&&i.push({nodes:n,edges:s})}}}for(var o=0;oo?r.x:o,n=r.ys?r.y:s;return{x:.5*(i+o),y:.5*(n+s)}}},{key:"openCluster",value:function(t,e){var i=arguments.length<=2||void 0===arguments[2]?!0:arguments[2];if(void 0===t)throw new Error("No clusterNodeId supplied to openCluster.");if(void 0===this.body.nodes[t])throw new Error("The clusterNodeId supplied to openCluster does not exist.");if(void 0===this.body.nodes[t].containedNodes)return void console.log("The node:"+t+" is not a cluster.");var o=this.body.nodes[t],n=o.containedNodes,s=o.containedEdges;if(void 0!==e&&void 0!==e.releaseFunction&&"function"==typeof e.releaseFunction){var r={},a={x:o.x,y:o.y};for(var d in n)if(n.hasOwnProperty(d)){var l=this.body.nodes[d];r[d]={x:l.x,y:l.y}}var u=e.releaseFunction(a,r);for(var d in n)if(n.hasOwnProperty(d)){var l=this.body.nodes[d];void 0!==u[d]&&(l.x=u[d].x||o.x,l.y=u[d].y||o.y)}}else for(var d in n)if(n.hasOwnProperty(d)){var l=this.body.nodes[d];l=n[d],l.x=o.x,l.y=o.y}for(var d in n)if(n.hasOwnProperty(d)){var l=this.body.nodes[d];l.vx=o.vx,l.vy=o.vy,l.options.hidden=!1,l.togglePhysics(!0),delete this.clusteredNodes[d]}for(var c in s)if(s.hasOwnProperty(c)){var p=s[c];if(void 0===this.body.nodes[p.fromId]||void 0===this.body.nodes[p.toId]||p.toId==t||p.fromId==t)p.edgeType.cleanup(),p.disconnect(),delete this.body.edges[c];else if(void 0!==this.clusteredNodes[p.fromId]||void 0!==this.clusteredNodes[p.toId]){var f=void 0,m=void 0,v=this.clusteredNodes[p.fromId]||this.clusteredNodes[p.toId],g=v.clusterId,y=this.body.nodes[g];if(y.containedEdges[c]=p,void 0!==this.clusteredNodes[p.fromId]?(f=g,m=p.toId):(f=p.fromId,m=g),this.body.nodes[f].options.hidden!==!0&&this.body.nodes[m].options.hidden!==!0){var b=this._cloneOptions(p,"edge"),w="clusterEdge:"+h.randomUUID();h.deepExtend(b,y.clusterEdgeProperties),h.deepExtend(b,{from:f,to:m,hidden:!1,physics:!0,id:w});var _=this.body.functions.createEdge(b);this.body.edges[w]=_,this.body.edges[w].connect()}}else p.options.hidden=!1,p.togglePhysics(!0)}for(var x=[],k=0;ko;)e.push(this.clusteredNodes[t].node),t=this.clusteredNodes[t].clusterId,o++;return e.push(this.body.nodes[t]),e}},{key:"_getConnectedId",value:function(t,e){return t.toId!=e?t.toId:t.fromId!=e?t.fromId:t.fromId}},{key:"_getHubSize",value:function(){for(var t=0,e=0,i=0,o=0,n=0;no&&(o=s.edges.length),t+=s.edges.length,e+=Math.pow(s.edges.length,2),i+=1}t/=i,e/=i;var r=e-Math.pow(t,2),a=Math.sqrt(r),h=Math.floor(t+2*a);return h>o&&(h=o),h}}]),t}();e["default"]=d,t.exports=e["default"]},function(t,e,i){function o(t){return t&&t.__esModule?t:{"default":t}}function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function s(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0});var r=function(t,e,i){for(var o=!0;o;){var n=t,s=e,r=i;a=d=h=void 0,o=!1,null===n&&(n=Function.prototype);var a=Object.getOwnPropertyDescriptor(n,s);if(void 0!==a){if("value"in a)return a.value;var h=a.get;return void 0===h?void 0:h.call(r)}var d=Object.getPrototypeOf(n);if(null===d)return void 0;t=d,e=s,i=r,o=!0}},a=i(62),h=o(a),d=function(t){function e(t,i,o,s,a){n(this,e),r(Object.getPrototypeOf(e.prototype),"constructor",this).call(this,t,i,o,s,a),this.isCluster=!0,this.containedNodes={},this.containedEdges={}}return s(e,t),e}(h["default"]);e["default"]=d,t.exports=e["default"]},function(t,e,i){function o(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var n=function(){function t(t,e){for(var i=0;i0,t.renderTimer=void 0}),this.body.emitter.on("destroy",function(){t.renderRequests=0,t.renderingActive=!1,t.requiresTimeout===!0?clearTimeout(t.renderTimer):cancelAnimationFrame(t.renderTimer),t.body.emitter.off()})}},{key:"setOptions",value:function(t){if(void 0!==t){var e=["hideEdgesOnDrag","hideNodesOnDrag"];s.selectiveDeepExtend(e,this.options,t)}}},{key:"_startRendering",value:function(){this.renderingActive===!0&&void 0===this.renderTimer&&(this.requiresTimeout===!0?this.renderTimer=window.setTimeout(this._renderStep.bind(this),this.simulationInterval):this.renderTimer=window.requestAnimationFrame(this._renderStep.bind(this)))}},{key:"_renderStep",value:function(){this.renderingActive===!0&&(this.renderTimer=void 0,this.requiresTimeout===!0&&this._startRendering(),this._redraw(),this.requiresTimeout===!1&&this._startRendering())}},{key:"redraw",value:function(){this.body.emitter.emit("setSize"),this._redraw()}},{key:"_requestRedraw",value:function(){var t=this;this.redrawRequested!==!0&&this.renderingActive===!1&&this.allowRedraw===!0&&(this.redrawRequested=!0,this.requiresTimeout===!0?window.setTimeout(function(){t._redraw(!1)},0):window.requestAnimationFrame(function(){t._redraw(!1)}))}},{key:"_redraw",value:function(){var t=arguments.length<=0||void 0===arguments[0]?!1:arguments[0];if(this.allowRedraw===!0){this.body.emitter.emit("initRedraw"),this.redrawRequested=!1;var e=this.canvas.frame.canvas.getContext("2d");(0===this.canvas.frame.canvas.width||0===this.canvas.frame.canvas.height)&&this.canvas.setSize(),void 0===this.pixelRatio&&(this.pixelRatio=(window.devicePixelRatio||1)/(e.webkitBackingStorePixelRatio||e.mozBackingStorePixelRatio||e.msBackingStorePixelRatio||e.oBackingStorePixelRatio||e.backingStorePixelRatio||1)),e.setTransform(this.pixelRatio,0,0,this.pixelRatio,0,0);var i=this.canvas.frame.canvas.clientWidth,o=this.canvas.frame.canvas.clientHeight;e.clearRect(0,0,i,o),e.save(),e.translate(this.body.view.translation.x,this.body.view.translation.y),e.scale(this.body.view.scale,this.body.view.scale),e.beginPath(),this.body.emitter.emit("beforeDrawing",e),e.closePath(),t===!1&&(this.dragging===!1||this.dragging===!0&&this.options.hideEdgesOnDrag===!1)&&this._drawEdges(e),(this.dragging===!1||this.dragging===!0&&this.options.hideNodesOnDrag===!1)&&this._drawNodes(e,t),this.controlNodesActive===!0&&this._drawControlNodes(e),e.beginPath(),this.body.emitter.emit("afterDrawing",e),e.closePath(),e.restore(),t===!0&&e.clearRect(0,0,i,o)}}},{key:"_resizeNodes",value:function(){var t=this.canvas.frame.canvas.getContext("2d");void 0===this.pixelRatio&&(this.pixelRatio=(window.devicePixelRatio||1)/(t.webkitBackingStorePixelRatio||t.mozBackingStorePixelRatio||t.msBackingStorePixelRatio||t.oBackingStorePixelRatio||t.backingStorePixelRatio||1)),t.setTransform(this.pixelRatio,0,0,this.pixelRatio,0,0),t.save(),t.translate(this.body.view.translation.x,this.body.view.translation.y),t.scale(this.body.view.scale,this.body.view.scale);var e=this.body.nodes,i=void 0;for(var o in e)e.hasOwnProperty(o)&&(i=e[o],i.resize(t),i.updateBoundingBox(t,i.selected));t.restore()}},{key:"_drawNodes",value:function(t){for(var e=arguments.length<=1||void 0===arguments[1]?!1:arguments[1],i=this.body.nodes,o=this.body.nodeIndices,n=void 0,s=[],r=20,a=this.canvas.DOMtoCanvas({x:-r,y:-r}),h=this.canvas.DOMtoCanvas({x:this.canvas.frame.canvas.clientWidth+r,y:this.canvas.frame.canvas.clientHeight+r}),d={top:a.y,left:a.x,bottom:h.y,right:h.x},l=0;l0)for(var r=0;rt.shape.boundingBox.left&&(n=t.shape.boundingBox.left),st.shape.boundingBox.top&&(i=t.shape.boundingBox.top),ot.shape.boundingBox.left&&(n=t.shape.boundingBox.left),st.shape.boundingBox.top&&(i=t.shape.boundingBox.top),o.5*this.body.nodeIndices.length)return void this.fit(i,!1);t=this._getRange(i.nodes);var a=this.body.nodeIndices.length;e=12.662/(a+7.4147)+.0964822;var h=Math.min(this.canvas.frame.canvas.clientWidth/600,this.canvas.frame.canvas.clientHeight/600);e*=h}else{this.body.emitter.emit("_resizeNodes"),t=this._getRange(i.nodes);var d=1.1*Math.abs(t.maxX-t.minX),l=1.1*Math.abs(t.maxY-t.minY),u=this.canvas.frame.canvas.clientWidth/d,c=this.canvas.frame.canvas.clientHeight/l;e=c>=u?u:c}e>1?e=1:0===e&&(e=1);var p=this._findCenter(t),f={position:p,scale:e,animation:i.animation};this.moveTo(f)}},{key:"focus",value:function(t){var e=arguments.length<=1||void 0===arguments[1]?{}:arguments[1];if(void 0!==this.body.nodes[t]){var i={x:this.body.nodes[t].x,y:this.body.nodes[t].y};e.position=i,e.lockedOnNode=t,this.moveTo(e)}else console.log("Node: "+t+" cannot be found.")}},{key:"moveTo",value:function(t){return void 0===t?void(t={}):(void 0===t.offset&&(t.offset={x:0,y:0}),void 0===t.offset.x&&(t.offset.x=0),void 0===t.offset.y&&(t.offset.y=0),void 0===t.scale&&(t.scale=this.body.view.scale),void 0===t.position&&(t.position=this.getViewPosition()),void 0===t.animation&&(t.animation={duration:0}),t.animation===!1&&(t.animation={duration:0}),t.animation===!0&&(t.animation={}),void 0===t.animation.duration&&(t.animation.duration=1e3),void 0===t.animation.easingFunction&&(t.animation.easingFunction="easeInOutQuad"),void this.animateView(t))}},{key:"animateView",value:function(t){if(void 0!==t){this.animationEasingFunction=t.animation.easingFunction,this.releaseNode(),t.locked===!0&&(this.lockedOnNodeId=t.lockedOnNode,this.lockedOnNodeOffset=t.offset),0!=this.easingTime&&this._transitionRedraw(!0),this.sourceScale=this.body.view.scale,this.sourceTranslation=this.body.view.translation,this.targetScale=t.scale,this.body.view.scale=this.targetScale;var e=this.canvas.DOMtoCanvas({x:.5*this.canvas.frame.canvas.clientWidth,y:.5*this.canvas.frame.canvas.clientHeight}),i={x:e.x-t.position.x,y:e.y-t.position.y};this.targetTranslation={x:this.sourceTranslation.x+i.x*this.targetScale+t.offset.x,y:this.sourceTranslation.y+i.y*this.targetScale+t.offset.y},0===t.animation.duration?void 0!=this.lockedOnNodeId?(this.viewFunction=this._lockedRedraw.bind(this),this.body.emitter.on("initRedraw",this.viewFunction)):(this.body.view.scale=this.targetScale,this.body.view.translation=this.targetTranslation,this.body.emitter.emit("_requestRedraw")):(this.animationSpeed=1/(60*t.animation.duration*.001)||1/60,this.animationEasingFunction=t.animation.easingFunction,this.viewFunction=this._transitionRedraw.bind(this),this.body.emitter.on("initRedraw",this.viewFunction),this.body.emitter.emit("_startRendering"))}}},{key:"_lockedRedraw",value:function(){var t={x:this.body.nodes[this.lockedOnNodeId].x,y:this.body.nodes[this.lockedOnNodeId].y},e=this.canvas.DOMtoCanvas({x:.5*this.canvas.frame.canvas.clientWidth,y:.5*this.canvas.frame.canvas.clientHeight}),i={x:e.x-t.x,y:e.y-t.y},o=this.body.view.translation,n={x:o.x+i.x*this.body.view.scale+this.lockedOnNodeOffset.x,y:o.y+i.y*this.body.view.scale+this.lockedOnNodeOffset.y};this.body.view.translation=n}},{key:"releaseNode",value:function(){void 0!==this.lockedOnNodeId&&void 0!==this.viewFunction&&(this.body.emitter.off("initRedraw",this.viewFunction),this.lockedOnNodeId=void 0,this.lockedOnNodeOffset=void 0)}},{key:"_transitionRedraw",value:function(){var t=arguments.length<=0||void 0===arguments[0]?!1:arguments[0];this.easingTime+=this.animationSpeed,this.easingTime=t===!0?1:this.easingTime;var e=s.easingFunctions[this.animationEasingFunction](this.easingTime);this.body.view.scale=this.sourceScale+(this.targetScale-this.sourceScale)*e,this.body.view.translation={x:this.sourceTranslation.x+(this.targetTranslation.x-this.sourceTranslation.x)*e,y:this.sourceTranslation.y+(this.targetTranslation.y-this.sourceTranslation.y)*e},this.easingTime>=1&&(this.body.emitter.off("initRedraw",this.viewFunction),this.easingTime=0,void 0!=this.lockedOnNodeId&&(this.viewFunction=this._lockedRedraw.bind(this),this.body.emitter.on("initRedraw",this.viewFunction)),this.body.emitter.emit("animationFinished"))}},{key:"getScale",value:function(){return this.body.view.scale}},{key:"getViewPosition",value:function(){return this.canvas.DOMtoCanvas({x:.5*this.canvas.frame.canvas.clientWidth,y:.5*this.canvas.frame.canvas.clientHeight})}}]),t}();e["default"]=r,t.exports=e["default"]},function(t,e,i){function o(t){return t&&t.__esModule?t:{"default":t}}function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var s=function(){function t(t,e){for(var i=0;i50&&(this.drag.pointer=this.getPointer(t.center),this.drag.pinched=!1,this.pinch.scale=this.body.view.scale,this.touchTime=(new Date).valueOf())}},{key:"onTap",value:function(t){var e=this.getPointer(t.center),i=this.selectionHandler.options.multiselect&&(t.changedPointers[0].ctrlKey||t.changedPointers[0].metaKey);this.checkSelectionChanges(e,t,i),this.selectionHandler._generateClickEvent("click",t,e)}},{key:"onDoubleTap",value:function(t){var e=this.getPointer(t.center);this.selectionHandler._generateClickEvent("doubleClick",t,e); -}},{key:"onHold",value:function(t){var e=this.getPointer(t.center),i=this.selectionHandler.options.multiselect;this.checkSelectionChanges(e,t,i),this.selectionHandler._generateClickEvent("click",t,e),this.selectionHandler._generateClickEvent("hold",t,e)}},{key:"onRelease",value:function(t){if((new Date).valueOf()-this.touchTime>10){var e=this.getPointer(t.center);this.selectionHandler._generateClickEvent("release",t,e),this.touchTime=(new Date).valueOf()}}},{key:"onContext",value:function(t){var e=this.getPointer({x:t.clientX,y:t.clientY});this.selectionHandler._generateClickEvent("oncontext",t,e)}},{key:"checkSelectionChanges",value:function(t,e){var i=arguments.length<=2||void 0===arguments[2]?!1:arguments[2],o=this.selectionHandler._getSelectedEdgeCount(),n=this.selectionHandler._getSelectedNodeCount(),s=this.selectionHandler.getSelection(),r=void 0;r=i===!0?this.selectionHandler.selectAdditionalOnPoint(t):this.selectionHandler.selectOnPoint(t);var a=this.selectionHandler._getSelectedEdgeCount(),h=this.selectionHandler._getSelectedNodeCount(),d=this.selectionHandler.getSelection(),l=this._determineIfDifferent(s,d),u=l.nodesChanges,c=l.edgesChanges;h-n>0?(this.selectionHandler._generateClickEvent("selectNode",e,t),r=!0):0>h-n?(this.selectionHandler._generateClickEvent("deselectNode",e,t,s),r=!0):h===n&&u===!0&&(this.selectionHandler._generateClickEvent("deselectNode",e,t,s),this.selectionHandler._generateClickEvent("selectNode",e,t),r=!0),a-o>0?(this.selectionHandler._generateClickEvent("selectEdge",e,t),r=!0):0>a-o?(this.selectionHandler._generateClickEvent("deselectEdge",e,t,s),r=!0):a===o&&c===!0&&(this.selectionHandler._generateClickEvent("deselectEdge",e,t,s),this.selectionHandler._generateClickEvent("selectEdge",e,t),r=!0),r===!0&&this.selectionHandler._generateClickEvent("select",e,t)}},{key:"_determineIfDifferent",value:function(t,e){for(var i=!1,o=!1,n=0;nt&&(t=1e-5),t>10&&(t=10);var o=void 0;void 0!==this.drag&&this.drag.dragging===!0&&(o=this.canvas.DOMtoCanvas(this.drag.pointer));var n=this.body.view.translation,s=t/i,r=(1-s)*e.x+n.x*s,a=(1-s)*e.y+n.y*s;if(this.body.view.scale=t,this.body.view.translation={x:r,y:a},void 0!=o){var h=this.canvas.canvasToDOM(o);this.drag.pointer.x=h.x,this.drag.pointer.y=h.y}this.body.emitter.emit("_requestRedraw"),t>i?this.body.emitter.emit("zoom",{direction:"+",scale:this.body.view.scale}):this.body.emitter.emit("zoom",{direction:"-",scale:this.body.view.scale})}}},{key:"onMouseWheel",value:function(t){var e=0;if(t.wheelDelta?e=t.wheelDelta/120:t.detail&&(e=-t.detail/3),0!==e){var i=this.body.view.scale,o=e/10;0>e&&(o/=1-o),i*=1+o;var n=this.getPointer({x:t.clientX,y:t.clientY});this.zoom(i,n)}t.preventDefault()}},{key:"onMouseMove",value:function(t){var e=this,i=this.getPointer({x:t.clientX,y:t.clientY}),o=!1;if(void 0!==this.popup&&(this.popup.hidden===!1&&this._checkHidePopup(i),this.popup.hidden===!1&&(o=!0,this.popup.setPosition(i.x+3,i.y-5),this.popup.show())),this.options.keyboard.bindToWindow===!1&&this.options.keyboard.enabled===!0&&this.canvas.frame.focus(),o===!1&&(void 0!==this.popupTimer&&(clearInterval(this.popupTimer),this.popupTimer=void 0),this.drag.dragging||(this.popupTimer=setTimeout(function(){return e._checkShowPopup(i)},this.options.tooltipDelay))),this.options.hover===!0){var n=this.selectionHandler.getNodeAt(i);void 0===n&&(n=this.selectionHandler.getEdgeAt(i)),this.selectionHandler.hoverObject(n)}}},{key:"_checkShowPopup",value:function(t){var e=this.canvas._XconvertDOMtoCanvas(t.x),i=this.canvas._YconvertDOMtoCanvas(t.y),o={left:e,top:i,right:e,bottom:i},n=void 0===this.popupObj?void 0:this.popupObj.id,s=!1,r="node";if(void 0===this.popupObj){for(var a=this.body.nodeIndices,h=this.body.nodes,l=void 0,u=[],c=0;c0&&(this.popupObj=h[u[u.length-1]],s=!0)}if(void 0===this.popupObj&&s===!1){for(var p=this.body.edgeIndices,f=this.body.edges,m=void 0,v=[],c=0;c0&&(this.popupObj=f[v[v.length-1]],r="edge")}void 0!==this.popupObj?this.popupObj.id!==n&&(void 0===this.popup&&(this.popup=new d["default"](this.canvas.frame)),this.popup.popupTargetType=r,this.popup.popupTargetId=this.popupObj.id,this.popup.setPosition(t.x+3,t.y-5),this.popup.setText(this.popupObj.getTitle()),this.popup.show(),this.body.emitter.emit("showPopup",this.popupObj.id)):void 0!==this.popup&&(this.popup.hide(),this.body.emitter.emit("hidePopup"))}},{key:"_checkHidePopup",value:function(t){var e=this.selectionHandler._pointerToPositionObject(t),i=!1;if("node"===this.popup.popupTargetType){if(void 0!==this.body.nodes[this.popup.popupTargetId]&&(i=this.body.nodes[this.popup.popupTargetId].isOverlappingWith(e),i===!0)){var o=this.selectionHandler.getNodeAt(t);i=o.id===this.popup.popupTargetId}}else void 0===this.selectionHandler.getNodeAt(t)&&void 0!==this.body.edges[this.popup.popupTargetId]&&(i=this.body.edges[this.popup.popupTargetId].isOverlappingWith(e));i===!1&&(this.popupObj=void 0,this.popup.hide(),this.body.emitter.emit("hidePopup"))}}]),t}();e["default"]=u,t.exports=e["default"]},function(t,e,i){function o(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var n=function(){function t(t,e){for(var i=0;i700&&(this.body.emitter.emit("fit",{duration:700}),this.touchTime=(new Date).valueOf())}},{key:"_stopMovement",value:function(){for(var t in this.boundFunctions)this.boundFunctions.hasOwnProperty(t)&&(this.body.emitter.off("initRedraw",this.boundFunctions[t]),this.body.emitter.emit("_stopRendering"));this.boundFunctions={}}},{key:"_moveUp",value:function(){this.body.view.translation.y+=this.options.keyboard.speed.y}},{key:"_moveDown",value:function(){this.body.view.translation.y-=this.options.keyboard.speed.y}},{key:"_moveLeft",value:function(){this.body.view.translation.x+=this.options.keyboard.speed.x}},{key:"_moveRight",value:function(){this.body.view.translation.x-=this.options.keyboard.speed.x}},{key:"_zoomIn",value:function(){this.body.view.scale*=1+this.options.keyboard.speed.zoom,this.body.emitter.emit("zoom",{direction:"+",scale:this.body.view.scale})}},{key:"_zoomOut",value:function(){this.body.view.scale/=1+this.options.keyboard.speed.zoom,this.body.emitter.emit("zoom",{direction:"-",scale:this.body.view.scale})}},{key:"configureKeyboardBindings",value:function(){var t=this;void 0!==this.keycharm&&this.keycharm.destroy(),this.options.keyboard.enabled===!0&&(this.options.keyboard.bindToWindow===!0?this.keycharm=a({container:window,preventDefault:!0}):this.keycharm=a({container:this.canvas.frame,preventDefault:!0}),this.keycharm.reset(),this.activated===!0&&(this.keycharm.bind("up",function(){t.bindToRedraw("_moveUp")},"keydown"),this.keycharm.bind("down",function(){t.bindToRedraw("_moveDown")},"keydown"),this.keycharm.bind("left",function(){t.bindToRedraw("_moveLeft")},"keydown"),this.keycharm.bind("right",function(){t.bindToRedraw("_moveRight")},"keydown"),this.keycharm.bind("=",function(){t.bindToRedraw("_zoomIn")},"keydown"),this.keycharm.bind("num+",function(){t.bindToRedraw("_zoomIn")},"keydown"),this.keycharm.bind("num-",function(){t.bindToRedraw("_zoomOut")},"keydown"),this.keycharm.bind("-",function(){t.bindToRedraw("_zoomOut")},"keydown"),this.keycharm.bind("[",function(){t.bindToRedraw("_zoomOut")},"keydown"),this.keycharm.bind("]",function(){t.bindToRedraw("_zoomIn")},"keydown"),this.keycharm.bind("pageup",function(){t.bindToRedraw("_zoomIn")},"keydown"),this.keycharm.bind("pagedown",function(){t.bindToRedraw("_zoomOut")},"keydown"),this.keycharm.bind("up",function(){t.unbindFromRedraw("_moveUp")},"keyup"),this.keycharm.bind("down",function(){t.unbindFromRedraw("_moveDown")},"keyup"),this.keycharm.bind("left",function(){t.unbindFromRedraw("_moveLeft")},"keyup"),this.keycharm.bind("right",function(){t.unbindFromRedraw("_moveRight")},"keyup"),this.keycharm.bind("=",function(){t.unbindFromRedraw("_zoomIn")},"keyup"),this.keycharm.bind("num+",function(){t.unbindFromRedraw("_zoomIn")},"keyup"),this.keycharm.bind("num-",function(){t.unbindFromRedraw("_zoomOut")},"keyup"),this.keycharm.bind("-",function(){t.unbindFromRedraw("_zoomOut")},"keyup"),this.keycharm.bind("[",function(){t.unbindFromRedraw("_zoomOut")},"keyup"),this.keycharm.bind("]",function(){t.unbindFromRedraw("_zoomIn")},"keyup"),this.keycharm.bind("pageup",function(){t.unbindFromRedraw("_zoomIn")},"keyup"),this.keycharm.bind("pagedown",function(){t.unbindFromRedraw("_zoomOut")},"keyup")))}}]),t}();e["default"]=h,t.exports=e["default"]},function(t,e){function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var o=function(){function t(t,e){for(var i=0;io&&(s=o-e-this.padding),sn&&(r=n-i-this.padding),r0?e===!0?this.body.nodes[o[o.length-1]]:o[o.length-1]:void 0}},{key:"_getEdgesOverlappingWith",value:function(t,e){for(var i=this.body.edges,o=0;o0?e===!0?this.body.edges[o[o.length-1]]:o[o.length-1]:void 0}},{key:"_addToSelection",value:function(t){t instanceof s?this.selectionObj.nodes[t.id]=t:this.selectionObj.edges[t.id]=t}},{key:"_addToHover",value:function(t){t instanceof s?this.hoverObj.nodes[t.id]=t:this.hoverObj.edges[t.id]=t}},{key:"_removeFromSelection",value:function(t){t instanceof s?delete this.selectionObj.nodes[t.id]:delete this.selectionObj.edges[t.id]}},{key:"unselectAll",value:function(){for(var t in this.selectionObj.nodes)this.selectionObj.nodes.hasOwnProperty(t)&&this.selectionObj.nodes[t].unselect();for(var e in this.selectionObj.edges)this.selectionObj.edges.hasOwnProperty(e)&&this.selectionObj.edges[e].unselect();this.selectionObj={nodes:{},edges:{}}}},{key:"_getSelectedNodeCount",value:function(){var t=0;for(var e in this.selectionObj.nodes)this.selectionObj.nodes.hasOwnProperty(e)&&(t+=1);return t}},{key:"_getSelectedNode",value:function(){for(var t in this.selectionObj.nodes)if(this.selectionObj.nodes.hasOwnProperty(t))return this.selectionObj.nodes[t];return void 0}},{key:"_getSelectedEdge",value:function(){for(var t in this.selectionObj.edges)if(this.selectionObj.edges.hasOwnProperty(t))return this.selectionObj.edges[t];return void 0}},{key:"_getSelectedEdgeCount",value:function(){var t=0;for(var e in this.selectionObj.edges)this.selectionObj.edges.hasOwnProperty(e)&&(t+=1);return t}},{key:"_getSelectedObjectCount",value:function(){var t=0;for(var e in this.selectionObj.nodes)this.selectionObj.nodes.hasOwnProperty(e)&&(t+=1);for(var i in this.selectionObj.edges)this.selectionObj.edges.hasOwnProperty(i)&&(t+=1);return t}},{key:"_selectionIsEmpty",value:function(){for(var t in this.selectionObj.nodes)if(this.selectionObj.nodes.hasOwnProperty(t))return!1;for(var e in this.selectionObj.edges)if(this.selectionObj.edges.hasOwnProperty(e))return!1;return!0}},{key:"_clusterInSelection",value:function(){for(var t in this.selectionObj.nodes)if(this.selectionObj.nodes.hasOwnProperty(t)&&this.selectionObj.nodes[t].clusterSize>1)return!0;return!1}},{key:"_selectConnectedEdges",value:function(t){for(var e=0;e0&&(this.options.hierarchical.levelSeparation*=-1):this.options.hierarchical.levelSeparation<0&&(this.options.hierarchical.levelSeparation*=-1),this.body.emitter.emit("_resetHierarchicalLayout"),this.adaptAllOptions(e);if(i===!0)return this.body.emitter.emit("refresh"),s.deepExtend(e,this.optionsBackup)}return e}},{key:"adaptAllOptions",value:function(t){if(this.options.hierarchical.enabled===!0){void 0===t.physics||t.physics===!0?(t.physics={solver:"hierarchicalRepulsion"},this.optionsBackup.physics={solver:"barnesHut"}):"object"==typeof t.physics?(this.optionsBackup.physics={solver:"barnesHut"},void 0!==t.physics.solver&&(this.optionsBackup.physics={solver:t.physics.solver}),t.physics.solver="hierarchicalRepulsion"):t.physics!==!1&&(this.optionsBackup.physics={solver:"barnesHut"},t.physics.solver="hierarchicalRepulsion");var e="horizontal";("RL"===this.options.hierarchical.direction||"LR"===this.options.hierarchical.direction)&&(e="vertical"),void 0===t.edges?(this.optionsBackup.edges={smooth:{enabled:!0,type:"dynamic"}},t.edges={smooth:!1}):void 0===t.edges.smooth?(this.optionsBackup.edges={smooth:{enabled:!0,type:"dynamic"}},t.edges.smooth=!1):"boolean"==typeof t.edges.smooth?(this.optionsBackup.edges={smooth:t.edges.smooth},t.edges.smooth={enabled:t.edges.smooth,type:e}):(void 0!==t.edges.smooth.type&&"dynamic"!==t.edges.smooth.type&&(e=t.edges.smooth.type),this.optionsBackup.edges={smooth:void 0===t.edges.smooth.enabled?!0:t.edges.smooth.enabled,type:void 0===t.edges.smooth.type?"dynamic":t.edges.smooth.type,roundness:void 0===t.edges.smooth.roundness?.5:t.edges.smooth.roundness},t.edges.smooth={enabled:void 0===t.edges.smooth.enabled?!0:t.edges.smooth.enabled,type:e,roundness:void 0===t.edges.smooth.roundness?.5:t.edges.smooth.roundness}),this.body.emitter.emit("_forceDisableDynamicCurves",e)}return t}},{key:"seededRandom",value:function(){var t=1e4*Math.sin(this.randomSeed++);return t-Math.floor(t)}},{key:"positionInitially",value:function(t){if(this.options.hierarchical.enabled!==!0){this.randomSeed=this.initialRandomSeed;for(var e=0;e0){var t=void 0,e=void 0,i=!1,o=!1;this.hierarchicalLevels={},this.nodeSpacing=100;for(e in this.body.nodes)this.body.nodes.hasOwnProperty(e)&&(t=this.body.nodes[e],void 0!==t.options.level?(i=!0,this.hierarchicalLevels[e]=t.options.level):o=!0);if(o===!0&&i===!0)throw new Error("To use the hierarchical layout, nodes require either no predefined levels or levels have to be defined for all nodes.");o===!0&&("hubsize"===this.options.hierarchical.sortMethod?this._determineLevelsByHubsize():("directed"===this.options.hierarchical.sortMethod,0||this._determineLevelsDirected()));var n=this._getDistribution();this._placeNodesByHierarchy(n)}}},{key:"_placeNodesByHierarchy",value:function(t){var e=void 0,i=void 0;this.positionedNodes={};for(var o in t)if(t.hasOwnProperty(o))for(e in t[o].nodes)t[o].nodes.hasOwnProperty(e)&&(i=t[o].nodes[e],"UD"===this.options.hierarchical.direction||"DU"===this.options.hierarchical.direction?(void 0===i.x&&(i.x=t[o].distance),t[o].distance=i.x+this.nodeSpacing):(void 0===i.y&&(i.y=t[o].distance),t[o].distance=i.y+this.nodeSpacing),this.positionedNodes[e]=!0,this._placeBranchNodes(i.edges,i.id,t,o))}},{key:"_getDistribution",value:function(){var t={},e=void 0,i=void 0;for(e in this.body.nodes)if(this.body.nodes.hasOwnProperty(e)){i=this.body.nodes[e];var o=void 0===this.hierarchicalLevels[e]?0:this.hierarchicalLevels[e];"UD"===this.options.hierarchical.direction||"DU"===this.options.hierarchical.direction?(i.y=this.options.hierarchical.levelSeparation*o,i.options.fixed.y=!0):(i.x=this.options.hierarchical.levelSeparation*o,i.options.fixed.x=!0),void 0===t[o]&&(t[o]={amount:0,nodes:{},distance:0}),t[o].amount+=1,t[o].nodes[e]=i}return t}},{key:"_getHubSize",value:function(){var t=0;for(var e in this.body.nodes)if(this.body.nodes.hasOwnProperty(e)){var i=this.body.nodes[e];void 0===this.hierarchicalLevels[e]&&(t=i.edges.length0&&(i=this._getHubSize(),0!==i);)for(t in this.body.nodes)this.body.nodes.hasOwnProperty(t)&&(e=this.body.nodes[t],e.edges.length===i&&this._setLevelByHubsize(0,e))}},{key:"_setLevelByHubsize",value:function(t,e){if(void 0===this.hierarchicalLevels[e.id]){var i=void 0;this.hierarchicalLevels[e.id]=t;for(var o=0;oo&&("UD"===this.options.hierarchical.direction||"DU"===this.options.hierarchical.direction?(void 0===s.x&&(s.x=Math.max(i[a].distance,r.x)),i[a].distance=s.x+this.nodeSpacing,this.positionedNodes[s.id]=!0):(void 0===s.y&&(s.y=Math.max(i[a].distance,r.y)),i[a].distance=s.y+this.nodeSpacing),this.positionedNodes[s.id]=!0,s.edges.length>1&&this._placeBranchNodes(s.edges,s.id,i,a))}}}]),t}();e["default"]=r,t.exports=e["default"]},function(t,e,i){function o(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var n=function(){function t(t,e){for(var i=0;i0){for(var n=0;n0&&"function"==typeof this.options.deleteEdge&&(o=this.options.deleteEdge);if("function"==typeof o){var s={nodes:e,edges:i};if(2!==o.length)throw new Error("The function for delete does not support two arguments (data, callback)");o(s,function(e){null!==e&&void 0!==e&&"delete"===t.inMode?(t.body.data.edges.getDataSet().remove(e.edges),t.body.data.nodes.getDataSet().remove(e.nodes),t.body.emitter.emit("startSimulation"),t.showManipulatorToolbar()):(t.body.emitter.emit("startSimulation"),t.showManipulatorToolbar())})}else this.body.data.edges.getDataSet().remove(i),this.body.data.nodes.getDataSet().remove(e),this.body.emitter.emit("startSimulation"),this.showManipulatorToolbar()}},{key:"_setup",value:function(){this.options.enabled===!0?(this.guiEnabled=!0,this._createWrappers(),this.editMode===!1?this._createEditButton():this.showManipulatorToolbar()):(this._removeManipulationDOM(),this.guiEnabled=!1)}},{key:"_createWrappers",value:function(){void 0===this.manipulationDiv&&(this.manipulationDiv=document.createElement("div"),this.manipulationDiv.className="vis-manipulation",this.editMode===!0?this.manipulationDiv.style.display="block":this.manipulationDiv.style.display="none",this.canvas.frame.appendChild(this.manipulationDiv)),void 0===this.editModeDiv&&(this.editModeDiv=document.createElement("div"),this.editModeDiv.className="vis-edit-mode",this.editMode===!0?this.editModeDiv.style.display="none":this.editModeDiv.style.display="block",this.canvas.frame.appendChild(this.editModeDiv)),void 0===this.closeDiv&&(this.closeDiv=document.createElement("div"),this.closeDiv.className="vis-close",this.closeDiv.style.display=this.manipulationDiv.style.display,this.canvas.frame.appendChild(this.closeDiv))}},{key:"_getNewTargetNode",value:function(t,e){var i=s.deepExtend({},this.options.controlNodeStyle);return i.id="targetNode"+s.randomUUID(),i.hidden=!1,i.physics=!1,i.x=t,i.y=e,this.body.functions.createNode(i)}},{key:"_createEditButton",value:function(){this._clean(),this.manipulationDOM={},s.recursiveDOMDelete(this.editModeDiv);var t=this.options.locales[this.options.locale],e=this._createButton("editMode","vis-button vis-edit vis-edit-mode",t.edit||this.options.locales.en.edit);this.editModeDiv.appendChild(e),this._bindHammerToDiv(e,this.toggleEditMode.bind(this))}},{key:"_clean",value:function(){this.inMode=!1,this.guiEnabled===!0&&(s.recursiveDOMDelete(this.editModeDiv),s.recursiveDOMDelete(this.manipulationDiv),this._cleanManipulatorHammers()),this._cleanupTemporaryNodesAndEdges(),this._unbindTemporaryUIs(),this._unbindTemporaryEvents(),this.body.emitter.emit("restorePhysics")}},{key:"_cleanManipulatorHammers",value:function(){if(0!=this.manipulationHammers.length){for(var t=0;t=0;r--)if(n[r]!==this.selectedControlNode.id){s=this.body.nodes[n[r]];break}if(void 0!==s&&void 0!==this.selectedControlNode)if(s.isCluster===!0)alert(this.options.locales[this.options.locale].createEdgeError||this.options.locales.en.createEdgeError);else{var a=this.body.nodes[this.temporaryIds.nodes[0]];this.selectedControlNode.id===a.id?this._performEditEdge(s.id,o.to.id):this._performEditEdge(o.from.id,s.id)}else o.updateEdgeType(),this.body.emitter.emit("restorePhysics");this.body.emitter.emit("_redraw")}},{key:"_handleConnect",value:function(t){if((new Date).valueOf()-this.touchTime>100){this.lastTouch=this.body.functions.getPointer(t.center),this.lastTouch.translation=s.extend({},this.body.view.translation);var e=this.lastTouch,i=this.selectionHandler.getNodeAt(e);if(void 0!==i)if(i.isCluster===!0)alert(this.options.locales[this.options.locale].createEdgeError||this.options.locales.en.createEdgeError);else{var o=this._getNewTargetNode(i.x,i.y);this.body.nodes[o.id]=o,this.body.nodeIndices.push(o.id);var n=this.body.functions.createEdge({id:"connectionEdge"+s.randomUUID(),from:i.id,to:o.id,physics:!1,smooth:{enabled:!0,type:"continuous",roundness:.5}});this.body.edges[n.id]=n,this.body.edgeIndices.push(n.id),this.temporaryIds.nodes.push(o.id),this.temporaryIds.edges.push(n.id)}this.touchTime=(new Date).valueOf()}}},{key:"_dragControlNode",value:function(t){var e=this.body.functions.getPointer(t.center);if(void 0!==this.temporaryIds.nodes[0]){var i=this.body.nodes[this.temporaryIds.nodes[0]];i.x=this.canvas._XconvertDOMtoCanvas(e.x),i.y=this.canvas._YconvertDOMtoCanvas(e.y),this.body.emitter.emit("_redraw")}else{var o=e.x-this.lastTouch.x,n=e.y-this.lastTouch.y;this.body.view.translation={x:this.lastTouch.translation.x+o,y:this.lastTouch.translation.y+n}}}},{key:"_finishConnect",value:function(t){var e=this.body.functions.getPointer(t.center),i=this.selectionHandler._pointerToPositionObject(e),o=void 0;void 0!==this.temporaryIds.edges[0]&&(o=this.body.edges[this.temporaryIds.edges[0]].fromId);for(var n=this.selectionHandler._getAllNodesOverlappingWith(i),s=void 0,r=n.length-1;r>=0;r--)if(-1===this.temporaryIds.nodes.indexOf(n[r])){s=this.body.nodes[n[r]];break}this._cleanupTemporaryNodesAndEdges(),void 0!==s&&(s.isCluster===!0?alert(this.options.locales[this.options.locale].createEdgeError||this.options.locales.en.createEdgeError):void 0!==this.body.nodes[o]&&void 0!==this.body.nodes[s.id]&&this._performAddEdge(o,s.id)),this.body.emitter.emit("_redraw")}},{key:"_performAddNode",value:function(t){var e=this,i={id:s.randomUUID(),x:t.pointer.canvas.x,y:t.pointer.canvas.y,label:"new"};if("function"==typeof this.options.addNode){if(2!==this.options.addNode.length)throw new Error("The function for add does not support two arguments (data,callback)");this.options.addNode(i,function(t){null!==t&&void 0!==t&&"addNode"===e.inMode&&(e.body.data.nodes.getDataSet().add(t),e.showManipulatorToolbar())})}else this.body.data.nodes.getDataSet().add(i),this.showManipulatorToolbar()}},{key:"_performAddEdge",value:function(t,e){var i=this,o={from:t,to:e};if("function"==typeof this.options.addEdge){if(2!==this.options.addEdge.length)throw new Error("The function for connect does not support two arguments (data,callback)");this.options.addEdge(o,function(t){null!==t&&void 0!==t&&"addEdge"===i.inMode&&(i.body.data.edges.getDataSet().add(t),i.selectionHandler.unselectAll(),i.showManipulatorToolbar())})}else this.body.data.edges.getDataSet().add(o),this.selectionHandler.unselectAll(),this.showManipulatorToolbar()}},{key:"_performEditEdge",value:function(t,e){var i=this,o={id:this.edgeBeingEditedId,from:t,to:e};if("function"==typeof this.options.editEdge){if(2!==this.options.editEdge.length)throw new Error("The function for edit does not support two arguments (data, callback)");this.options.editEdge(o,function(t){null===t||void 0===t||"editEdge"!==i.inMode?(i.body.edges[o.id].updateEdgeType(),i.body.emitter.emit("_redraw")):(i.body.data.edges.getDataSet().update(t),i.selectionHandler.unselectAll(),i.showManipulatorToolbar())})}else this.body.data.edges.getDataSet().update(o),this.selectionHandler.unselectAll(),this.showManipulatorToolbar()}}]),t}();e["default"]=h,t.exports=e["default"]},function(t,e){Object.defineProperty(e,"__esModule",{value:!0});var i="string",o="boolean",n="number",s="array",r="object",a="dom",h="any",d={configure:{enabled:{"boolean":o},filter:{"boolean":o,string:i,array:s,"function":"function"},container:{dom:a},showButton:{"boolean":o},__type__:{object:r,"boolean":o,string:i,array:s,"function":"function"}},edges:{arrows:{to:{enabled:{"boolean":o},scaleFactor:{number:n},__type__:{object:r,"boolean":o}},middle:{enabled:{"boolean":o},scaleFactor:{number:n},__type__:{object:r,"boolean":o}},from:{enabled:{"boolean":o},scaleFactor:{number:n},__type__:{object:r,"boolean":o}},__type__:{string:["from","to","middle"],object:r}},color:{color:{string:i},highlight:{string:i},hover:{string:i},inherit:{string:["from","to","both"],"boolean":o},opacity:{number:n},__type__:{object:r,string:i}},dashes:{"boolean":o,array:s},font:{color:{string:i},size:{number:n},face:{string:i},background:{string:i},strokeWidth:{number:n},strokeColor:{string:i},align:{string:["horizontal","top","middle","bottom"]},__type__:{object:r,string:i}},hidden:{"boolean":o},hoverWidth:{"function":"function",number:n},label:{string:i,undefined:"undefined"},labelHighlightBold:{"boolean":o},length:{number:n,undefined:"undefined"},physics:{"boolean":o},scaling:{min:{number:n},max:{number:n},label:{enabled:{"boolean":o},min:{number:n},max:{number:n},maxVisible:{number:n},drawThreshold:{number:n},__type__:{object:r,"boolean":o}},customScalingFunction:{"function":"function"},__type__:{object:r}},selectionWidth:{"function":"function",number:n},selfReferenceSize:{number:n},shadow:{enabled:{"boolean":o},size:{number:n},x:{number:n},y:{number:n},__type__:{object:r,"boolean":o}},smooth:{enabled:{"boolean":o},type:{string:["dynamic","continuous","discrete","diagonalCross","straightCross","horizontal","vertical","curvedCW","curvedCCW"]},roundness:{number:n},__type__:{object:r,"boolean":o}},title:{string:i,undefined:"undefined"},width:{number:n},value:{number:n,undefined:"undefined"},__type__:{object:r}},groups:{useDefaultGroups:{"boolean":o},__any__:"get from nodes, will be overwritten below",__type__:{object:r}},interaction:{dragNodes:{"boolean":o},dragView:{"boolean":o},hideEdgesOnDrag:{"boolean":o},hideNodesOnDrag:{"boolean":o},hover:{"boolean":o},keyboard:{enabled:{"boolean":o},speed:{x:{number:n},y:{number:n},zoom:{number:n},__type__:{object:r}},bindToWindow:{"boolean":o},__type__:{object:r,"boolean":o}},multiselect:{"boolean":o},navigationButtons:{"boolean":o},selectable:{"boolean":o},selectConnectedEdges:{"boolean":o},hoverConnectedEdges:{"boolean":o},tooltipDelay:{number:n},zoomView:{"boolean":o},__type__:{object:r}},layout:{randomSeed:{undefined:"undefined",number:n},hierarchical:{enabled:{"boolean":o},levelSeparation:{number:n},direction:{string:["UD","DU","LR","RL"]},sortMethod:{string:["hubsize","directed"]},__type__:{object:r,"boolean":o}},__type__:{object:r}},manipulation:{enabled:{"boolean":o},initiallyActive:{"boolean":o},addNode:{"boolean":o,"function":"function"},addEdge:{"boolean":o,"function":"function"},editNode:{"function":"function"},editEdge:{"boolean":o,"function":"function"},deleteNode:{"boolean":o,"function":"function"},deleteEdge:{"boolean":o,"function":"function"},controlNodeStyle:"get from nodes, will be overwritten below",__type__:{object:r,"boolean":o}},nodes:{borderWidth:{number:n},borderWidthSelected:{number:n,undefined:"undefined"},brokenImage:{string:i,undefined:"undefined"},color:{border:{string:i},background:{string:i},highlight:{border:{string:i},background:{string:i},__type__:{object:r,string:i}},hover:{border:{string:i},background:{string:i},__type__:{object:r,string:i}},__type__:{object:r,string:i}},fixed:{x:{"boolean":o},y:{"boolean":o},__type__:{object:r,"boolean":o}},font:{color:{string:i},size:{number:n},face:{string:i},background:{string:i},strokeWidth:{number:n},strokeColor:{string:i},__type__:{object:r,string:i}},group:{string:i,number:n,undefined:"undefined"},hidden:{"boolean":o},icon:{face:{string:i},code:{string:i},size:{number:n},color:{string:i},__type__:{object:r}},id:{string:i,number:n},image:{string:i,undefined:"undefined"},label:{string:i,undefined:"undefined"},labelHighlightBold:{"boolean":o},level:{number:n,undefined:"undefined"},mass:{number:n},physics:{"boolean":o},scaling:{min:{number:n},max:{number:n},label:{enabled:{"boolean":o},min:{number:n},max:{number:n},maxVisible:{number:n},drawThreshold:{number:n},__type__:{object:r,"boolean":o}},customScalingFunction:{"function":"function"},__type__:{object:r}},shadow:{enabled:{"boolean":o},size:{number:n},x:{number:n},y:{number:n},__type__:{object:r,"boolean":o}},shape:{string:["ellipse","circle","database","box","text","image","circularImage","diamond","dot","star","triangle","triangleDown","square","icon"]},shapeProperties:{borderDashes:{"boolean":o,array:s},__type__:{object:r}},size:{number:n},title:{string:i,undefined:"undefined"},value:{number:n,undefined:"undefined"},x:{number:n},y:{number:n},__type__:{object:r}},physics:{enabled:{"boolean":o},barnesHut:{gravitationalConstant:{number:n},centralGravity:{number:n},springLength:{number:n},springConstant:{number:n},damping:{number:n},avoidOverlap:{number:n},__type__:{object:r}},forceAtlas2Based:{gravitationalConstant:{number:n},centralGravity:{number:n},springLength:{number:n},springConstant:{number:n},damping:{number:n},avoidOverlap:{number:n},__type__:{object:r}},repulsion:{centralGravity:{number:n},springLength:{number:n},springConstant:{number:n},nodeDistance:{number:n},damping:{number:n},__type__:{object:r}},hierarchicalRepulsion:{centralGravity:{number:n},springLength:{number:n},springConstant:{number:n},nodeDistance:{number:n},damping:{number:n},__type__:{object:r}},maxVelocity:{number:n},minVelocity:{number:n},solver:{string:["barnesHut","repulsion","hierarchicalRepulsion","forceAtlas2Based"]},stabilization:{enabled:{"boolean":o},iterations:{number:n},updateInterval:{number:n},onlyDynamicEdges:{"boolean":o},fit:{"boolean":o},__type__:{object:r,"boolean":o}},timestep:{number:n},__type__:{object:r,"boolean":o}},autoResize:{"boolean":o},clickToUse:{"boolean":o},locale:{string:i},locales:{__any__:{any:h},__type__:{object:r}},height:{string:i},width:{string:i},__type__:{object:r}};d.groups.__any__=d.nodes,d.manipulation.controlNodeStyle=d.nodes;var l={nodes:{borderWidth:[1,0,10,1],borderWidthSelected:[2,0,10,1],color:{border:["color","#2B7CE9"],background:["color","#97C2FC"],highlight:{border:["color","#2B7CE9"],background:["color","#D2E5FF"]},hover:{border:["color","#2B7CE9"],background:["color","#D2E5FF"]}},fixed:{x:!1,y:!1},font:{color:["color","#343434"],size:[14,0,100,1],face:["arial","verdana","tahoma"],background:["color","none"],strokeWidth:[0,0,50,1],strokeColor:["color","#ffffff"]},hidden:!1,labelHighlightBold:!0,physics:!0,scaling:{min:[10,0,200,1],max:[30,0,200,1],label:{enabled:!1,min:[14,0,200,1],max:[30,0,200,1],maxVisible:[30,0,200,1],drawThreshold:[5,0,20,1]}},shadow:{enabled:!1,size:[10,0,20,1],x:[5,-30,30,1],y:[5,-30,30,1]},shape:["ellipse","box","circle","database","diamond","dot","square","star","text","triangle","triangleDown"],shapeProperties:{borderDashes:!1},size:[25,0,200,1]},edges:{arrows:{to:{enabled:!1,scaleFactor:[1,0,3,.05]},middle:{enabled:!1,scaleFactor:[1,0,3,.05]},from:{enabled:!1,scaleFactor:[1,0,3,.05]}},color:{color:["color","#848484"],highlight:["color","#848484"],hover:["color","#848484"],inherit:["from","to","both",!0,!1],opacity:[1,0,1,.05]},dashes:!1,font:{color:["color","#343434"],size:[14,0,100,1],face:["arial","verdana","tahoma"],background:["color","none"],strokeWidth:[2,0,50,1],strokeColor:["color","#ffffff"],align:["horizontal","top","middle","bottom"]},hidden:!1,hoverWidth:[1.5,0,5,.1],labelHighlightBold:!0,physics:!0,scaling:{min:[1,0,100,1],max:[15,0,100,1],label:{enabled:!0,min:[14,0,200,1],max:[30,0,200,1],maxVisible:[30,0,200,1],drawThreshold:[5,0,20,1]}},selectionWidth:[1.5,0,5,.1],selfReferenceSize:[20,0,200,1],shadow:{enabled:!1,size:[10,0,20,1],x:[5,-30,30,1],y:[5,-30,30,1]},smooth:{enabled:!0,type:["dynamic","continuous","discrete","diagonalCross","straightCross","horizontal","vertical","curvedCW","curvedCCW"],roundness:[.5,0,1,.05]},width:[1,0,30,1]},layout:{hierarchical:{enabled:!1,levelSeparation:[150,20,500,5],direction:["UD","DU","LR","RL"],sortMethod:["hubsize","directed"]}},interaction:{dragNodes:!0,dragView:!0,hideEdgesOnDrag:!1,hideNodesOnDrag:!1,hover:!1,keyboard:{enabled:!1,speed:{x:[10,0,40,1],y:[10,0,40,1],zoom:[.02,0,.1,.005]},bindToWindow:!0},multiselect:!1,navigationButtons:!1,selectable:!0,selectConnectedEdges:!0,hoverConnectedEdges:!0,tooltipDelay:[300,0,1e3,25],zoomView:!0},manipulation:{enabled:!1,initiallyActive:!1},physics:{enabled:!0,barnesHut:{gravitationalConstant:[-2e3,-3e4,0,50],centralGravity:[.3,0,10,.05],springLength:[95,0,500,5],springConstant:[.04,0,1.2,.005],damping:[.09,0,1,.01],avoidOverlap:[0,0,1,.01]},forceAtlas2Based:{gravitationalConstant:[-50,-500,0,1],centralGravity:[.01,0,1,.005],springLength:[95,0,500,5],springConstant:[.08,0,1.2,.005],damping:[.4,0,1,.01],avoidOverlap:[0,0,1,.01]},repulsion:{centralGravity:[.2,0,10,.05],springLength:[200,0,500,5],springConstant:[.05,0,1.2,.005],nodeDistance:[100,0,500,5],damping:[.09,0,1,.01]},hierarchicalRepulsion:{centralGravity:[.2,0,10,.05],springLength:[100,0,500,5],springConstant:[.01,0,1.2,.005],nodeDistance:[120,0,500,5],damping:[.09,0,1,.01]},maxVelocity:[50,0,150,1],minVelocity:[.1,.01,.5,.01],solver:["barnesHut","forceAtlas2Based","repulsion","hierarchicalRepulsion"],timestep:[.5,.01,1,.01]},global:{locale:["en","nl"]}};e.allOptions=d,e.configureOptions=l},function(t,e){"undefined"!=typeof CanvasRenderingContext2D&&(CanvasRenderingContext2D.prototype.circle=function(t,e,i){this.beginPath(),this.arc(t,e,i,0,2*Math.PI,!1),this.closePath()},CanvasRenderingContext2D.prototype.square=function(t,e,i){this.beginPath(),this.rect(t-i,e-i,2*i,2*i),this.closePath()},CanvasRenderingContext2D.prototype.triangle=function(t,e,i){this.beginPath(),i*=1.15,e+=.275*i;var o=2*i,n=o/2,s=Math.sqrt(3)/6*o,r=Math.sqrt(o*o-n*n);this.moveTo(t,e-(r-s)),this.lineTo(t+n,e+s),this.lineTo(t-n,e+s),this.lineTo(t,e-(r-s)),this.closePath()},CanvasRenderingContext2D.prototype.triangleDown=function(t,e,i){this.beginPath(),i*=1.15,e-=.275*i;var o=2*i,n=o/2,s=Math.sqrt(3)/6*o,r=Math.sqrt(o*o-n*n);this.moveTo(t,e+(r-s)),this.lineTo(t+n,e-s),this.lineTo(t-n,e-s),this.lineTo(t,e+(r-s)),this.closePath()},CanvasRenderingContext2D.prototype.star=function(t,e,i){this.beginPath(),i*=.82,e+=.1*i;for(var o=0;10>o;o++){var n=o%2===0?1.3*i:.5*i;this.lineTo(t+n*Math.sin(2*o*Math.PI/10),e-n*Math.cos(2*o*Math.PI/10))}this.closePath()},CanvasRenderingContext2D.prototype.diamond=function(t,e,i){this.beginPath(),this.lineTo(t,e+i),this.lineTo(t+i,e),this.lineTo(t,e-i),this.lineTo(t-i,e),this.closePath()},CanvasRenderingContext2D.prototype.roundRect=function(t,e,i,o,n){var s=Math.PI/180;0>i-2*n&&(n=i/2),0>o-2*n&&(n=o/2),this.beginPath(),this.moveTo(t+n,e),this.lineTo(t+i-n,e),this.arc(t+i-n,e+n,n,270*s,360*s,!1),this.lineTo(t+i,e+o-n),this.arc(t+i-n,e+o-n,n,0,90*s,!1),this.lineTo(t+n,e+o),this.arc(t+n,e+o-n,n,90*s,180*s,!1),this.lineTo(t,e+n),this.arc(t+n,e+n,n,180*s,270*s,!1),this.closePath()},CanvasRenderingContext2D.prototype.ellipse=function(t,e,i,o){var n=.5522848,s=i/2*n,r=o/2*n,a=t+i,h=e+o,d=t+i/2,l=e+o/2;this.beginPath(),this.moveTo(t,l),this.bezierCurveTo(t,l-r,d-s,e,d,e),this.bezierCurveTo(d+s,e,a,l-r,a,l),this.bezierCurveTo(a,l+r,d+s,h,d,h),this.bezierCurveTo(d-s,h,t,l+r,t,l),this.closePath()},CanvasRenderingContext2D.prototype.database=function(t,e,i,o){var n=1/3,s=i,r=o*n,a=.5522848,h=s/2*a,d=r/2*a,l=t+s,u=e+r,c=t+s/2,p=e+r/2,f=e+(o-r/2),m=e+o; -this.beginPath(),this.moveTo(l,p),this.bezierCurveTo(l,p+d,c+h,u,c,u),this.bezierCurveTo(c-h,u,t,p+d,t,p),this.bezierCurveTo(t,p-d,c-h,e,c,e),this.bezierCurveTo(c+h,e,l,p-d,l,p),this.lineTo(l,f),this.bezierCurveTo(l,f+d,c+h,m,c,m),this.bezierCurveTo(c-h,m,t,f+d,t,f),this.lineTo(t,p)},CanvasRenderingContext2D.prototype.arrow=function(t,e,i,o){var n=t-o*Math.cos(i),s=e-o*Math.sin(i),r=t-.9*o*Math.cos(i),a=e-.9*o*Math.sin(i),h=n+o/3*Math.cos(i+.5*Math.PI),d=s+o/3*Math.sin(i+.5*Math.PI),l=n+o/3*Math.cos(i-.5*Math.PI),u=s+o/3*Math.sin(i-.5*Math.PI);this.beginPath(),this.moveTo(t,e),this.lineTo(h,d),this.lineTo(r,a),this.lineTo(l,u),this.closePath()},CanvasRenderingContext2D.prototype.dashedLine=function(t,e,i,o,n){this.beginPath(),this.moveTo(t,e);for(var s=n.length,r=i-t,a=o-e,h=a/r,d=Math.sqrt(r*r+a*a),l=0,u=!0,c=0,p=n[0];d>=.1;)p=n[l++%s],p>d&&(p=d),c=Math.sqrt(p*p/(1+h*h)),c=0>r?-c:c,t+=c,e+=h*c,u===!0?this.lineTo(t,e):this.moveTo(t,e),d-=p,u=!u})},function(t,e){function i(t){return P=t,p()}function o(){I=0,z=P.charAt(0)}function n(){I++,z=P.charAt(I)}function s(){return P.charAt(I+1)}function r(t){return A.test(t)}function a(t,e){if(t||(t={}),e)for(var i in e)e.hasOwnProperty(i)&&(t[i]=e[i]);return t}function h(t,e,i){for(var o=e.split("."),n=t;o.length;){var s=o.shift();o.length?(n[s]||(n[s]={}),n=n[s]):n[s]=i}}function d(t,e){for(var i,o,n=null,s=[t],r=t;r.parent;)s.push(r.parent),r=r.parent;if(r.nodes)for(i=0,o=r.nodes.length;o>i;i++)if(e.id===r.nodes[i].id){n=r.nodes[i];break}for(n||(n={id:e.id},t.node&&(n.attr=a(n.attr,t.node))),i=s.length-1;i>=0;i--){var h=s[i];h.nodes||(h.nodes=[]),-1===h.nodes.indexOf(n)&&h.nodes.push(n)}e.attr&&(n.attr=a(n.attr,e.attr))}function l(t,e){if(t.edges||(t.edges=[]),t.edges.push(e),t.edge){var i=a({},t.edge);e.attr=a(i,e.attr)}}function u(t,e,i,o,n){var s={from:e,to:i,type:o};return t.edge&&(s.attr=a({},t.edge)),s.attr=a(s.attr||{},n),s}function c(){for(L=E.NULL,N="";" "===z||" "===z||"\n"===z||"\r"===z;)n();do{var t=!1;if("#"===z){for(var e=I-1;" "===P.charAt(e)||" "===P.charAt(e);)e--;if("\n"===P.charAt(e)||""===P.charAt(e)){for(;""!=z&&"\n"!=z;)n();t=!0}}if("/"===z&&"/"===s()){for(;""!=z&&"\n"!=z;)n();t=!0}if("/"===z&&"*"===s()){for(;""!=z;){if("*"===z&&"/"===s()){n(),n();break}n()}t=!0}for(;" "===z||" "===z||"\n"===z||"\r"===z;)n()}while(t);if(""===z)return void(L=E.DELIMITER);var i=z+s();if(S[i])return L=E.DELIMITER,N=i,n(),void n();if(S[z])return L=E.DELIMITER,N=z,void n();if(r(z)||"-"===z){for(N+=z,n();r(z);)N+=z,n();return"false"===N?N=!1:"true"===N?N=!0:isNaN(Number(N))||(N=Number(N)),void(L=E.IDENTIFIER)}if('"'===z){for(n();""!=z&&('"'!=z||'"'===z&&'"'===s());)N+=z,'"'===z&&n(),n();if('"'!=z)throw _('End of string " expected');return n(),void(L=E.IDENTIFIER)}for(L=E.UNKNOWN;""!=z;)N+=z,n();throw new SyntaxError('Syntax error in part "'+x(N,30)+'"')}function p(){var t={};if(o(),c(),"strict"===N&&(t.strict=!0,c()),("graph"===N||"digraph"===N)&&(t.type=N,c()),L===E.IDENTIFIER&&(t.id=N,c()),"{"!=N)throw _("Angle bracket { expected");if(c(),f(t),"}"!=N)throw _("Angle bracket } expected");if(c(),""!==N)throw _("End of file expected");return c(),delete t.node,delete t.edge,delete t.graph,t}function f(t){for(;""!==N&&"}"!=N;)m(t),";"===N&&c()}function m(t){var e=v(t);if(e)return void b(t,e);var i=g(t);if(!i){if(L!=E.IDENTIFIER)throw _("Identifier expected");var o=N;if(c(),"="===N){if(c(),L!=E.IDENTIFIER)throw _("Identifier expected");t[o]=N,c()}else y(t,o)}}function v(t){var e=null;if("subgraph"===N&&(e={},e.type="subgraph",c(),L===E.IDENTIFIER&&(e.id=N,c())),"{"===N){if(c(),e||(e={}),e.parent=t,e.node=t.node,e.edge=t.edge,e.graph=t.graph,f(e),"}"!=N)throw _("Angle bracket } expected");c(),delete e.node,delete e.edge,delete e.graph,delete e.parent,t.subgraphs||(t.subgraphs=[]),t.subgraphs.push(e)}return e}function g(t){return"node"===N?(c(),t.node=w(),"node"):"edge"===N?(c(),t.edge=w(),"edge"):"graph"===N?(c(),t.graph=w(),"graph"):null}function y(t,e){var i={id:e},o=w();o&&(i.attr=o),d(t,i),b(t,e)}function b(t,e){for(;"->"===N||"--"===N;){var i,o=N;c();var n=v(t);if(n)i=n;else{if(L!=E.IDENTIFIER)throw _("Identifier or subgraph expected");i=N,d(t,{id:i}),c()}var s=w(),r=u(t,e,i,o,s);l(t,r),e=i}}function w(){for(var t=null;"["===N;){for(c(),t={};""!==N&&"]"!=N;){if(L!=E.IDENTIFIER)throw _("Attribute name expected");var e=N;if(c(),"="!=N)throw _("Equal sign = expected");if(c(),L!=E.IDENTIFIER)throw _("Attribute value expected");var i=N;h(t,e,i),c(),","==N&&c()}if("]"!=N)throw _("Bracket ] expected");c()}return t}function _(t){return new SyntaxError(t+', got "'+x(N,30)+'" (char '+I+")")}function x(t,e){return t.length<=e?t:t.substr(0,27)+"..."}function k(t,e,i){Array.isArray(t)?t.forEach(function(t){Array.isArray(e)?e.forEach(function(e){i(t,e)}):i(t,e)}):Array.isArray(e)?e.forEach(function(e){i(t,e)}):i(t,e)}function M(t,e,i){for(var o=e.split("."),n=o.pop(),s=t,r=0;r":!0,"--":!0},P="",I=0,z="",N="",L=E.NULL,A=/[a-zA-Z_0-9.:#]/;e.parseDOT=i,e.DOTToGraph=D},function(t,e){function i(t,e){var i=[],o=[],n={edges:{inheritColor:!1},nodes:{fixed:!1,parseColor:!1}};void 0!==e&&(void 0!==e.fixed&&(n.nodes.fixed=e.fixed),void 0!==e.parseColor&&(n.nodes.parseColor=e.parseColor),void 0!==e.inheritColor&&(n.edges.inheritColor=e.inheritColor));for(var s=t.edges,r=t.nodes,a=0;ai;i++)if(t[i]!=e[i])return!1;return!0},e.convert=function(t,i){var n;if(void 0!==t){if(null===t)return null;if(!i)return t;if("string"!=typeof i&&!(i instanceof String))throw new Error("Type must be a string");switch(i){case"boolean":case"Boolean":return Boolean(t);case"number":case"Number":return Number(t.valueOf());case"string":case"String":return String(t);case"Date":if(e.isNumber(t))return new Date(t);if(t instanceof Date)return new Date(t.valueOf());if(o.isMoment(t))return new Date(t.valueOf());if(e.isString(t))return n=s.exec(t),n?new Date(Number(n[1])):o(t).toDate();throw new Error("Cannot convert object of type "+e.getType(t)+" to type Date");case"Moment":if(e.isNumber(t))return o(t);if(t instanceof Date)return o(t.valueOf());if(o.isMoment(t))return o(t);if(e.isString(t))return n=s.exec(t),o(n?Number(n[1]):t);throw new Error("Cannot convert object of type "+e.getType(t)+" to type Date");case"ISODate":if(e.isNumber(t))return new Date(t);if(t instanceof Date)return t.toISOString();if(o.isMoment(t))return t.toDate().toISOString();if(e.isString(t))return n=s.exec(t),n?new Date(Number(n[1])).toISOString():new Date(t).toISOString();throw new Error("Cannot convert object of type "+e.getType(t)+" to type ISODate");case"ASPDate":if(e.isNumber(t))return"/Date("+t+")/";if(t instanceof Date)return"/Date("+t.valueOf()+")/";if(e.isString(t)){n=s.exec(t);var r;return r=n?new Date(Number(n[1])).valueOf():new Date(t).valueOf(),"/Date("+r+")/"}throw new Error("Cannot convert object of type "+e.getType(t)+" to type ASPDate");default:throw new Error('Unknown type "'+i+'"')}}};var s=/^\/?Date\((\-?\d+)/i;e.getType=function(t){var e=typeof t;return"object"==e?null===t?"null":t instanceof Boolean?"Boolean":t instanceof Number?"Number":t instanceof String?"String":Array.isArray(t)?"Array":t instanceof Date?"Date":"Object":"number"==e?"Number":"boolean"==e?"Boolean":"string"==e?"String":void 0===e?"undefined":e},e.copyAndExtendArray=function(t,e){for(var i=[],o=0;oi;i++)e(t[i],i,t);else for(i in t)t.hasOwnProperty(i)&&e(t[i],i,t)},e.toArray=function(t){var e=[];for(var i in t)t.hasOwnProperty(i)&&e.push(t[i]);return e},e.updateProperty=function(t,e,i){return t[e]!==i?(t[e]=i,!0):!1},e.throttle=function(t,e){var i=null,o=!1;return function n(){i?o=!0:(o=!1,t(),i=setTimeout(function(){i=null,o&&n()},e))}},e.addEventListener=function(t,e,i,o){t.addEventListener?(void 0===o&&(o=!1),"mousewheel"===e&&navigator.userAgent.indexOf("Firefox")>=0&&(e="DOMMouseScroll"),t.addEventListener(e,i,o)):t.attachEvent("on"+e,i)},e.removeEventListener=function(t,e,i,o){t.removeEventListener?(void 0===o&&(o=!1),"mousewheel"===e&&navigator.userAgent.indexOf("Firefox")>=0&&(e="DOMMouseScroll"),t.removeEventListener(e,i,o)):t.detachEvent("on"+e,i)},e.preventDefault=function(t){t||(t=window.event),t.preventDefault?t.preventDefault():t.returnValue=!1},e.getTarget=function(t){t||(t=window.event);var e;return t.target?e=t.target:t.srcElement&&(e=t.srcElement),void 0!=e.nodeType&&3==e.nodeType&&(e=e.parentNode),e},e.hasParent=function(t,e){for(var i=t;i;){if(i===e)return!0;i=i.parentNode}return!1},e.option={},e.option.asBoolean=function(t,e){return"function"==typeof t&&(t=t()),null!=t?0!=t:e||null},e.option.asNumber=function(t,e){return"function"==typeof t&&(t=t()),null!=t?Number(t)||e||null:e||null},e.option.asString=function(t,e){return"function"==typeof t&&(t=t()),null!=t?String(t):e||null},e.option.asSize=function(t,i){return"function"==typeof t&&(t=t()),e.isString(t)?t:e.isNumber(t)?t+"px":i||null},e.option.asElement=function(t,e){return"function"==typeof t&&(t=t()),t||e||null},e.hexToRGB=function(t){var e=/^#?([a-f\d])([a-f\d])([a-f\d])$/i;t=t.replace(e,function(t,e,i,o){return e+e+i+i+o+o});var i=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(t);return i?{r:parseInt(i[1],16),g:parseInt(i[2],16),b:parseInt(i[3],16)}:null},e.overrideOpacity=function(t,i){if(-1!=t.indexOf("rgba"))return t;if(-1!=t.indexOf("rgb")){var o=t.substr(t.indexOf("(")+1).replace(")","").split(",");return"rgba("+o[0]+","+o[1]+","+o[2]+","+i+")"}var o=e.hexToRGB(t);return null==o?t:"rgba("+o.r+","+o.g+","+o.b+","+i+")"},e.RGBToHex=function(t,e,i){return"#"+((1<<24)+(t<<16)+(e<<8)+i).toString(16).slice(1)},e.parseColor=function(t){var i;if(e.isString(t)===!0){if(e.isValidRGB(t)===!0){var o=t.substr(4).substr(0,t.length-5).split(",").map(function(t){return parseInt(t)});t=e.RGBToHex(o[0],o[1],o[2])}if(e.isValidHex(t)===!0){var n=e.hexToHSV(t),s={h:n.h,s:.8*n.s,v:Math.min(1,1.02*n.v)},r={h:n.h,s:Math.min(1,1.25*n.s),v:.8*n.v},a=e.HSVToHex(r.h,r.s,r.v),h=e.HSVToHex(s.h,s.s,s.v);i={background:t,border:a,highlight:{background:h,border:a},hover:{background:h,border:a}}}else i={background:t,border:t,highlight:{background:t,border:t},hover:{background:t,border:t}}}else i={},i.background=t.background||void 0,i.border=t.border||void 0,e.isString(t.highlight)?i.highlight={border:t.highlight,background:t.highlight}:(i.highlight={},i.highlight.background=t.highlight&&t.highlight.background||void 0,i.highlight.border=t.highlight&&t.highlight.border||void 0),e.isString(t.hover)?i.hover={border:t.hover,background:t.hover}:(i.hover={},i.hover.background=t.hover&&t.hover.background||void 0,i.hover.border=t.hover&&t.hover.border||void 0);return i},e.RGBToHSV=function(t,e,i){t/=255,e/=255,i/=255;var o=Math.min(t,Math.min(e,i)),n=Math.max(t,Math.max(e,i));if(o==n)return{h:0,s:0,v:o};var s=t==o?e-i:i==o?t-e:i-t,r=t==o?3:i==o?1:5,a=60*(r-s/(n-o))/360,h=(n-o)/n,d=n;return{h:a,s:h,v:d}};var r={split:function(t){var e={};return t.split(";").forEach(function(t){if(""!=t.trim()){var i=t.split(":"),o=i[0].trim(),n=i[1].trim();e[o]=n}}),e},join:function(t){return Object.keys(t).map(function(e){return e+": "+t[e]}).join("; ")}};e.addCssText=function(t,i){var o=r.split(t.style.cssText),n=r.split(i),s=e.extend(o,n);t.style.cssText=r.join(s)},e.removeCssText=function(t,e){var i=r.split(t.style.cssText),o=r.split(e);for(var n in o)o.hasOwnProperty(n)&&delete i[n];t.style.cssText=r.join(i)},e.HSVToRGB=function(t,e,i){var o,n,s,r=Math.floor(6*t),a=6*t-r,h=i*(1-e),d=i*(1-a*e),l=i*(1-(1-a)*e);switch(r%6){case 0:o=i,n=l,s=h;break;case 1:o=d,n=i,s=h;break;case 2:o=h,n=i,s=l;break;case 3:o=h,n=d,s=i;break;case 4:o=l,n=h,s=i;break;case 5:o=i,n=h,s=d}return{r:Math.floor(255*o),g:Math.floor(255*n),b:Math.floor(255*s)}},e.HSVToHex=function(t,i,o){var n=e.HSVToRGB(t,i,o);return e.RGBToHex(n.r,n.g,n.b)},e.hexToHSV=function(t){var i=e.hexToRGB(t);return e.RGBToHSV(i.r,i.g,i.b)},e.isValidHex=function(t){var e=/(^#[0-9A-F]{6}$)|(^#[0-9A-F]{3}$)/i.test(t);return e},e.isValidRGB=function(t){t=t.replace(" ","");var e=/rgb\((\d{1,3}),(\d{1,3}),(\d{1,3})\)/i.test(t);return e},e.isValidRGBA=function(t){t=t.replace(" ","");var e=/rgba\((\d{1,3}),(\d{1,3}),(\d{1,3}),(.{1,3})\)/i.test(t);return e},e.selectiveBridgeObject=function(t,i){if("object"==typeof i){for(var o=Object.create(i),n=0;n0&&e(o,t[n-1])<0;n--)t[n]=t[n-1];t[n]=o}return t},e.mergeOptions=function(t,e,i){var o=(arguments.length<=3||void 0===arguments[3]?!1:arguments[3],arguments.length<=4||void 0===arguments[4]?{}:arguments[4]);if(null===e[i])t[i]=Object.create(o[i]);else if(void 0!==e[i])if("boolean"==typeof e[i])t[i].enabled=e[i];else{void 0===e[i].enabled&&(t[i].enabled=!0);for(var n in e[i])e[i].hasOwnProperty(n)&&(t[i][n]=e[i][n])}},e.binarySearchCustom=function(t,e,i,o){for(var n=1e4,s=0,r=0,a=t.length-1;a>=r&&n>s;){var h=Math.floor((r+a)/2),d=t[h],l=void 0===o?d[i]:d[i][o],u=e(l);if(0==u)return h;-1==u?r=h+1:a=h-1,s++}return-1},e.binarySearchValue=function(t,e,i,o,n){for(var s,r,a,h,d=1e4,l=0,u=0,c=t.length-1,n=void 0!=n?n:function(t,e){return t==e?0:e>t?-1:1};c>=u&&d>l;){if(h=Math.floor(.5*(c+u)),s=t[Math.max(0,h-1)][i],r=t[h][i],a=t[Math.min(t.length-1,h+1)][i],0==n(r,e))return h;if(n(s,e)<0&&n(r,e)>0)return"before"==o?Math.max(0,h-1):h;if(n(r,e)<0&&n(a,e)>0)return"before"==o?h:Math.min(t.length-1,h+1);n(r,e)<0?u=h+1:c=h-1,l++}return-1},e.easingFunctions={linear:function(t){return t},easeInQuad:function(t){return t*t},easeOutQuad:function(t){return t*(2-t)},easeInOutQuad:function(t){return.5>t?2*t*t:-1+(4-2*t)*t},easeInCubic:function(t){return t*t*t},easeOutCubic:function(t){return--t*t*t+1},easeInOutCubic:function(t){return.5>t?4*t*t*t:(t-1)*(2*t-2)*(2*t-2)+1},easeInQuart:function(t){return t*t*t*t},easeOutQuart:function(t){return 1- --t*t*t*t},easeInOutQuart:function(t){return.5>t?8*t*t*t*t:1-8*--t*t*t*t},easeInQuint:function(t){return t*t*t*t*t},easeOutQuint:function(t){return 1+--t*t*t*t*t},easeInOutQuint:function(t){return.5>t?16*t*t*t*t*t:1+16*--t*t*t*t*t}}},function(t,e,i){t.exports="undefined"!=typeof window&&window.moment||i(3)},function(t,e,i){(function(t){!function(e,i){t.exports=i()}(this,function(){function e(){return qi.apply(null,arguments)}function i(t){qi=t}function o(t){return"[object Array]"===Object.prototype.toString.call(t)}function n(t){return t instanceof Date||"[object Date]"===Object.prototype.toString.call(t)}function s(t,e){var i,o=[];for(i=0;i0)for(i in Zi)o=Zi[i],n=e[o],p(n)||(t[o]=n);return t}function m(t){f(this,t),this._d=new Date(null!=t._d?t._d.getTime():NaN),Ki===!1&&(Ki=!0,e.updateOffset(this),Ki=!1)}function v(t){return t instanceof m||null!=t&&null!=t._isAMomentObject}function g(t){return 0>t?Math.ceil(t):Math.floor(t)}function y(t){var e=+t,i=0;return 0!==e&&isFinite(e)&&(i=g(e)),i}function b(t,e,i){var o,n=Math.min(t.length,e.length),s=Math.abs(t.length-e.length),r=0;for(o=0;n>o;o++)(i&&t[o]!==e[o]||!i&&y(t[o])!==y(e[o]))&&r++;return r+s}function _(){}function w(t){return t?t.toLowerCase().replace("_","-"):t}function x(t){for(var e,i,o,n,s=0;s0;){if(o=k(n.slice(0,e).join("-")))return o;if(i&&i.length>=e&&b(n,i,!0)>=e-1)break;e--}s++}return null}function k(e){var i=null;if(!Ji[e]&&"undefined"!=typeof t&&t&&t.exports)try{i=Xi._abbr,!function(){var t=new Error('Cannot find module "./locale"');throw t.code="MODULE_NOT_FOUND",t}(),O(i)}catch(o){}return Ji[e]}function O(t,e){var i;return t&&(i=p(e)?D(t):M(t,e),i&&(Xi=i)),Xi._abbr}function M(t,e){return null!==e?(e.abbr=t,Ji[t]=Ji[t]||new _,Ji[t].set(e),O(t),Ji[t]):(delete Ji[t],null)}function D(t){var e;if(t&&t._locale&&t._locale._abbr&&(t=t._locale._abbr),!t)return Xi;if(!o(t)){if(e=k(t))return e;t=[t]}return x(t)}function C(t,e){var i=t.toLowerCase();Qi[i]=Qi[i+"s"]=Qi[e]=t}function S(t){return"string"==typeof t?Qi[t]||Qi[t.toLowerCase()]:void 0}function T(t){var e,i,o={};for(i in t)r(t,i)&&(e=S(i),e&&(o[e]=t[i]));return o}function E(t){return t instanceof Function||"[object Function]"===Object.prototype.toString.call(t)}function P(t,i){return function(o){return null!=o?(N(this,t,o),e.updateOffset(this,i),this):I(this,t)}}function I(t,e){return t.isValid()?t._d["get"+(t._isUTC?"UTC":"")+e]():NaN}function N(t,e,i){t.isValid()&&t._d["set"+(t._isUTC?"UTC":"")+e](i)}function z(t,e){var i;if("object"==typeof t)for(i in t)this.set(i,t[i]);else if(t=S(t),E(this[t]))return this[t](e);return this}function L(t,e,i){var o=""+Math.abs(t),n=e-o.length,s=t>=0;return(s?i?"+":"":"-")+Math.pow(10,Math.max(0,n)).toString().substr(1)+o}function A(t,e,i,o){var n=o;"string"==typeof o&&(n=function(){return this[o]()}),t&&(io[t]=n),e&&(io[e[0]]=function(){return L(n.apply(this,arguments),e[1],e[2])}),i&&(io[i]=function(){return this.localeData().ordinal(n.apply(this,arguments),t)})}function F(t){return t.match(/\[[\s\S]/)?t.replace(/^\[|\]$/g,""):t.replace(/\\/g,"")}function B(t){var e,i,o=t.match($i);for(e=0,i=o.length;i>e;e++)io[o[e]]?o[e]=io[o[e]]:o[e]=F(o[e]);return function(n){var s="";for(e=0;i>e;e++)s+=o[e]instanceof Function?o[e].call(n,t):o[e];return s}}function R(t,e){return t.isValid()?(e=j(e,t.localeData()),eo[e]=eo[e]||B(e),eo[e](t)):t.localeData().invalidDate()}function j(t,e){function i(t){return e.longDateFormat(t)||t}var o=5;for(to.lastIndex=0;o>=0&&to.test(t);)t=t.replace(to,i),to.lastIndex=0,o-=1;return t}function H(t,e,i){wo[t]=E(e)?e:function(t,o){return t&&i?i:e}}function W(t,e){return r(wo,t)?wo[t](e._strict,e._locale):new RegExp(Y(t))}function Y(t){return G(t.replace("\\","").replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,function(t,e,i,o,n){return e||i||o||n}))}function G(t){return t.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}function V(t,e){var i,o=e;for("string"==typeof t&&(t=[t]),"number"==typeof e&&(o=function(t,i){i[e]=y(t)}),i=0;io;o++){if(n=h([2e3,o]),i&&!this._longMonthsParse[o]&&(this._longMonthsParse[o]=new RegExp("^"+this.months(n,"").replace(".","")+"$","i"),this._shortMonthsParse[o]=new RegExp("^"+this.monthsShort(n,"").replace(".","")+"$","i")),i||this._monthsParse[o]||(s="^"+this.months(n,"")+"|^"+this.monthsShort(n,""),this._monthsParse[o]=new RegExp(s.replace(".",""),"i")),i&&"MMMM"===e&&this._longMonthsParse[o].test(t))return o;if(i&&"MMM"===e&&this._shortMonthsParse[o].test(t))return o;if(!i&&this._monthsParse[o].test(t))return o}}function Q(t,e){var i;return t.isValid()?"string"==typeof e&&(e=t.localeData().monthsParse(e),"number"!=typeof e)?t:(i=Math.min(t.date(),X(t.year(),e)),t._d["set"+(t._isUTC?"UTC":"")+"Month"](e,i),t):t}function $(t){return null!=t?(Q(this,t),e.updateOffset(this,!0),this):I(this,"Month")}function tt(){return X(this.year(),this.month())}function et(t){return this._monthsParseExact?(r(this,"_monthsRegex")||ot.call(this),t?this._monthsShortStrictRegex:this._monthsShortRegex):this._monthsShortStrictRegex&&t?this._monthsShortStrictRegex:this._monthsShortRegex}function it(t){return this._monthsParseExact?(r(this,"_monthsRegex")||ot.call(this),t?this._monthsStrictRegex:this._monthsRegex):this._monthsStrictRegex&&t?this._monthsStrictRegex:this._monthsRegex}function ot(){function t(t,e){return e.length-t.length}var e,i,o=[],n=[],s=[];for(e=0;12>e;e++)i=h([2e3,e]),o.push(this.monthsShort(i,"")),n.push(this.months(i,"")),s.push(this.months(i,"")),s.push(this.monthsShort(i,""));for(o.sort(t),n.sort(t),s.sort(t),e=0;12>e;e++)o[e]=G(o[e]),n[e]=G(n[e]),s[e]=G(s[e]);this._monthsRegex=new RegExp("^("+s.join("|")+")","i"),this._monthsShortRegex=this._monthsRegex,this._monthsStrictRegex=new RegExp("^("+n.join("|")+")$","i"),this._monthsShortStrictRegex=new RegExp("^("+o.join("|")+")$","i")}function nt(t){var e,i=t._a;return i&&-2===l(t).overflow&&(e=i[Oo]<0||i[Oo]>11?Oo:i[Mo]<1||i[Mo]>X(i[ko],i[Oo])?Mo:i[Do]<0||i[Do]>24||24===i[Do]&&(0!==i[Co]||0!==i[So]||0!==i[To])?Do:i[Co]<0||i[Co]>59?Co:i[So]<0||i[So]>59?So:i[To]<0||i[To]>999?To:-1,l(t)._overflowDayOfYear&&(ko>e||e>Mo)&&(e=Mo),l(t)._overflowWeeks&&-1===e&&(e=Eo),l(t)._overflowWeekday&&-1===e&&(e=Po),l(t).overflow=e),t}function st(t){e.suppressDeprecationWarnings===!1&&"undefined"!=typeof console&&console.warn&&console.warn("Deprecation warning: "+t)}function rt(t,e){var i=!0;return a(function(){return i&&(st(t+"\nArguments: "+Array.prototype.slice.call(arguments).join(", ")+"\n"+(new Error).stack),i=!1),e.apply(this,arguments)},e)}function at(t,e){Fo[t]||(st(e),Fo[t]=!0)}function ht(t){var e,i,o,n,s,r,a=t._i,h=Bo.exec(a)||Ro.exec(a);if(h){for(l(t).iso=!0,e=0,i=Ho.length;i>e;e++)if(Ho[e][1].exec(h[1])){n=Ho[e][0],o=Ho[e][2]!==!1;break}if(null==n)return void(t._isValid=!1);if(h[3]){for(e=0,i=Wo.length;i>e;e++)if(Wo[e][1].exec(h[3])){s=(h[2]||" ")+Wo[e][0];break}if(null==s)return void(t._isValid=!1)}if(!o&&null!=s)return void(t._isValid=!1);if(h[4]){if(!jo.exec(h[4]))return void(t._isValid=!1);r="Z"}t._f=n+(s||"")+(r||""),kt(t)}else t._isValid=!1}function dt(t){var i=Yo.exec(t._i);return null!==i?void(t._d=new Date(+i[1])):(ht(t),void(t._isValid===!1&&(delete t._isValid,e.createFromInputFallback(t))))}function lt(t,e,i,o,n,s,r){var a=new Date(t,e,i,o,n,s,r);return 100>t&&t>=0&&isFinite(a.getFullYear())&&a.setFullYear(t),a}function ut(t){var e=new Date(Date.UTC.apply(null,arguments));return 100>t&&t>=0&&isFinite(e.getUTCFullYear())&&e.setUTCFullYear(t),e}function ct(t){return pt(t)?366:365}function pt(t){return t%4===0&&t%100!==0||t%400===0}function ft(){return pt(this.year())}function mt(t,e,i){var o=7+e-i,n=(7+ut(t,0,o).getUTCDay()-e)%7;return-n+o-1}function vt(t,e,i,o,n){var s,r,a=(7+i-o)%7,h=mt(t,o,n),d=1+7*(e-1)+a+h;return 0>=d?(s=t-1,r=ct(s)+d):d>ct(t)?(s=t+1,r=d-ct(t)):(s=t,r=d),{year:s,dayOfYear:r}}function gt(t,e,i){var o,n,s=mt(t.year(),e,i),r=Math.floor((t.dayOfYear()-s-1)/7)+1;return 1>r?(n=t.year()-1,o=r+yt(n,e,i)):r>yt(t.year(),e,i)?(o=r-yt(t.year(),e,i),n=t.year()+1):(n=t.year(),o=r),{week:o,year:n}}function yt(t,e,i){var o=mt(t,e,i),n=mt(t+1,e,i);return(ct(t)-o+n)/7}function bt(t,e,i){return null!=t?t:null!=e?e:i}function _t(t){var i=new Date(e.now());return t._useUTC?[i.getUTCFullYear(),i.getUTCMonth(),i.getUTCDate()]:[i.getFullYear(),i.getMonth(),i.getDate()]}function wt(t){var e,i,o,n,s=[];if(!t._d){for(o=_t(t),t._w&&null==t._a[Mo]&&null==t._a[Oo]&&xt(t),t._dayOfYear&&(n=bt(t._a[ko],o[ko]),t._dayOfYear>ct(n)&&(l(t)._overflowDayOfYear=!0),i=ut(n,0,t._dayOfYear),t._a[Oo]=i.getUTCMonth(),t._a[Mo]=i.getUTCDate()),e=0;3>e&&null==t._a[e];++e)t._a[e]=s[e]=o[e];for(;7>e;e++)t._a[e]=s[e]=null==t._a[e]?2===e?1:0:t._a[e];24===t._a[Do]&&0===t._a[Co]&&0===t._a[So]&&0===t._a[To]&&(t._nextDay=!0,t._a[Do]=0),t._d=(t._useUTC?ut:lt).apply(null,s),null!=t._tzm&&t._d.setUTCMinutes(t._d.getUTCMinutes()-t._tzm),t._nextDay&&(t._a[Do]=24)}}function xt(t){var e,i,o,n,s,r,a,h;e=t._w,null!=e.GG||null!=e.W||null!=e.E?(s=1,r=4,i=bt(e.GG,t._a[ko],gt(Pt(),1,4).year),o=bt(e.W,1),n=bt(e.E,1),(1>n||n>7)&&(h=!0)):(s=t._locale._week.dow,r=t._locale._week.doy,i=bt(e.gg,t._a[ko],gt(Pt(),s,r).year),o=bt(e.w,1),null!=e.d?(n=e.d,(0>n||n>6)&&(h=!0)):null!=e.e?(n=e.e+s,(e.e<0||e.e>6)&&(h=!0)):n=s),1>o||o>yt(i,s,r)?l(t)._overflowWeeks=!0:null!=h?l(t)._overflowWeekday=!0:(a=vt(i,o,n,s,r),t._a[ko]=a.year,t._dayOfYear=a.dayOfYear)}function kt(t){if(t._f===e.ISO_8601)return void ht(t);t._a=[],l(t).empty=!0;var i,o,n,s,r,a=""+t._i,h=a.length,d=0;for(n=j(t._f,t._locale).match($i)||[],i=0;i0&&l(t).unusedInput.push(r),a=a.slice(a.indexOf(o)+o.length),d+=o.length),io[s]?(o?l(t).empty=!1:l(t).unusedTokens.push(s),q(s,o,t)):t._strict&&!o&&l(t).unusedTokens.push(s);l(t).charsLeftOver=h-d,a.length>0&&l(t).unusedInput.push(a),l(t).bigHour===!0&&t._a[Do]<=12&&t._a[Do]>0&&(l(t).bigHour=void 0),t._a[Do]=Ot(t._locale,t._a[Do],t._meridiem),wt(t),nt(t)}function Ot(t,e,i){var o;return null==i?e:null!=t.meridiemHour?t.meridiemHour(e,i):null!=t.isPM?(o=t.isPM(i),o&&12>e&&(e+=12),o||12!==e||(e=0),e):e}function Mt(t){var e,i,o,n,s;if(0===t._f.length)return l(t).invalidFormat=!0,void(t._d=new Date(NaN));for(n=0;ns)&&(o=s,i=e));a(t,i||e)}function Dt(t){if(!t._d){var e=T(t._i);t._a=s([e.year,e.month,e.day||e.date,e.hour,e.minute,e.second,e.millisecond],function(t){return t&&parseInt(t,10)}),wt(t)}}function Ct(t){var e=new m(nt(St(t)));return e._nextDay&&(e.add(1,"d"),e._nextDay=void 0),e}function St(t){var e=t._i,i=t._f;return t._locale=t._locale||D(t._l),null===e||void 0===i&&""===e?c({nullInput:!0}):("string"==typeof e&&(t._i=e=t._locale.preparse(e)),v(e)?new m(nt(e)):(o(i)?Mt(t):i?kt(t):n(e)?t._d=e:Tt(t),u(t)||(t._d=null),t))}function Tt(t){var i=t._i;void 0===i?t._d=new Date(e.now()):n(i)?t._d=new Date(+i):"string"==typeof i?dt(t):o(i)?(t._a=s(i.slice(0),function(t){return parseInt(t,10)}),wt(t)):"object"==typeof i?Dt(t):"number"==typeof i?t._d=new Date(i):e.createFromInputFallback(t)}function Et(t,e,i,o,n){var s={};return"boolean"==typeof i&&(o=i,i=void 0),s._isAMomentObject=!0,s._useUTC=s._isUTC=n,s._l=i,s._i=t,s._f=e,s._strict=o,Ct(s)}function Pt(t,e,i,o){return Et(t,e,i,o,!1)}function It(t,e){var i,n;if(1===e.length&&o(e[0])&&(e=e[0]),!e.length)return Pt();for(i=e[0],n=1;nt&&(t=-t,i="-"),i+L(~~(t/60),2)+e+L(~~t%60,2)})}function Bt(t,e){var i=(e||"").match(t)||[],o=i[i.length-1]||[],n=(o+"").match(Xo)||["-",0,0],s=+(60*n[1])+y(n[2]);return"+"===n[0]?s:-s}function Rt(t,i){var o,s;return i._isUTC?(o=i.clone(),s=(v(t)||n(t)?+t:+Pt(t))-+o,o._d.setTime(+o._d+s),e.updateOffset(o,!1),o):Pt(t).local()}function jt(t){return 15*-Math.round(t._d.getTimezoneOffset()/15)}function Ht(t,i){var o,n=this._offset||0;return this.isValid()?null!=t?("string"==typeof t?t=Bt(yo,t):Math.abs(t)<16&&(t=60*t),!this._isUTC&&i&&(o=jt(this)),this._offset=t,this._isUTC=!0,null!=o&&this.add(o,"m"),n!==t&&(!i||this._changeInProgress?oe(this,Qt(t-n,"m"),1,!1):this._changeInProgress||(this._changeInProgress=!0,e.updateOffset(this,!0),this._changeInProgress=null)),this):this._isUTC?n:jt(this):null!=t?this:NaN}function Wt(t,e){return null!=t?("string"!=typeof t&&(t=-t),this.utcOffset(t,e),this):-this.utcOffset()}function Yt(t){return this.utcOffset(0,t)}function Gt(t){return this._isUTC&&(this.utcOffset(0,t),this._isUTC=!1,t&&this.subtract(jt(this),"m")),this}function Vt(){return this._tzm?this.utcOffset(this._tzm):"string"==typeof this._i&&this.utcOffset(Bt(go,this._i)),this}function Ut(t){return this.isValid()?(t=t?Pt(t).utcOffset():0,(this.utcOffset()-t)%60===0):!1}function qt(){return this.utcOffset()>this.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()}function Xt(){if(!p(this._isDSTShifted))return this._isDSTShifted;var t={};if(f(t,this),t=St(t),t._a){var e=t._isUTC?h(t._a):Pt(t._a);this._isDSTShifted=this.isValid()&&b(t._a,e.toArray())>0}else this._isDSTShifted=!1;return this._isDSTShifted}function Zt(){return this.isValid()?!this._isUTC:!1}function Kt(){return this.isValid()?this._isUTC:!1}function Jt(){return this.isValid()?this._isUTC&&0===this._offset:!1}function Qt(t,e){var i,o,n,s=t,a=null;return At(t)?s={ms:t._milliseconds,d:t._days,M:t._months}:"number"==typeof t?(s={},e?s[e]=t:s.milliseconds=t):(a=Zo.exec(t))?(i="-"===a[1]?-1:1,s={y:0,d:y(a[Mo])*i,h:y(a[Do])*i,m:y(a[Co])*i,s:y(a[So])*i,ms:y(a[To])*i}):(a=Ko.exec(t))?(i="-"===a[1]?-1:1,s={y:$t(a[2],i),M:$t(a[3],i),d:$t(a[4],i),h:$t(a[5],i),m:$t(a[6],i),s:$t(a[7],i),w:$t(a[8],i)}):null==s?s={}:"object"==typeof s&&("from"in s||"to"in s)&&(n=ee(Pt(s.from),Pt(s.to)),s={},s.ms=n.milliseconds,s.M=n.months),o=new Lt(s),At(t)&&r(t,"_locale")&&(o._locale=t._locale),o}function $t(t,e){var i=t&&parseFloat(t.replace(",","."));return(isNaN(i)?0:i)*e}function te(t,e){var i={milliseconds:0,months:0};return i.months=e.month()-t.month()+12*(e.year()-t.year()),t.clone().add(i.months,"M").isAfter(e)&&--i.months,i.milliseconds=+e-+t.clone().add(i.months,"M"),i}function ee(t,e){var i;return t.isValid()&&e.isValid()?(e=Rt(e,t),t.isBefore(e)?i=te(t,e):(i=te(e,t),i.milliseconds=-i.milliseconds,i.months=-i.months),i):{milliseconds:0,months:0}}function ie(t,e){return function(i,o){var n,s;return null===o||isNaN(+o)||(at(e,"moment()."+e+"(period, number) is deprecated. Please use moment()."+e+"(number, period)."),s=i,i=o,o=s),i="string"==typeof i?+i:i,n=Qt(i,o),oe(this,n,t),this}}function oe(t,i,o,n){var s=i._milliseconds,r=i._days,a=i._months;t.isValid()&&(n=null==n?!0:n,s&&t._d.setTime(+t._d+s*o),r&&N(t,"Date",I(t,"Date")+r*o),a&&Q(t,I(t,"Month")+a*o),n&&e.updateOffset(t,r||a))}function ne(t,e){var i=t||Pt(),o=Rt(i,this).startOf("day"),n=this.diff(o,"days",!0),s=-6>n?"sameElse":-1>n?"lastWeek":0>n?"lastDay":1>n?"sameDay":2>n?"nextDay":7>n?"nextWeek":"sameElse",r=e&&(E(e[s])?e[s]():e[s]);return this.format(r||this.localeData().calendar(s,this,Pt(i)))}function se(){return new m(this)}function re(t,e){var i=v(t)?t:Pt(t);return this.isValid()&&i.isValid()?(e=S(p(e)?"millisecond":e),"millisecond"===e?+this>+i:+i<+this.clone().startOf(e)):!1}function ae(t,e){var i=v(t)?t:Pt(t);return this.isValid()&&i.isValid()?(e=S(p(e)?"millisecond":e),"millisecond"===e?+i>+this:+this.clone().endOf(e)<+i):!1}function he(t,e,i){return this.isAfter(t,i)&&this.isBefore(e,i)}function de(t,e){var i,o=v(t)?t:Pt(t);return this.isValid()&&o.isValid()?(e=S(e||"millisecond"),"millisecond"===e?+this===+o:(i=+o,+this.clone().startOf(e)<=i&&i<=+this.clone().endOf(e))):!1}function le(t,e){return this.isSame(t,e)||this.isAfter(t,e)} +function ue(t,e){return this.isSame(t,e)||this.isBefore(t,e)}function ce(t,e,i){var o,n,s,r;return this.isValid()?(o=Rt(t,this),o.isValid()?(n=6e4*(o.utcOffset()-this.utcOffset()),e=S(e),"year"===e||"month"===e||"quarter"===e?(r=pe(this,o),"quarter"===e?r/=3:"year"===e&&(r/=12)):(s=this-o,r="second"===e?s/1e3:"minute"===e?s/6e4:"hour"===e?s/36e5:"day"===e?(s-n)/864e5:"week"===e?(s-n)/6048e5:s),i?r:g(r)):NaN):NaN}function pe(t,e){var i,o,n=12*(e.year()-t.year())+(e.month()-t.month()),s=t.clone().add(n,"months");return 0>e-s?(i=t.clone().add(n-1,"months"),o=(e-s)/(s-i)):(i=t.clone().add(n+1,"months"),o=(e-s)/(i-s)),-(n+o)}function fe(){return this.clone().locale("en").format("ddd MMM DD YYYY HH:mm:ss [GMT]ZZ")}function me(){var t=this.clone().utc();return 0s&&(e=s),He.call(this,t,e,i,o,n))}function He(t,e,i,o,n){var s=vt(t,e,i,o,n),r=ut(s.year,0,s.dayOfYear);return this.year(r.getUTCFullYear()),this.month(r.getUTCMonth()),this.date(r.getUTCDate()),this}function We(t){return null==t?Math.ceil((this.month()+1)/3):this.month(3*(t-1)+this.month()%3)}function Ye(t){return gt(t,this._week.dow,this._week.doy).week}function Ge(){return this._week.dow}function Ve(){return this._week.doy}function Ue(t){var e=this.localeData().week(this);return null==t?e:this.add(7*(t-e),"d")}function qe(t){var e=gt(this,1,4).week;return null==t?e:this.add(7*(t-e),"d")}function Xe(t,e){return"string"!=typeof t?t:isNaN(t)?(t=e.weekdaysParse(t),"number"==typeof t?t:null):parseInt(t,10)}function Ze(t,e){return o(this._weekdays)?this._weekdays[t.day()]:this._weekdays[this._weekdays.isFormat.test(e)?"format":"standalone"][t.day()]}function Ke(t){return this._weekdaysShort[t.day()]}function Je(t){return this._weekdaysMin[t.day()]}function Qe(t,e,i){var o,n,s;for(this._weekdaysParse||(this._weekdaysParse=[],this._minWeekdaysParse=[],this._shortWeekdaysParse=[],this._fullWeekdaysParse=[]),o=0;7>o;o++){if(n=Pt([2e3,1]).day(o),i&&!this._fullWeekdaysParse[o]&&(this._fullWeekdaysParse[o]=new RegExp("^"+this.weekdays(n,"").replace(".",".?")+"$","i"),this._shortWeekdaysParse[o]=new RegExp("^"+this.weekdaysShort(n,"").replace(".",".?")+"$","i"),this._minWeekdaysParse[o]=new RegExp("^"+this.weekdaysMin(n,"").replace(".",".?")+"$","i")),this._weekdaysParse[o]||(s="^"+this.weekdays(n,"")+"|^"+this.weekdaysShort(n,"")+"|^"+this.weekdaysMin(n,""),this._weekdaysParse[o]=new RegExp(s.replace(".",""),"i")),i&&"dddd"===e&&this._fullWeekdaysParse[o].test(t))return o;if(i&&"ddd"===e&&this._shortWeekdaysParse[o].test(t))return o;if(i&&"dd"===e&&this._minWeekdaysParse[o].test(t))return o;if(!i&&this._weekdaysParse[o].test(t))return o}}function $e(t){if(!this.isValid())return null!=t?this:NaN;var e=this._isUTC?this._d.getUTCDay():this._d.getDay();return null!=t?(t=Xe(t,this.localeData()),this.add(t-e,"d")):e}function ti(t){if(!this.isValid())return null!=t?this:NaN;var e=(this.day()+7-this.localeData()._week.dow)%7;return null==t?e:this.add(t-e,"d")}function ei(t){return this.isValid()?null==t?this.day()||7:this.day(this.day()%7?t:t-7):null!=t?this:NaN}function ii(t){var e=Math.round((this.clone().startOf("day")-this.clone().startOf("year"))/864e5)+1;return null==t?e:this.add(t-e,"d")}function oi(){return this.hours()%12||12}function ni(t,e){A(t,0,0,function(){return this.localeData().meridiem(this.hours(),this.minutes(),e)})}function si(t,e){return e._meridiemParse}function ri(t){return"p"===(t+"").toLowerCase().charAt(0)}function ai(t,e,i){return t>11?i?"pm":"PM":i?"am":"AM"}function hi(t,e){e[To]=y(1e3*("0."+t))}function di(){return this._isUTC?"UTC":""}function li(){return this._isUTC?"Coordinated Universal Time":""}function ui(t){return Pt(1e3*t)}function ci(){return Pt.apply(null,arguments).parseZone()}function pi(t,e,i){var o=this._calendar[t];return E(o)?o.call(e,i):o}function fi(t){var e=this._longDateFormat[t],i=this._longDateFormat[t.toUpperCase()];return e||!i?e:(this._longDateFormat[t]=i.replace(/MMMM|MM|DD|dddd/g,function(t){return t.slice(1)}),this._longDateFormat[t])}function mi(){return this._invalidDate}function vi(t){return this._ordinal.replace("%d",t)}function gi(t){return t}function yi(t,e,i,o){var n=this._relativeTime[i];return E(n)?n(t,e,i,o):n.replace(/%d/i,t)}function bi(t,e){var i=this._relativeTime[t>0?"future":"past"];return E(i)?i(e):i.replace(/%s/i,e)}function _i(t){var e,i;for(i in t)e=t[i],E(e)?this[i]=e:this["_"+i]=e;this._ordinalParseLenient=new RegExp(this._ordinalParse.source+"|"+/\d{1,2}/.source)}function wi(t,e,i,o){var n=D(),s=h().set(o,e);return n[i](s,t)}function xi(t,e,i,o,n){if("number"==typeof t&&(e=t,t=void 0),t=t||"",null!=e)return wi(t,e,i,n);var s,r=[];for(s=0;o>s;s++)r[s]=wi(t,s,i,n);return r}function ki(t,e){return xi(t,e,"months",12,"month")}function Oi(t,e){return xi(t,e,"monthsShort",12,"month")}function Mi(t,e){return xi(t,e,"weekdays",7,"day")}function Di(t,e){return xi(t,e,"weekdaysShort",7,"day")}function Ci(t,e){return xi(t,e,"weekdaysMin",7,"day")}function Si(){var t=this._data;return this._milliseconds=wn(this._milliseconds),this._days=wn(this._days),this._months=wn(this._months),t.milliseconds=wn(t.milliseconds),t.seconds=wn(t.seconds),t.minutes=wn(t.minutes),t.hours=wn(t.hours),t.months=wn(t.months),t.years=wn(t.years),this}function Ti(t,e,i,o){var n=Qt(e,i);return t._milliseconds+=o*n._milliseconds,t._days+=o*n._days,t._months+=o*n._months,t._bubble()}function Ei(t,e){return Ti(this,t,e,1)}function Pi(t,e){return Ti(this,t,e,-1)}function Ii(t){return 0>t?Math.floor(t):Math.ceil(t)}function Ni(){var t,e,i,o,n,s=this._milliseconds,r=this._days,a=this._months,h=this._data;return s>=0&&r>=0&&a>=0||0>=s&&0>=r&&0>=a||(s+=864e5*Ii(Li(a)+r),r=0,a=0),h.milliseconds=s%1e3,t=g(s/1e3),h.seconds=t%60,e=g(t/60),h.minutes=e%60,i=g(e/60),h.hours=i%24,r+=g(i/24),n=g(zi(r)),a+=n,r-=Ii(Li(n)),o=g(a/12),a%=12,h.days=r,h.months=a,h.years=o,this}function zi(t){return 4800*t/146097}function Li(t){return 146097*t/4800}function Ai(t){var e,i,o=this._milliseconds;if(t=S(t),"month"===t||"year"===t)return e=this._days+o/864e5,i=this._months+zi(e),"month"===t?i:i/12;switch(e=this._days+Math.round(Li(this._months)),t){case"week":return e/7+o/6048e5;case"day":return e+o/864e5;case"hour":return 24*e+o/36e5;case"minute":return 1440*e+o/6e4;case"second":return 86400*e+o/1e3;case"millisecond":return Math.floor(864e5*e)+o;default:throw new Error("Unknown unit "+t)}}function Fi(){return this._milliseconds+864e5*this._days+this._months%12*2592e6+31536e6*y(this._months/12)}function Bi(t){return function(){return this.as(t)}}function Ri(t){return t=S(t),this[t+"s"]()}function ji(t){return function(){return this._data[t]}}function Hi(){return g(this.days()/7)}function Wi(t,e,i,o,n){return n.relativeTime(e||1,!!i,t,o)}function Yi(t,e,i){var o=Qt(t).abs(),n=Fn(o.as("s")),s=Fn(o.as("m")),r=Fn(o.as("h")),a=Fn(o.as("d")),h=Fn(o.as("M")),d=Fn(o.as("y")),l=n=s&&["m"]||s=r&&["h"]||r=a&&["d"]||a=h&&["M"]||h=d&&["y"]||["yy",d];return l[2]=e,l[3]=+t>0,l[4]=i,Wi.apply(null,l)}function Gi(t,e){return void 0===Bn[t]?!1:void 0===e?Bn[t]:(Bn[t]=e,!0)}function Vi(t){var e=this.localeData(),i=Yi(this,!t,e);return t&&(i=e.pastFuture(+this,i)),e.postformat(i)}function Ui(){var t,e,i,o=Rn(this._milliseconds)/1e3,n=Rn(this._days),s=Rn(this._months);t=g(o/60),e=g(t/60),o%=60,t%=60,i=g(s/12),s%=12;var r=i,a=s,h=n,d=e,l=t,u=o,c=this.asSeconds();return c?(0>c?"-":"")+"P"+(r?r+"Y":"")+(a?a+"M":"")+(h?h+"D":"")+(d||l||u?"T":"")+(d?d+"H":"")+(l?l+"M":"")+(u?u+"S":""):"P0D"}var qi,Xi,Zi=e.momentProperties=[],Ki=!1,Ji={},Qi={},$i=/(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g,to=/(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g,eo={},io={},oo=/\d/,no=/\d\d/,so=/\d{3}/,ro=/\d{4}/,ao=/[+-]?\d{6}/,ho=/\d\d?/,lo=/\d\d\d\d?/,uo=/\d\d\d\d\d\d?/,co=/\d{1,3}/,po=/\d{1,4}/,fo=/[+-]?\d{1,6}/,mo=/\d+/,vo=/[+-]?\d+/,go=/Z|[+-]\d\d:?\d\d/gi,yo=/Z|[+-]\d\d(?::?\d\d)?/gi,bo=/[+-]?\d+(\.\d{1,3})?/,_o=/[0-9]*['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+|[\u0600-\u06FF\/]+(\s*?[\u0600-\u06FF]+){1,2}/i,wo={},xo={},ko=0,Oo=1,Mo=2,Do=3,Co=4,So=5,To=6,Eo=7,Po=8;A("M",["MM",2],"Mo",function(){return this.month()+1}),A("MMM",0,0,function(t){return this.localeData().monthsShort(this,t)}),A("MMMM",0,0,function(t){return this.localeData().months(this,t)}),C("month","M"),H("M",ho),H("MM",ho,no),H("MMM",function(t,e){return e.monthsShortRegex(t)}),H("MMMM",function(t,e){return e.monthsRegex(t)}),V(["M","MM"],function(t,e){e[Oo]=y(t)-1}),V(["MMM","MMMM"],function(t,e,i,o){var n=i._locale.monthsParse(t,o,i._strict);null!=n?e[Oo]=n:l(i).invalidMonth=t});var Io=/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/,No="January_February_March_April_May_June_July_August_September_October_November_December".split("_"),zo="Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),Lo=_o,Ao=_o,Fo={};e.suppressDeprecationWarnings=!1;var Bo=/^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?/,Ro=/^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?/,jo=/Z|[+-]\d\d(?::?\d\d)?/,Ho=[["YYYYYY-MM-DD",/[+-]\d{6}-\d\d-\d\d/],["YYYY-MM-DD",/\d{4}-\d\d-\d\d/],["GGGG-[W]WW-E",/\d{4}-W\d\d-\d/],["GGGG-[W]WW",/\d{4}-W\d\d/,!1],["YYYY-DDD",/\d{4}-\d{3}/],["YYYY-MM",/\d{4}-\d\d/,!1],["YYYYYYMMDD",/[+-]\d{10}/],["YYYYMMDD",/\d{8}/],["GGGG[W]WWE",/\d{4}W\d{3}/],["GGGG[W]WW",/\d{4}W\d{2}/,!1],["YYYYDDD",/\d{7}/]],Wo=[["HH:mm:ss.SSSS",/\d\d:\d\d:\d\d\.\d+/],["HH:mm:ss,SSSS",/\d\d:\d\d:\d\d,\d+/],["HH:mm:ss",/\d\d:\d\d:\d\d/],["HH:mm",/\d\d:\d\d/],["HHmmss.SSSS",/\d\d\d\d\d\d\.\d+/],["HHmmss,SSSS",/\d\d\d\d\d\d,\d+/],["HHmmss",/\d\d\d\d\d\d/],["HHmm",/\d\d\d\d/],["HH",/\d\d/]],Yo=/^\/?Date\((\-?\d+)/i;e.createFromInputFallback=rt("moment construction falls back to js Date. This is discouraged and will be removed in upcoming major release. Please refer to https://github.com/moment/moment/issues/1407 for more info.",function(t){t._d=new Date(t._i+(t._useUTC?" UTC":""))}),A("Y",0,0,function(){var t=this.year();return 9999>=t?""+t:"+"+t}),A(0,["YY",2],0,function(){return this.year()%100}),A(0,["YYYY",4],0,"year"),A(0,["YYYYY",5],0,"year"),A(0,["YYYYYY",6,!0],0,"year"),C("year","y"),H("Y",vo),H("YY",ho,no),H("YYYY",po,ro),H("YYYYY",fo,ao),H("YYYYYY",fo,ao),V(["YYYYY","YYYYYY"],ko),V("YYYY",function(t,i){i[ko]=2===t.length?e.parseTwoDigitYear(t):y(t)}),V("YY",function(t,i){i[ko]=e.parseTwoDigitYear(t)}),V("Y",function(t,e){e[ko]=parseInt(t,10)}),e.parseTwoDigitYear=function(t){return y(t)+(y(t)>68?1900:2e3)};var Go=P("FullYear",!1);e.ISO_8601=function(){};var Vo=rt("moment().min is deprecated, use moment.min instead. https://github.com/moment/moment/issues/1548",function(){var t=Pt.apply(null,arguments);return this.isValid()&&t.isValid()?this>t?this:t:c()}),Uo=rt("moment().max is deprecated, use moment.max instead. https://github.com/moment/moment/issues/1548",function(){var t=Pt.apply(null,arguments);return this.isValid()&&t.isValid()?t>this?this:t:c()}),qo=function(){return Date.now?Date.now():+new Date};Ft("Z",":"),Ft("ZZ",""),H("Z",yo),H("ZZ",yo),V(["Z","ZZ"],function(t,e,i){i._useUTC=!0,i._tzm=Bt(yo,t)});var Xo=/([\+\-]|\d\d)/gi;e.updateOffset=function(){};var Zo=/^(\-)?(?:(\d*)[. ])?(\d+)\:(\d+)(?:\:(\d+)\.?(\d{3})?\d*)?$/,Ko=/^(-)?P(?:(?:([0-9,.]*)Y)?(?:([0-9,.]*)M)?(?:([0-9,.]*)D)?(?:T(?:([0-9,.]*)H)?(?:([0-9,.]*)M)?(?:([0-9,.]*)S)?)?|([0-9,.]*)W)$/;Qt.fn=Lt.prototype;var Jo=ie(1,"add"),Qo=ie(-1,"subtract");e.defaultFormat="YYYY-MM-DDTHH:mm:ssZ";var $o=rt("moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.",function(t){return void 0===t?this.localeData():this.locale(t)});A(0,["gg",2],0,function(){return this.weekYear()%100}),A(0,["GG",2],0,function(){return this.isoWeekYear()%100}),Le("gggg","weekYear"),Le("ggggg","weekYear"),Le("GGGG","isoWeekYear"),Le("GGGGG","isoWeekYear"),C("weekYear","gg"),C("isoWeekYear","GG"),H("G",vo),H("g",vo),H("GG",ho,no),H("gg",ho,no),H("GGGG",po,ro),H("gggg",po,ro),H("GGGGG",fo,ao),H("ggggg",fo,ao),U(["gggg","ggggg","GGGG","GGGGG"],function(t,e,i,o){e[o.substr(0,2)]=y(t)}),U(["gg","GG"],function(t,i,o,n){i[n]=e.parseTwoDigitYear(t)}),A("Q",0,"Qo","quarter"),C("quarter","Q"),H("Q",oo),V("Q",function(t,e){e[Oo]=3*(y(t)-1)}),A("w",["ww",2],"wo","week"),A("W",["WW",2],"Wo","isoWeek"),C("week","w"),C("isoWeek","W"),H("w",ho),H("ww",ho,no),H("W",ho),H("WW",ho,no),U(["w","ww","W","WW"],function(t,e,i,o){e[o.substr(0,1)]=y(t)});var tn={dow:0,doy:6};A("D",["DD",2],"Do","date"),C("date","D"),H("D",ho),H("DD",ho,no),H("Do",function(t,e){return t?e._ordinalParse:e._ordinalParseLenient}),V(["D","DD"],Mo),V("Do",function(t,e){e[Mo]=y(t.match(ho)[0],10)});var en=P("Date",!0);A("d",0,"do","day"),A("dd",0,0,function(t){return this.localeData().weekdaysMin(this,t)}),A("ddd",0,0,function(t){return this.localeData().weekdaysShort(this,t)}),A("dddd",0,0,function(t){return this.localeData().weekdays(this,t)}),A("e",0,0,"weekday"),A("E",0,0,"isoWeekday"),C("day","d"),C("weekday","e"),C("isoWeekday","E"),H("d",ho),H("e",ho),H("E",ho),H("dd",_o),H("ddd",_o),H("dddd",_o),U(["dd","ddd","dddd"],function(t,e,i,o){var n=i._locale.weekdaysParse(t,o,i._strict);null!=n?e.d=n:l(i).invalidWeekday=t}),U(["d","e","E"],function(t,e,i,o){e[o]=y(t)});var on="Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),nn="Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),sn="Su_Mo_Tu_We_Th_Fr_Sa".split("_");A("DDD",["DDDD",3],"DDDo","dayOfYear"),C("dayOfYear","DDD"),H("DDD",co),H("DDDD",so),V(["DDD","DDDD"],function(t,e,i){i._dayOfYear=y(t)}),A("H",["HH",2],0,"hour"),A("h",["hh",2],0,oi),A("hmm",0,0,function(){return""+oi.apply(this)+L(this.minutes(),2)}),A("hmmss",0,0,function(){return""+oi.apply(this)+L(this.minutes(),2)+L(this.seconds(),2)}),A("Hmm",0,0,function(){return""+this.hours()+L(this.minutes(),2)}),A("Hmmss",0,0,function(){return""+this.hours()+L(this.minutes(),2)+L(this.seconds(),2)}),ni("a",!0),ni("A",!1),C("hour","h"),H("a",si),H("A",si),H("H",ho),H("h",ho),H("HH",ho,no),H("hh",ho,no),H("hmm",lo),H("hmmss",uo),H("Hmm",lo),H("Hmmss",uo),V(["H","HH"],Do),V(["a","A"],function(t,e,i){i._isPm=i._locale.isPM(t),i._meridiem=t}),V(["h","hh"],function(t,e,i){e[Do]=y(t),l(i).bigHour=!0}),V("hmm",function(t,e,i){var o=t.length-2;e[Do]=y(t.substr(0,o)),e[Co]=y(t.substr(o)),l(i).bigHour=!0}),V("hmmss",function(t,e,i){var o=t.length-4,n=t.length-2;e[Do]=y(t.substr(0,o)),e[Co]=y(t.substr(o,2)),e[So]=y(t.substr(n)),l(i).bigHour=!0}),V("Hmm",function(t,e,i){var o=t.length-2;e[Do]=y(t.substr(0,o)),e[Co]=y(t.substr(o))}),V("Hmmss",function(t,e,i){var o=t.length-4,n=t.length-2;e[Do]=y(t.substr(0,o)),e[Co]=y(t.substr(o,2)),e[So]=y(t.substr(n))});var rn=/[ap]\.?m?\.?/i,an=P("Hours",!0);A("m",["mm",2],0,"minute"),C("minute","m"),H("m",ho),H("mm",ho,no),V(["m","mm"],Co);var hn=P("Minutes",!1);A("s",["ss",2],0,"second"),C("second","s"),H("s",ho),H("ss",ho,no),V(["s","ss"],So);var dn=P("Seconds",!1);A("S",0,0,function(){return~~(this.millisecond()/100)}),A(0,["SS",2],0,function(){return~~(this.millisecond()/10)}),A(0,["SSS",3],0,"millisecond"),A(0,["SSSS",4],0,function(){return 10*this.millisecond()}),A(0,["SSSSS",5],0,function(){return 100*this.millisecond()}),A(0,["SSSSSS",6],0,function(){return 1e3*this.millisecond()}),A(0,["SSSSSSS",7],0,function(){return 1e4*this.millisecond()}),A(0,["SSSSSSSS",8],0,function(){return 1e5*this.millisecond()}),A(0,["SSSSSSSSS",9],0,function(){return 1e6*this.millisecond()}),C("millisecond","ms"),H("S",co,oo),H("SS",co,no),H("SSS",co,so);var ln;for(ln="SSSS";ln.length<=9;ln+="S")H(ln,mo);for(ln="S";ln.length<=9;ln+="S")V(ln,hi);var un=P("Milliseconds",!1);A("z",0,0,"zoneAbbr"),A("zz",0,0,"zoneName");var cn=m.prototype;cn.add=Jo,cn.calendar=ne,cn.clone=se,cn.diff=ce,cn.endOf=Oe,cn.format=ve,cn.from=ge,cn.fromNow=ye,cn.to=be,cn.toNow=_e,cn.get=z,cn.invalidAt=Ne,cn.isAfter=re,cn.isBefore=ae,cn.isBetween=he,cn.isSame=de,cn.isSameOrAfter=le,cn.isSameOrBefore=ue,cn.isValid=Pe,cn.lang=$o,cn.locale=we,cn.localeData=xe,cn.max=Uo,cn.min=Vo,cn.parsingFlags=Ie,cn.set=z,cn.startOf=ke,cn.subtract=Qo,cn.toArray=Se,cn.toObject=Te,cn.toDate=Ce,cn.toISOString=me,cn.toJSON=Ee,cn.toString=fe,cn.unix=De,cn.valueOf=Me,cn.creationData=ze,cn.year=Go,cn.isLeapYear=ft,cn.weekYear=Ae,cn.isoWeekYear=Fe,cn.quarter=cn.quarters=We,cn.month=$,cn.daysInMonth=tt,cn.week=cn.weeks=Ue,cn.isoWeek=cn.isoWeeks=qe,cn.weeksInYear=Re,cn.isoWeeksInYear=Be,cn.date=en,cn.day=cn.days=$e,cn.weekday=ti,cn.isoWeekday=ei,cn.dayOfYear=ii,cn.hour=cn.hours=an,cn.minute=cn.minutes=hn,cn.second=cn.seconds=dn,cn.millisecond=cn.milliseconds=un,cn.utcOffset=Ht,cn.utc=Yt,cn.local=Gt,cn.parseZone=Vt,cn.hasAlignedHourOffset=Ut,cn.isDST=qt,cn.isDSTShifted=Xt,cn.isLocal=Zt,cn.isUtcOffset=Kt,cn.isUtc=Jt,cn.isUTC=Jt,cn.zoneAbbr=di,cn.zoneName=li,cn.dates=rt("dates accessor is deprecated. Use date instead.",en),cn.months=rt("months accessor is deprecated. Use month instead",$),cn.years=rt("years accessor is deprecated. Use year instead",Go),cn.zone=rt("moment().zone is deprecated, use moment().utcOffset instead. https://github.com/moment/moment/issues/1779",Wt);var pn=cn,fn={sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},mn={LTS:"h:mm:ss A",LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"},vn="Invalid date",gn="%d",yn=/\d{1,2}/,bn={future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},_n=_.prototype;_n._calendar=fn,_n.calendar=pi,_n._longDateFormat=mn,_n.longDateFormat=fi,_n._invalidDate=vn,_n.invalidDate=mi,_n._ordinal=gn,_n.ordinal=vi,_n._ordinalParse=yn,_n.preparse=gi,_n.postformat=gi,_n._relativeTime=bn,_n.relativeTime=yi,_n.pastFuture=bi,_n.set=_i,_n.months=Z,_n._months=No,_n.monthsShort=K,_n._monthsShort=zo,_n.monthsParse=J,_n._monthsRegex=Ao,_n.monthsRegex=it,_n._monthsShortRegex=Lo,_n.monthsShortRegex=et,_n.week=Ye,_n._week=tn,_n.firstDayOfYear=Ve,_n.firstDayOfWeek=Ge,_n.weekdays=Ze,_n._weekdays=on,_n.weekdaysMin=Je,_n._weekdaysMin=sn,_n.weekdaysShort=Ke,_n._weekdaysShort=nn,_n.weekdaysParse=Qe,_n.isPM=ri,_n._meridiemParse=rn,_n.meridiem=ai,O("en",{ordinalParse:/\d{1,2}(th|st|nd|rd)/,ordinal:function(t){var e=t%10,i=1===y(t%100/10)?"th":1===e?"st":2===e?"nd":3===e?"rd":"th";return t+i}}),e.lang=rt("moment.lang is deprecated. Use moment.locale instead.",O),e.langData=rt("moment.langData is deprecated. Use moment.localeData instead.",D);var wn=Math.abs,xn=Bi("ms"),kn=Bi("s"),On=Bi("m"),Mn=Bi("h"),Dn=Bi("d"),Cn=Bi("w"),Sn=Bi("M"),Tn=Bi("y"),En=ji("milliseconds"),Pn=ji("seconds"),In=ji("minutes"),Nn=ji("hours"),zn=ji("days"),Ln=ji("months"),An=ji("years"),Fn=Math.round,Bn={s:45,m:45,h:22,d:26,M:11},Rn=Math.abs,jn=Lt.prototype;jn.abs=Si,jn.add=Ei,jn.subtract=Pi,jn.as=Ai,jn.asMilliseconds=xn,jn.asSeconds=kn,jn.asMinutes=On,jn.asHours=Mn,jn.asDays=Dn,jn.asWeeks=Cn,jn.asMonths=Sn,jn.asYears=Tn,jn.valueOf=Fi,jn._bubble=Ni,jn.get=Ri,jn.milliseconds=En,jn.seconds=Pn,jn.minutes=In,jn.hours=Nn,jn.days=zn,jn.weeks=Hi,jn.months=Ln,jn.years=An,jn.humanize=Vi,jn.toISOString=Ui,jn.toString=Ui,jn.toJSON=Ui,jn.locale=we,jn.localeData=xe,jn.toIsoString=rt("toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)",Ui),jn.lang=$o,A("X",0,0,"unix"),A("x",0,0,"valueOf"),H("x",vo),H("X",bo),V("X",function(t,e,i){i._d=new Date(1e3*parseFloat(t,10))}),V("x",function(t,e,i){i._d=new Date(y(t))}),e.version="2.11.2",i(Pt),e.fn=pn,e.min=Nt,e.max=zt,e.now=qo,e.utc=h,e.unix=ui,e.months=ki,e.isDate=n,e.locale=O,e.invalid=c,e.duration=Qt,e.isMoment=v,e.weekdays=Mi,e.parseZone=ci,e.localeData=D,e.isDuration=At,e.monthsShort=Oi,e.weekdaysMin=Ci,e.defineLocale=M,e.weekdaysShort=Di,e.normalizeUnits=S,e.relativeTimeThreshold=Gi,e.prototype=pn;var Hn=e;return Hn})}).call(e,i(4)(t))},function(t,e){t.exports=function(t){return t.webpackPolyfill||(t.deprecate=function(){},t.paths=[],t.children=[],t.webpackPolyfill=1),t}},function(t,e){function i(t){throw new Error("Cannot find module '"+t+"'.")}i.keys=function(){return[]},i.resolve=i,t.exports=i,i.id=5},function(t,e){(function(e){function i(t,e,i){var o=e&&i||0,n=0;for(e=e||[],t.toLowerCase().replace(/[0-9a-f]{2}/g,function(t){16>n&&(e[o+n++]=u[t])});16>n;)e[o+n++]=0;return e}function o(t,e){var i=e||0,o=l;return o[t[i++]]+o[t[i++]]+o[t[i++]]+o[t[i++]]+"-"+o[t[i++]]+o[t[i++]]+"-"+o[t[i++]]+o[t[i++]]+"-"+o[t[i++]]+o[t[i++]]+"-"+o[t[i++]]+o[t[i++]]+o[t[i++]]+o[t[i++]]+o[t[i++]]+o[t[i++]]}function n(t,e,i){var n=e&&i||0,s=e||[];t=t||{};var r=void 0!==t.clockseq?t.clockseq:m,a=void 0!==t.msecs?t.msecs:(new Date).getTime(),h=void 0!==t.nsecs?t.nsecs:g+1,d=a-v+(h-g)/1e4;if(0>d&&void 0===t.clockseq&&(r=r+1&16383),(0>d||a>v)&&void 0===t.nsecs&&(h=0),h>=1e4)throw new Error("uuid.v1(): Can't create more than 10M uuids/sec");v=a,g=h,m=r,a+=122192928e5;var l=(1e4*(268435455&a)+h)%4294967296;s[n++]=l>>>24&255,s[n++]=l>>>16&255,s[n++]=l>>>8&255,s[n++]=255&l;var u=a/4294967296*1e4&268435455;s[n++]=u>>>8&255,s[n++]=255&u,s[n++]=u>>>24&15|16,s[n++]=u>>>16&255,s[n++]=r>>>8|128,s[n++]=255&r;for(var c=t.node||f,p=0;6>p;p++)s[n+p]=c[p];return e?e:o(s)}function s(t,e,i){var n=e&&i||0;"string"==typeof t&&(e="binary"==t?new Array(16):null,t=null),t=t||{};var s=t.random||(t.rng||r)();if(s[6]=15&s[6]|64,s[8]=63&s[8]|128,e)for(var a=0;16>a;a++)e[n+a]=s[a];return e||o(s)}var r,a="undefined"!=typeof window?window:"undefined"!=typeof e?e:null;if(a&&a.crypto&&crypto.getRandomValues){var h=new Uint8Array(16);r=function(){return crypto.getRandomValues(h),h}}if(!r){var d=new Array(16);r=function(){for(var t,e=0;16>e;e++)0===(3&e)&&(t=4294967296*Math.random()),d[e]=t>>>((3&e)<<3)&255;return d}}for(var l=[],u={},c=0;256>c;c++)l[c]=(c+256).toString(16).substr(1),u[l[c]]=c;var p=r(),f=[1|p[0],p[1],p[2],p[3],p[4],p[5]],m=16383&(p[6]<<8|p[7]),v=0,g=0,y=s;y.v1=n,y.v4=s,y.parse=i,y.unparse=o,t.exports=y}).call(e,function(){return this}())},function(t,e){e.prepareElements=function(t){for(var e in t)t.hasOwnProperty(e)&&(t[e].redundant=t[e].used,t[e].used=[])},e.cleanupElements=function(t){for(var e in t)if(t.hasOwnProperty(e)&&t[e].redundant){for(var i=0;i0?(o=e[t].redundant[0],e[t].redundant.shift()):(o=document.createElementNS("http://www.w3.org/2000/svg",t),i.appendChild(o)):(o=document.createElementNS("http://www.w3.org/2000/svg",t),e[t]={used:[],redundant:[]},i.appendChild(o)),e[t].used.push(o),o},e.getDOMElement=function(t,e,i,o){var n;return e.hasOwnProperty(t)?e[t].redundant.length>0?(n=e[t].redundant[0],e[t].redundant.shift()):(n=document.createElement(t),void 0!==o?i.insertBefore(n,o):i.appendChild(n)):(n=document.createElement(t),e[t]={used:[],redundant:[]},void 0!==o?i.insertBefore(n,o):i.appendChild(n)),e[t].used.push(n),n},e.drawPoint=function(t,i,o,n,s,r){var a;if("circle"==o.style?(a=e.getSVGElement("circle",n,s),a.setAttributeNS(null,"cx",t),a.setAttributeNS(null,"cy",i),a.setAttributeNS(null,"r",.5*o.size)):(a=e.getSVGElement("rect",n,s),a.setAttributeNS(null,"x",t-.5*o.size),a.setAttributeNS(null,"y",i-.5*o.size),a.setAttributeNS(null,"width",o.size),a.setAttributeNS(null,"height",o.size)),void 0!==o.styles&&a.setAttributeNS(null,"style",o.styles),a.setAttributeNS(null,"class",o.className+" vis-point"),r){var h=e.getSVGElement("text",n,s);r.xOffset&&(t+=r.xOffset),r.yOffset&&(i+=r.yOffset),r.content&&(h.textContent=r.content),r.className&&h.setAttributeNS(null,"class",r.className+" vis-label"),h.setAttributeNS(null,"x",t),h.setAttributeNS(null,"y",i)}return a},e.drawBar=function(t,i,o,n,s,r,a,h){if(0!=n){0>n&&(n*=-1,i-=n);var d=e.getSVGElement("rect",r,a);d.setAttributeNS(null,"x",t-.5*o),d.setAttributeNS(null,"y",i),d.setAttributeNS(null,"width",o),d.setAttributeNS(null,"height",n),d.setAttributeNS(null,"class",s),h&&d.setAttributeNS(null,"style",h)}}},function(t,e,i){function o(t,e){if(t&&!Array.isArray(t)&&(e=t,t=null),this._options=e||{},this._data={},this.length=0,this._fieldId=this._options.fieldId||"id",this._type={},this._options.type)for(var i=Object.keys(this._options.type),o=0,n=i.length;n>o;o++){var s=i[o],r=this._options.type[s];"Date"==r||"ISODate"==r||"ASPDate"==r?this._type[s]="Date":this._type[s]=r}if(this._options.convert)throw new Error('Option "convert" is deprecated. Use "type" instead.');this._subscribers={},t&&this.add(t),this.setOptions(e)}var n=i(1),s=i(9);o.prototype.setOptions=function(t){t&&void 0!==t.queue&&(t.queue===!1?this._queue&&(this._queue.destroy(),delete this._queue):(this._queue||(this._queue=s.extend(this,{replace:["add","update","remove"]})),"object"==typeof t.queue&&this._queue.setOptions(t.queue)))},o.prototype.on=function(t,e){var i=this._subscribers[t];i||(i=[],this._subscribers[t]=i),i.push({callback:e})},o.prototype.subscribe=function(){throw new Error("DataSet.subscribe is deprecated. Use DataSet.on instead.")},o.prototype.off=function(t,e){var i=this._subscribers[t];i&&(this._subscribers[t]=i.filter(function(t){return t.callback!=e}))},o.prototype.unsubscribe=function(){throw new Error("DataSet.unsubscribe is deprecated. Use DataSet.off instead.")},o.prototype._trigger=function(t,e,i){if("*"==t)throw new Error("Cannot trigger event *");var o=[];t in this._subscribers&&(o=o.concat(this._subscribers[t])),"*"in this._subscribers&&(o=o.concat(this._subscribers["*"]));for(var n=0,s=o.length;s>n;n++){var r=o[n];r.callback&&r.callback(t,e,i||null)}},o.prototype.add=function(t,e){var i,o=[],n=this;if(Array.isArray(t))for(var s=0,r=t.length;r>s;s++)i=n._addItem(t[s]),o.push(i);else{if(!(t instanceof Object))throw new Error("Unknown dataType");i=n._addItem(t),o.push(i)}return o.length&&this._trigger("add",{items:o},e),o},o.prototype.update=function(t,e){var i=[],o=[],s=[],r=[],a=this,h=a._fieldId,d=function(t){var e=t[h];if(a._data[e]){var d=n.extend({},a._data[e]);e=a._updateItem(t),o.push(e),r.push(t),s.push(d)}else e=a._addItem(t),i.push(e)};if(Array.isArray(t))for(var l=0,u=t.length;u>l;l++)t[l]instanceof Object?d(t[l]):console.warn("Ignoring input item, which is not an object at index "+l);else{if(!(t instanceof Object))throw new Error("Unknown dataType");d(t)}if(i.length&&this._trigger("add",{items:i},e),o.length){var c={items:o,oldData:s,data:r};this._trigger("update",c,e)}return i.concat(o)},o.prototype.get=function(t){var e,i,o,s=this,r=n.getType(arguments[0]);"String"==r||"Number"==r?(e=arguments[0],o=arguments[1]):"Array"==r?(i=arguments[0],o=arguments[1]):o=arguments[0];var a;if(o&&o.returnType){var h=["Array","Object"];a=-1==h.indexOf(o.returnType)?"Array":o.returnType}else a="Array";var d,l,u,c,p,f=o&&o.type||this._options.type,m=o&&o.filter,v=[];if(void 0!=e)d=s._getItem(e,f),d&&m&&!m(d)&&(d=null);else if(void 0!=i)for(c=0,p=i.length;p>c;c++)d=s._getItem(i[c],f),(!m||m(d))&&v.push(d);else for(l=Object.keys(this._data),c=0,p=l.length;p>c;c++)u=l[c],d=s._getItem(u,f),(!m||m(d))&&v.push(d);if(o&&o.order&&void 0==e&&this._sort(v,o.order),o&&o.fields){var g=o.fields;if(void 0!=e)d=this._filterFields(d,g);else for(c=0,p=v.length;p>c;c++)v[c]=this._filterFields(v[c],g)}if("Object"==a){var y,b={};for(c=0,p=v.length;p>c;c++)y=v[c],b[y.id]=y;return b}return void 0!=e?d:v},o.prototype.getIds=function(t){var e,i,o,n,s,r=this._data,a=t&&t.filter,h=t&&t.order,d=t&&t.type||this._options.type,l=Object.keys(r),u=[];if(a)if(h){for(s=[],e=0,i=l.length;i>e;e++)o=l[e],n=this._getItem(o,d),a(n)&&s.push(n);for(this._sort(s,h),e=0,i=s.length;i>e;e++)u.push(s[e][this._fieldId])}else for(e=0,i=l.length;i>e;e++)o=l[e],n=this._getItem(o,d),a(n)&&u.push(n[this._fieldId]);else if(h){for(s=[],e=0,i=l.length;i>e;e++)o=l[e],s.push(r[o]);for(this._sort(s,h),e=0,i=s.length;i>e;e++)u.push(s[e][this._fieldId])}else for(e=0,i=l.length;i>e;e++)o=l[e],n=r[o],u.push(n[this._fieldId]);return u},o.prototype.getDataSet=function(){return this},o.prototype.forEach=function(t,e){var i,o,n,s,r=e&&e.filter,a=e&&e.type||this._options.type,h=this._data,d=Object.keys(h);if(e&&e.order){var l=this.get(e);for(i=0,o=l.length;o>i;i++)n=l[i],s=n[this._fieldId],t(n,s)}else for(i=0,o=d.length;o>i;i++)s=d[i],n=this._getItem(s,a),(!r||r(n))&&t(n,s)},o.prototype.map=function(t,e){var i,o,n,s,r=e&&e.filter,a=e&&e.type||this._options.type,h=[],d=this._data,l=Object.keys(d);for(i=0,o=l.length;o>i;i++)n=l[i],s=this._getItem(n,a),(!r||r(s))&&h.push(t(s,n));return e&&e.order&&this._sort(h,e.order),h},o.prototype._filterFields=function(t,e){if(!t)return t;var i,o,n={},s=Object.keys(t),r=s.length;if(Array.isArray(e))for(i=0;r>i;i++)o=s[i],-1!=e.indexOf(o)&&(n[o]=t[o]);else for(i=0;r>i;i++)o=s[i],e.hasOwnProperty(o)&&(n[e[o]]=t[o]);return n},o.prototype._sort=function(t,e){if(n.isString(e)){var i=e;t.sort(function(t,e){var o=t[i],n=e[i];return o>n?1:n>o?-1:0})}else{if("function"!=typeof e)throw new TypeError("Order must be a function or a string");t.sort(e)}},o.prototype.remove=function(t,e){var i,o,n,s=[];if(Array.isArray(t))for(i=0,o=t.length;o>i;i++)n=this._remove(t[i]), +null!=n&&s.push(n);else n=this._remove(t),null!=n&&s.push(n);return s.length&&this._trigger("remove",{items:s},e),s},o.prototype._remove=function(t){if(n.isNumber(t)||n.isString(t)){if(this._data[t])return delete this._data[t],this.length--,t}else if(t instanceof Object){var e=t[this._fieldId];if(void 0!==e&&this._data[e])return delete this._data[e],this.length--,e}return null},o.prototype.clear=function(t){var e=Object.keys(this._data);return this._data={},this.length=0,this._trigger("remove",{items:e},t),e},o.prototype.max=function(t){var e,i,o=this._data,n=Object.keys(o),s=null,r=null;for(e=0,i=n.length;i>e;e++){var a=n[e],h=o[a],d=h[t];null!=d&&(!s||d>r)&&(s=h,r=d)}return s},o.prototype.min=function(t){var e,i,o=this._data,n=Object.keys(o),s=null,r=null;for(e=0,i=n.length;i>e;e++){var a=n[e],h=o[a],d=h[t];null!=d&&(!s||r>d)&&(s=h,r=d)}return s},o.prototype.distinct=function(t){var e,i,o,s=this._data,r=Object.keys(s),a=[],h=this._options.type&&this._options.type[t]||null,d=0;for(e=0,o=r.length;o>e;e++){var l=r[e],u=s[l],c=u[t],p=!1;for(i=0;d>i;i++)if(a[i]==c){p=!0;break}p||void 0===c||(a[d]=c,d++)}if(h)for(e=0,o=a.length;o>e;e++)a[e]=n.convert(a[e],h);return a},o.prototype._addItem=function(t){var e=t[this._fieldId];if(void 0!=e){if(this._data[e])throw new Error("Cannot add item: item with id "+e+" already exists")}else e=n.randomUUID(),t[this._fieldId]=e;var i,o,s={},r=Object.keys(t);for(i=0,o=r.length;o>i;i++){var a=r[i],h=this._type[a];s[a]=n.convert(t[a],h)}return this._data[e]=s,this.length++,e},o.prototype._getItem=function(t,e){var i,o,s,r,a=this._data[t];if(!a)return null;var h={},d=Object.keys(a);if(e)for(s=0,r=d.length;r>s;s++)i=d[s],o=a[i],h[i]=n.convert(o,e[i]);else for(s=0,r=d.length;r>s;s++)i=d[s],o=a[i],h[i]=o;return h},o.prototype._updateItem=function(t){var e=t[this._fieldId];if(void 0==e)throw new Error("Cannot update item: item has no id (item: "+JSON.stringify(t)+")");var i=this._data[e];if(!i)throw new Error("Cannot update item: no item with id "+e+" found");for(var o=Object.keys(t),s=0,r=o.length;r>s;s++){var a=o[s],h=this._type[a];i[a]=n.convert(t[a],h)}return e},t.exports=o},function(t,e){function i(t){this.delay=null,this.max=1/0,this._queue=[],this._timeout=null,this._extended=null,this.setOptions(t)}i.prototype.setOptions=function(t){t&&"undefined"!=typeof t.delay&&(this.delay=t.delay),t&&"undefined"!=typeof t.max&&(this.max=t.max),this._flushIfNeeded()},i.extend=function(t,e){var o=new i(e);if(void 0!==t.flush)throw new Error("Target object already has a property flush");t.flush=function(){o.flush()};var n=[{name:"flush",original:void 0}];if(e&&e.replace)for(var s=0;sthis.max&&this.flush(),clearTimeout(this._timeout),this.queue.length>0&&"number"==typeof this.delay){var t=this;this._timeout=setTimeout(function(){t.flush()},this.delay)}},i.prototype.flush=function(){for(;this._queue.length>0;){var t=this._queue.shift();t.fn.apply(t.context||t.fn,t.args||[])}},t.exports=i},function(t,e,i){function o(t,e){this._data=null,this._ids={},this.length=0,this._options=e||{},this._fieldId="id",this._subscribers={};var i=this;this.listener=function(){i._onEvent.apply(i,arguments)},this.setData(t)}var n=i(1),s=i(8);o.prototype.setData=function(t){var e,i,o,n;if(this._data&&(this._data.off&&this._data.off("*",this.listener),e=Object.keys(this._ids),this._ids={},this.length=0,this._trigger("remove",{items:e})),this._data=t,this._data){for(this._fieldId=this._options.fieldId||this._data&&this._data.options&&this._data.options.fieldId||"id",e=this._data.getIds({filter:this._options&&this._options.filter}),o=0,n=e.length;n>o;o++)i=e[o],this._ids[i]=!0;this.length=e.length,this._trigger("add",{items:e}),this._data.on&&this._data.on("*",this.listener)}},o.prototype.refresh=function(){var t,e,i,o=this._data.getIds({filter:this._options&&this._options.filter}),n=Object.keys(this._ids),s={},r=[],a=[];for(e=0,i=o.length;i>e;e++)t=o[e],s[t]=!0,this._ids[t]||(r.push(t),this._ids[t]=!0);for(e=0,i=n.length;i>e;e++)t=n[e],s[t]||(a.push(t),delete this._ids[t]);this.length+=r.length-a.length,r.length&&this._trigger("add",{items:r}),a.length&&this._trigger("remove",{items:a})},o.prototype.get=function(t){var e,i,o,s=this,r=n.getType(arguments[0]);"String"==r||"Number"==r||"Array"==r?(e=arguments[0],i=arguments[1],o=arguments[2]):(i=arguments[0],o=arguments[1]);var a=n.extend({},this._options,i);this._options.filter&&i&&i.filter&&(a.filter=function(t){return s._options.filter(t)&&i.filter(t)});var h=[];return void 0!=e&&h.push(e),h.push(a),h.push(o),this._data&&this._data.get.apply(this._data,h)},o.prototype.getIds=function(t){var e;if(this._data){var i,o=this._options.filter;i=t&&t.filter?o?function(e){return o(e)&&t.filter(e)}:t.filter:o,e=this._data.getIds({filter:i,order:t&&t.order})}else e=[];return e},o.prototype.map=function(t,e){var i=[];if(this._data){var o,n=this._options.filter;o=e&&e.filter?n?function(t){return n(t)&&e.filter(t)}:e.filter:n,i=this._data.map(t,{filter:o,order:e&&e.order})}else i=[];return i},o.prototype.getDataSet=function(){for(var t=this;t instanceof o;)t=t._data;return t||null},o.prototype._onEvent=function(t,e,i){var o,n,s,r,a=e&&e.items,h=this._data,d=[],l=[],u=[],c=[];if(a&&h){switch(t){case"add":for(o=0,n=a.length;n>o;o++)s=a[o],r=this.get(s),r&&(this._ids[s]=!0,l.push(s));break;case"update":for(o=0,n=a.length;n>o;o++)s=a[o],r=this.get(s),r?this._ids[s]?(u.push(s),d.push(e.data[o])):(this._ids[s]=!0,l.push(s)):this._ids[s]&&(delete this._ids[s],c.push(s));break;case"remove":for(o=0,n=a.length;n>o;o++)s=a[o],this._ids[s]&&(delete this._ids[s],c.push(s))}this.length+=l.length-c.length,l.length&&this._trigger("add",{items:l},i),u.length&&this._trigger("update",{items:u,data:d},i),c.length&&this._trigger("remove",{items:c},i)}},o.prototype.on=s.prototype.on,o.prototype.off=s.prototype.off,o.prototype._trigger=s.prototype._trigger,o.prototype.subscribe=o.prototype.on,o.prototype.unsubscribe=o.prototype.off,t.exports=o},function(t,e,i){function o(t,e,i){if(!(this instanceof o))throw new SyntaxError("Constructor must be called with the new operator");this.containerElement=t,this.width="400px",this.height="400px",this.margin=10,this.defaultXCenter="55%",this.defaultYCenter="50%",this.xLabel="x",this.yLabel="y",this.zLabel="z";var n=function(t){return t};this.xValueLabel=n,this.yValueLabel=n,this.zValueLabel=n,this.filterLabel="time",this.legendLabel="value",this.style=o.STYLE.DOT,this.showPerspective=!0,this.showGrid=!0,this.keepAspectRatio=!0,this.showShadow=!1,this.showGrayBottom=!1,this.showTooltip=!1,this.verticalRatio=.5,this.animationInterval=1e3,this.animationPreload=!1,this.camera=new c,this.camera.setArmRotation(1,.5),this.camera.setArmLength(1.7),this.eye=new l(0,0,-1),this.dataTable=null,this.dataPoints=null,this.colX=void 0,this.colY=void 0,this.colZ=void 0,this.colValue=void 0,this.colFilter=void 0,this.xMin=0,this.xStep=void 0,this.xMax=1,this.yMin=0,this.yStep=void 0,this.yMax=1,this.zMin=0,this.zStep=void 0,this.zMax=1,this.valueMin=0,this.valueMax=1,this.xBarWidth=1,this.yBarWidth=1,this.axisColor="#4D4D4D",this.gridColor="#D3D3D3",this.dataColor={fill:"#7DC1FF",stroke:"#3267D2",strokeWidth:1},this.dotSizeRatio=.02,this.create(),this.setOptions(i),e&&this.setData(e)}function n(t){return"clientX"in t?t.clientX:t.targetTouches[0]&&t.targetTouches[0].clientX||0}function s(t){return"clientY"in t?t.clientY:t.targetTouches[0]&&t.targetTouches[0].clientY||0}var r=i(12),a=i(8),h=i(10),d=i(1),l=i(13),u=i(14),c=i(15),p=i(16),f=i(17),m=i(18);r(o.prototype),o.prototype._setScale=function(){this.scale=new l(1/(this.xMax-this.xMin),1/(this.yMax-this.yMin),1/(this.zMax-this.zMin)),this.keepAspectRatio&&(this.scale.x3&&(this.colFilter=3);else{if(this.style!==o.STYLE.DOTCOLOR&&this.style!==o.STYLE.DOTSIZE&&this.style!==o.STYLE.BARCOLOR&&this.style!==o.STYLE.BARSIZE)throw'Unknown style "'+this.style+'"';this.colX=0,this.colY=1,this.colZ=2,this.colValue=3,t.getNumberOfColumns()>4&&(this.colFilter=4)}},o.prototype.getNumberOfRows=function(t){return t.length},o.prototype.getNumberOfColumns=function(t){var e=0;for(var i in t[0])t[0].hasOwnProperty(i)&&e++;return e},o.prototype.getDistinctValues=function(t,e){for(var i=[],o=0;ot[o][e]&&(i.min=t[o][e]),i.maxt;t++){var f=(t-c)/(p-c),v=240*f,g=this._hsv2rgb(v,1,1);u.strokeStyle=g,u.beginPath(),u.moveTo(h,r+t),u.lineTo(a,r+t),u.stroke()}u.strokeStyle=this.axisColor,u.strokeRect(h,r,i,s)}if(this.style===o.STYLE.DOTSIZE&&(u.strokeStyle=this.axisColor,u.fillStyle=this.dataColor.fill,u.beginPath(),u.moveTo(h,r),u.lineTo(a,r),u.lineTo(a-i+e,d),u.lineTo(h,d),u.closePath(),u.fill(),u.stroke()),this.style===o.STYLE.DOTCOLOR||this.style===o.STYLE.DOTSIZE){var y=5,b=new m(this.valueMin,this.valueMax,(this.valueMax-this.valueMin)/5,!0);for(b.start(),b.getCurrent()0?this.yMin:this.yMax,n=this._convert3Dto2D(new l(w,r,this.zMin)),Math.cos(2*_)>0?(v.textAlign="center",v.textBaseline="top",n.y+=b):Math.sin(2*_)<0?(v.textAlign="right",v.textBaseline="middle"):(v.textAlign="left",v.textBaseline="middle"),v.fillStyle=this.axisColor,v.fillText(" "+this.xValueLabel(i.getCurrent())+" ",n.x,n.y),i.next()}for(v.lineWidth=1,o=void 0===this.defaultYStep,i=new m(this.yMin,this.yMax,this.yStep,o),i.start(),i.getCurrent()0?this.xMin:this.xMax,n=this._convert3Dto2D(new l(s,i.getCurrent(),this.zMin)),Math.cos(2*_)<0?(v.textAlign="center",v.textBaseline="top",n.y+=b):Math.sin(2*_)>0?(v.textAlign="right",v.textBaseline="middle"):(v.textAlign="left",v.textBaseline="middle"),v.fillStyle=this.axisColor,v.fillText(" "+this.yValueLabel(i.getCurrent())+" ",n.x,n.y),i.next();for(v.lineWidth=1,o=void 0===this.defaultZStep,i=new m(this.zMin,this.zMax,this.zStep,o),i.start(),i.getCurrent()0?this.xMin:this.xMax,r=Math.sin(_)<0?this.yMin:this.yMax;!i.end();)t=this._convert3Dto2D(new l(s,r,i.getCurrent())),v.strokeStyle=this.axisColor,v.beginPath(),v.moveTo(t.x,t.y),v.lineTo(t.x-b,t.y),v.stroke(),v.textAlign="right",v.textBaseline="middle",v.fillStyle=this.axisColor,v.fillText(this.zValueLabel(i.getCurrent())+" ",t.x-5,t.y),i.next();v.lineWidth=1,t=this._convert3Dto2D(new l(s,r,this.zMin)),e=this._convert3Dto2D(new l(s,r,this.zMax)),v.strokeStyle=this.axisColor,v.beginPath(),v.moveTo(t.x,t.y),v.lineTo(e.x,e.y),v.stroke(),v.lineWidth=1,c=this._convert3Dto2D(new l(this.xMin,this.yMin,this.zMin)),p=this._convert3Dto2D(new l(this.xMax,this.yMin,this.zMin)),v.strokeStyle=this.axisColor,v.beginPath(),v.moveTo(c.x,c.y),v.lineTo(p.x,p.y),v.stroke(),c=this._convert3Dto2D(new l(this.xMin,this.yMax,this.zMin)),p=this._convert3Dto2D(new l(this.xMax,this.yMax,this.zMin)),v.strokeStyle=this.axisColor,v.beginPath(),v.moveTo(c.x,c.y),v.lineTo(p.x,p.y),v.stroke(),v.lineWidth=1,t=this._convert3Dto2D(new l(this.xMin,this.yMin,this.zMin)),e=this._convert3Dto2D(new l(this.xMin,this.yMax,this.zMin)),v.strokeStyle=this.axisColor,v.beginPath(),v.moveTo(t.x,t.y),v.lineTo(e.x,e.y),v.stroke(),t=this._convert3Dto2D(new l(this.xMax,this.yMin,this.zMin)),e=this._convert3Dto2D(new l(this.xMax,this.yMax,this.zMin)),v.strokeStyle=this.axisColor,v.beginPath(),v.moveTo(t.x,t.y),v.lineTo(e.x,e.y),v.stroke();var x=this.xLabel;x.length>0&&(u=.1/this.scale.y,s=(this.xMin+this.xMax)/2,r=Math.cos(_)>0?this.yMin-u:this.yMax+u,n=this._convert3Dto2D(new l(s,r,this.zMin)),Math.cos(2*_)>0?(v.textAlign="center",v.textBaseline="top"):Math.sin(2*_)<0?(v.textAlign="right",v.textBaseline="middle"):(v.textAlign="left",v.textBaseline="middle"),v.fillStyle=this.axisColor,v.fillText(x,n.x,n.y));var k=this.yLabel;k.length>0&&(d=.1/this.scale.x,s=Math.sin(_)>0?this.xMin-d:this.xMax+d,r=(this.yMin+this.yMax)/2,n=this._convert3Dto2D(new l(s,r,this.zMin)),Math.cos(2*_)<0?(v.textAlign="center",v.textBaseline="top"):Math.sin(2*_)>0?(v.textAlign="right",v.textBaseline="middle"):(v.textAlign="left",v.textBaseline="middle"),v.fillStyle=this.axisColor,v.fillText(k,n.x,n.y));var O=this.zLabel;O.length>0&&(h=30,s=Math.cos(_)>0?this.xMin:this.xMax,r=Math.sin(_)<0?this.yMin:this.yMax,a=(this.zMin+this.zMax)/2,n=this._convert3Dto2D(new l(s,r,a)),v.textAlign="right",v.textBaseline="middle",v.fillStyle=this.axisColor,v.fillText(O,n.x-h,n.y))},o.prototype._hsv2rgb=function(t,e,i){var o,n,s,r,a,h;switch(r=i*e,a=Math.floor(t/60),h=r*(1-Math.abs(t/60%2-1)),a){case 0:o=r,n=h,s=0;break;case 1:o=h,n=r,s=0;break;case 2:o=0,n=r,s=h;break;case 3:o=0,n=h,s=r;break;case 4:o=h,n=0,s=r;break;case 5:o=r,n=0,s=h;break;default:o=0,n=0,s=0}return"RGB("+parseInt(255*o)+","+parseInt(255*n)+","+parseInt(255*s)+")"},o.prototype._redrawDataGrid=function(){var t,e,i,n,s,r,a,h,d,u,c,p,f=this.frame.canvas,m=f.getContext("2d");if(m.lineJoin="round",m.lineCap="round",!(void 0===this.dataPoints||this.dataPoints.length<=0)){for(s=0;s0}else r=!0;r?(p=(t.point.z+e.point.z+i.point.z+n.point.z)/4,d=240*(1-(p-this.zMin)*this.scale.z/this.verticalRatio),u=1,this.showShadow?(c=Math.min(1+x.x/k/2,1),a=this._hsv2rgb(d,u,c),h=a):(c=1,a=this._hsv2rgb(d,u,c),h=this.axisColor)):(a="gray",h=this.axisColor),m.lineWidth=this._getStrokeWidth(t),m.fillStyle=a,m.strokeStyle=h,m.beginPath(),m.moveTo(t.screen.x,t.screen.y),m.lineTo(e.screen.x,e.screen.y),m.lineTo(n.screen.x,n.screen.y),m.lineTo(i.screen.x,i.screen.y),m.closePath(),m.fill(),m.stroke()}}else for(s=0;sc&&(c=0);var p,f,m;this.style===o.STYLE.DOTCOLOR?(p=240*(1-(d.point.value-this.valueMin)*this.scale.value),f=this._hsv2rgb(p,1,1),m=this._hsv2rgb(p,1,.8)):this.style===o.STYLE.DOTSIZE?(f=this.dataColor.fill,m=this.dataColor.stroke):(p=240*(1-(d.point.z-this.zMin)*this.scale.z/this.verticalRatio),f=this._hsv2rgb(p,1,1),m=this._hsv2rgb(p,1,.8)),i.lineWidth=this._getStrokeWidth(d),i.strokeStyle=m,i.fillStyle=f,i.beginPath(),i.arc(d.screen.x,d.screen.y,c,0,2*Math.PI,!0),i.fill(),i.stroke()}}},o.prototype._redrawDataBar=function(){var t,e,i,n,s=this.frame.canvas,r=s.getContext("2d");if(!(void 0===this.dataPoints||this.dataPoints.length<=0)){for(t=0;t0){for(t=this.dataPoints[0],o.lineWidth=this._getStrokeWidth(t),o.lineJoin="round",o.lineCap="round",o.strokeStyle=this.dataColor.stroke,o.beginPath(),o.moveTo(t.screen.x,t.screen.y),e=1;e0?1:0>t?-1:0}var o=e[0],n=e[1],s=e[2],r=i((n.x-o.x)*(t.y-o.y)-(n.y-o.y)*(t.x-o.x)),a=i((s.x-n.x)*(t.y-n.y)-(s.y-n.y)*(t.x-n.x)),h=i((o.x-s.x)*(t.y-s.y)-(o.y-s.y)*(t.x-s.x));return!(0!=r&&0!=a&&r!=a||0!=a&&0!=h&&a!=h||0!=r&&0!=h&&r!=h)},o.prototype._dataPointFromXY=function(t,e){var i,n=100,s=null,r=null,a=null,h=new u(t,e);if(this.style===o.STYLE.BAR||this.style===o.STYLE.BARCOLOR||this.style===o.STYLE.BARSIZE)for(i=this.dataPoints.length-1;i>=0;i--){s=this.dataPoints[i];var d=s.surfaces;if(d)for(var l=d.length-1;l>=0;l--){var c=d[l],p=c.corners,f=[p[0].screen,p[1].screen,p[2].screen],m=[p[2].screen,p[3].screen,p[0].screen];if(this._insideTriangle(h,f)||this._insideTriangle(h,m))return s}}else for(i=0;ib)&&n>b&&(a=b,r=s)}}return r},o.prototype._showTooltip=function(t){var e,i,o;this.tooltip?(e=this.tooltip.dom.content,i=this.tooltip.dom.line,o=this.tooltip.dom.dot):(e=document.createElement("div"),e.style.position="absolute",e.style.padding="10px",e.style.border="1px solid #4d4d4d",e.style.color="#1a1a1a",e.style.background="rgba(255,255,255,0.7)",e.style.borderRadius="2px",e.style.boxShadow="5px 5px 10px rgba(128,128,128,0.5)",i=document.createElement("div"),i.style.position="absolute",i.style.height="40px",i.style.width="0",i.style.borderLeft="1px solid #4d4d4d",o=document.createElement("div"),o.style.position="absolute",o.style.height="0",o.style.width="0",o.style.border="5px solid #4d4d4d",o.style.borderRadius="5px",this.tooltip={dataPoint:null,dom:{content:e,line:i,dot:o}}),this._hideTooltip(),this.tooltip.dataPoint=t,"function"==typeof this.showTooltip?e.innerHTML=this.showTooltip(t.point):e.innerHTML="
x:"+t.point.x+"
y:"+t.point.y+"
z:"+t.point.z+"
",e.style.left="0",e.style.top="0",this.frame.appendChild(e),this.frame.appendChild(i),this.frame.appendChild(o);var n=e.offsetWidth,s=e.offsetHeight,r=i.offsetHeight,a=o.offsetWidth,h=o.offsetHeight,d=t.screen.x-n/2;d=Math.min(Math.max(d,10),this.frame.clientWidth-10-n),i.style.left=t.screen.x+"px",i.style.top=t.screen.y-r+"px",e.style.left=d+"px",e.style.top=t.screen.y-r-s+"px",o.style.left=t.screen.x-a/2+"px",o.style.top=t.screen.y-h/2+"px"},o.prototype._hideTooltip=function(){if(this.tooltip){this.tooltip.dataPoint=null;for(var t in this.tooltip.dom)if(this.tooltip.dom.hasOwnProperty(t)){var e=this.tooltip.dom[t];e&&e.parentNode&&e.parentNode.removeChild(e)}}},t.exports=o},function(t,e){function i(t){return t?o(t):void 0}function o(t){for(var e in i.prototype)t[e]=i.prototype[e];return t}t.exports=i,i.prototype.on=i.prototype.addEventListener=function(t,e){return this._callbacks=this._callbacks||{},(this._callbacks[t]=this._callbacks[t]||[]).push(e),this},i.prototype.once=function(t,e){function i(){o.off(t,i),e.apply(this,arguments)}var o=this;return this._callbacks=this._callbacks||{},i.fn=e,this.on(t,i),this},i.prototype.off=i.prototype.removeListener=i.prototype.removeAllListeners=i.prototype.removeEventListener=function(t,e){if(this._callbacks=this._callbacks||{},0==arguments.length)return this._callbacks={},this;var i=this._callbacks[t];if(!i)return this;if(1==arguments.length)return delete this._callbacks[t],this;for(var o,n=0;no;++o)i[o].apply(this,e)}return this},i.prototype.listeners=function(t){return this._callbacks=this._callbacks||{},this._callbacks[t]||[]},i.prototype.hasListeners=function(t){return!!this.listeners(t).length}},function(t,e){function i(t,e,i){this.x=void 0!==t?t:0,this.y=void 0!==e?e:0,this.z=void 0!==i?i:0}i.subtract=function(t,e){var o=new i;return o.x=t.x-e.x,o.y=t.y-e.y,o.z=t.z-e.z,o},i.add=function(t,e){var o=new i;return o.x=t.x+e.x,o.y=t.y+e.y,o.z=t.z+e.z,o},i.avg=function(t,e){return new i((t.x+e.x)/2,(t.y+e.y)/2,(t.z+e.z)/2)},i.crossProduct=function(t,e){var o=new i;return o.x=t.y*e.z-t.z*e.y,o.y=t.z*e.x-t.x*e.z,o.z=t.x*e.y-t.y*e.x,o},i.prototype.length=function(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z)},t.exports=i},function(t,e){function i(t,e){this.x=void 0!==t?t:0,this.y=void 0!==e?e:0}t.exports=i},function(t,e,i){function o(){this.armLocation=new n,this.armRotation={},this.armRotation.horizontal=0,this.armRotation.vertical=0,this.armLength=1.7,this.cameraLocation=new n,this.cameraRotation=new n(.5*Math.PI,0,0),this.calculateCameraOrientation()}var n=i(13);o.prototype.setArmLocation=function(t,e,i){this.armLocation.x=t,this.armLocation.y=e,this.armLocation.z=i,this.calculateCameraOrientation()},o.prototype.setArmRotation=function(t,e){void 0!==t&&(this.armRotation.horizontal=t),void 0!==e&&(this.armRotation.vertical=e,this.armRotation.vertical<0&&(this.armRotation.vertical=0),this.armRotation.vertical>.5*Math.PI&&(this.armRotation.vertical=.5*Math.PI)),(void 0!==t||void 0!==e)&&this.calculateCameraOrientation()},o.prototype.getArmRotation=function(){var t={};return t.horizontal=this.armRotation.horizontal,t.vertical=this.armRotation.vertical,t},o.prototype.setArmLength=function(t){void 0!==t&&(this.armLength=t,this.armLength<.71&&(this.armLength=.71),this.armLength>5&&(this.armLength=5),this.calculateCameraOrientation())},o.prototype.getArmLength=function(){return this.armLength},o.prototype.getCameraLocation=function(){return this.cameraLocation},o.prototype.getCameraRotation=function(){return this.cameraRotation},o.prototype.calculateCameraOrientation=function(){this.cameraLocation.x=this.armLocation.x-this.armLength*Math.sin(this.armRotation.horizontal)*Math.cos(this.armRotation.vertical),this.cameraLocation.y=this.armLocation.y-this.armLength*Math.cos(this.armRotation.horizontal)*Math.cos(this.armRotation.vertical),this.cameraLocation.z=this.armLocation.z+this.armLength*Math.sin(this.armRotation.vertical),this.cameraRotation.x=Math.PI/2-this.armRotation.vertical,this.cameraRotation.y=0,this.cameraRotation.z=-this.armRotation.horizontal},t.exports=o},function(t,e,i){function o(t,e,i){this.data=t,this.column=e,this.graph=i,this.index=void 0,this.value=void 0,this.values=i.getDistinctValues(t.get(),this.column),this.values.sort(function(t,e){return t>e?1:e>t?-1:0}),this.values.length>0&&this.selectValue(0),this.dataPoints=[],this.loaded=!1,this.onLoadCallback=void 0,i.animationPreload?(this.loaded=!1,this.loadInBackground()):this.loaded=!0}var n=i(10);o.prototype.isLoaded=function(){return this.loaded},o.prototype.getLoadedProgress=function(){for(var t=this.values.length,e=0;this.dataPoints[e];)e++;return Math.round(e/t*100)},o.prototype.getLabel=function(){return this.graph.filterLabel},o.prototype.getColumn=function(){return this.column},o.prototype.getSelectedValue=function(){return void 0!==this.index?this.values[this.index]:void 0},o.prototype.getValues=function(){return this.values},o.prototype.getValue=function(t){if(t>=this.values.length)throw"Error: index out of range";return this.values[t]},o.prototype._getDataPoints=function(t){if(void 0===t&&(t=this.index),void 0===t)return[];var e;if(this.dataPoints[t])e=this.dataPoints[t];else{var i={};i.column=this.column,i.value=this.values[t];var o=new n(this.data,{filter:function(t){return t[i.column]==i.value}}).get();e=this.graph._getDataPoints(o),this.dataPoints[t]=e}return e},o.prototype.setOnLoadCallback=function(t){this.onLoadCallback=t},o.prototype.selectValue=function(t){if(t>=this.values.length)throw"Error: index out of range";this.index=t,this.value=this.values[t]},o.prototype.loadInBackground=function(t){void 0===t&&(t=0);var e=this.graph.frame;if(t0&&(t--,this.setIndex(t))},o.prototype.next=function(){var t=this.getIndex();t0?this.setIndex(0):this.index=void 0},o.prototype.setIndex=function(t){if(!(to&&(o=0),o>this.values.length-1&&(o=this.values.length-1),o},o.prototype.indexToLeft=function(t){var e=parseFloat(this.frame.bar.style.width)-this.frame.slide.clientWidth-10,i=t/(this.values.length-1)*e,o=i+3;return o},o.prototype._onMouseMove=function(t){var e=t.clientX-this.startClientX,i=this.startSlideX+e,o=this.leftToIndex(i);this.setIndex(o),n.preventDefault()},o.prototype._onMouseUp=function(t){this.frame.style.cursor="auto",n.removeEventListener(document,"mousemove",this.onmousemove),n.removeEventListener(document,"mouseup",this.onmouseup),n.preventDefault()},t.exports=o},function(t,e){function i(t,e,i,o){this._start=0,this._end=0,this._step=1,this.prettyStep=!0,this.precision=5,this._current=0,this.setRange(t,e,i,o)}i.prototype.setRange=function(t,e,i,o){this._start=t?t:0,this._end=e?e:0,this.setStep(i,o)},i.prototype.setStep=function(t,e){void 0===t||0>=t||(void 0!==e&&(this.prettyStep=e),this.prettyStep===!0?this._step=i.calculatePrettyStep(t):this._step=t)},i.calculatePrettyStep=function(t){var e=function(t){return Math.log(t)/Math.LN10},i=Math.pow(10,Math.round(e(t))),o=2*Math.pow(10,Math.round(e(t/2))),n=5*Math.pow(10,Math.round(e(t/5))),s=i;return Math.abs(o-t)<=Math.abs(s-t)&&(s=o),Math.abs(n-t)<=Math.abs(s-t)&&(s=n),0>=s&&(s=1),s},i.prototype.getCurrent=function(){return parseFloat(this._current.toPrecision(this.precision))},i.prototype.getStep=function(){return this._step},i.prototype.start=function(){this._current=this._start-this._start%this._step},i.prototype.next=function(){this._current+=this._step},i.prototype.end=function(){return this._current>this._end},t.exports=i},function(t,e,i){function o(t,e,i,d){if(!(this instanceof o))throw new SyntaxError("Constructor must be called with the new operator");if(!(Array.isArray(i)||i instanceof r||i instanceof a)&&i instanceof Object){var c=d;d=i,i=c}var f=this;this.defaultOptions={start:null,end:null,autoResize:!0,throttleRedraw:0,orientation:{axis:"bottom",item:"bottom"},moment:n,width:null,height:null,maxHeight:null,minHeight:null},this.options=s.deepExtend({},this.defaultOptions),this._create(t),this.components=[],this.body={dom:this.dom,domProps:this.props,emitter:{on:this.on.bind(this),off:this.off.bind(this),emit:this.emit.bind(this)},hiddenDates:[],util:{getScale:function(){return f.timeAxis.step.scale},getStep:function(){return f.timeAxis.step.step},toScreen:f._toScreen.bind(f),toGlobalScreen:f._toGlobalScreen.bind(f),toTime:f._toTime.bind(f),toGlobalTime:f._toGlobalTime.bind(f)}},this.range=new h(this.body),this.components.push(this.range),this.body.range=this.range,this.timeAxis=new l(this.body),this.timeAxis2=null,this.components.push(this.timeAxis),this.currentTime=new u(this.body),this.components.push(this.currentTime),this.itemSet=new p(this.body),this.components.push(this.itemSet),this.itemsData=null,this.groupsData=null,this.on("tap",function(t){f.emit("click",f.getEventProperties(t))}),this.on("doubletap",function(t){f.emit("doubleClick",f.getEventProperties(t))}),this.dom.root.oncontextmenu=function(t){f.emit("contextmenu",f.getEventProperties(t))},this.fitDone=!1,this.on("changed",function(){if(null!=this.itemsData&&!f.fitDone)if(f.fitDone=!0,void 0!=f.options.start||void 0!=f.options.end){if(void 0==f.options.start||void 0==f.options.end)var t=f.getItemRange();var e=void 0!=f.options.start?f.options.start:t.min,i=void 0!=f.options.end?f.options.end:t.max;f.setWindow(e,i,{animation:!1})}else f.fit({animation:!1})}),d&&this.setOptions(d),i&&this.setGroups(i),e&&this.setItems(e),this._redraw()}var n=(i(12),i(20),i(2)),s=i(1),r=i(8),a=i(10),h=i(23),d=i(27),l=i(38),u=i(43),c=i(41),p=i(28),f=i(44),m=i(46)["default"],v=i(46).printStyle,g=i(47).allOptions,y=i(47).configureOptions;o.prototype=new d,o.prototype._createConfigurator=function(){return new f(this,this.dom.container,y)},o.prototype.redraw=function(){this.itemSet&&this.itemSet.markDirty({refreshItems:!0}),this._redraw()},o.prototype.setOptions=function(t){var e=m.validate(t,g);if(e===!0&&console.log("%cErrors have been found in the supplied options object.",v),d.prototype.setOptions.call(this,t),"type"in t&&t.type!==this.options.type){this.options.type=t.type;var i=this.itemsData;if(i){var o=this.getSelection();this.setItems(null),this.setItems(i),this.setSelection(o)}}},o.prototype.setItems=function(t){var e;e=t?t instanceof r||t instanceof a?t:new r(t,{type:{start:"Date",end:"Date"}}):null,this.itemsData=e,this.itemSet&&this.itemSet.setItems(e)},o.prototype.setGroups=function(t){var e;e=t?t instanceof r||t instanceof a?t:new r(t):null,this.groupsData=e,this.itemSet.setGroups(e)},o.prototype.setData=function(t){t&&t.groups&&this.setGroups(t.groups),t&&t.items&&this.setItems(t.items)},o.prototype.setSelection=function(t,e){this.itemSet&&this.itemSet.setSelection(t),e&&e.focus&&this.focus(t,e)},o.prototype.getSelection=function(){return this.itemSet&&this.itemSet.getSelection()||[]},o.prototype.focus=function(t,e){if(this.itemsData&&void 0!=t){var i=Array.isArray(t)?t:[t],o=this.itemsData.getDataSet().get(i,{type:{start:"Date",end:"Date"}}),n=null,s=null;if(o.forEach(function(t){var e=t.start.valueOf(),i="end"in t?t.end.valueOf():t.start.valueOf();(null===n||n>e)&&(n=e),(null===s||i>s)&&(s=i)}),null!==n&&null!==s){var r=(n+s)/2,a=Math.max(this.range.end-this.range.start,1.1*(s-n)),h=e&&void 0!==e.animation?e.animation:!0;this.range.setRange(r-a/2,r+a/2,h)}}},o.prototype.fit=function(t){var e=t&&void 0!==t.animation?t.animation:!0,i=this.getItemRange();this.range.setRange(i.min,i.max,e)},o.prototype.getItemRange=function(){var t=this,e=this.getDataRange(),i=null!==e.min?e.min.valueOf():null,o=null!==e.max?e.max.valueOf():null,n=null,r=null;if(null!=i&&null!=o){var a,h,d,l,u;!function(){var e=function(t){return s.convert(t.data.start,"Date").valueOf()},c=function(t){var e=void 0!=t.data.end?t.data.end:t.data.start;return s.convert(e,"Date").valueOf()};a=o-i,0>=a&&(a=10),h=a/t.props.center.width,s.forEach(t.itemSet.items,function(t){t.show(),t.repositionX();var s=e(t),a=c(t),d=s-(t.getWidthLeft()+10)*h,l=a+(t.getWidthRight()+10)*h;i>d&&(i=d,n=t),l>o&&(o=l,r=t)}.bind(t)),n&&r&&(d=n.getWidthLeft()+10,l=r.getWidthRight()+10,u=t.props.center.width-d-l,u>0&&(i=e(n)-d*a/u,o=c(r)+l*a/u))}()}return{min:null!=i?new Date(i):null,max:null!=o?new Date(o):null}},o.prototype.getDataRange=function(){var t=null,e=null,i=this.itemsData&&this.itemsData.getDataSet();return i&&i.forEach(function(i){var o=s.convert(i.start,"Date").valueOf(),n=s.convert(void 0!=i.end?i.end:i.start,"Date").valueOf();(null===t||t>o)&&(t=o),(null===e||n>e)&&(e=n)}),{min:null!=t?new Date(t):null,max:null!=e?new Date(e):null}},o.prototype.getEventProperties=function(t){var e=t.center?t.center.x:t.clientX,i=t.center?t.center.y:t.clientY,o=e-s.getAbsoluteLeft(this.dom.centerContainer),n=i-s.getAbsoluteTop(this.dom.centerContainer),r=this.itemSet.itemFromTarget(t),a=this.itemSet.groupFromTarget(t),h=c.customTimeFromTarget(t),d=this.itemSet.options.snap||null,l=this.body.util.getScale(),u=this.body.util.getStep(),p=this._toTime(o),f=d?d(p,l,u):p,m=s.getTarget(t),v=null;return null!=r?v="item":null!=h?v="custom-time":s.hasParent(m,this.timeAxis.dom.foreground)?v="axis":this.timeAxis2&&s.hasParent(m,this.timeAxis2.dom.foreground)?v="axis":s.hasParent(m,this.itemSet.dom.labelSet)?v="group-label":s.hasParent(m,this.currentTime.bar)?v="current-time":s.hasParent(m,this.dom.center)&&(v="background"),{event:t,item:r?r.id:null,group:a?a.groupId:null,what:v,pageX:t.srcEvent?t.srcEvent.pageX:t.pageX,pageY:t.srcEvent?t.srcEvent.pageY:t.pageY,x:o,y:n,time:p,snappedTime:f}},t.exports=o},function(t,e,i){if("undefined"!=typeof window){var o=i(21),n=window.Hammer||i(22);t.exports=o(n,{preventDefault:"mouse"})}else t.exports=function(){throw Error("hammer.js is only available in a browser, not in node.js.")}},function(t,e,i){var o,n,s;!function(i){n=[],o=i,s="function"==typeof o?o.apply(e,n):o,!(void 0!==s&&(t.exports=s))}(function(){var t=null;return function e(i,o){function n(t){return t.match(/[^ ]+/g)}function s(e){if("hammer.input"!==e.type){if(e.srcEvent._handled||(e.srcEvent._handled={}),e.srcEvent._handled[e.type])return;e.srcEvent._handled[e.type]=!0}var i=!1;e.stopPropagation=function(){i=!0};var o=e.srcEvent.stopPropagation;"function"==typeof o&&(e.srcEvent.stopPropagation=function(){o(),e.stopPropagation()}),e.firstTarget=t;for(var n=t;n&&!i;){var s=n.hammer;if(s)for(var r,a=0;a0?d._handlers[t]=o:(i.off(t,s),delete d._handlers[t]))}),d},d.emit=function(e,o){t=o.target,i.emit(e,o)},d.destroy=function(){var t=i.element.hammer,e=t.indexOf(d);-1!==e&&t.splice(e,1),t.length||delete i.element.hammer,d._handlers={},i.destroy()},d}})},function(t,e,i){var o;!function(n,s,r,a){function h(t,e,i){return setTimeout(p(t,i),e)}function d(t,e,i){return Array.isArray(t)?(l(t,i[e],i),!0):!1}function l(t,e,i){var o;if(t)if(t.forEach)t.forEach(e,i);else if(t.length!==a)for(o=0;o\s*\(/gm,"{anonymous}()@"):"Unknown Stack Trace",s=n.console&&(n.console.warn||n.console.log);return s&&s.call(n.console,o,i),t.apply(this,arguments)}}function c(t,e,i){var o,n=e.prototype;o=t.prototype=Object.create(n),o.constructor=t,o._super=n,i&&ut(o,i)}function p(t,e){return function(){return t.apply(e,arguments)}}function f(t,e){return typeof t==ft?t.apply(e?e[0]||a:a,e):t}function m(t,e){return t===a?e:t}function v(t,e,i){l(_(e),function(e){t.addEventListener(e,i,!1)})}function g(t,e,i){l(_(e),function(e){t.removeEventListener(e,i,!1)})}function y(t,e){for(;t;){if(t==e)return!0;t=t.parentNode}return!1}function b(t,e){return t.indexOf(e)>-1}function _(t){return t.trim().split(/\s+/g)}function w(t,e,i){if(t.indexOf&&!i)return t.indexOf(e);for(var o=0;oi[e]}):o.sort()),o}function O(t,e){for(var i,o,n=e[0].toUpperCase()+e.slice(1),s=0;s1&&!i.firstMultiple?i.firstMultiple=N(e):1===n&&(i.firstMultiple=!1);var s=i.firstInput,r=i.firstMultiple,a=r?r.center:s.center,h=e.center=z(o);e.timeStamp=gt(),e.deltaTime=e.timeStamp-s.timeStamp,e.angle=B(a,h),e.distance=F(a,h),P(i,e),e.offsetDirection=A(e.deltaX,e.deltaY);var d=L(e.deltaTime,e.deltaX,e.deltaY);e.overallVelocityX=d.x,e.overallVelocityY=d.y,e.overallVelocity=vt(d.x)>vt(d.y)?d.x:d.y,e.scale=r?j(r.pointers,o):1,e.rotation=r?R(r.pointers,o):0,e.maxPointers=i.prevInput?e.pointers.length>i.prevInput.maxPointers?e.pointers.length:i.prevInput.maxPointers:e.pointers.length,I(i,e);var l=t.element;y(e.srcEvent.target,l)&&(l=e.srcEvent.target),e.target=l}function P(t,e){var i=e.center,o=t.offsetDelta||{},n=t.prevDelta||{},s=t.prevInput||{};(e.eventType===Et||s.eventType===It)&&(n=t.prevDelta={x:s.deltaX||0,y:s.deltaY||0},o=t.offsetDelta={x:i.x,y:i.y}),e.deltaX=n.x+(i.x-o.x),e.deltaY=n.y+(i.y-o.y)}function I(t,e){var i,o,n,s,r=t.lastInterval||e,h=e.timeStamp-r.timeStamp;if(e.eventType!=Nt&&(h>Tt||r.velocity===a)){var d=e.deltaX-r.deltaX,l=e.deltaY-r.deltaY,u=L(h,d,l);o=u.x,n=u.y,i=vt(u.x)>vt(u.y)?u.x:u.y,s=A(d,l),t.lastInterval=e}else i=r.velocity,o=r.velocityX,n=r.velocityY,s=r.direction;e.velocity=i,e.velocityX=o,e.velocityY=n,e.direction=s}function N(t){for(var e=[],i=0;in;)i+=t[n].clientX,o+=t[n].clientY,n++;return{x:mt(i/e),y:mt(o/e)}}function L(t,e,i){return{x:e/t||0,y:i/t||0}}function A(t,e){return t===e?zt:vt(t)>=vt(e)?0>t?Lt:At:0>e?Ft:Bt}function F(t,e,i){i||(i=Wt);var o=e[i[0]]-t[i[0]],n=e[i[1]]-t[i[1]];return Math.sqrt(o*o+n*n)}function B(t,e,i){i||(i=Wt);var o=e[i[0]]-t[i[0]],n=e[i[1]]-t[i[1]];return 180*Math.atan2(n,o)/Math.PI}function R(t,e){return B(e[1],e[0],Yt)+B(t[1],t[0],Yt)}function j(t,e){return F(e[0],e[1],Yt)/F(t[0],t[1],Yt)}function H(){this.evEl=Vt,this.evWin=Ut,this.allow=!0,this.pressed=!1,C.apply(this,arguments)}function W(){this.evEl=Zt,this.evWin=Kt,C.apply(this,arguments),this.store=this.manager.session.pointerEvents=[]}function Y(){this.evTarget=Qt,this.evWin=$t,this.started=!1,C.apply(this,arguments)}function G(t,e){var i=x(t.touches),o=x(t.changedTouches);return e&(It|Nt)&&(i=k(i.concat(o),"identifier",!0)),[i,o]}function V(){this.evTarget=ee,this.targetIds={},C.apply(this,arguments)}function U(t,e){var i=x(t.touches),o=this.targetIds;if(e&(Et|Pt)&&1===i.length)return o[i[0].identifier]=!0,[i,i];var n,s,r=x(t.changedTouches),a=[],h=this.target;if(s=i.filter(function(t){return y(t.target,h)}),e===Et)for(n=0;na&&(e.push(t),a=e.length-1):n&(It|Nt)&&(i=!0),0>a||(e[a]=t,this.callback(this.manager,n,{pointers:e,changedPointers:[t],pointerType:s,srcEvent:t}),i&&e.splice(a,1))}});var Jt={touchstart:Et,touchmove:Pt,touchend:It,touchcancel:Nt},Qt="touchstart",$t="touchstart touchmove touchend touchcancel";c(Y,C,{handler:function(t){var e=Jt[t.type];if(e===Et&&(this.started=!0),this.started){var i=G.call(this,t,e);e&(It|Nt)&&i[0].length-i[1].length===0&&(this.started=!1),this.callback(this.manager,e,{pointers:i[0],changedPointers:i[1],pointerType:Mt,srcEvent:t})}}});var te={touchstart:Et,touchmove:Pt,touchend:It,touchcancel:Nt},ee="touchstart touchmove touchend touchcancel";c(V,C,{handler:function(t){var e=te[t.type],i=U.call(this,t,e);i&&this.callback(this.manager,e,{pointers:i[0],changedPointers:i[1],pointerType:Mt,srcEvent:t})}}),c(q,C,{handler:function(t,e,i){var o=i.pointerType==Mt,n=i.pointerType==Ct;if(o)this.mouse.allow=!1;else if(n&&!this.mouse.allow)return;e&(It|Nt)&&(this.mouse.allow=!0),this.callback(t,e,i)},destroy:function(){this.touch.destroy(),this.mouse.destroy()}});var ie=O(pt.style,"touchAction"),oe=ie!==a,ne="compute",se="auto",re="manipulation",ae="none",he="pan-x",de="pan-y";X.prototype={set:function(t){t==ne&&(t=this.compute()),oe&&this.manager.element.style&&(this.manager.element.style[ie]=t),this.actions=t.toLowerCase().trim()},update:function(){this.set(this.manager.options.touchAction)},compute:function(){var t=[];return l(this.manager.recognizers,function(e){f(e.options.enable,[e])&&(t=t.concat(e.getTouchAction()))}),Z(t.join(" "))},preventDefaults:function(t){if(!oe){var e=t.srcEvent,i=t.offsetDirection;if(this.manager.session.prevented)return void e.preventDefault();var o=this.actions,n=b(o,ae),s=b(o,de),r=b(o,he);if(n){var a=1===t.pointers.length,h=t.distance<2,d=t.deltaTime<250;if(a&&h&&d)return}if(!r||!s)return n||s&&i&Rt||r&&i&jt?this.preventSrc(e):void 0}},preventSrc:function(t){this.manager.session.prevented=!0,t.preventDefault()}};var le=1,ue=2,ce=4,pe=8,fe=pe,me=16,ve=32;K.prototype={defaults:{},set:function(t){return ut(this.options,t),this.manager&&this.manager.touchAction.update(),this},recognizeWith:function(t){if(d(t,"recognizeWith",this))return this;var e=this.simultaneous;return t=$(t,this),e[t.id]||(e[t.id]=t,t.recognizeWith(this)),this},dropRecognizeWith:function(t){return d(t,"dropRecognizeWith",this)?this:(t=$(t,this),delete this.simultaneous[t.id],this)},requireFailure:function(t){if(d(t,"requireFailure",this))return this;var e=this.requireFail;return t=$(t,this),-1===w(e,t)&&(e.push(t),t.requireFailure(this)),this},dropRequireFailure:function(t){if(d(t,"dropRequireFailure",this))return this;t=$(t,this);var e=w(this.requireFail,t);return e>-1&&this.requireFail.splice(e,1),this},hasRequireFailures:function(){return this.requireFail.length>0},canRecognizeWith:function(t){return!!this.simultaneous[t.id]},emit:function(t){function e(e){i.manager.emit(e,t)}var i=this,o=this.state;pe>o&&e(i.options.event+J(o)),e(i.options.event),t.additionalEvent&&e(t.additionalEvent),o>=pe&&e(i.options.event+J(o))},tryEmit:function(t){return this.canEmit()?this.emit(t):void(this.state=ve)},canEmit:function(){for(var t=0;ts?Lt:At,i=s!=this.pX,o=Math.abs(t.deltaX)):(n=0===r?zt:0>r?Ft:Bt,i=r!=this.pY,o=Math.abs(t.deltaY))),t.direction=n,i&&o>e.threshold&&n&e.direction},attrTest:function(t){return tt.prototype.attrTest.call(this,t)&&(this.state&ue||!(this.state&ue)&&this.directionTest(t))},emit:function(t){this.pX=t.deltaX,this.pY=t.deltaY;var e=Q(t.direction);e&&(t.additionalEvent=this.options.event+e),this._super.emit.call(this,t)}}),c(it,tt,{defaults:{event:"pinch",threshold:0,pointers:2},getTouchAction:function(){return[ae]},attrTest:function(t){return this._super.attrTest.call(this,t)&&(Math.abs(t.scale-1)>this.options.threshold||this.state&ue)},emit:function(t){if(1!==t.scale){var e=t.scale<1?"in":"out";t.additionalEvent=this.options.event+e}this._super.emit.call(this,t)}}),c(ot,K,{defaults:{event:"press",pointers:1,time:251,threshold:9},getTouchAction:function(){return[se]},process:function(t){var e=this.options,i=t.pointers.length===e.pointers,o=t.distancee.time;if(this._input=t,!o||!i||t.eventType&(It|Nt)&&!n)this.reset();else if(t.eventType&Et)this.reset(),this._timer=h(function(){this.state=fe,this.tryEmit()},e.time,this);else if(t.eventType&It)return fe;return ve},reset:function(){clearTimeout(this._timer)},emit:function(t){this.state===fe&&(t&&t.eventType&It?this.manager.emit(this.options.event+"up",t):(this._input.timeStamp=gt(),this.manager.emit(this.options.event,this._input)))}}),c(nt,tt,{defaults:{event:"rotate",threshold:0,pointers:2},getTouchAction:function(){return[ae]},attrTest:function(t){return this._super.attrTest.call(this,t)&&(Math.abs(t.rotation)>this.options.threshold||this.state&ue)}}),c(st,tt,{defaults:{event:"swipe",threshold:10,velocity:.3,direction:Rt|jt,pointers:1},getTouchAction:function(){return et.prototype.getTouchAction.call(this)},attrTest:function(t){var e,i=this.options.direction;return i&(Rt|jt)?e=t.overallVelocity:i&Rt?e=t.overallVelocityX:i&jt&&(e=t.overallVelocityY),this._super.attrTest.call(this,t)&&i&t.offsetDirection&&t.distance>this.options.threshold&&t.maxPointers==this.options.pointers&&vt(e)>this.options.velocity&&t.eventType&It},emit:function(t){var e=Q(t.offsetDirection);e&&this.manager.emit(this.options.event+e,t),this.manager.emit(this.options.event,t)}}),c(rt,K,{defaults:{event:"tap",pointers:1,taps:1,interval:300,time:250,threshold:9,posThreshold:10},getTouchAction:function(){return[re]},process:function(t){var e=this.options,i=t.pointers.length===e.pointers,o=t.distanceu,c=r||null===n?n:h+(n-h)*i,v=r||null===s?s:l+(s-l)*i;g=a._applyRange(c,v),d.updateHiddenDates(a.options.moment,a.body,a.options.hiddenDates),m=m||g,g&&a.body.emitter.emit("rangechange",{start:new Date(a.start),end:new Date(a.end),byUser:o}),r?m&&a.body.emitter.emit("rangechanged",{start:new Date(a.start),end:new Date(a.end),byUser:o}):a.animationTimer=setTimeout(b,20)}};return v()}var g=this._applyRange(n,s);if(d.updateHiddenDates(this.options.moment,this.body,this.options.hiddenDates),g){var y={start:new Date(this.start),end:new Date(this.end),byUser:o};this.body.emitter.emit("rangechange",y),this.body.emitter.emit("rangechanged",y)}},o.prototype._cancelAnimation=function(){this.animationTimer&&(clearTimeout(this.animationTimer),this.animationTimer=null)},o.prototype._applyRange=function(t,e){var i,o=null!=t?r.convert(t,"Date").valueOf():this.start,n=null!=e?r.convert(e,"Date").valueOf():this.end,s=null!=this.options.max?r.convert(this.options.max,"Date").valueOf():null,a=null!=this.options.min?r.convert(this.options.min,"Date").valueOf():null;if(isNaN(o)||null===o)throw new Error('Invalid start "'+t+'"');if(isNaN(n)||null===n)throw new Error('Invalid end "'+e+'"');if(o>n&&(n=o),null!==a&&a>o&&(i=a-o,o+=i,n+=i,null!=s&&n>s&&(n=s)),null!==s&&n>s&&(i=n-s,o-=i,n-=i,null!=a&&a>o&&(o=a)),null!==this.options.zoomMin){var h=parseFloat(this.options.zoomMin);0>h&&(h=0),h>n-o&&(this.end-this.start===h&&o>this.start&&nd&&(d=0),n-o>d&&(this.end-this.start===d&&othis.end?(o=this.start,n=this.end):(i=n-o-d,o+=i/2,n-=i/2))}var l=this.start!=o||this.end!=n;return o>=this.start&&o<=this.end||n>=this.start&&n<=this.end||this.start>=o&&this.start<=n||this.end>=o&&this.end<=n||this.body.emitter.emit("checkRangedItems"),this.start=o,this.end=n,l},o.prototype.getRange=function(){return{start:this.start,end:this.end}},o.prototype.conversion=function(t,e){return o.conversion(this.start,this.end,t,e)},o.conversion=function(t,e,i,o){return void 0===o&&(o=0),0!=i&&e-t!=0?{offset:t,scale:i/(e-t-o)}:{offset:0,scale:1}},o.prototype._onDragStart=function(t){this.deltaDifference=0,this.previousDelta=0,this.options.moveable&&this._isInsideRange(t)&&this.props.touch.allowDragging&&(this.props.touch.start=this.start,this.props.touch.end=this.end,this.props.touch.dragging=!0,this.body.dom.root&&(this.body.dom.root.style.cursor="move"))},o.prototype._onDrag=function(t){if(this.props.touch.dragging&&this.options.moveable&&this.props.touch.allowDragging){var e=this.options.direction;n(e);var i="horizontal"==e?t.deltaX:t.deltaY;i-=this.deltaDifference;var o=this.props.touch.end-this.props.touch.start,s=d.getHiddenDurationBetween(this.body.hiddenDates,this.start,this.end);o-=s;var r="horizontal"==e?this.body.domProps.center.width:this.body.domProps.center.height,a=-i/r*o,h=this.props.touch.start+a,l=this.props.touch.end+a,u=d.snapAwayFromHidden(this.body.hiddenDates,h,this.previousDelta-i,!0),c=d.snapAwayFromHidden(this.body.hiddenDates,l,this.previousDelta-i,!0);if(u!=h||c!=l)return this.deltaDifference+=i,this.props.touch.start=u,this.props.touch.end=c,void this._onDrag(t);this.previousDelta=i,this._applyRange(h,l);var p=new Date(this.start),f=new Date(this.end);this.body.emitter.emit("rangechange",{start:p,end:f,byUser:!0})}},o.prototype._onDragEnd=function(t){this.props.touch.dragging&&this.options.moveable&&this.props.touch.allowDragging&&(this.props.touch.dragging=!1,this.body.dom.root&&(this.body.dom.root.style.cursor="auto"),this.body.emitter.emit("rangechanged",{start:new Date(this.start),end:new Date(this.end),byUser:!0}))},o.prototype._onMouseWheel=function(t){if(this.options.zoomable&&this.options.moveable&&this._isInsideRange(t)&&(!this.options.zoomKey||t[this.options.zoomKey])){var e=0;if(t.wheelDelta?e=t.wheelDelta/120:t.detail&&(e=-t.detail/3),e){var i;i=0>e?1-e/5:1/(1+e/5);var o=s({x:t.clientX,y:t.clientY},this.body.dom.center),n=this._pointerToDate(o);this.zoom(i,n,e)}t.preventDefault()}},o.prototype._onTouch=function(t){this.props.touch.start=this.start,this.props.touch.end=this.end,this.props.touch.allowDragging=!0,this.props.touch.center=null,this.scaleOffset=0,this.deltaDifference=0},o.prototype._onPinch=function(t){if(this.options.zoomable&&this.options.moveable){this.props.touch.allowDragging=!1,this.props.touch.center||(this.props.touch.center=s(t.center,this.body.dom.center));var e=1/(t.scale+this.scaleOffset),i=this._pointerToDate(this.props.touch.center),o=d.getHiddenDurationBetween(this.body.hiddenDates,this.start,this.end),n=d.getHiddenDurationBefore(this.options.moment,this.body.hiddenDates,this,i),r=o-n,a=i-n+(this.props.touch.start-(i-n))*e,h=i+r+(this.props.touch.end-(i+r))*e;this.startToFront=0>=1-e,this.endToFront=0>=e-1;var l=d.snapAwayFromHidden(this.body.hiddenDates,a,1-e,!0),u=d.snapAwayFromHidden(this.body.hiddenDates,h,e-1,!0);(l!=a||u!=h)&&(this.props.touch.start=l,this.props.touch.end=u,this.scaleOffset=1-t.scale,a=l,h=u),this.setRange(a,h,!1,!0),this.startToFront=!1,this.endToFront=!0}},o.prototype._isInsideRange=function(t){var e=t.center?t.center.x:t.clientX,i=e-r.getAbsoluteLeft(this.body.dom.centerContainer),o=this.body.util.toTime(i);return o>=this.start&&o<=this.end},o.prototype._pointerToDate=function(t){var e,i=this.options.direction;if(n(i),"horizontal"==i)return this.body.util.toTime(t.x).valueOf();var o=this.body.domProps.center.height;return e=this.conversion(o),t.y/e.scale+e.offset},o.prototype.zoom=function(t,e,i){null==e&&(e=(this.start+this.end)/2);var o=d.getHiddenDurationBetween(this.body.hiddenDates,this.start,this.end),n=d.getHiddenDurationBefore(this.options.moment,this.body.hiddenDates,this,e),s=o-n,r=e-n+(this.start-(e-n))*t,a=e+s+(this.end-(e+s))*t;this.startToFront=i>0?!1:!0,this.endToFront=-i>0?!1:!0;var h=d.snapAwayFromHidden(this.body.hiddenDates,r,i,!0),l=d.snapAwayFromHidden(this.body.hiddenDates,a,-i,!0);(h!=r||l!=a)&&(r=h,a=l),this.setRange(r,a,!1,!0),this.startToFront=!1,this.endToFront=!0},o.prototype.move=function(t){var e=this.end-this.start,i=this.start+e*t,o=this.end+e*t;this.start=i,this.end=o},o.prototype.moveTo=function(t){var e=(this.start+this.end)/2,i=e-t,o=this.start-i,n=this.end-i;this.setRange(o,n)},t.exports=o},function(t,e,i){i(20);e.onTouch=function(t,e){e.inputHandler=function(t){t.isFirst&&e(t)},t.on("hammer.input",e.inputHandler)},e.onRelease=function(t,e){return e.inputHandler=function(t){t.isFinal&&e(t)},t.on("hammer.input",e.inputHandler)},e.offTouch=function(t,e){t.off("hammer.input",e.inputHandler)},e.offRelease=e.offTouch},function(t,e){function i(t,e){this.options=null,this.props=null}i.prototype.setOptions=function(t){t&&util.extend(this.options,t)},i.prototype.redraw=function(){return!1},i.prototype.destroy=function(){},i.prototype._isResized=function(){var t=this.props._previousWidth!==this.props.width||this.props._previousHeight!==this.props.height;return this.props._previousWidth=this.props.width,this.props._previousHeight=this.props.height,t},t.exports=i},function(t,e){e.convertHiddenOptions=function(t,i,o){if(o&&!Array.isArray(o))return e.convertHiddenOptions(t,i,[o]);if(i.hiddenDates=[],o&&1==Array.isArray(o)){for(var n=0;n=4*a){var c=0,p=s.clone();switch(o[h].repeat){case"daily":d.day()!=l.day()&&(c=1),d.dayOfYear(n.dayOfYear()),d.year(n.year()),d.subtract(7,"days"),l.dayOfYear(n.dayOfYear()),l.year(n.year()),l.subtract(7-c,"days"),p.add(1,"weeks");break;case"weekly":var f=l.diff(d,"days"),m=d.day();d.date(n.date()),d.month(n.month()),d.year(n.year()),l=d.clone(),d.day(m),l.day(m),l.add(f,"days"),d.subtract(1,"weeks"),l.subtract(1,"weeks"),p.add(1,"weeks");break;case"monthly":d.month()!=l.month()&&(c=1),d.month(n.month()),d.year(n.year()),d.subtract(1,"months"),l.month(n.month()),l.year(n.year()),l.subtract(1,"months"),l.add(c,"months"),p.add(1,"months");break;case"yearly":d.year()!=l.year()&&(c=1),d.year(n.year()),d.subtract(1,"years"),l.year(n.year()),l.subtract(1,"years"),l.add(c,"years"),p.add(1,"years");break;default:return void console.log("Wrong repeat format, allowed are: daily, weekly, monthly, yearly. Given:",o[h].repeat)}for(;p>d;)switch(i.hiddenDates.push({start:d.valueOf(),end:l.valueOf()}),o[h].repeat){case"daily":d.add(1,"days"),l.add(1,"days");break;case"weekly":d.add(1,"weeks"),l.add(1,"weeks");break;case"monthly":d.add(1,"months"),l.add(1,"months");break;case"yearly":d.add(1,"y"),l.add(1,"y");break;default:return void console.log("Wrong repeat format, allowed are: daily, weekly, monthly, yearly. Given:",o[h].repeat)}i.hiddenDates.push({start:d.valueOf(),end:l.valueOf()})}}e.removeDuplicates(i);var v=e.isHidden(i.range.start,i.hiddenDates),g=e.isHidden(i.range.end,i.hiddenDates),y=i.range.start,b=i.range.end;1==v.hidden&&(y=1==i.range.startToFront?v.startDate-1:v.endDate+1),1==g.hidden&&(b=1==i.range.endToFront?g.startDate-1:g.endDate+1),(1==v.hidden||1==g.hidden)&&i.range._applyRange(y,b)}},e.removeDuplicates=function(t){for(var e=t.hiddenDates,i=[],o=0;o=e[o].start&&e[n].end<=e[o].end?e[n].remove=!0:e[n].start>=e[o].start&&e[n].start<=e[o].end?(e[o].end=e[n].end,e[n].remove=!0):e[n].end>=e[o].start&&e[n].end<=e[o].end&&(e[o].start=e[n].start,e[n].remove=!0));for(var o=0;o=r&&a>n){o=!0;break}}if(1==o&&n=e&&i>r&&(o+=r-s)}return o},e.correctTimeForHidden=function(t,i,o,n){return n=t(n).toDate().valueOf(),n-=e.getHiddenDurationBefore(t,i,o,n)},e.getHiddenDurationBefore=function(t,e,i,o){var n=0;o=t(o).toDate().valueOf();for(var s=0;s=i.start&&a=a&&(n+=a-r)}return n},e.getAccumulatedHiddenDuration=function(t,e,i){for(var o=0,n=0,s=e.start,r=0;r=e.start&&h=i)break;o+=h-a}}return o},e.snapAwayFromHidden=function(t,i,o,n){var s=e.isHidden(i,t);return 1==s.hidden?0>o?1==n?s.startDate-(s.endDate-i)-1:s.startDate-1:1==n?s.endDate+(i-s.startDate)+1:s.endDate+1:i},e.isHidden=function(t,e){for(var i=0;i=o&&n>t)return{hidden:!0,startDate:o,endDate:n}}return{hidden:!1,startDate:o,endDate:n}}},function(t,e,i){function o(){}var n=i(12),s=i(20),r=i(24),a=i(1),h=(i(8),i(10),i(23),i(28),i(38)),d=i(39),l=i(26),u=i(41);n(o.prototype),o.prototype._create=function(t){function e(t){ +i.isActive()&&i.emit("mousewheel",t)}this.dom={},this.dom.container=t,this.dom.root=document.createElement("div"),this.dom.background=document.createElement("div"),this.dom.backgroundVertical=document.createElement("div"),this.dom.backgroundHorizontal=document.createElement("div"),this.dom.centerContainer=document.createElement("div"),this.dom.leftContainer=document.createElement("div"),this.dom.rightContainer=document.createElement("div"),this.dom.center=document.createElement("div"),this.dom.left=document.createElement("div"),this.dom.right=document.createElement("div"),this.dom.top=document.createElement("div"),this.dom.bottom=document.createElement("div"),this.dom.shadowTop=document.createElement("div"),this.dom.shadowBottom=document.createElement("div"),this.dom.shadowTopLeft=document.createElement("div"),this.dom.shadowBottomLeft=document.createElement("div"),this.dom.shadowTopRight=document.createElement("div"),this.dom.shadowBottomRight=document.createElement("div"),this.dom.root.className="vis-timeline",this.dom.background.className="vis-panel vis-background",this.dom.backgroundVertical.className="vis-panel vis-background vis-vertical",this.dom.backgroundHorizontal.className="vis-panel vis-background vis-horizontal",this.dom.centerContainer.className="vis-panel vis-center",this.dom.leftContainer.className="vis-panel vis-left",this.dom.rightContainer.className="vis-panel vis-right",this.dom.top.className="vis-panel vis-top",this.dom.bottom.className="vis-panel vis-bottom",this.dom.left.className="vis-content",this.dom.center.className="vis-content",this.dom.right.className="vis-content",this.dom.shadowTop.className="vis-shadow vis-top",this.dom.shadowBottom.className="vis-shadow vis-bottom",this.dom.shadowTopLeft.className="vis-shadow vis-top",this.dom.shadowBottomLeft.className="vis-shadow vis-bottom",this.dom.shadowTopRight.className="vis-shadow vis-top",this.dom.shadowBottomRight.className="vis-shadow vis-bottom",this.dom.root.appendChild(this.dom.background),this.dom.root.appendChild(this.dom.backgroundVertical),this.dom.root.appendChild(this.dom.backgroundHorizontal),this.dom.root.appendChild(this.dom.centerContainer),this.dom.root.appendChild(this.dom.leftContainer),this.dom.root.appendChild(this.dom.rightContainer),this.dom.root.appendChild(this.dom.top),this.dom.root.appendChild(this.dom.bottom),this.dom.centerContainer.appendChild(this.dom.center),this.dom.leftContainer.appendChild(this.dom.left),this.dom.rightContainer.appendChild(this.dom.right),this.dom.centerContainer.appendChild(this.dom.shadowTop),this.dom.centerContainer.appendChild(this.dom.shadowBottom),this.dom.leftContainer.appendChild(this.dom.shadowTopLeft),this.dom.leftContainer.appendChild(this.dom.shadowBottomLeft),this.dom.rightContainer.appendChild(this.dom.shadowTopRight),this.dom.rightContainer.appendChild(this.dom.shadowBottomRight),this.on("rangechange",function(){this.initialDrawDone===!0&&this._redraw()}.bind(this)),this.on("touch",this._onTouch.bind(this)),this.on("pan",this._onDrag.bind(this));var i=this;this.on("_change",function(t){t&&1==t.queue?i._redrawTimer||(i._redrawTimer=setTimeout(function(){i._redrawTimer=null,i._redraw()},0)):i._redraw()}),this.hammer=new s(this.dom.root),this.hammer.get("pinch").set({enable:!0}),this.hammer.get("pan").set({threshold:5,direction:30}),this.listeners={};var o=["tap","doubletap","press","pinch","pan","panstart","panmove","panend"];if(o.forEach(function(t){var e=function(e){i.isActive()&&i.emit(t,e)};i.hammer.on(t,e),i.listeners[t]=e}),r.onTouch(this.hammer,function(t){i.emit("touch",t)}.bind(this)),r.onRelease(this.hammer,function(t){i.emit("release",t)}.bind(this)),this.dom.root.addEventListener("mousewheel",e),this.dom.root.addEventListener("DOMMouseScroll",e),this.props={root:{},background:{},centerContainer:{},leftContainer:{},rightContainer:{},center:{},left:{},right:{},top:{},bottom:{},border:{},scrollTop:0,scrollTopMin:0},this.customTimes=[],this.touch={},this.redrawCount=0,this.initialDrawDone=!1,!t)throw new Error("No container provided");t.appendChild(this.dom.root)},o.prototype.setOptions=function(t){if(t){var e=["width","height","minHeight","maxHeight","autoResize","start","end","clickToUse","dataAttributes","hiddenDates","locale","locales","moment","throttleRedraw"];if(a.selectiveExtend(e,this.options,t),this.options.orientation={item:void 0,axis:void 0},"orientation"in t&&("string"==typeof t.orientation?this.options.orientation={item:t.orientation,axis:t.orientation}:"object"==typeof t.orientation&&("item"in t.orientation&&(this.options.orientation.item=t.orientation.item),"axis"in t.orientation&&(this.options.orientation.axis=t.orientation.axis))),"both"===this.options.orientation.axis){if(!this.timeAxis2){var i=this.timeAxis2=new h(this.body);i.setOptions=function(t){var e=t?a.extend({},t):{};e.orientation="top",h.prototype.setOptions.call(i,e)},this.components.push(i)}}else if(this.timeAxis2){var o=this.components.indexOf(this.timeAxis2);-1!==o&&this.components.splice(o,1),this.timeAxis2.destroy(),this.timeAxis2=null}if("function"==typeof t.drawPoints&&(t.drawPoints={onRender:t.drawPoints}),"hiddenDates"in this.options&&l.convertHiddenOptions(this.options.moment,this.body,this.options.hiddenDates),"clickToUse"in t&&(t.clickToUse?this.activator||(this.activator=new d(this.dom.root)):this.activator&&(this.activator.destroy(),delete this.activator)),"showCustomTime"in t)throw new Error("Option `showCustomTime` is deprecated. Create a custom time bar via timeline.addCustomTime(time [, id])");this._initAutoResize()}if(this.components.forEach(function(e){return e.setOptions(t)}),"configure"in t){this.configurator||(this.configurator=this._createConfigurator()),this.configurator.setOptions(t.configure);var n=a.deepExtend({},this.options);this.components.forEach(function(t){a.deepExtend(n,t.options)}),this.configurator.setModuleOptions({global:n})}this._origRedraw?this._redraw():(this._origRedraw=this._redraw.bind(this),this._redraw=a.throttle(this._origRedraw,this.options.throttleRedraw))},o.prototype.isActive=function(){return!this.activator||this.activator.active},o.prototype.destroy=function(){this.setItems(null),this.setGroups(null),this.off(),this._stopAutoResize(),this.dom.root.parentNode&&this.dom.root.parentNode.removeChild(this.dom.root),this.dom=null,this.activator&&(this.activator.destroy(),delete this.activator);for(var t in this.listeners)this.listeners.hasOwnProperty(t)&&delete this.listeners[t];this.listeners=null,this.hammer=null,this.components.forEach(function(t){return t.destroy()}),this.body=null},o.prototype.setCustomTime=function(t,e){var i=this.customTimes.filter(function(t){return e===t.options.id});if(0===i.length)throw new Error("No custom time bar found with id "+JSON.stringify(e));i.length>0&&i[0].setCustomTime(t)},o.prototype.getCustomTime=function(t){var e=this.customTimes.filter(function(e){return e.options.id===t});if(0===e.length)throw new Error("No custom time bar found with id "+JSON.stringify(t));return e[0].getCustomTime()},o.prototype.setCustomTimeTitle=function(t,e){var i=this.customTimes.filter(function(t){return t.options.id===e});if(0===i.length)throw new Error("No custom time bar found with id "+JSON.stringify(e));return i.length>0?i[0].setCustomTitle(t):void 0},o.prototype.getEventProperties=function(t){return{event:t}},o.prototype.addCustomTime=function(t,e){var i=void 0!==t?a.convert(t,"Date").valueOf():new Date,o=this.customTimes.some(function(t){return t.options.id===e});if(o)throw new Error("A custom time with id "+JSON.stringify(e)+" already exists");var n=new u(this.body,a.extend({},this.options,{time:i,id:e}));return this.customTimes.push(n),this.components.push(n),this._redraw(),e},o.prototype.removeCustomTime=function(t){var e=this.customTimes.filter(function(e){return e.options.id===t});if(0===e.length)throw new Error("No custom time bar found with id "+JSON.stringify(t));e.forEach(function(t){this.customTimes.splice(this.customTimes.indexOf(t),1),this.components.splice(this.components.indexOf(t),1),t.destroy()}.bind(this))},o.prototype.getVisibleItems=function(){return this.itemSet&&this.itemSet.getVisibleItems()||[]},o.prototype.fit=function(t){var e=this.getDataRange();if(null!==e.min||null!==e.max){var i=e.max-e.min,o=new Date(e.min.valueOf()-.01*i),n=new Date(e.max.valueOf()+.01*i),s=t&&void 0!==t.animation?t.animation:!0;this.range.setRange(o,n,s)}},o.prototype.getDataRange=function(){throw new Error("Cannot invoke abstract method getDataRange")},o.prototype.setWindow=function(t,e,i){var o;if(1==arguments.length){var n=arguments[0];o=void 0!==n.animation?n.animation:!0,this.range.setRange(n.start,n.end,o)}else o=i&&void 0!==i.animation?i.animation:!0,this.range.setRange(t,e,o)},o.prototype.moveTo=function(t,e){var i=this.range.end-this.range.start,o=a.convert(t,"Date").valueOf(),n=o-i/2,s=o+i/2,r=e&&void 0!==e.animation?e.animation:!0;this.range.setRange(n,s,r)},o.prototype.getWindow=function(){var t=this.range.getRange();return{start:new Date(t.start),end:new Date(t.end)}},o.prototype.redraw=function(){this._redraw()},o.prototype._redraw=function(){this.redrawCount++;var t=!1,e=this.options,i=this.props,o=this.dom;if(o&&o.container&&0!=o.container.clientWidth){l.updateHiddenDates(this.options.moment,this.body,this.options.hiddenDates),"top"==e.orientation?(a.addClassName(o.root,"vis-top"),a.removeClassName(o.root,"vis-bottom")):(a.removeClassName(o.root,"vis-top"),a.addClassName(o.root,"vis-bottom")),o.root.style.maxHeight=a.option.asSize(e.maxHeight,""),o.root.style.minHeight=a.option.asSize(e.minHeight,""),o.root.style.width=a.option.asSize(e.width,""),i.border.left=(o.centerContainer.offsetWidth-o.centerContainer.clientWidth)/2,i.border.right=i.border.left,i.border.top=(o.centerContainer.offsetHeight-o.centerContainer.clientHeight)/2,i.border.bottom=i.border.top;var n=o.root.offsetHeight-o.root.clientHeight,s=o.root.offsetWidth-o.root.clientWidth;0===o.centerContainer.clientHeight&&(i.border.left=i.border.top,i.border.right=i.border.left),0===o.root.clientHeight&&(s=n),i.center.height=o.center.offsetHeight,i.left.height=o.left.offsetHeight,i.right.height=o.right.offsetHeight,i.top.height=o.top.clientHeight||-i.border.top,i.bottom.height=o.bottom.clientHeight||-i.border.bottom;var r=Math.max(i.left.height,i.center.height,i.right.height),h=i.top.height+r+i.bottom.height+n+i.border.top+i.border.bottom;o.root.style.height=a.option.asSize(e.height,h+"px"),i.root.height=o.root.offsetHeight,i.background.height=i.root.height-n;var d=i.root.height-i.top.height-i.bottom.height-n;i.centerContainer.height=d,i.leftContainer.height=d,i.rightContainer.height=i.leftContainer.height,i.root.width=o.root.offsetWidth,i.background.width=i.root.width-s,i.left.width=o.leftContainer.clientWidth||-i.border.left,i.leftContainer.width=i.left.width,i.right.width=o.rightContainer.clientWidth||-i.border.right,i.rightContainer.width=i.right.width;var u=i.root.width-i.left.width-i.right.width-s;i.center.width=u,i.centerContainer.width=u,i.top.width=u,i.bottom.width=u,o.background.style.height=i.background.height+"px",o.backgroundVertical.style.height=i.background.height+"px",o.backgroundHorizontal.style.height=i.centerContainer.height+"px",o.centerContainer.style.height=i.centerContainer.height+"px",o.leftContainer.style.height=i.leftContainer.height+"px",o.rightContainer.style.height=i.rightContainer.height+"px",o.background.style.width=i.background.width+"px",o.backgroundVertical.style.width=i.centerContainer.width+"px",o.backgroundHorizontal.style.width=i.background.width+"px",o.centerContainer.style.width=i.center.width+"px",o.top.style.width=i.top.width+"px",o.bottom.style.width=i.bottom.width+"px",o.background.style.left="0",o.background.style.top="0",o.backgroundVertical.style.left=i.left.width+i.border.left+"px",o.backgroundVertical.style.top="0",o.backgroundHorizontal.style.left="0",o.backgroundHorizontal.style.top=i.top.height+"px",o.centerContainer.style.left=i.left.width+"px",o.centerContainer.style.top=i.top.height+"px",o.leftContainer.style.left="0",o.leftContainer.style.top=i.top.height+"px",o.rightContainer.style.left=i.left.width+i.center.width+"px",o.rightContainer.style.top=i.top.height+"px",o.top.style.left=i.left.width+"px",o.top.style.top="0",o.bottom.style.left=i.left.width+"px",o.bottom.style.top=i.top.height+i.centerContainer.height+"px",this._updateScrollTop();var c=this.props.scrollTop;"top"!=e.orientation.item&&(c+=Math.max(this.props.centerContainer.height-this.props.center.height-this.props.border.top-this.props.border.bottom,0)),o.center.style.left="0",o.center.style.top=c+"px",o.left.style.left="0",o.left.style.top=c+"px",o.right.style.left="0",o.right.style.top=c+"px";var p=0==this.props.scrollTop?"hidden":"",f=this.props.scrollTop==this.props.scrollTopMin?"hidden":"";o.shadowTop.style.visibility=p,o.shadowBottom.style.visibility=f,o.shadowTopLeft.style.visibility=p,o.shadowBottomLeft.style.visibility=f,o.shadowTopRight.style.visibility=p,o.shadowBottomRight.style.visibility=f,this.components.forEach(function(e){t=e.redraw()||t});var m=5;if(t){if(this.redrawCount0&&(this.props.scrollTop=0),this.props.scrollTope;e++)o=this.selection[e],n=this.items[o],n&&n.unselect();for(this.selection=[],e=0,i=t.length;i>e;e++)o=t[e],n=this.items[o],n&&(this.selection.push(o),n.select())},o.prototype.getSelection=function(){return this.selection.concat([])},o.prototype.getVisibleItems=function(){var t=this.body.range.getRange(),e=this.body.util.toScreen(t.start),i=this.body.util.toScreen(t.end),o=[];for(var n in this.groups)if(this.groups.hasOwnProperty(n))for(var s=this.groups[n],r=s.visibleItems,a=0;ae&&o.push(h.id)}return o},o.prototype._deselect=function(t){for(var e=this.selection,i=0,o=e.length;o>i;i++)if(e[i]==t){e.splice(i,1);break}},o.prototype.redraw=function(){var t=this.options.margin,e=this.body.range,i=s.option.asSize,o=this.options,n=o.orientation.item,r=!1,a=this.dom.frame;this.props.top=this.body.domProps.top.height+this.body.domProps.border.top,this.props.left=this.body.domProps.left.width+this.body.domProps.border.left,a.className="vis-itemset",r=this._orderGroups()||r;var h=e.end-e.start,d=h!=this.lastVisibleInterval||this.props.width!=this.props.lastWidth;d&&(this.stackDirty=!0),this.lastVisibleInterval=h,this.props.lastWidth=this.props.width;var l=this.stackDirty,u=this._firstGroup(),c={item:t.item,axis:t.axis},p={item:t.item,axis:t.item.vertical/2},f=0,m=t.axis+t.item.vertical;return this.groups[g].redraw(e,p,l),s.forEach(this.groups,function(t){var i=t==u?c:p,o=t.redraw(e,i,l);r=o||r,f+=t.height}),f=Math.max(f,m),this.stackDirty=!1,a.style.height=i(f),this.props.width=a.offsetWidth,this.props.height=f,this.dom.axis.style.top=i("top"==n?this.body.domProps.top.height+this.body.domProps.border.top:this.body.domProps.top.height+this.body.domProps.centerContainer.height),this.dom.axis.style.left="0",r=this._isResized()||r},o.prototype._firstGroup=function(){var t="top"==this.options.orientation.item?0:this.groupIds.length-1,e=this.groupIds[t],i=this.groups[e]||this.groups[v];return i||null},o.prototype._updateUngrouped=function(){var t,e,i=this.groups[v];this.groups[g];if(this.groupsData){if(i){i.hide(),delete this.groups[v];for(e in this.items)if(this.items.hasOwnProperty(e)){t=this.items[e],t.parent&&t.parent.remove(t);var o=this._getGroupId(t.data),n=this.groups[o];n&&n.add(t)||t.hide()}}}else if(!i){var s=null,r=null;i=new l(s,r,this),this.groups[v]=i;for(e in this.items)this.items.hasOwnProperty(e)&&(t=this.items[e],i.add(t));i.show()}},o.prototype.getLabelSet=function(){return this.dom.labelSet},o.prototype.setItems=function(t){var e,i=this,o=this.itemsData;if(t){if(!(t instanceof r||t instanceof a))throw new TypeError("Data must be an instance of DataSet or DataView");this.itemsData=t}else this.itemsData=null;if(o&&(s.forEach(this.itemListeners,function(t,e){o.off(e,t)}),e=o.getIds(),this._onRemove(e)),this.itemsData){var n=this.id;s.forEach(this.itemListeners,function(t,e){i.itemsData.on(e,t,n)}),e=this.itemsData.getIds(),this._onAdd(e),this._updateUngrouped()}this.body.emitter.emit("_change",{queue:!0})},o.prototype.getItems=function(){return this.itemsData},o.prototype.setGroups=function(t){var e,i=this;if(this.groupsData&&(s.forEach(this.groupListeners,function(t,e){i.groupsData.off(e,t)}),e=this.groupsData.getIds(),this.groupsData=null,this._onRemoveGroups(e)),t){if(!(t instanceof r||t instanceof a))throw new TypeError("Data must be an instance of DataSet or DataView");this.groupsData=t}else this.groupsData=null;if(this.groupsData){var o=this.id;s.forEach(this.groupListeners,function(t,e){i.groupsData.on(e,t,o)}),e=this.groupsData.getIds(),this._onAddGroups(e)}this._updateUngrouped(),this._order(),this.body.emitter.emit("_change",{queue:!0})},o.prototype.getGroups=function(){return this.groupsData},o.prototype.removeItem=function(t){var e=this.itemsData.get(t),i=this.itemsData.getDataSet();e&&this.options.onRemove(e,function(e){e&&i.remove(t)})},o.prototype._getType=function(t){return t.type||this.options.type||(t.end?"range":"box")},o.prototype._getGroupId=function(t){var e=this._getType(t);return"background"==e&&void 0==t.group?g:this.groupsData?t.group:v},o.prototype._onUpdate=function(t){var e=this;t.forEach(function(t){var i,n=e.itemsData.get(t,e.itemOptions),s=e.items[t],r=e._getType(n),a=o.types[r];if(s&&(a&&s instanceof a?e._updateItem(s,n):(i=s.selected,e._removeItem(s),s=null)),!s){if(!a)throw"rangeoverflow"==r?new TypeError('Item type "rangeoverflow" is deprecated. Use css styling instead: .vis-item.vis-range .vis-item-content {overflow: visible;}'):new TypeError('Unknown item type "'+r+'"');s=new a(n,e.conversion,e.options),s.id=t,e._addItem(s),i&&(this.selection.push(t),s.select())}}.bind(this)),this._order(),this.stackDirty=!0,this.body.emitter.emit("_change",{queue:!0})},o.prototype._onAdd=o.prototype._onUpdate,o.prototype._onRemove=function(t){var e=0,i=this;t.forEach(function(t){var o=i.items[t];o&&(e++,i._removeItem(o))}),e&&(this._order(),this.stackDirty=!0,this.body.emitter.emit("_change",{queue:!0}))},o.prototype._order=function(){s.forEach(this.groups,function(t){t.order()})},o.prototype._onUpdateGroups=function(t){this._onAddGroups(t)},o.prototype._onAddGroups=function(t){var e=this;t.forEach(function(t){var i=e.groupsData.get(t),o=e.groups[t];if(o)o.setData(i);else{if(t==v||t==g)throw new Error("Illegal group id. "+t+" is a reserved id.");var n=Object.create(e.options);s.extend(n,{height:null}),o=new l(t,i,e),e.groups[t]=o;for(var r in e.items)if(e.items.hasOwnProperty(r)){var a=e.items[r];a.data.group==t&&o.add(a)}o.order(),o.show()}}),this.body.emitter.emit("_change",{queue:!0})},o.prototype._onRemoveGroups=function(t){var e=this.groups;t.forEach(function(t){var i=e[t];i&&(i.hide(),delete e[t])}),this.markDirty(),this.body.emitter.emit("_change",{queue:!0})},o.prototype._orderGroups=function(){if(this.groupsData){var t=this.groupsData.getIds({order:this.options.groupOrder}),e=!s.equalArray(t,this.groupIds);if(e){var i=this.groups;t.forEach(function(t){i[t].hide()}),t.forEach(function(t){i[t].show()}),this.groupIds=t}return e}return!1},o.prototype._addItem=function(t){this.items[t.id]=t;var e=this._getGroupId(t.data),i=this.groups[e];i&&i.add(t)},o.prototype._updateItem=function(t,e){var i=t.data.group,o=t.data.subgroup;if(t.setData(e),i!=t.data.group||o!=t.data.subgroup){var n=this.groups[i];n&&n.remove(t);var s=this._getGroupId(t.data),r=this.groups[s];r&&r.add(t)}},o.prototype._removeItem=function(t){t.hide(),delete this.items[t.id];var e=this.selection.indexOf(t.id);-1!=e&&this.selection.splice(e,1),t.parent&&t.parent.remove(t)},o.prototype._constructByEndArray=function(t){for(var e=[],i=0;in+r)return}else{var a=e.height;if(n+a-r>o)return}}if(e&&e!=this.groupTouchParams.group){var h=this.groupsData,d=h.get(e.groupId),l=h.get(this.groupTouchParams.group.groupId);l&&d&&(this.options.groupOrderSwap(l,d,this.groupsData),this.groupsData.update(l),this.groupsData.update(d));var u=this.groupsData.getIds({order:this.options.groupOrder});if(!s.equalArray(u,this.groupTouchParams.originalOrder))for(var h=this.groupsData,c=this.groupTouchParams.originalOrder,p=this.groupTouchParams.group.groupId,f=Math.min(c.length,u.length),m=0,v=0,g=0;f>m;){for(;f>m+v&&f>m+g&&u[m+v]==c[m+g];)m++;if(m+v>=f)break;if(u[m+v]!=p)if(c[m+g]!=p){var y=u.indexOf(c[m+g]),b=h.get(u[m+v]),_=h.get(c[m+g]);this.options.groupOrderSwap(b,_,h),h.update(b),h.update(_);var w=u[m+v];u[m+v]=c[m+g],u[y]=w,m++}else g=1;else v=1}}}},o.prototype._onGroupDragEnd=function(t){if(this.options.groupEditable.order&&this.groupTouchParams.group){t.stopPropagation();var e=this,i=e.groupTouchParams.group.groupId,o=e.groupsData.getDataSet(),n=s.extend({},o.get(i));e.options.onMoveGroup(n,function(t){if(t)t[o._fieldId]=i,o.update(t);else{var n=o.getIds({order:e.options.groupOrder});if(!s.equalArray(n,e.groupTouchParams.originalOrder))for(var r=e.groupTouchParams.originalOrder,a=Math.min(r.length,n.length),h=0;a>h;){for(;a>h&&n[h]==r[h];)h++;if(h>=a)break;var d=n.indexOf(r[h]),l=o.get(n[h]),u=o.get(r[h]);e.options.groupOrderSwap(l,u,o),groupsData.update(l),groupsData.update(u);var c=n[h];n[h]=r[h],n[d]=c,h++}}}),e.body.emitter.emit("groupDragged",{groupId:i})}},o.prototype._onSelectItem=function(t){if(this.options.selectable){var e=t.srcEvent&&(t.srcEvent.ctrlKey||t.srcEvent.metaKey),i=t.srcEvent&&t.srcEvent.shiftKey;if(e||i)return void this._onMultiSelectItem(t);var o=this.getSelection(),n=this.itemFromTarget(t),s=n?[n.id]:[];this.setSelection(s);var r=this.getSelection();(r.length>0||o.length>0)&&this.body.emitter.emit("select",{items:r,event:t})}},o.prototype._onAddItem=function(t){if(this.options.selectable&&this.options.editable.add){var e=this,i=this.options.snap||null,o=this.itemFromTarget(t);if(o){var n=e.itemsData.get(o.id);this.options.onUpdate(n,function(t){t&&e.itemsData.getDataSet().update(t)})}else{var r=s.getAbsoluteLeft(this.dom.frame),a=t.center.x-r,h=this.body.util.toTime(a),d=this.body.util.getScale(),l=this.body.util.getStep(),u={start:i?i(h,d,l):h,content:"new item"};if("range"===this.options.type){var c=this.body.util.toTime(a+this.props.width/5);u.end=i?i(c,d,l):c}u[this.itemsData._fieldId]=s.randomUUID();var p=this.groupFromTarget(t);p&&(u.group=p.groupId),u=this._cloneItemData(u),this.options.onAdd(u,function(t){t&&e.itemsData.getDataSet().add(t)})}}},o.prototype._onMultiSelectItem=function(t){if(this.options.selectable){var e=this.itemFromTarget(t);if(e){var i=this.options.multiselect?this.getSelection():[],n=t.srcEvent&&t.srcEvent.shiftKey||!1;if(n&&this.options.multiselect){var s=this.itemsData.get(e.id).group,r=void 0;this.options.multiselectPerGroup&&i.length>0&&(r=this.itemsData.get(i[0]).group),this.options.multiselectPerGroup&&void 0!=r&&r!=s||i.push(e.id);var a=o._getItemRange(this.itemsData.get(i,this.itemOptions));if(!this.options.multiselectPerGroup||r==s){i=[];for(var h in this.items)if(this.items.hasOwnProperty(h)){var d=this.items[h],l=d.data.start,u=void 0!==d.data.end?d.data.end:l;!(l>=a.min&&u<=a.max)||this.options.multiselectPerGroup&&r!=this.itemsData.get(d.id).group||d instanceof m||i.push(d.id)}}}else{var c=i.indexOf(e.id);-1==c?i.push(e.id):i.splice(c,1)}this.setSelection(i),this.body.emitter.emit("select",{items:this.getSelection(),event:t})}}},o._getItemRange=function(t){var e=null,i=null;return t.forEach(function(t){(null==i||t.starte)&&(e=t.end):(null==e||t.start>e)&&(e=t.start)}),{min:i,max:e}},o.prototype.itemFromTarget=function(t){for(var e=t.target;e;){if(e.hasOwnProperty("timeline-item"))return e["timeline-item"];e=e.parentNode}return null},o.prototype.groupFromTarget=function(t){for(var e=t.center?t.center.y:t.clientY,i=0;ia&&ea)return n}else if(0===i&&e0?t.step:1,this.autoScale=!1)},o.prototype.setAutoScale=function(t){this.autoScale=t},o.prototype.setMinimumStep=function(t){if(void 0!=t){var e=31104e6,i=2592e6,o=864e5,n=36e5,s=6e4,r=1e3,a=1;1e3*e>t&&(this.scale="year",this.step=1e3),500*e>t&&(this.scale="year",this.step=500),100*e>t&&(this.scale="year",this.step=100),50*e>t&&(this.scale="year",this.step=50),10*e>t&&(this.scale="year",this.step=10),5*e>t&&(this.scale="year",this.step=5),e>t&&(this.scale="year",this.step=1),3*i>t&&(this.scale="month",this.step=3),i>t&&(this.scale="month",this.step=1),5*o>t&&(this.scale="day",this.step=5),2*o>t&&(this.scale="day",this.step=2),o>t&&(this.scale="day",this.step=1),o/2>t&&(this.scale="weekday",this.step=1),4*n>t&&(this.scale="hour",this.step=4),n>t&&(this.scale="hour",this.step=1),15*s>t&&(this.scale="minute",this.step=15),10*s>t&&(this.scale="minute",this.step=10),5*s>t&&(this.scale="minute",this.step=5),s>t&&(this.scale="minute",this.step=1),15*r>t&&(this.scale="second",this.step=15),10*r>t&&(this.scale="second",this.step=10),5*r>t&&(this.scale="second",this.step=5),r>t&&(this.scale="second",this.step=1),200*a>t&&(this.scale="millisecond",this.step=200),100*a>t&&(this.scale="millisecond",this.step=100),50*a>t&&(this.scale="millisecond",this.step=50),10*a>t&&(this.scale="millisecond",this.step=10),5*a>t&&(this.scale="millisecond",this.step=5),a>t&&(this.scale="millisecond",this.step=1)}},o.snap=function(t,e,i){var o=n(t);if("year"==e){var s=o.year()+Math.round(o.month()/12);o.year(Math.round(s/i)*i),o.month(0),o.date(0),o.hours(0),o.minutes(0),o.seconds(0),o.milliseconds(0)}else if("month"==e)o.date()>15?(o.date(1),o.add(1,"month")):o.date(1),o.hours(0),o.minutes(0),o.seconds(0),o.milliseconds(0);else if("day"==e){switch(i){case 5:case 2:o.hours(24*Math.round(o.hours()/24));break;default:o.hours(12*Math.round(o.hours()/12))}o.minutes(0),o.seconds(0),o.milliseconds(0)}else if("weekday"==e){switch(i){case 5:case 2:o.hours(12*Math.round(o.hours()/12));break;default:o.hours(6*Math.round(o.hours()/6))}o.minutes(0),o.seconds(0),o.milliseconds(0)}else if("hour"==e){switch(i){case 4:o.minutes(60*Math.round(o.minutes()/60));break;default:o.minutes(30*Math.round(o.minutes()/30))}o.seconds(0),o.milliseconds(0)}else if("minute"==e){switch(i){case 15:case 10:o.minutes(5*Math.round(o.minutes()/5)),o.seconds(0);break;case 5:o.seconds(60*Math.round(o.seconds()/60));break;default:o.seconds(30*Math.round(o.seconds()/30))}o.milliseconds(0)}else if("second"==e)switch(i){case 15:case 10:o.seconds(5*Math.round(o.seconds()/5)),o.milliseconds(0);break;case 5:o.milliseconds(1e3*Math.round(o.milliseconds()/1e3));break;default:o.milliseconds(500*Math.round(o.milliseconds()/500))}else if("millisecond"==e){var r=i>5?i/2:1;o.milliseconds(Math.round(o.milliseconds()/r)*r)}return o},o.prototype.isMajor=function(){if(1==this.switchedYear)switch(this.switchedYear=!1,this.scale){case"year":case"month":case"weekday":case"day":case"hour":case"minute":case"second":case"millisecond":return!0;default:return!1}else if(1==this.switchedMonth)switch(this.switchedMonth=!1,this.scale){case"weekday":case"day":case"hour":case"minute":case"second":case"millisecond":return!0;default:return!1}else if(1==this.switchedDay)switch(this.switchedDay=!1,this.scale){case"millisecond":case"second":case"minute":case"hour":return!0;default:return!1}var t=this.moment(this.current);switch(this.scale){case"millisecond":return 0==t.milliseconds();case"second":return 0==t.seconds();case"minute":return 0==t.hours()&&0==t.minutes();case"hour":return 0==t.hours();case"weekday":case"day":return 1==t.date();case"month":return 0==t.month();case"year":return!1;default:return!1}},o.prototype.getLabelMinor=function(t){void 0==t&&(t=this.current);var e=this.format.minorLabels[this.scale];return e&&e.length>0?this.moment(t).format(e):""},o.prototype.getLabelMajor=function(t){void 0==t&&(t=this.current);var e=this.format.majorLabels[this.scale];return e&&e.length>0?this.moment(t).format(e):""},o.prototype.getClassName=function(){function t(t){return t/h%2==0?" vis-even":" vis-odd"}function e(t){return t.isSame(new Date,"day")?" vis-today":t.isSame(s().add(1,"day"),"day")?" vis-tomorrow":t.isSame(s().add(-1,"day"),"day")?" vis-yesterday":""}function i(t){return t.isSame(new Date,"week")?" vis-current-week":""}function o(t){return t.isSame(new Date,"month")?" vis-current-month":""}function n(t){return t.isSame(new Date,"year")?" vis-current-year":""}var s=this.moment,r=this.moment(this.current),a=r.locale?r.locale("en"):r.lang("en"),h=this.step;switch(this.scale){case"millisecond":return t(a.milliseconds()).trim();case"second":return t(a.seconds()).trim();case"minute":return t(a.minutes()).trim();case"hour":var d=a.hours();return 4==this.step&&(d=d+"-h"+(d+4)),"vis-h"+d+e(a)+t(a.hours());case"weekday":return"vis-"+a.format("dddd").toLowerCase()+e(a)+i(a)+t(a.date());case"day":var l=a.date(),u=a.format("MMMM").toLowerCase();return"vis-day"+l+" vis-"+u+o(a)+t(l-1);case"month":return"vis-"+a.format("MMMM").toLowerCase()+o(a)+t(a.month());case"year":var c=a.year();return"vis-year"+c+n(a)+t(c);default:return""}},t.exports=o},function(t,e,i){function o(t,e,i){this.groupId=t,this.subgroups={},this.subgroupIndex=0,this.subgroupOrderer=e&&e.subgroupOrder,this.itemSet=i,this.dom={},this.props={label:{width:0,height:0}},this.className=null,this.items={},this.visibleItems=[],this.orderedItems={byStart:[],byEnd:[]},this.checkRangedItems=!1;var o=this;this.itemSet.body.emitter.on("checkRangedItems",function(){o.checkRangedItems=!0}),this._create(),this.setData(e)}var n=i(1),s=i(31);i(32);o.prototype._create=function(){var t=document.createElement("div");this.itemSet.options.groupEditable.order?t.className="vis-label draggable":t.className="vis-label",this.dom.label=t;var e=document.createElement("div");e.className="vis-inner",t.appendChild(e),this.dom.inner=e;var i=document.createElement("div");i.className="vis-group",i["timeline-group"]=this,this.dom.foreground=i,this.dom.background=document.createElement("div"),this.dom.background.className="vis-group",this.dom.axis=document.createElement("div"),this.dom.axis.className="vis-group",this.dom.marker=document.createElement("div"),this.dom.marker.style.visibility="hidden",this.dom.marker.innerHTML="?",this.dom.background.appendChild(this.dom.marker)},o.prototype.setData=function(t){var e;if(e=this.itemSet.options&&this.itemSet.options.groupTemplate?this.itemSet.options.groupTemplate(t):t&&t.content,e instanceof Element){for(this.dom.inner.appendChild(e);this.dom.inner.firstChild;)this.dom.inner.removeChild(this.dom.inner.firstChild);this.dom.inner.appendChild(e)}else void 0!==e&&null!==e?this.dom.inner.innerHTML=e:this.dom.inner.innerHTML=this.groupId||"";this.dom.label.title=t&&t.title||"",this.dom.inner.firstChild?n.removeClassName(this.dom.inner,"vis-hidden"):n.addClassName(this.dom.inner,"vis-hidden");var i=t&&t.className||null;i!=this.className&&(this.className&&(n.removeClassName(this.dom.label,this.className),n.removeClassName(this.dom.foreground,this.className),n.removeClassName(this.dom.background,this.className),n.removeClassName(this.dom.axis,this.className)),n.addClassName(this.dom.label,i),n.addClassName(this.dom.foreground,i),n.addClassName(this.dom.background,i),n.addClassName(this.dom.axis,i),this.className=i),this.style&&(n.removeCssText(this.dom.label,this.style),this.style=null),t&&t.style&&(n.addCssText(this.dom.label,t.style),this.style=t.style)},o.prototype.getLabelWidth=function(){return this.props.label.width},o.prototype.redraw=function(t,e,i){var o=!1,r=this.dom.marker.clientHeight;if(r!=this.lastMarkerHeight&&(this.lastMarkerHeight=r,n.forEach(this.items,function(t){t.dirty=!0,t.displayed&&t.redraw()}),i=!0),this._calculateSubGroupHeights(),"function"==typeof this.itemSet.options.order){if(i){var a=this,h=!1;n.forEach(this.items,function(t){t.displayed||(t.redraw(),a.visibleItems.push(t)),t.repositionX(h)});var d=this.orderedItems.byStart.slice().sort(function(t,e){return a.itemSet.options.order(t.data,e.data)});s.stack(d,e,!0)}this.visibleItems=this._updateVisibleItems(this.orderedItems,this.visibleItems,t)}else this.visibleItems=this._updateVisibleItems(this.orderedItems,this.visibleItems,t),this.itemSet.options.stack?s.stack(this.visibleItems,e,i):s.nostack(this.visibleItems,e,this.subgroups);var l=this._calculateHeight(e),u=this.dom.foreground;this.top=u.offsetTop,this.left=u.offsetLeft,this.width=u.offsetWidth,o=n.updateProperty(this,"height",l)||o,o=n.updateProperty(this.props.label,"width",this.dom.inner.clientWidth)||o,o=n.updateProperty(this.props.label,"height",this.dom.inner.clientHeight)||o,this.dom.background.style.height=l+"px",this.dom.foreground.style.height=l+"px",this.dom.label.style.height=l+"px";for(var c=0,p=this.visibleItems.length;p>c;c++){var f=this.visibleItems[c];f.repositionY(e)}return o},o.prototype._calculateSubGroupHeights=function(){if(Object.keys(this.subgroups).length>0){var t=this;this.resetSubgroups(),n.forEach(this.visibleItems,function(e){void 0!==e.data.subgroup&&(t.subgroups[e.data.subgroup].height=Math.max(t.subgroups[e.data.subgroup].height,e.height),t.subgroups[e.data.subgroup].visible=!0)})}},o.prototype._calculateHeight=function(t){var e,i=this.visibleItems;if(i.length>0){var o=i[0].top,s=i[0].top+i[0].height;if(n.forEach(i,function(t){o=Math.min(o,t.top),s=Math.max(s,t.top+t.height)}),o>t.axis){var r=o-t.axis;s-=r,n.forEach(i,function(t){t.top-=r})}e=s+t.item.vertical/2}else e=0;return e=Math.max(e,this.props.label.height)},o.prototype.show=function(){this.dom.label.parentNode||this.itemSet.dom.labelSet.appendChild(this.dom.label),this.dom.foreground.parentNode||this.itemSet.dom.foreground.appendChild(this.dom.foreground),this.dom.background.parentNode||this.itemSet.dom.background.appendChild(this.dom.background),this.dom.axis.parentNode||this.itemSet.dom.axis.appendChild(this.dom.axis)},o.prototype.hide=function(){var t=this.dom.label;t.parentNode&&t.parentNode.removeChild(t);var e=this.dom.foreground;e.parentNode&&e.parentNode.removeChild(e);var i=this.dom.background;i.parentNode&&i.parentNode.removeChild(i);var o=this.dom.axis;o.parentNode&&o.parentNode.removeChild(o)},o.prototype.add=function(t){if(this.items[t.id]=t,t.setParent(this),void 0!==t.data.subgroup&&(void 0===this.subgroups[t.data.subgroup]&&(this.subgroups[t.data.subgroup]={height:0,visible:!1,index:this.subgroupIndex,items:[]},this.subgroupIndex++),this.subgroups[t.data.subgroup].items.push(t)),this.orderSubgroups(),-1==this.visibleItems.indexOf(t)){var e=this.itemSet.body.range;this._checkIfVisible(t,this.visibleItems,e)}},o.prototype.orderSubgroups=function(){if(void 0!==this.subgroupOrderer){var t=[];if("string"==typeof this.subgroupOrderer){for(var e in this.subgroups)t.push({subgroup:e,sortField:this.subgroups[e].items[0].data[this.subgroupOrderer]});t.sort(function(t,e){return t.sortField-e.sortField})}else if("function"==typeof this.subgroupOrderer){for(var e in this.subgroups)t.push(this.subgroups[e].items[0].data);t.sort(this.subgroupOrderer)}if(t.length>0)for(var i=0;it?-1:l>=t?0:1};if(e.length>0)for(s=0;sl}),1==this.checkRangedItems)for(this.checkRangedItems=!1,s=0;sl})}for(s=0;s=0&&(s=e[r],!n(s));r--)void 0===o[s.id]&&(o[s.id]=!0,i.push(s));for(r=t+1;rn;n++)t[n].top=null;for(n=0,s=t.length;s>n;n++){var r=t[n];if(r.stack&&null===r.top){r.top=i.axis;do{for(var a=null,h=0,d=t.length;d>h;h++){var l=t[h];if(null!==l.top&&l!==r&&l.stack&&e.collision(r,l,i.item)){a=l;break}}null!=a&&(r.top=a.top+a.height+i.item.vertical)}while(a)}}},e.nostack=function(t,e,i){var o,n,s;for(o=0,n=t.length;n>o;o++)if(void 0!==t[o].data.subgroup){s=e.axis;for(var r in i)i.hasOwnProperty(r)&&1==i[r].visible&&i[r].indexe.left&&t.top-o.vertical+ie.top}},function(t,e,i){function o(t,e,i){if(this.props={content:{width:0}},this.overflow=!1,t){if(void 0==t.start)throw new Error('Property "start" missing in item '+t.id);if(void 0==t.end)throw new Error('Property "end" missing in item '+t.id)}n.call(this,t,e,i)}var n=(i(20),i(33));o.prototype=new n(null,null,null),o.prototype.baseClassName="vis-item vis-range",o.prototype.isVisible=function(t){return this.data.startt.start},o.prototype.redraw=function(){var t=this.dom;if(t||(this.dom={},t=this.dom,t.box=document.createElement("div"),t.frame=document.createElement("div"),t.frame.className="vis-item-overflow",t.box.appendChild(t.frame),t.content=document.createElement("div"),t.content.className="vis-item-content",t.frame.appendChild(t.content),t.box["timeline-item"]=this,this.dirty=!0),!this.parent)throw new Error("Cannot redraw item: no parent attached");if(!t.box.parentNode){var e=this.parent.dom.foreground;if(!e)throw new Error("Cannot redraw item: parent has no foreground container element");e.appendChild(t.box)}if(this.displayed=!0,this.dirty){this._updateContents(this.dom.content),this._updateTitle(this.dom.box),this._updateDataAttributes(this.dom.box),this._updateStyle(this.dom.box);var i=(this.options.editable.updateTime||this.options.editable.updateGroup||this.editable===!0)&&this.editable!==!1,o=(this.data.className?" "+this.data.className:"")+(this.selected?" vis-selected":"")+(i?" vis-editable":" vis-readonly");t.box.className=this.baseClassName+o,this.overflow="hidden"!==window.getComputedStyle(t.frame).overflow,this.dom.content.style.maxWidth="none",this.props.content.width=this.dom.content.offsetWidth,this.height=this.dom.box.offsetHeight,this.dom.content.style.maxWidth="",this.dirty=!1}this._repaintDeleteButton(t.box),this._repaintDragLeft(),this._repaintDragRight()},o.prototype.show=function(){this.displayed||this.redraw()},o.prototype.hide=function(){if(this.displayed){var t=this.dom.box;t.parentNode&&t.parentNode.removeChild(t),this.displayed=!1}},o.prototype.repositionX=function(t){var e,i,o=this.parent.width,n=this.conversion.toScreen(this.data.start),s=this.conversion.toScreen(this.data.end);(void 0===t||t===!0)&&(-o>n&&(n=-o),s>2*o&&(s=2*o));var r=Math.max(s-n,1);switch(this.overflow?(this.left=n,this.width=r+this.props.content.width,i=this.props.content.width):(this.left=n,this.width=r,i=Math.min(s-n,this.props.content.width)),this.dom.box.style.left=this.left+"px",this.dom.box.style.width=r+"px",this.options.align){case"left":this.dom.content.style.left="0";break;case"right":this.dom.content.style.left=Math.max(r-i,0)+"px";break;case"center":this.dom.content.style.left=Math.max((r-i)/2,0)+"px";break;default:e=this.overflow?s>0?Math.max(-n,0):-i:0>n?-n:0,this.dom.content.style.left=e+"px"}},o.prototype.repositionY=function(){var t=this.options.orientation.item,e=this.dom.box;"top"==t?e.style.top=this.top+"px":e.style.top=this.parent.height-this.top-this.height+"px"},o.prototype._repaintDragLeft=function(){if(this.selected&&this.options.editable.updateTime&&!this.dom.dragLeft){var t=document.createElement("div");t.className="vis-drag-left",t.dragLeftItem=this,this.dom.box.appendChild(t),this.dom.dragLeft=t}else!this.selected&&this.dom.dragLeft&&(this.dom.dragLeft.parentNode&&this.dom.dragLeft.parentNode.removeChild(this.dom.dragLeft),this.dom.dragLeft=null)},o.prototype._repaintDragRight=function(){if(this.selected&&this.options.editable.updateTime&&!this.dom.dragRight){var t=document.createElement("div");t.className="vis-drag-right",t.dragRightItem=this,this.dom.box.appendChild(t),this.dom.dragRight=t}else!this.selected&&this.dom.dragRight&&(this.dom.dragRight.parentNode&&this.dom.dragRight.parentNode.removeChild(this.dom.dragRight),this.dom.dragRight=null)},t.exports=o},function(t,e,i){function o(t,e,i){this.id=null,this.parent=null,this.data=t,this.dom=null,this.conversion=e||{},this.options=i||{},this.selected=!1,this.displayed=!1,this.dirty=!0,this.top=null,this.left=null,this.width=null,this.height=null,this.editable=null,this.data&&this.data.hasOwnProperty("editable")&&"boolean"==typeof this.data.editable&&(this.editable=t.editable)}var n=i(20),s=i(1);o.prototype.stack=!0,o.prototype.select=function(){this.selected=!0,this.dirty=!0,this.displayed&&this.redraw()},o.prototype.unselect=function(){this.selected=!1,this.dirty=!0,this.displayed&&this.redraw()},o.prototype.setData=function(t){var e=void 0!=t.group&&this.data.group!=t.group;e&&this.parent.itemSet._moveToGroup(this,t.group),t.hasOwnProperty("editable")&&"boolean"==typeof t.editable&&(this.editable=t.editable),this.data=t,this.dirty=!0,this.displayed&&this.redraw()},o.prototype.setParent=function(t){this.displayed?(this.hide(),this.parent=t,this.parent&&this.show()):this.parent=t},o.prototype.isVisible=function(t){return!1},o.prototype.show=function(){return!1},o.prototype.hide=function(){return!1},o.prototype.redraw=function(){},o.prototype.repositionX=function(){},o.prototype.repositionY=function(){},o.prototype._repaintDeleteButton=function(t){var e=(this.options.editable.remove||this.data.editable===!0)&&this.data.editable!==!1;if(this.selected&&e&&!this.dom.deleteButton){var i=this,o=document.createElement("div");o.className="vis-delete",o.title="Delete this item",new n(o).on("tap",function(t){t.stopPropagation(),i.parent.removeFromDataSet(i)}),t.appendChild(o),this.dom.deleteButton=o}else!this.selected&&this.dom.deleteButton&&(this.dom.deleteButton.parentNode&&this.dom.deleteButton.parentNode.removeChild(this.dom.deleteButton),this.dom.deleteButton=null)},o.prototype._updateContents=function(t){var e;if(this.options.template){var i=this.parent.itemSet.itemsData.get(this.id);e=this.options.template(i)}else e=this.data.content;var o=this._contentToString(this.content)!==this._contentToString(e);if(o){if(e instanceof Element)t.innerHTML="",t.appendChild(e);else if(void 0!=e)t.innerHTML=e;else if("background"!=this.data.type||void 0!==this.data.content)throw new Error('Property "content" missing in item '+this.id);this.content=e}},o.prototype._updateTitle=function(t){null!=this.data.title?t.title=this.data.title||"":t.removeAttribute("vis-title")},o.prototype._updateDataAttributes=function(t){if(this.options.dataAttributes&&this.options.dataAttributes.length>0){var e=[];if(Array.isArray(this.options.dataAttributes))e=this.options.dataAttributes;else{if("all"!=this.options.dataAttributes)return;e=Object.keys(this.data)}for(var i=0;in;n++){var r=this.visibleItems[n];r.repositionY(e)}return o; +},o.prototype.show=function(){this.dom.background.parentNode||this.itemSet.dom.background.appendChild(this.dom.background)},t.exports=o},function(t,e,i){function o(t,e,i){if(this.props={dot:{width:0,height:0},line:{width:0,height:0}},t&&void 0==t.start)throw new Error('Property "start" missing in item '+t);n.call(this,t,e,i)}var n=i(33);i(1);o.prototype=new n(null,null,null),o.prototype.isVisible=function(t){var e=(t.end-t.start)/4;return this.data.start>t.start-e&&this.data.startt.start-e&&this.data.startt.start},o.prototype.redraw=function(){var t=this.dom;if(t||(this.dom={},t=this.dom,t.box=document.createElement("div"),t.frame=document.createElement("div"),t.frame.className="vis-item-overflow",t.box.appendChild(t.frame),t.content=document.createElement("div"),t.content.className="vis-item-content",t.frame.appendChild(t.content),this.dirty=!0),!this.parent)throw new Error("Cannot redraw item: no parent attached");if(!t.box.parentNode){var e=this.parent.dom.background;if(!e)throw new Error("Cannot redraw item: parent has no background container element");e.appendChild(t.box)}if(this.displayed=!0,this.dirty){this._updateContents(this.dom.content),this._updateTitle(this.dom.content),this._updateDataAttributes(this.dom.content),this._updateStyle(this.dom.box);var i=(this.data.className?" "+this.data.className:"")+(this.selected?" vis-selected":"");t.box.className=this.baseClassName+i,this.overflow="hidden"!==window.getComputedStyle(t.content).overflow,this.props.content.width=this.dom.content.offsetWidth,this.height=0,this.dirty=!1}},o.prototype.show=r.prototype.show,o.prototype.hide=r.prototype.hide,o.prototype.repositionX=r.prototype.repositionX,o.prototype.repositionY=function(t){var e="top"===this.options.orientation.item;this.dom.content.style.top=e?"":"0",this.dom.content.style.bottom=e?"0":"";var i;if(void 0!==this.data.subgroup){var o=this.data.subgroup,n=this.parent.subgroups,r=n[o].index;if(1==e){i=this.parent.subgroups[o].height+t.item.vertical,i+=0==r?t.axis-.5*t.item.vertical:0;var a=this.parent.top;for(var h in n)n.hasOwnProperty(h)&&1==n[h].visible&&n[h].indexr&&(a+=l)}i=this.parent.subgroups[o].height+t.item.vertical,this.dom.box.style.top=this.parent.height-d+a+"px",this.dom.box.style.bottom=""}}else this.parent instanceof s?(i=Math.max(this.parent.height,this.parent.itemSet.body.domProps.center.height,this.parent.itemSet.body.domProps.centerContainer.height),this.dom.box.style.top=e?"0":"",this.dom.box.style.bottom=e?"":"0"):(i=this.parent.height,this.dom.box.style.top=this.parent.top+"px",this.dom.box.style.bottom="");this.dom.box.style.height=i+"px"},t.exports=o},function(t,e,i){function o(t,e){this.dom={foreground:null,lines:[],majorTexts:[],minorTexts:[],redundant:{lines:[],majorTexts:[],minorTexts:[]}},this.props={range:{start:0,end:0,minimumStep:0},lineTop:0},this.defaultOptions={orientation:{axis:"bottom"},showMinorLabels:!0,showMajorLabels:!0,maxMinorChars:7,format:r.FORMAT,moment:h,timeAxis:null},this.options=n.extend({},this.defaultOptions),this.body=t,this._create(),this.setOptions(e)}var n=i(1),s=i(25),r=i(29),a=i(26),h=i(2);o.prototype=new s,o.prototype.setOptions=function(t){t&&(n.selectiveExtend(["showMinorLabels","showMajorLabels","maxMinorChars","hiddenDates","timeAxis","moment"],this.options,t),n.selectiveDeepExtend(["format"],this.options,t),"orientation"in t&&("string"==typeof t.orientation?this.options.orientation.axis=t.orientation:"object"==typeof t.orientation&&"axis"in t.orientation&&(this.options.orientation.axis=t.orientation.axis)),"locale"in t&&("function"==typeof h.locale?h.locale(t.locale):h.lang(t.locale)))},o.prototype._create=function(){this.dom.foreground=document.createElement("div"),this.dom.background=document.createElement("div"),this.dom.foreground.className="vis-time-axis vis-foreground",this.dom.background.className="vis-time-axis vis-background"},o.prototype.destroy=function(){this.dom.foreground.parentNode&&this.dom.foreground.parentNode.removeChild(this.dom.foreground),this.dom.background.parentNode&&this.dom.background.parentNode.removeChild(this.dom.background),this.body=null},o.prototype.redraw=function(){var t=this.props,e=this.dom.foreground,i=this.dom.background,o="top"==this.options.orientation.axis?this.body.dom.top:this.body.dom.bottom,n=e.parentNode!==o;this._calculateCharSize();var s=this.options.showMinorLabels&&"none"!==this.options.orientation.axis,r=this.options.showMajorLabels&&"none"!==this.options.orientation.axis;t.minorLabelHeight=s?t.minorCharHeight:0,t.majorLabelHeight=r?t.majorCharHeight:0,t.height=t.minorLabelHeight+t.majorLabelHeight,t.width=e.offsetWidth,t.minorLineHeight=this.body.domProps.root.height-t.majorLabelHeight-("top"==this.options.orientation.axis?this.body.domProps.bottom.height:this.body.domProps.top.height),t.minorLineWidth=1,t.majorLineHeight=t.minorLineHeight+t.majorLabelHeight,t.majorLineWidth=1;var a=e.nextSibling,h=i.nextSibling;return e.parentNode&&e.parentNode.removeChild(e),i.parentNode&&i.parentNode.removeChild(i),e.style.height=this.props.height+"px",this._repaintLabels(),a?o.insertBefore(e,a):o.appendChild(e),h?this.body.dom.backgroundVertical.insertBefore(i,h):this.body.dom.backgroundVertical.appendChild(i),this._isResized()||n},o.prototype._repaintLabels=function(){var t=this.options.orientation.axis,e=n.convert(this.body.range.start,"Number"),i=n.convert(this.body.range.end,"Number"),o=this.body.util.toTime((this.props.minorCharWidth||10)*this.options.maxMinorChars).valueOf(),s=o-a.getHiddenDurationBefore(this.options.moment,this.body.hiddenDates,this.body.range,o);s-=this.body.util.toTime(0).valueOf();var h=new r(new Date(e),new Date(i),s,this.body.hiddenDates);h.setMoment(this.options.moment),this.options.format&&h.setFormat(this.options.format),this.options.timeAxis&&h.setScale(this.options.timeAxis),this.step=h;var l=this.dom;l.redundant.lines=l.lines,l.redundant.majorTexts=l.majorTexts,l.redundant.minorTexts=l.minorTexts,l.lines=[],l.majorTexts=[],l.minorTexts=[];var u,c,p,f,m,v,g,y,b,_,w=0,x=void 0,k=0,O=1e3;for(h.start(),c=h.getCurrent(),f=this.body.util.toScreen(c);h.hasNext()&&O>k;){k++,m=h.isMajor(),_=h.getClassName(),b=h.getLabelMinor(),u=c,p=f,h.next(),c=h.getCurrent(),v=h.isMajor(),f=this.body.util.toScreen(c),g=w,w=f-p;var M=w>=.4*g;if(this.options.showMinorLabels&&M){var D=this._repaintMinorText(p,b,t,_);D.style.width=w+"px"}m&&this.options.showMajorLabels?(p>0&&(void 0==x&&(x=p),D=this._repaintMajorText(p,h.getLabelMajor(),t,_)),y=this._repaintMajorLine(p,w,t,_)):M?y=this._repaintMinorLine(p,w,t,_):y&&(y.style.width=parseInt(y.style.width)+w+"px")}if(k!==O||d||(console.warn("Something is wrong with the Timeline scale. Limited drawing of grid lines to "+O+" lines."),d=!0),this.options.showMajorLabels){var C=this.body.util.toTime(0),S=h.getLabelMajor(C),T=S.length*(this.props.majorCharWidth||10)+10;(void 0==x||x>T)&&this._repaintMajorText(0,S,t,_)}n.forEach(this.dom.redundant,function(t){for(;t.length;){var e=t.pop();e&&e.parentNode&&e.parentNode.removeChild(e)}})},o.prototype._repaintMinorText=function(t,e,i,o){var n=this.dom.redundant.minorTexts.shift();if(!n){var s=document.createTextNode("");n=document.createElement("div"),n.appendChild(s),this.dom.foreground.appendChild(n)}return this.dom.minorTexts.push(n),n.childNodes[0].nodeValue=e,n.style.top="top"==i?this.props.majorLabelHeight+"px":"0",n.style.left=t+"px",n.className="vis-text vis-minor "+o,n},o.prototype._repaintMajorText=function(t,e,i,o){var n=this.dom.redundant.majorTexts.shift();if(!n){var s=document.createTextNode(e);n=document.createElement("div"),n.appendChild(s),this.dom.foreground.appendChild(n)}return this.dom.majorTexts.push(n),n.childNodes[0].nodeValue=e,n.className="vis-text vis-major "+o,n.style.top="top"==i?"0":this.props.minorLabelHeight+"px",n.style.left=t+"px",n},o.prototype._repaintMinorLine=function(t,e,i,o){var n=this.dom.redundant.lines.shift();n||(n=document.createElement("div"),this.dom.background.appendChild(n)),this.dom.lines.push(n);var s=this.props;return"top"==i?n.style.top=s.majorLabelHeight+"px":n.style.top=this.body.domProps.top.height+"px",n.style.height=s.minorLineHeight+"px",n.style.left=t-s.minorLineWidth/2+"px",n.style.width=e+"px",n.className="vis-grid vis-vertical vis-minor "+o,n},o.prototype._repaintMajorLine=function(t,e,i,o){var n=this.dom.redundant.lines.shift();n||(n=document.createElement("div"),this.dom.background.appendChild(n)),this.dom.lines.push(n);var s=this.props;return"top"==i?n.style.top="0":n.style.top=this.body.domProps.top.height+"px",n.style.left=t-s.majorLineWidth/2+"px",n.style.height=s.majorLineHeight+"px",n.style.width=e+"px",n.className="vis-grid vis-vertical vis-major "+o,n},o.prototype._calculateCharSize=function(){this.dom.measureCharMinor||(this.dom.measureCharMinor=document.createElement("DIV"),this.dom.measureCharMinor.className="vis-text vis-minor vis-measure",this.dom.measureCharMinor.style.position="absolute",this.dom.measureCharMinor.appendChild(document.createTextNode("0")),this.dom.foreground.appendChild(this.dom.measureCharMinor)),this.props.minorCharHeight=this.dom.measureCharMinor.clientHeight,this.props.minorCharWidth=this.dom.measureCharMinor.clientWidth,this.dom.measureCharMajor||(this.dom.measureCharMajor=document.createElement("DIV"),this.dom.measureCharMajor.className="vis-text vis-major vis-measure",this.dom.measureCharMajor.style.position="absolute",this.dom.measureCharMajor.appendChild(document.createTextNode("0")),this.dom.foreground.appendChild(this.dom.measureCharMajor)),this.props.majorCharHeight=this.dom.measureCharMajor.clientHeight,this.props.majorCharWidth=this.dom.measureCharMajor.clientWidth};var d=!1;t.exports=o},function(t,e,i){function o(t){this.active=!1,this.dom={container:t},this.dom.overlay=document.createElement("div"),this.dom.overlay.className="vis-overlay",this.dom.container.appendChild(this.dom.overlay),this.hammer=a(this.dom.overlay),this.hammer.on("tap",this._onTapOverlay.bind(this));var e=this,i=["tap","doubletap","press","pinch","pan","panstart","panmove","panend"];i.forEach(function(t){e.hammer.on(t,function(t){t.stopPropagation()})}),document&&document.body&&(this.onClick=function(i){n(i.target,t)||e.deactivate()},document.body.addEventListener("click",this.onClick)),void 0!==this.keycharm&&this.keycharm.destroy(),this.keycharm=s(),this.escListener=this.deactivate.bind(this)}function n(t,e){for(;t;){if(t===e)return!0;t=t.parentNode}return!1}var s=i(40),r=i(12),a=i(20),h=i(1);r(o.prototype),o.current=null,o.prototype.destroy=function(){this.deactivate(),this.dom.overlay.parentNode.removeChild(this.dom.overlay),this.onClick&&document.body.removeEventListener("click",this.onClick),this.hammer.destroy(),this.hammer=null},o.prototype.activate=function(){o.current&&o.current.deactivate(),o.current=this,this.active=!0,this.dom.overlay.style.display="none",h.addClassName(this.dom.container,"vis-active"),this.emit("change"),this.emit("activate"),this.keycharm.bind("esc",this.escListener)},o.prototype.deactivate=function(){this.active=!1,this.dom.overlay.style.display="",h.removeClassName(this.dom.container,"vis-active"),this.keycharm.unbind("esc",this.escListener),this.emit("change"),this.emit("deactivate")},o.prototype._onTapOverlay=function(t){this.activate(),t.stopPropagation()},t.exports=o},function(t,e,i){var o,n,s;!function(i,r){n=[],o=r,s="function"==typeof o?o.apply(e,n):o,!(void 0!==s&&(t.exports=s))}(this,function(){function t(t){var e,i=t&&t.preventDefault||!1,o=t&&t.container||window,n={},s={keydown:{},keyup:{}},r={};for(e=97;122>=e;e++)r[String.fromCharCode(e)]={code:65+(e-97),shift:!1};for(e=65;90>=e;e++)r[String.fromCharCode(e)]={code:e,shift:!0};for(e=0;9>=e;e++)r[""+e]={code:48+e,shift:!1};for(e=1;12>=e;e++)r["F"+e]={code:111+e,shift:!1};for(e=0;9>=e;e++)r["num"+e]={code:96+e,shift:!1};r["num*"]={code:106,shift:!1},r["num+"]={code:107,shift:!1},r["num-"]={code:109,shift:!1},r["num/"]={code:111,shift:!1},r["num."]={code:110,shift:!1},r.left={code:37,shift:!1},r.up={code:38,shift:!1},r.right={code:39,shift:!1},r.down={code:40,shift:!1},r.space={code:32,shift:!1},r.enter={code:13,shift:!1},r.shift={code:16,shift:void 0},r.esc={code:27,shift:!1},r.backspace={code:8,shift:!1},r.tab={code:9,shift:!1},r.ctrl={code:17,shift:!1},r.alt={code:18,shift:!1},r["delete"]={code:46,shift:!1},r.pageup={code:33,shift:!1},r.pagedown={code:34,shift:!1},r["="]={code:187,shift:!1},r["-"]={code:189,shift:!1},r["]"]={code:221,shift:!1},r["["]={code:219,shift:!1};var a=function(t){d(t,"keydown")},h=function(t){d(t,"keyup")},d=function(t,e){if(void 0!==s[e][t.keyCode]){for(var o=s[e][t.keyCode],n=0;no&&(o=30),o>1e3&&(o=1e3),e.redraw(),e.currentTimeTimer=setTimeout(t,o)}var e=this;t()},o.prototype.stop=function(){void 0!==this.currentTimeTimer&&(clearTimeout(this.currentTimeTimer),delete this.currentTimeTimer)},o.prototype.setCurrentTime=function(t){var e=n.convert(t,"Date").valueOf(),i=(new Date).valueOf();this.offset=e-i,this.redraw()},o.prototype.getCurrentTime=function(){return new Date((new Date).valueOf()+this.offset)},t.exports=o},function(t,e,i){function o(t){return t&&t.__esModule?t:{"default":t}}function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var s=function(){function t(t,e){for(var i=0;i0&&this._makeItem([]),this._makeHeader(n),this._handleObject(this.configureOptions[n],[n])),i++);this.options.showButton===!0&&!function(){var e=document.createElement("div");e.className="vis-configuration vis-config-button",e.innerHTML="generate options",e.onclick=function(){t._printOptions()},e.onmouseover=function(){e.className="vis-configuration vis-config-button hover"},e.onmouseout=function(){e.className="vis-configuration vis-config-button"},t.optionsContainer=document.createElement("div"),t.optionsContainer.className="vis-configuration vis-config-option-container",t.domElements.push(t.optionsContainer),t.domElements.push(e)}(),this._push()}},{key:"_push",value:function(){this.wrapper=document.createElement("div"),this.wrapper.className="vis-configuration-wrapper",this.container.appendChild(this.wrapper);for(var t=0;t1?o-1:0),s=1;o>s;s++)n[s-1]=e[s];return n.forEach(function(t){r.appendChild(t)}),i.domElements.push(r),{v:i.domElements.length}}();if("object"==typeof r)return r.v}return 0}},{key:"_makeHeader",value:function(t){var e=document.createElement("div");e.className="vis-configuration vis-config-header",e.innerHTML=t,this._makeItem([],e)}},{key:"_makeLabel",value:function(t,e){var i=arguments.length<=2||void 0===arguments[2]?!1:arguments[2],o=document.createElement("div");return o.className="vis-configuration vis-config-label vis-config-s"+e.length,i===!0?o.innerHTML=""+t+":":o.innerHTML=t+":",o}},{key:"_makeDropdown",value:function(t,e,i){var o=document.createElement("select");o.className="vis-configuration vis-config-select";var n=0;void 0!==e&&-1!==t.indexOf(e)&&(n=t.indexOf(e));for(var s=0;se&&n>e*u?(a.min=Math.ceil(e*u),l=a.min,d="range increased"):n>e/u&&(a.min=Math.ceil(e/u),l=a.min,d="range increased"),e*u>s&&1!==s&&(a.max=Math.ceil(e*u),l=a.max,d="range increased"),a.value=e}else a.value=o;var c=document.createElement("input");c.className="vis-configuration vis-config-rangeinput",c.value=a.value;var p=this;a.onchange=function(){c.value=this.value,p._update(Number(this.value),i)},a.oninput=function(){c.value=this.value};var f=this._makeLabel(i[i.length-1],i),m=this._makeItem(i,f,a,c);""!==d&&this.popupHistory[m]!==l&&(this.popupHistory[m]=l,this._setupPopup(d,m))}},{key:"_setupPopup",value:function(t,e){var i=this;if(this.initialized===!0&&this.allowCreation===!0&&this.popupCountervar options = "+JSON.stringify(t,null,2)+""}},{key:"getOptions",value:function(){for(var t={},e=0;es;s++)for(r=0;rp?p+1:p;var f=l/this.r,m=a.RGBToHSV(this.color.r,this.color.g,this.color.b);m.h=p,m.s=f;var v=a.HSVToRGB(m.h,m.s,m.v);v.a=this.color.a,this.color=v,this.initialColorDiv.style.backgroundColor="rgba("+this.initialColor.r+","+this.initialColor.g+","+this.initialColor.b+","+this.initialColor.a+")",this.newColorDiv.style.backgroundColor="rgba("+this.color.r+","+this.color.g+","+this.color.b+","+this.color.a+")"}}]),t}();e["default"]=h,t.exports=e["default"]},function(t,e,i){function o(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var n=function(){function t(t,e){for(var i=0;is.distance?console.log('%cUnknown option detected: "'+e+'" in '+t.printLocation(n.path,e,"")+"Perhaps it was misplaced? Matching option found at: "+t.printLocation(s.path,s.closestMatch,""),h):n.distance<=d?console.log('%cUnknown option detected: "'+e+'". Did you mean "'+n.closestMatch+'"?'+t.printLocation(n.path,e),h):console.log('%cUnknown option detected: "'+e+'". Did you mean one of these: '+t.print(Object.keys(i))+t.printLocation(o,e),h),r=!0}},{key:"findInOptions",value:function(e,i,o){var n=arguments.length<=3||void 0===arguments[3]?!1:arguments[3],r=1e9,a="",h=[],d=e.toLowerCase(),l=void 0;for(var u in i){var c=void 0;if(void 0!==i[u].__type__&&n===!0){var p=t.findInOptions(e,i[u],s.copyAndExtendArray(o,u));r>p.distance&&(a=p.closestMatch,h=p.path,r=p.distance,l=p.indexMatch)}else-1!==u.toLowerCase().indexOf(d)&&(l=u),c=t.levenshteinDistance(e,u),r>c&&(a=u,h=s.copyArray(o),r=c)}return{closestMatch:a,path:h,distance:r,indexMatch:l}}},{key:"printLocation",value:function(t,e){for(var i=arguments.length<=2||void 0===arguments[2]?"Problem value found at: \n":arguments[2],o="\n\n"+i+"options = {\n",n=0;ns;s++)o+=" ";o+=t[n]+": {\n"}for(var s=0;sr?r:t,e=null==e?r:r>e?r:e}return{min:null!=t?new Date(t):null,max:null!=e?new Date(e):null}},o.prototype.getEventProperties=function(t){var e=t.center?t.center.x:t.clientX,i=t.center?t.center.y:t.clientY,o=e-s.getAbsoluteLeft(this.dom.centerContainer),n=i-s.getAbsoluteTop(this.dom.centerContainer),r=this._toTime(o),a=c.customTimeFromTarget(t),h=s.getTarget(t),d=null;s.hasParent(h,this.timeAxis.dom.foreground)?d="axis":this.timeAxis2&&s.hasParent(h,this.timeAxis2.dom.foreground)?d="axis":s.hasParent(h,this.linegraph.yAxisLeft.dom.frame)?d="data-axis":s.hasParent(h,this.linegraph.yAxisRight.dom.frame)?d="data-axis":s.hasParent(h,this.linegraph.legendLeft.dom.frame)?d="legend":s.hasParent(h,this.linegraph.legendRight.dom.frame)?d="legend":null!=a?d="custom-time":s.hasParent(h,this.currentTime.bar)?d="current-time":s.hasParent(h,this.dom.center)&&(d="background");var l=[],u=this.linegraph.yAxisLeft,p=this.linegraph.yAxisRight;return u.hidden||l.push(u.screenToValue(n)),p.hidden||l.push(p.screenToValue(n)),{event:t,what:d,pageX:t.srcEvent?t.srcEvent.pageX:t.pageX,pageY:t.srcEvent?t.srcEvent.pageY:t.pageY,x:o,y:n,time:r,value:l}},o.prototype._createConfigurator=function(){return new f(this,this.dom.container,y)},t.exports=o},function(t,e,i){function o(t,e){this.id=n.randomUUID(),this.body=t,this.defaultOptions={yAxisOrientation:"left",defaultGroup:"default",sort:!0,sampling:!0,stack:!1,graphHeight:"400px",shaded:{enabled:!1,orientation:"bottom"},style:"line",barChart:{width:50,sideBySide:!1,align:"center"},interpolation:{enabled:!0,parametrization:"centripetal",alpha:.5},drawPoints:{enabled:!0,size:6,style:"square"},dataAxis:{},legend:{},groups:{visibility:{}}},this.options=n.extend({},this.defaultOptions),this.dom={},this.props={},this.hammer=null,this.groups={},this.abortedGraphUpdate=!1,this.updateSVGheight=!1,this.updateSVGheightOnResize=!1,this.forceGraphUpdate=!0;var i=this;this.itemsData=null,this.groupsData=null,this.itemListeners={add:function(t,e,o){i._onAdd(e.items)},update:function(t,e,o){i._onUpdate(e.items)},remove:function(t,e,o){i._onRemove(e.items)}},this.groupListeners={add:function(t,e,o){ +i._onAddGroups(e.items)},update:function(t,e,o){i._onUpdateGroups(e.items)},remove:function(t,e,o){i._onRemoveGroups(e.items)}},this.items={},this.selection=[],this.lastStart=this.body.range.start,this.touchParams={},this.svgElements={},this.setOptions(e),this.groupsUsingDefaultStyles=[0],this.body.emitter.on("rangechanged",function(){i.lastStart=i.body.range.start,i.svg.style.left=n.option.asSize(-i.props.width),i.forceGraphUpdate=!0,i.redraw.call(i)}),this._create(),this.framework={svg:this.svg,svgElements:this.svgElements,options:this.options,groups:this.groups}}var n=i(1),s=i(7),r=i(8),a=i(10),h=i(25),d=i(50),l=i(52),u=i(56),c=i(53),p=i(55),f=i(54),m="__ungrouped__";o.prototype=new h,o.prototype._create=function(){var t=document.createElement("div");t.className="vis-line-graph",this.dom.frame=t,this.svg=document.createElementNS("http://www.w3.org/2000/svg","svg"),this.svg.style.position="relative",this.svg.style.height=(""+this.options.graphHeight).replace("px","")+"px",this.svg.style.display="block",t.appendChild(this.svg),this.options.dataAxis.orientation="left",this.yAxisLeft=new d(this.body,this.options.dataAxis,this.svg,this.options.groups),this.options.dataAxis.orientation="right",this.yAxisRight=new d(this.body,this.options.dataAxis,this.svg,this.options.groups),delete this.options.dataAxis.orientation,this.legendLeft=new u(this.body,this.options.legend,"left",this.options.groups),this.legendRight=new u(this.body,this.options.legend,"right",this.options.groups),this.show()},o.prototype.setOptions=function(t){if(t){var e=["sampling","defaultGroup","stack","height","graphHeight","yAxisOrientation","style","barChart","dataAxis","sort","groups"];void 0===t.graphHeight&&void 0!==t.height?(this.updateSVGheight=!0,this.updateSVGheightOnResize=!0):void 0!==this.body.domProps.centerContainer.height&&void 0!==t.graphHeight&&parseInt((t.graphHeight+"").replace("px",""))i?-1:1});for(var o=new Array(t.length),s=0;s0){var h={};for(this._getRelevantData(a,h,n,r),this._applySampling(a,h),e=0;e0)switch(t.options.style){case"line":l.hasOwnProperty(a[e])||(l[a[e]]=p.calcPath(h[a[e]],t)),p.draw(l[a[e]],t,this.framework);case"point":case"points":("point"==t.options.style||"points"==t.options.style||1==t.options.drawPoints.enabled)&&f.draw(h[a[e]],t,this.framework);break;case"bar":}}}return s.cleanupElements(this.svgElements),!1},o.prototype._stack=function(t,e){var i,o,n,s,r;i=0;for(var a=0;at[a].x){r=e[h],s=0==h?r:e[h-1],i=h;break}}void 0===r&&(s=e[e.length-1],r=e[e.length-1]),o=r.x-s.x,n=r.y-s.y,0==o?t[a].y=t[a].orginalY+r.y:t[a].y=t[a].orginalY+n/o*(t[a].x-s.x)+s.y}},o.prototype._getRelevantData=function(t,e,i,o){var s,r,a,h;if(t.length>0)for(r=0;rt?-1:1},u=Math.max(0,n.binarySearchValue(d,i,"x","before",l)),c=Math.min(d.length,n.binarySearchValue(d,o,"x","after",l)+1);0>=c&&(c=d.length);var p=new Array(c-u);for(a=u;c>a;a++)h=s.itemsData[a],p[a-u]=h;e[t[r]]=p}else e[t[r]]=s.itemsData}},o.prototype._applySampling=function(t,e){var i;if(t.length>0)for(var o=0;o0){var s=1,r=n.length,a=this.body.util.toGlobalScreen(n[n.length-1].x)-this.body.util.toGlobalScreen(n[0].x),h=r/a;s=Math.min(Math.ceil(.2*r),Math.max(1,Math.round(h)));for(var d=new Array(r),l=0;r>l;l+=s){var u=Math.round(l/s);d[u]=n[l]}e[t[o]]=d.splice(0,Math.round(r/s))}}},o.prototype._getYRanges=function(t,e,i){var o,n,s,r,a=[],h=[];if(t.length>0){for(s=0;s0&&(n=this.groups[t[s]],r.stack===!0&&"bar"===r.style?"left"===r.yAxisOrientation?a=a.concat(n.getItems()):h=h.concat(n.getItems()):i[t[s]]=n.getYRange(o,t[s]));c.getStackedYRange(a,i,t,"__barStackLeft","left"),c.getStackedYRange(h,i,t,"__barStackRight","right")}},o.prototype._updateYAxis=function(t,e){var i,o,n=!1,s=!1,r=!1,a=1e9,h=1e9,d=-1e9,l=-1e9;if(t.length>0){for(var u=0;ui?i:a,d=o>d?o:d):(r=!0,h=h>i?i:h,l=o>l?o:l));1==s&&this.yAxisLeft.setRange(a,d),1==r&&this.yAxisRight.setRange(h,l)}n=this._toggleAxisVisiblity(s,this.yAxisLeft)||n,n=this._toggleAxisVisiblity(r,this.yAxisRight)||n,1==r&&1==s?(this.yAxisLeft.drawIcons=!0,this.yAxisRight.drawIcons=!0):(this.yAxisLeft.drawIcons=!1,this.yAxisRight.drawIcons=!1),this.yAxisRight.master=!s,this.yAxisRight.masterAxis=this.yAxisLeft,0==this.yAxisRight.master?(1==r?this.yAxisLeft.lineOffset=this.yAxisRight.width:this.yAxisLeft.lineOffset=0,n=this.yAxisLeft.redraw()||n,n=this.yAxisRight.redraw()||n):n=this.yAxisRight.redraw()||n;for(var p=["__barStackLeft","__barStackRight","__lineStackLeft","__lineStackRight"],u=0;ut?-1:1});for(var a=0;a=0&&t._redrawLabel(o-2,e.val,i,"vis-y-axis vis-major",t.props.majorCharHeight),t.master===!0&&(n?t._redrawLine(o,i,"vis-grid vis-horizontal vis-major",t.options.majorLinesOffset,t.props.majorLineWidth):t._redrawLine(o,i,"vis-grid vis-horizontal vis-minor",t.options.minorLinesOffset,t.props.minorLineWidth))});var d=0;void 0!==this.options[i].title&&void 0!==this.options[i].title.text&&(d=this.props.titleCharHeight);var l=this.options.icons===!0?Math.max(this.options.iconWidth,d)+this.options.labelOffsetX+15:d+this.options.labelOffsetX+15;return this.maxLabelSize>this.width-l&&this.options.visible===!0?(this.width=this.maxLabelSize+l,this.options.width=this.width+"px",s.cleanupElements(this.DOMelements.lines),s.cleanupElements(this.DOMelements.labels),this.redraw(),e=!0):this.maxLabelSizethis.minWidth?(this.width=Math.max(this.minWidth,this.maxLabelSize+l),this.options.width=this.width+"px",s.cleanupElements(this.DOMelements.lines),s.cleanupElements(this.DOMelements.labels),this.redraw(),e=!0):(s.cleanupElements(this.DOMelements.lines),s.cleanupElements(this.DOMelements.labels),e=!1),e},o.prototype.convertValue=function(t){return this.scale.convertValue(t)},o.prototype.screenToValue=function(t){return this.scale.screenToValue(t)},o.prototype._redrawLabel=function(t,e,i,o,n){var r=s.getDOMElement("div",this.DOMelements.labels,this.dom.frame);r.className=o,r.innerHTML=e,"left"===i?(r.style.left="-"+this.options.labelOffsetX+"px",r.style.textAlign="right"):(r.style.right="-"+this.options.labelOffsetX+"px",r.style.textAlign="left"),r.style.top=t-.5*n+this.options.labelOffsetY+"px",e+="";var a=Math.max(this.props.majorCharWidth,this.props.minorCharWidth);this.maxLabelSize.5*(h.magnitudefactor*h.minorSteps[h.minorStepIdx])?e+h.magnitudefactor*h.minorSteps[h.minorStepIdx]:e};i&&(this._start-=2*this.magnitudefactor*this.minorSteps[this.minorStepIdx],this._start=d(this._start)),o&&(this._end+=this.magnitudefactor*this.minorSteps[this.minorStepIdx],this._end=d(this._end)),this.determineScale()}}i.prototype.setCharHeight=function(t){this.majorCharHeight=t},i.prototype.setHeight=function(t){this.containerHeight=t},i.prototype.determineScale=function(){var t=this._end-this._start;this.scale=this.containerHeight/t;var e=this.majorCharHeight/this.scale,i=Math.round(Math.log(t)/Math.LN10);this.minorStepIdx=-1,this.magnitudefactor=Math.pow(10,i);var o=0;0>i&&(o=i);for(var n=!1,s=o;Math.abs(s)<=Math.abs(i);s++){this.magnitudefactor=Math.pow(10,s);for(var r=0;r=e){n=!0,this.minorStepIdx=r;break}}if(n===!0)break}},i.prototype.is_major=function(t){return t%(this.magnitudefactor*this.majorSteps[this.minorStepIdx])===0},i.prototype.getStep=function(){return this.magnitudefactor*this.minorSteps[this.minorStepIdx]},i.prototype.getFirstMajor=function(){var t=this.magnitudefactor*this.majorSteps[this.minorStepIdx];return this.convertValue(this._start+(t-this._start%t)%t)},i.prototype.formatValue=function(t){var e=t.toPrecision(5);return"function"==typeof this.formattingFunction&&(e=this.formattingFunction(t)),"number"==typeof e?""+e:"string"==typeof e?e:t.toPrecision(5)},i.prototype.getLines=function(){for(var t=[],e=this.getStep(),i=(e-this._start%e)%e,o=this._start+i;this._end-o>1e-5;o+=e)o!=this._start&&t.push({major:this.is_major(o),y:this.convertValue(o),val:this.formatValue(o)});return t},i.prototype.followScale=function(t){var e=this.minorStepIdx,i=this._start,o=this._end,n=this,s=function(){n.magnitudefactor*=2},r=function(){n.magnitudefactor/=2};t.minorStepIdx<=1&&this.minorStepIdx<=1||t.minorStepIdx>1&&this.minorStepIdx>1||(t.minorStepIdxo+1e-5)r(),d=!1;else{if(!this.autoScaleStart&&this._start=0)){r(),d=!1;continue}console.warn("Can't adhere to given 'min' range, due to zeroalign")}this.autoScaleStart&&this.autoScaleEnd&&o-i>u?(s(),d=!1):d=!0}}},i.prototype.convertValue=function(t){return this.containerHeight-(t-this._start)*this.scale},i.prototype.screenToValue=function(t){return(this.containerHeight-t)/this.scale+this._start},t.exports=i},function(t,e,i){function o(t,e,i,o){this.id=e;var s=["sampling","style","sort","yAxisOrientation","barChart","drawPoints","shaded","interpolation","zIndex","excludeFromStacking","excludeFromLegend"];this.options=n.selectiveBridgeObject(s,i),this.usingDefaultStyle=void 0===t.className,this.groupsUsingDefaultStyles=o,this.zeroPosition=0,this.update(t),1==this.usingDefaultStyle&&(this.groupsUsingDefaultStyles[0]+=1),this.itemsData=[],this.visible=void 0===t.visible?!0:t.visible}var n=i(1),s=(i(7),i(53)),r=i(55),a=i(54);o.prototype.setItems=function(t){null!=t?(this.itemsData=t,1==this.options.sort&&n.insertSort(this.itemsData,function(t,e){return t.x>e.x?1:-1})):this.itemsData=[]},o.prototype.getItems=function(){return this.itemsData},o.prototype.setZeroPosition=function(t){this.zeroPosition=t},o.prototype.setOptions=function(t){if(void 0!==t){var e=["sampling","style","sort","yAxisOrientation","barChart","zIndex","excludeFromStacking","excludeFromLegend"];n.selectiveDeepExtend(e,this.options,t),"function"==typeof t.drawPoints&&(t.drawPoints={onRender:t.drawPoints}),n.mergeOptions(this.options,t,"interpolation"),n.mergeOptions(this.options,t,"drawPoints"),n.mergeOptions(this.options,t,"shaded"),t.interpolation&&"object"==typeof t.interpolation&&t.interpolation.parametrization&&("uniform"==t.interpolation.parametrization?this.options.interpolation.alpha=0:"chordal"==t.interpolation.parametrization?this.options.interpolation.alpha=1:(this.options.interpolation.parametrization="centripetal",this.options.interpolation.alpha=.5))}},o.prototype.update=function(t){this.group=t,this.content=t.content||"graph",this.className=t.className||this.className||"vis-graph-group"+this.groupsUsingDefaultStyles[0]%10,this.visible=void 0===t.visible?!0:t.visible,this.style=t.style,this.setOptions(t.options)},o.prototype.getLegend=function(t,e,i,o,n){if(void 0==i||null==i){var h=document.createElementNS("http://www.w3.org/2000/svg","svg");i={svg:h,svgElements:{},options:this.options,groups:[this]}}switch((void 0==o||null==o)&&(o=0),(void 0==n||null==n)&&(n=.5*e),this.options.style){case"line":r.drawIcon(this,o,n,t,e,i);break;case"points":case"point":a.drawIcon(this,o,n,t,e,i);break;case"bar":s.drawIcon(this,o,n,t,e,i)}return{icon:i.svg,label:this.content,orientation:this.options.yAxisOrientation}},o.prototype.getYRange=function(t){for(var e=t[0].y,i=t[0].y,o=0;ot[o].y?t[o].y:e,i=i0&&(i=Math.min(i,Math.abs(e[o-1].screen_x-e[o].screen_x))),0===i&&(void 0===t[e[o].screen_x]&&(t[e[o].screen_x]={amount:0,resolved:0,accumulatedPositive:0,accumulatedNegative:0}),t[e[o].screen_x].amount+=1)},o._getSafeDrawData=function(t,e,i){var o,n;return t0?(o=i>t?i:t,n=0,"left"===e.options.barChart.align?n-=.5*t:"right"===e.options.barChart.align&&(n+=.5*t)):(o=e.options.barChart.width,n=0,"left"===e.options.barChart.align?n-=.5*e.options.barChart.width:"right"===e.options.barChart.align&&(n+=.5*e.options.barChart.width)),{width:o,offset:n}},o.getStackedYRange=function(t,e,i,n,s){if(t.length>0){t.sort(function(t,e){return t.screen_x===e.screen_x?t.groupIde[s].screen_y?e[s].screen_y:o,n=nt[r].accumulatedNegative?t[r].accumulatedNegative:o,o=o>t[r].accumulatedPositive?t[r].accumulatedPositive:o,n=n0){var i=[];return i=1==e.options.interpolation.enabled?o._catmullRom(t,e):o._linear(t)}},o.drawIcon=function(t,e,i,o,s,r){var a,h,d=.5*s,l=n.getSVGElement("rect",r.svgElements,r.svg);if(l.setAttributeNS(null,"x",e),l.setAttributeNS(null,"y",i-d),l.setAttributeNS(null,"width",o),l.setAttributeNS(null,"height",2*d),l.setAttributeNS(null,"class","vis-outline"),a=n.getSVGElement("path",r.svgElements,r.svg),a.setAttributeNS(null,"class",t.className),void 0!==t.style&&a.setAttributeNS(null,"style",t.style),a.setAttributeNS(null,"d","M"+e+","+i+" L"+(e+o)+","+i),1==t.options.shaded.enabled&&(h=n.getSVGElement("path",r.svgElements,r.svg),"top"==t.options.shaded.orientation?h.setAttributeNS(null,"d","M"+e+", "+(i-d)+"L"+e+","+i+" L"+(e+o)+","+i+" L"+(e+o)+","+(i-d)):h.setAttributeNS(null,"d","M"+e+","+i+" L"+e+","+(i+d)+" L"+(e+o)+","+(i+d)+"L"+(e+o)+","+i),h.setAttributeNS(null,"class",t.className+" vis-icon-fill"),void 0!==t.options.shaded.style&&""!==t.options.shaded.style&&h.setAttributeNS(null,"style",t.options.shaded.style)),1==t.options.drawPoints.enabled){var u={style:t.options.drawPoints.style,styles:t.options.drawPoints.styles,size:t.options.drawPoints.size,className:t.className};n.drawPoint(e+.5*o,i,u,r.svgElements,r.svg)}},o.drawShading=function(t,e,i,o){if(1==e.options.shaded.enabled){var s=Number(o.svg.style.height.replace("px","")),r=n.getSVGElement("path",o.svgElements,o.svg),a="L";1==e.options.interpolation.enabled&&(a="C");var h,d=0;d="top"==e.options.shaded.orientation?0:"bottom"==e.options.shaded.orientation?s:Math.min(Math.max(0,e.zeroPosition),s),h="group"==e.options.shaded.orientation&&null!=i&&void 0!=i?"M"+t[0][0]+","+t[0][1]+" "+this.serializePath(t,a,!1)+" L"+i[i.length-1][0]+","+i[i.length-1][1]+" "+this.serializePath(i,a,!0)+i[0][0]+","+i[0][1]+" Z":"M"+t[0][0]+","+t[0][1]+" "+this.serializePath(t,a,!1)+" V"+d+" H"+t[0][0]+" Z",r.setAttributeNS(null,"class",e.className+" vis-fill"),void 0!==e.options.shaded.style&&r.setAttributeNS(null,"style",e.options.shaded.style),r.setAttributeNS(null,"d",h)}},o.draw=function(t,e,i){if(null!=t&&void 0!=t){var o=n.getSVGElement("path",i.svgElements,i.svg);o.setAttributeNS(null,"class",e.className),void 0!==e.style&&o.setAttributeNS(null,"style",e.style);var s="L";1==e.options.interpolation.enabled&&(s="C"),o.setAttributeNS(null,"d","M"+t[0][0]+","+t[0][1]+" "+this.serializePath(t,s,!1))}},o.serializePath=function(t,e,i){if(t.length<2)return"";var o=e;if(i)for(var n=t.length-2;n>0;n--)o+=t[n][0]+","+t[n][1]+" ";else for(var n=1;nl;l++)e=0==l?t[0]:t[l-1],i=t[l],o=t[l+1],n=d>l+2?t[l+2]:o,s={screen_x:(-e.screen_x+6*i.screen_x+o.screen_x)*h,screen_y:(-e.screen_y+6*i.screen_y+o.screen_y)*h},r={screen_x:(i.screen_x+6*o.screen_x-n.screen_x)*h,screen_y:(i.screen_y+6*o.screen_y-n.screen_y)*h},a.push([s.screen_x,s.screen_y]),a.push([r.screen_x,r.screen_y]),a.push([o.screen_x,o.screen_y]);return a},o._catmullRom=function(t,e){var i=e.options.interpolation.alpha;if(0==i||void 0===i)return this._catmullRomUniform(t);var o,n,s,r,a,h,d,l,u,c,p,f,m,v,g,y,b,_,w,x=[];x.push([Math.round(t[0].screen_x),Math.round(t[0].screen_y)]);for(var k=t.length,O=0;k-1>O;O++)o=0==O?t[0]:t[O-1],n=t[O],s=t[O+1],r=k>O+2?t[O+2]:s,d=Math.sqrt(Math.pow(o.screen_x-n.screen_x,2)+Math.pow(o.screen_y-n.screen_y,2)),l=Math.sqrt(Math.pow(n.screen_x-s.screen_x,2)+Math.pow(n.screen_y-s.screen_y,2)),u=Math.sqrt(Math.pow(s.screen_x-r.screen_x,2)+Math.pow(s.screen_y-r.screen_y,2)),v=Math.pow(u,i),y=Math.pow(u,2*i),g=Math.pow(l,i),b=Math.pow(l,2*i),w=Math.pow(d,i),_=Math.pow(d,2*i),c=2*_+3*w*g+b,p=2*y+3*v*g+b,f=3*w*(w+g),f>0&&(f=1/f),m=3*v*(v+g),m>0&&(m=1/m),a={screen_x:(-b*o.screen_x+c*n.screen_x+_*s.screen_x)*f,screen_y:(-b*o.screen_y+c*n.screen_y+_*s.screen_y)*f},h={screen_x:(y*n.screen_x+p*s.screen_x-b*r.screen_x)*m,screen_y:(y*n.screen_y+p*s.screen_y-b*r.screen_y)*m},0==a.screen_x&&0==a.screen_y&&(a=n),0==h.screen_x&&0==h.screen_y&&(h=s),x.push([a.screen_x,a.screen_y]),x.push([h.screen_x,h.screen_y]),x.push([s.screen_x,s.screen_y]);return x},o._linear=function(t){for(var e=[],i=0;it?-1:1});for(var i=0;i")}this.dom.textArea.innerHTML=s,this.dom.textArea.style.lineHeight=.75*this.options.iconSize+this.options.iconSpacing+"px"}},o.prototype.drawLegendIcons=function(){if(this.dom.frame.parentNode){var t=Object.keys(this.groups);t.sort(function(t,e){return e>t?-1:1}),s.resetElements(this.svgElements);var e=window.getComputedStyle(this.dom.frame).paddingTop,i=Number(e.replace("px","")),o=i,n=this.options.iconSize,r=.75*this.options.iconSize,a=i+.5*r+3;this.svg.style.width=n+5+i+"px";for(var h=0;h0){var i=this.groupIndex%this.groupsArray.length;this.groupIndex++,e={},e.color=this.groups[this.groupsArray[i]],this.groups[t]=e}else{var i=this.defaultIndex%this.defaultGroups.length;this.defaultIndex++,e={},e.color=this.defaultGroups[i],this.groups[t]=e}return e}},{key:"add",value:function(t,e){return this.groups[t]=e,this.groupsArray.push(t),e}}]),t}();e["default"]=r,t.exports=e["default"]},function(t,e,i){function o(t){return t&&t.__esModule?t:{"default":t}}function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var s=function(){function t(t,e){for(var i=0;it.left&&this.shape.topt.top}},{key:"isBoundingBoxOverlappingWith",value:function(t){return this.shape.boundingBox.leftt.left&&this.shape.boundingBox.topt.top}}],[{key:"parseOptions",value:function(t,e){var i=arguments.length<=2||void 0===arguments[2]?!1:arguments[2],o=arguments.length<=3||void 0===arguments[3]?{}:arguments[3],n=["color","font","fixed","shadow"];if(F.selectiveNotDeepExtend(n,t,e,i),F.mergeOptions(t,e,"shadow",i,o),void 0!==e.color&&null!==e.color){var s=F.parseColor(e.color);F.fillIfDefined(t.color,s)}else i===!0&&null===e.color&&(t.color=F.bridgeObject(o.color));void 0!==e.fixed&&null!==e.fixed&&("boolean"==typeof e.fixed?(t.fixed.x=e.fixed,t.fixed.y=e.fixed):(void 0!==e.fixed.x&&"boolean"==typeof e.fixed.x&&(t.fixed.x=e.fixed.x),void 0!==e.fixed.y&&"boolean"==typeof e.fixed.y&&(t.fixed.y=e.fixed.y))),void 0!==e.font&&null!==e.font?a["default"].parseOptions(t.font,e):i===!0&&null===e.font&&(t.font=F.bridgeObject(o.font)),void 0!==e.scaling&&F.mergeOptions(t.scaling,e.scaling,"label",i,o.scaling)}}]),t}();e["default"]=B,t.exports=e["default"]},function(t,e,i){function o(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var n=function(){function t(t,e){var i=[],o=!0,n=!1,s=void 0;try{for(var r,a=t[Symbol.iterator]();!(o=(r=a.next()).done)&&(i.push(r.value),!e||i.length!==e);o=!0);}catch(h){n=!0,s=h}finally{try{!o&&a["return"]&&a["return"]()}finally{if(n)throw s}}return i}return function(e,i){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,i);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),s=function(){function t(t,e){for(var i=0;i=this.nodeOptions.scaling.label.maxVisible&&(r=Number(this.nodeOptions.scaling.label.maxVisible)/this.body.view.scale);var h=this.size.yLine,d=this._getColor(a),l=n(d,2),u=l[0],c=l[1],p=this._setAlignment(t,i,h,s),f=n(p,2);i=f[0],h=f[1],t.font=(e&&this.nodeOptions.labelHighlightBold?"bold ":"")+r+"px "+this.fontOptions.face,t.fillStyle=u,t.textAlign="center",this.fontOptions.strokeWidth>0&&(t.lineWidth=this.fontOptions.strokeWidth,t.strokeStyle=c,t.lineJoin="round");for(var m=0;m0&&t.strokeText(this.lines[m],i,h),t.fillText(this.lines[m],i,h),h+=r}},{key:"_setAlignment",value:function(t,e,i,o){if("horizontal"!==this.fontOptions.align&&this.pointToSelf===!1){e=0,i=0;var n=2;"top"===this.fontOptions.align?(t.textBaseline="alphabetic",i-=2*n):"bottom"===this.fontOptions.align?(t.textBaseline="hanging",i+=2*n):t.textBaseline="middle"}else t.textBaseline=o;return[e,i]}},{key:"_getColor",value:function(t){var e=this.fontOptions.color||"#000000",i=this.fontOptions.strokeColor||"#ffffff";if(t<=this.nodeOptions.scaling.label.drawThreshold){var o=Math.max(0,Math.min(1,1-(this.nodeOptions.scaling.label.drawThreshold-t)));e=r.overrideOpacity(e,o),i=r.overrideOpacity(i,o)}return[e,i]}},{key:"getTextSize",value:function(t){var e=arguments.length<=1||void 0===arguments[1]?!1:arguments[1],i={width:this._processLabel(t,e),height:this.fontOptions.size*this.lineCount,lineCount:this.lineCount};return i}},{key:"calculateLabelSize",value:function(t,e){var i=arguments.length<=2||void 0===arguments[2]?0:arguments[2],o=arguments.length<=3||void 0===arguments[3]?0:arguments[3],n=arguments.length<=4||void 0===arguments[4]?"middle":arguments[4];this.labelDirty===!0&&(this.size.width=this._processLabel(t,e)),this.size.height=this.fontOptions.size*this.lineCount,this.size.left=i-.5*this.size.width,this.size.top=o-.5*this.size.height,this.size.yLine=o+.5*(1-this.lineCount)*this.fontOptions.size,"hanging"===n&&(this.size.top+=.5*this.fontOptions.size,this.size.top+=4,this.size.yLine+=4),this.labelDirty=!1}},{key:"_processLabel",value:function(t,e){var i=0,o=[""],n=0;if(void 0!==this.nodeOptions.label){o=String(this.nodeOptions.label).split("\n"),n=o.length,t.font=(e&&this.nodeOptions.labelHighlightBold?"bold ":"")+this.fontOptions.size+"px "+this.fontOptions.face,i=t.measureText(o[0]).width;for(var s=1;n>s;s++){var r=t.measureText(o[s]).width;i=r>i?r:i}}return this.lines=o,this.lineCount=n,i}}],[{key:"parseOptions",value:function(t,e){var i=arguments.length<=2||void 0===arguments[2]?!1:arguments[2];if("string"==typeof e.font){var o=e.font.split(" ");t.size=o[0].replace("px",""),t.face=o[1],t.color=o[2]}else"object"==typeof e.font&&r.fillIfDefined(t,e.font,i);t.size=Number(t.size)}}]),t}();e["default"]=a,t.exports=e["default"]},function(t,e,i){function o(t){return t&&t.__esModule?t:{"default":t}}function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function s(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0});var r=function(){function t(t,e){for(var i=0;i0&&(this.enableBorderDashes(t),t.stroke(),this.disableBorderDashes(t)),t.restore(),this.updateBoundingBox(e,i,t,o),this.labelModule.draw(t,e,i,o)}},{key:"updateBoundingBox",value:function(t,e,i,o){this.resize(i,o),this.left=t-.5*this.width,this.top=e-.5*this.height;var n=this.options.shapeProperties.borderRadius;this.boundingBox.left=this.left-n,this.boundingBox.top=this.top-n,this.boundingBox.bottom=this.top+this.height+n,this.boundingBox.right=this.left+this.width+n}},{key:"distanceToBorder",value:function(t,e){this.resize(t);var i=this.options.borderWidth;return Math.min(Math.abs(this.width/2/Math.cos(e)),Math.abs(this.height/2/Math.sin(e)))+i}}]),e}(d["default"]);e["default"]=l,t.exports=e["default"]},function(t,e){function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var o=function(){function t(t,e){for(var i=0;ithis.imageObj.height?(o=this.imageObj.width/this.imageObj.height,e=2*this.options.size*o||this.imageObj.width,i=2*this.options.size||this.imageObj.height):(o=this.imageObj.width&&this.imageObj.height?this.imageObj.height/this.imageObj.width:1,e=2*this.options.size,i=2*this.options.size*o):(e=this.imageObj.width,i=this.imageObj.height),this.width=e,this.height=i,this.radius=.5*this.width}}},{key:"_drawRawCircle",value:function(t,e,i,o,n,s){var r=this.options.borderWidth,a=this.options.borderWidthSelected||2*this.options.borderWidth,h=(o?a:r)/this.body.view.scale;t.lineWidth=Math.min(this.width,h),t.strokeStyle=o?this.options.color.highlight.border:n?this.options.color.hover.border:this.options.color.border,t.fillStyle=o?this.options.color.highlight.background:n?this.options.color.hover.background:this.options.color.background,t.circle(e,i,s),this.enableShadow(t),t.fill(),this.disableShadow(t),t.save(),h>0&&(this.enableBorderDashes(t),t.stroke(),this.disableBorderDashes(t)),t.restore()}},{key:"_drawImageAtPosition",value:function(t){0!=this.imageObj.width&&(t.globalAlpha=1,this.enableShadow(t),t.drawImage(this.imageObj,this.left,this.top,this.width,this.height),this.disableShadow(t))}},{key:"_drawImageLabel",value:function(t,e,i,o){var n,s=0;if(void 0!==this.height){s=.5*this.height;var r=this.labelModule.getTextSize(t);r.lineCount>=1&&(s+=r.height/2)}n=i+s,this.options.label&&(this.labelOffset=s),this.labelModule.draw(t,e,n,o,"hanging")}}]),e}(d["default"]);e["default"]=l,t.exports=e["default"]},function(t,e,i){function o(t){return t&&t.__esModule?t:{"default":t}}function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function s(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0});var r=function(){function t(t,e){for(var i=0;i0&&(this.enableBorderDashes(t),t.stroke(),this.disableBorderDashes(t)),t.restore(),this.updateBoundingBox(e,i,t,o),this.labelModule.draw(t,e,i,o)}},{key:"updateBoundingBox",value:function(t,e,i,o){this.resize(i,o),this.left=t-.5*this.width,this.top=e-.5*this.height,this.boundingBox.left=this.left,this.boundingBox.top=this.top,this.boundingBox.bottom=this.top+this.height,this.boundingBox.right=this.left+this.width}},{key:"distanceToBorder",value:function(t,e){return this._distanceToBorder(t,e)}}]),e}(d["default"]);e["default"]=l,t.exports=e["default"]},function(t,e,i){function o(t){return t&&t.__esModule?t:{"default":t}}function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function s(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0});var r=function(){function t(t,e){for(var i=0;i0&&(this.enableBorderDashes(t),t.stroke(),this.disableBorderDashes(t)),t.restore(),void 0!==this.options.label){var l=n+.5*this.height+3;this.labelModule.draw(t,o,l,s,"hanging")}this.updateBoundingBox(o,n)}},{key:"updateBoundingBox",value:function(t,e){this.boundingBox.top=e-this.options.size,this.boundingBox.left=t-this.options.size,this.boundingBox.right=t+this.options.size,this.boundingBox.bottom=e+this.options.size,void 0!==this.options.label&&this.labelModule.size.width>0&&(this.boundingBox.left=Math.min(this.boundingBox.left,this.labelModule.size.left),this.boundingBox.right=Math.max(this.boundingBox.right,this.labelModule.size.left+this.labelModule.size.width),this.boundingBox.bottom=Math.max(this.boundingBox.bottom,this.boundingBox.bottom+this.labelModule.size.height+3))}}]),e}(d["default"]);e["default"]=l,t.exports=e["default"]},function(t,e,i){function o(t){return t&&t.__esModule?t:{"default":t}}function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function s(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0});var r=function(){function t(t,e){for(var i=0;i0&&(this.enableBorderDashes(t),t.stroke(),this.disableBorderDashes(t)),t.restore(),this.updateBoundingBox(e,i,t,o),this.labelModule.draw(t,e,i,o)}},{key:"updateBoundingBox",value:function(t,e,i,o){this.resize(i,o),this.left=t-.5*this.width,this.top=e-.5*this.height,this.boundingBox.left=this.left,this.boundingBox.top=this.top,this.boundingBox.bottom=this.top+this.height,this.boundingBox.right=this.left+this.width}},{key:"distanceToBorder",value:function(t,e){this.resize(t);var i=.5*this.width,o=.5*this.height,n=Math.sin(e)*i,s=Math.cos(e)*o;return i*o/Math.sqrt(n*n+s*s)}}]),e}(d["default"]);e["default"]=l,t.exports=e["default"]},function(t,e,i){function o(t){return t&&t.__esModule?t:{"default":t}}function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function s(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0});var r=function(){function t(t,e){for(var i=0;i0){var i=5;this.boundingBox.left=Math.min(this.boundingBox.left,this.labelModule.size.left),this.boundingBox.right=Math.max(this.boundingBox.right,this.labelModule.size.left+this.labelModule.size.width),this.boundingBox.bottom=Math.max(this.boundingBox.bottom,this.boundingBox.bottom+this.labelModule.size.height+i)}}},{key:"_icon",value:function(t,e,i,o){var n=Number(this.options.icon.size);void 0!==this.options.icon.code?(t.font=(o?"bold ":"")+n+"px "+this.options.icon.face,t.fillStyle=this.options.icon.color||"black",t.textAlign="center",t.textBaseline="middle",this.enableShadow(t),t.fillText(this.options.icon.code,e,i),this.disableShadow(t)):console.error("When using the icon shape, you need to define the code in the icon options object. This can be done per node or globally.")}},{key:"distanceToBorder",value:function(t,e){return this._distanceToBorder(t,e)}}]),e}(d["default"]);e["default"]=l,t.exports=e["default"]},function(t,e,i){function o(t){return t&&t.__esModule?t:{"default":t}}function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function s(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0});var r=function(){function t(t,e){for(var i=0;i0&&(this.enableBorderDashes(t),t.stroke(),this.disableBorderDashes(t)),t.restore(),t.closePath()}this._drawImageAtPosition(t),this._drawImageLabel(t,e,i,o||n),this.updateBoundingBox(e,i)}},{key:"updateBoundingBox",value:function(t,e){this.resize(),this.left=t-this.width/2,this.top=e-this.height/2,this.boundingBox.top=this.top,this.boundingBox.left=this.left,this.boundingBox.right=this.left+this.width,this.boundingBox.bottom=this.top+this.height,void 0!==this.options.label&&this.labelModule.size.width>0&&(this.boundingBox.left=Math.min(this.boundingBox.left,this.labelModule.size.left),this.boundingBox.right=Math.max(this.boundingBox.right,this.labelModule.size.left+this.labelModule.size.width),this.boundingBox.bottom=Math.max(this.boundingBox.bottom,this.boundingBox.bottom+this.labelOffset))}},{key:"distanceToBorder",value:function(t,e){return this._distanceToBorder(t,e)}}]),e}(d["default"]);e["default"]=l,t.exports=e["default"]},function(t,e,i){function o(t){return t&&t.__esModule?t:{"default":t}}function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function s(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0});var r=function(){function t(t,e){for(var i=0;ii.shape.height?(r=i.x+.5*i.shape.width,a=i.y-h):(r=i.x+h,a=i.y-.5*i.shape.height),s=this._pointOnCircle(r,a,h,.125),this.labelModule.draw(t,s.x,s.y,n)}}}},{key:"isOverlappingWith",value:function(t){if(this.connected){var e=10,i=this.from.x,o=this.from.y,n=this.to.x,s=this.to.y,r=t.left,a=t.top,h=this.edgeType.getDistanceToEdge(i,o,n,s,r,a);return e>h}return!1}},{key:"_rotateForLabelAlignment",value:function(t){var e=this.from.y-this.to.y,i=this.from.x-this.to.x,o=Math.atan2(e,i);(-1>o&&0>i||o>0&&0>i)&&(o+=Math.PI),t.rotate(o)}},{key:"_pointOnCircle",value:function(t,e,i,o){var n=2*o*Math.PI;return{x:t+i*Math.cos(n),y:e-i*Math.sin(n)}}},{key:"select",value:function(){this.selected=!0}},{key:"unselect",value:function(){this.selected=!1}},{key:"cleanup",value:function(){return this.edgeType.cleanup()}}],[{key:"parseOptions",value:function(t,e){var i=arguments.length<=2||void 0===arguments[2]?!1:arguments[2],o=arguments.length<=3||void 0===arguments[3]?{}:arguments[3],n=["arrowStrikethrough","id","from","hidden","hoverWidth","label","labelHighlightBold","length","line","opacity","physics","scaling","selectionWidth","selfReferenceSize","to","title","value","width"];if(v.selectiveDeepExtend(n,t,e,i),v.mergeOptions(t,e,"smooth",i,o),v.mergeOptions(t,e,"shadow",i,o),void 0!==e.dashes&&null!==e.dashes?t.dashes=e.dashes:i===!0&&null===e.dashes&&(t.dashes=Object.create(o.dashes)),void 0!==e.scaling&&null!==e.scaling?(void 0!==e.scaling.min&&(t.scaling.min=e.scaling.min),void 0!==e.scaling.max&&(t.scaling.max=e.scaling.max),v.mergeOptions(t.scaling,e.scaling,"label",i,o.scaling)):i===!0&&null===e.scaling&&(t.scaling=Object.create(o.scaling)),void 0!==e.arrows&&null!==e.arrows)if("string"==typeof e.arrows){var s=e.arrows.toLowerCase();-1!=s.indexOf("to")&&(t.arrows.to.enabled=!0),-1!=s.indexOf("middle")&&(t.arrows.middle.enabled=!0),-1!=s.indexOf("from")&&(t.arrows.from.enabled=!0)}else{if("object"!=typeof e.arrows)throw new Error("The arrow newOptions can only be an object or a string. Refer to the documentation. You used:"+JSON.stringify(e.arrows));v.mergeOptions(t.arrows,e.arrows,"to",i,o.arrows),v.mergeOptions(t.arrows,e.arrows,"middle",i,o.arrows),v.mergeOptions(t.arrows,e.arrows,"from",i,o.arrows)}else i===!0&&null===e.arrows&&(t.arrows=Object.create(o.arrows));if(void 0!==e.color&&null!==e.color)if(t.color=v.deepExtend({},t.color,!0),v.isString(e.color))t.color.color=e.color,t.color.highlight=e.color,t.color.hover=e.color,t.color.inherit=!1;else{var r=!1;void 0!==e.color.color&&(t.color.color=e.color.color,r=!0),void 0!==e.color.highlight&&(t.color.highlight=e.color.highlight,r=!0),void 0!==e.color.hover&&(t.color.hover=e.color.hover,r=!0),void 0!==e.color.inherit&&(t.color.inherit=e.color.inherit),void 0!==e.color.opacity&&(t.color.opacity=Math.min(1,Math.max(0,e.color.opacity))),void 0===e.color.inherit&&r===!0&&(t.color.inherit=!1)}else i===!0&&null===e.color&&(t.color=v.bridgeObject(o.color));void 0!==e.font&&null!==e.font?a["default"].parseOptions(t.font,e):i===!0&&null===e.font&&(t.font=v.bridgeObject(o.font))}}]),t}();e["default"]=g,t.exports=e["default"]},function(t,e,i){function o(t){return t&&t.__esModule?t:{"default":t}}function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function s(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0});var r=function(){function t(t,e){var i=[],o=!0,n=!1,s=void 0;try{for(var r,a=t[Symbol.iterator]();!(o=(r=a.next()).done)&&(i.push(r.value),!e||i.length!==e);o=!0);}catch(h){n=!0,s=h}finally{try{!o&&a["return"]&&a["return"]()}finally{if(n)throw s}}return i}return function(e,i){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,i);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),a=function(){function t(t,e){for(var i=0;iMath.abs(e)||this.options.smooth.forceDirection===!0||"horizontal"===this.options.smooth.forceDirection)&&"vertical"!==this.options.smooth.forceDirection?(o=this.from.y,s=this.to.y,i=this.from.x-r*t,n=this.to.x+r*t):(o=this.from.y-r*e,s=this.to.y+r*e,i=this.from.x,n=this.to.x),[{x:i,y:o},{x:n,y:s}]}},{key:"getViaNode",value:function(){return this._getViaCoordinates()}},{key:"_findBorderPosition",value:function(t,e){return this._findBorderPositionBezier(t,e)}},{key:"_getDistanceToEdge",value:function(t,e,i,o,n,s){var a=arguments.length<=6||void 0===arguments[6]?this._getViaCoordinates():arguments[6],h=r(a,2),d=h[0],l=h[1];return this._getDistanceToBezierEdge(t,e,i,o,n,s,d,l)}},{key:"getPoint",value:function(t){var e=arguments.length<=1||void 0===arguments[1]?this._getViaCoordinates():arguments[1],i=r(e,2),o=i[0],n=i[1],s=t,a=[];a[0]=Math.pow(1-s,3),a[1]=3*s*Math.pow(1-s,2),a[2]=3*Math.pow(s,2)*(1-s),a[3]=Math.pow(s,3);var h=a[0]*this.fromPoint.x+a[1]*o.x+a[2]*n.x+a[3]*this.toPoint.x,d=a[0]*this.fromPoint.y+a[1]*o.y+a[2]*n.y+a[3]*this.toPoint.y;return{x:h,y:d}}}]),e}(l["default"]);e["default"]=u,t.exports=e["default"]},function(t,e,i){function o(t){return t&&t.__esModule?t:{"default":t}}function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function s(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0});var r=function(){function t(t,e){for(var i=0;il;l++)u=.1*l,v[0]=Math.pow(1-u,3),v[1]=3*u*Math.pow(1-u,2),v[2]=3*Math.pow(u,2)*(1-u),v[3]=Math.pow(u,3),c=v[0]*t+v[1]*r.x+v[2]*a.x+v[3]*i,p=v[0]*e+v[1]*r.y+v[2]*a.y+v[3]*o,l>0&&(d=this._getDistanceToLine(f,m,c,p,n,s),h=h>d?d:h),f=c,m=p;return h}}]),e}(d["default"]);e["default"]=l,t.exports=e["default"]},function(t,e,i){function o(t){return t&&t.__esModule?t:{"default":t}}function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function s(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0});var r=function(){function t(t,e){for(var i=0;i=l&&h>d;){var m=.5*(l+u);if(i=this.getPoint(m,a),o=Math.atan2(p.y-i.y,p.x-i.x),n=p.distanceToBorder(e,o),s=Math.sqrt(Math.pow(i.x-p.x,2)+Math.pow(i.y-p.y,2)),r=n-s,Math.abs(r)r?f===!1?l=m:u=m:f===!1?u=m:l=m,d++}return i.t=m,i}},{key:"_getDistanceToBezierEdge",value:function(t,e,i,o,n,s,r){var a=1e9,h=void 0,d=void 0,l=void 0,u=void 0,c=void 0,p=t,f=e;for(d=1;10>d;d++)l=.1*d,u=Math.pow(1-l,2)*t+2*l*(1-l)*r.x+Math.pow(l,2)*i,c=Math.pow(1-l,2)*e+2*l*(1-l)*r.y+Math.pow(l,2)*o,d>0&&(h=this._getDistanceToLine(p,f,u,c,n,s),a=a>h?h:a),p=u,f=c;return a}}]),e}(d["default"]);e["default"]=l,t.exports=e["default"]},function(t,e,i){function o(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var n=function(){function t(t,e){var i=[],o=!0,n=!1,s=void 0;try{for(var r,a=t[Symbol.iterator]();!(o=(r=a.next()).done)&&(i.push(r.value),!e||i.length!==e);o=!0);}catch(h){n=!0,s=h}finally{try{!o&&a["return"]&&a["return"]()}finally{if(n)throw s}}return i}return function(e,i){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,i);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),s=function(){function t(t,e){for(var i=0;io.shape.height?(e=o.x+.5*o.shape.width,i=o.y-n):(e=o.x+n,i=o.y-.5*o.shape.height),[e,i,n]}},{key:"_pointOnCircle",value:function(t,e,i,o){var n=2*o*Math.PI;return{x:t+i*Math.cos(n),y:e-i*Math.sin(n)}}},{key:"_findBorderPositionCircle",value:function(t,e,i){for(var o=i.x,n=i.y,s=i.low,r=i.high,a=i.direction,h=10,d=0,l=this.options.selfReferenceSize,u=void 0,c=void 0,p=void 0,f=void 0,m=void 0,v=.05,g=.5*(s+r);r>=s&&h>d&&(g=.5*(s+r),u=this._pointOnCircle(o,n,l,g),c=Math.atan2(t.y-u.y,t.x-u.x),p=t.distanceToBorder(e,c),f=Math.sqrt(Math.pow(u.x-t.x,2)+Math.pow(u.y-t.y,2)),m=p-f,!(Math.abs(m)0?a>0?s=g:r=g:a>0?r=g:s=g,d++;return u.t=g,u}},{key:"getLineWidth",value:function(t,e){return t===!0?Math.max(this.selectionWidth,.3/this.body.view.scale):e===!0?Math.max(this.hoverWidth,.3/this.body.view.scale):Math.max(this.options.width,.3/this.body.view.scale)}},{key:"getColor",value:function(t,e,i){var o=this.options.color;if(o.inherit!==!1){if("both"===o.inherit&&this.from.id!==this.to.id){var n=t.createLinearGradient(this.from.x,this.from.y,this.to.x,this.to.y),s=void 0,a=void 0;return s=this.from.options.color.highlight.border,a=this.to.options.color.highlight.border,this.from.selected===!1&&this.to.selected===!1?(s=r.overrideOpacity(this.from.options.color.border,this.options.color.opacity),a=r.overrideOpacity(this.to.options.color.border,this.options.color.opacity)):this.from.selected===!0&&this.to.selected===!1?a=this.to.options.color.border:this.from.selected===!1&&this.to.selected===!0&&(s=this.from.options.color.border),n.addColorStop(0,s),n.addColorStop(1,a),n}this.colorDirty===!0&&("to"===o.inherit?(this.color.highlight=this.to.options.color.highlight.border,this.color.hover=this.to.options.color.hover.border,this.color.color=r.overrideOpacity(this.to.options.color.border,o.opacity)):(this.color.highlight=this.from.options.color.highlight.border,this.color.hover=this.from.options.color.hover.border,this.color.color=r.overrideOpacity(this.from.options.color.border,o.opacity)))}else this.colorDirty===!0&&(this.color.highlight=o.highlight,this.color.hover=o.hover,this.color.color=r.overrideOpacity(o.color,o.opacity));return this.colorDirty=!1,e===!0?this.color.highlight:i===!0?this.color.hover:this.color.color}},{key:"_circle",value:function(t,e,i,o){this.enableShadow(t),t.beginPath(),t.arc(e,i,o,0,2*Math.PI,!1),t.stroke(),this.disableShadow(t)}},{key:"getDistanceToEdge",value:function(t,e,i,o,s,r,a){var h=0;if(this.from!=this.to)h=this._getDistanceToEdge(t,e,i,o,s,r,a);else{var d=this._getCircleData(),l=n(d,3),u=l[0],c=l[1],p=l[2],f=u-s,m=c-r;h=Math.abs(Math.sqrt(f*f+m*m)-p)}return this.labelModule.size.lefts&&this.labelModule.size.topr?0:h}},{key:"_getDistanceToLine",value:function(t,e,i,o,n,s){var r=i-t,a=o-e,h=r*r+a*a,d=((n-t)*r+(s-e)*a)/h;d>1?d=1:0>d&&(d=0);var l=t+d*r,u=e+d*a,c=l-n,p=u-s;return Math.sqrt(c*c+p*p)}},{key:"getArrowData",value:function(t,e,i,o,s){var r=void 0,a=void 0,h=void 0,d=void 0,l=void 0,u=void 0,c=this.getLineWidth(o,s);if("from"===e?(h=this.from,d=this.to,l=.1,u=this.options.arrows.from.scaleFactor):"to"===e?(h=this.to,d=this.from,l=-.1,u=this.options.arrows.to.scaleFactor):(h=this.to,d=this.from,u=this.options.arrows.middle.scaleFactor),h!=d)if("middle"!==e)if(this.options.smooth.enabled===!0){a=this.findBorderPosition(h,t,{via:i});var p=this.getPoint(Math.max(0,Math.min(1,a.t+l)),i);r=Math.atan2(a.y-p.y,a.x-p.x)}else r=Math.atan2(h.y-d.y,h.x-d.x),a=this.findBorderPosition(h,t);else r=Math.atan2(h.y-d.y,h.x-d.x),a=this.getPoint(.5,i);else{var f=this._getCircleData(t),m=n(f,3),v=m[0],g=m[1],y=m[2];"from"===e?(a=this.findBorderPosition(this.from,t,{x:v,y:g,low:.25,high:.6,direction:-1}),r=-2*a.t*Math.PI+1.5*Math.PI+.1*Math.PI):"to"===e?(a=this.findBorderPosition(this.from,t,{x:v,y:g,low:.6,high:1,direction:1}),r=-2*a.t*Math.PI+1.5*Math.PI-1.1*Math.PI):(a=this._pointOnCircle(v,g,y,.175),r=3.9269908169872414)}var b=15*u+3*c,_=a.x-.9*b*Math.cos(r),w=a.y-.9*b*Math.sin(r),x={x:_,y:w};return{point:a,core:x,angle:r,length:b}}},{key:"drawArrowHead",value:function(t,e,i,o){t.strokeStyle=this.getColor(t,e,i),t.fillStyle=t.strokeStyle,t.lineWidth=this.getLineWidth(e,i),t.arrow(o.point.x,o.point.y,o.angle,o.length),this.enableShadow(t),t.fill(),this.disableShadow(t)}},{key:"enableShadow",value:function(t){this.options.shadow.enabled===!0&&(t.shadowColor=this.options.shadow.color,t.shadowBlur=this.options.shadow.size,t.shadowOffsetX=this.options.shadow.x,t.shadowOffsetY=this.options.shadow.y)}},{key:"disableShadow",value:function(t){this.options.shadow.enabled===!0&&(t.shadowColor="rgba(0,0,0,0)",t.shadowBlur=0,t.shadowOffsetX=0,t.shadowOffsetY=0)}}]),t}();e["default"]=a,t.exports=e["default"]},function(t,e,i){function o(t){return t&&t.__esModule?t:{"default":t}}function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function s(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0});var r=function(){function t(t,e){for(var i=0;i=this.to.y?this.from.x<=this.to.x?(t=this.from.x+i*s,e=this.from.y-i*s):this.from.x>this.to.x&&(t=this.from.x-i*s,e=this.from.y-i*s):this.from.ythis.to.x&&(t=this.from.x-i*s,e=this.from.y+i*s)),"discrete"===o&&(t=i*s>n?this.from.x:t)):Math.abs(this.from.x-this.to.x)>Math.abs(this.from.y-this.to.y)&&(this.from.y>=this.to.y?this.from.x<=this.to.x?(t=this.from.x+i*n,e=this.from.y-i*n):this.from.x>this.to.x&&(t=this.from.x-i*n,e=this.from.y-i*n):this.from.ythis.to.x&&(t=this.from.x-i*n,e=this.from.y+i*n)),"discrete"===o&&(e=i*n>s?this.from.y:e));else if("straightCross"===o)Math.abs(this.from.x-this.to.x)<=Math.abs(this.from.y-this.to.y)?(t=this.from.x,e=this.from.yMath.abs(this.from.y-this.to.y)&&(t=this.from.x=this.to.y?this.from.x<=this.to.x?(t=this.from.x+i*s,e=this.from.y-i*s,t=this.to.xthis.to.x&&(t=this.from.x-i*s,e=this.from.y-i*s,t=this.to.x>t?this.to.x:t):this.from.ythis.to.x&&(t=this.from.x-i*s,e=this.from.y+i*s,t=this.to.x>t?this.to.x:t)):Math.abs(this.from.x-this.to.x)>Math.abs(this.from.y-this.to.y)&&(this.from.y>=this.to.y?this.from.x<=this.to.x?(t=this.from.x+i*n,e=this.from.y-i*n, +e=this.to.y>e?this.to.y:e):this.from.x>this.to.x&&(t=this.from.x-i*n,e=this.from.y-i*n,e=this.to.y>e?this.to.y:e):this.from.ythis.to.x&&(t=this.from.x-i*n,e=this.from.y+i*n,e=this.to.y1||this.startedStabilization===!0)&&setTimeout(function(){t.body.emitter.emit("stabilized",{iterations:e}),t.startedStabilization=!1,t.stabilizationIterations=0},0)}},{key:"physicsTick",value:function(){if(this.startedStabilization===!1&&(this.body.emitter.emit("startStabilizing"),this.startedStabilization=!0),this.stabilized===!1){if(this.adaptiveTimestep===!0&&this.adaptiveTimestepEnabled===!0){var t=1.2;this.adaptiveCounter%this.adaptiveInterval===0?(this.timestep=2*this.timestep,this.calculateForces(),this.moveNodes(),this.revert(),this.timestep=.5*this.timestep,this.calculateForces(),this.moveNodes(),this.calculateForces(),this.moveNodes(),this._evaluateStepQuality()===!0?this.timestep=t*this.timestep:this.timestep/ts))return!1;return!0}},{key:"moveNodes",value:function(){for(var t=this.physicsBody.physicsNodeIndices,e=this.options.maxVelocity?this.options.maxVelocity:1e9,i=0,o=0,n=5,s=0;se?s[t].x>0?e:-e:s[t].x,i.x+=s[t].x*o}else n[t].x=0,s[t].x=0;if(i.options.fixed.y===!1){var h=this.modelOptions.damping*s[t].y,d=(n[t].y-h)/i.options.mass;s[t].y+=d*o,s[t].y=Math.abs(s[t].y)>e?s[t].y>0?e:-e:s[t].y,i.y+=s[t].y*o}else n[t].y=0,s[t].y=0;var l=Math.sqrt(Math.pow(s[t].x,2)+Math.pow(s[t].y,2));return l}},{key:"calculateForces",value:function(){this.gravitySolver.solve(),this.nodesSolver.solve(),this.edgesSolver.solve()}},{key:"_freezeNodes",value:function(){var t=this.body.nodes;for(var e in t)t.hasOwnProperty(e)&&t[e].x&&t[e].y&&(this.freezeCache[e]={x:t[e].options.fixed.x,y:t[e].options.fixed.y},t[e].options.fixed.x=!0,t[e].options.fixed.y=!0)}},{key:"_restoreFrozenNodes",value:function(){var t=this.body.nodes;for(var e in t)t.hasOwnProperty(e)&&void 0!==this.freezeCache[e]&&(t[e].options.fixed.x=this.freezeCache[e].x,t[e].options.fixed.y=this.freezeCache[e].y);this.freezeCache={}}},{key:"stabilize",value:function(){var t=this,e=arguments.length<=0||void 0===arguments[0]?this.options.stabilization.iterations:arguments[0];return"number"!=typeof e&&(console.log("The stabilize method needs a numeric amount of iterations. Switching to default: ",this.options.stabilization.iterations),e=this.options.stabilization.iterations),0===this.physicsBody.physicsNodeIndices.length?void(this.ready=!0):(this.adaptiveTimestep=this.options.adaptiveTimestep,this.body.emitter.emit("_resizeNodes"),this.stopSimulation(),this.stabilized=!1,this.body.emitter.emit("_blockRedraw"),this.targetIterations=e,this.options.stabilization.onlyDynamicEdges===!0&&this._freezeNodes(),this.stabilizationIterations=0,void setTimeout(function(){return t._stabilizationBatch()},0))}},{key:"_stabilizationBatch",value:function(){this.startedStabilization===!1&&(this.body.emitter.emit("startStabilizing"),this.startedStabilization=!0);for(var t=0;this.stabilized===!1&&t0){var t=void 0,e=this.body.nodes,i=this.physicsBody.physicsNodeIndices,o=i.length,n=this._formBarnesHutTree(e,i);this.barnesHutTree=n;for(var s=0;o>s;s++)t=e[i[s]],t.options.mass>0&&(this._getForceContribution(n.root.children.NW,t),this._getForceContribution(n.root.children.NE,t),this._getForceContribution(n.root.children.SW,t),this._getForceContribution(n.root.children.SE,t))}}},{key:"_getForceContribution",value:function(t,e){if(t.childrenCount>0){var i=void 0,o=void 0,n=void 0;i=t.centerOfMass.x-e.x,o=t.centerOfMass.y-e.y,n=Math.sqrt(i*i+o*o),n*t.calcSize>this.thetaInversed?this._calculateForces(n,i,o,e,t):4===t.childrenCount?(this._getForceContribution(t.children.NW,e),this._getForceContribution(t.children.NE,e),this._getForceContribution(t.children.SW,e),this._getForceContribution(t.children.SE,e)):t.children.data.id!=e.id&&this._calculateForces(n,i,o,e,t)}}},{key:"_calculateForces",value:function(t,e,i,o,n){0===t&&(t=.1,e=t),this.overlapAvoidanceFactor<1&&(t=Math.max(.1+this.overlapAvoidanceFactor*o.shape.radius,t-o.shape.radius));var s=this.options.gravitationalConstant*n.mass*o.options.mass/Math.pow(t,3),r=e*s,a=i*s;this.physicsBody.forces[o.id].x+=r,this.physicsBody.forces[o.id].y+=a}},{key:"_formBarnesHutTree",value:function(t,e){for(var i=void 0,o=e.length,n=t[e[0]].x,s=t[e[0]].y,r=t[e[0]].x,a=t[e[0]].y,h=1;o>h;h++){var d=t[e[h]].x,l=t[e[h]].y;t[e[h]].options.mass>0&&(n>d&&(n=d),d>r&&(r=d),s>l&&(s=l),l>a&&(a=l))}var u=Math.abs(r-n)-Math.abs(a-s);u>0?(s-=.5*u,a+=.5*u):(n+=.5*u,r-=.5*u);var c=1e-5,p=Math.max(c,Math.abs(r-n)),f=.5*p,m=.5*(n+r),v=.5*(s+a),g={root:{centerOfMass:{x:0,y:0},mass:0,range:{minX:m-f,maxX:m+f,minY:v-f,maxY:v+f},size:p,calcSize:1/p,children:{data:null},maxWidth:0,level:0,childrenCount:4}};this._splitBranch(g.root);for(var h=0;o>h;h++)i=t[e[h]],i.options.mass>0&&this._placeInTree(g.root,i);return g}},{key:"_updateBranchMass",value:function(t,e){var i=t.mass+e.options.mass,o=1/i;t.centerOfMass.x=t.centerOfMass.x*t.mass+e.x*e.options.mass,t.centerOfMass.x*=o,t.centerOfMass.y=t.centerOfMass.y*t.mass+e.y*e.options.mass,t.centerOfMass.y*=o,t.mass=i;var n=Math.max(Math.max(e.height,e.radius),e.width);t.maxWidth=t.maxWidthe.x?t.children.NW.range.maxY>e.y?this._placeInRegion(t,e,"NW"):this._placeInRegion(t,e,"SW"):t.children.NW.range.maxY>e.y?this._placeInRegion(t,e,"NE"):this._placeInRegion(t,e,"SE")}},{key:"_placeInRegion",value:function(t,e,i){switch(t.children[i].childrenCount){case 0:t.children[i].children.data=e,t.children[i].childrenCount=1,this._updateBranchMass(t.children[i],e);break;case 1:t.children[i].children.data.x===e.x&&t.children[i].children.data.y===e.y?(e.x+=this.seededRandom(),e.y+=this.seededRandom()):(this._splitBranch(t.children[i]),this._placeInTree(t.children[i],e));break;case 4:this._placeInTree(t.children[i],e)}}},{key:"_splitBranch",value:function(t){var e=null;1===t.childrenCount&&(e=t.children.data,t.mass=0,t.centerOfMass.x=0,t.centerOfMass.y=0),t.childrenCount=4,t.children.data=null,this._insertRegion(t,"NW"),this._insertRegion(t,"NE"),this._insertRegion(t,"SW"),this._insertRegion(t,"SE"),null!=e&&this._placeInTree(t,e)}},{key:"_insertRegion",value:function(t,e){var i=void 0,o=void 0,n=void 0,s=void 0,r=.5*t.size;switch(e){case"NW":i=t.range.minX,o=t.range.minX+r,n=t.range.minY,s=t.range.minY+r;break;case"NE":i=t.range.minX+r,o=t.range.maxX,n=t.range.minY,s=t.range.minY+r;break;case"SW":i=t.range.minX,o=t.range.minX+r,n=t.range.minY+r,s=t.range.maxY;break;case"SE":i=t.range.minX+r,o=t.range.maxX,n=t.range.minY+r,s=t.range.maxY}t.children[e]={centerOfMass:{x:0,y:0},mass:0,range:{minX:i,maxX:o,minY:n,maxY:s},size:.5*t.size,calcSize:2*t.calcSize,children:{data:null},maxWidth:0,level:t.level+1,childrenCount:0}}},{key:"_debug",value:function(t,e){void 0!==this.barnesHutTree&&(t.lineWidth=1,this._drawBranch(this.barnesHutTree.root,t,e))}},{key:"_drawBranch",value:function(t,e,i){void 0===i&&(i="#FF0000"),4===t.childrenCount&&(this._drawBranch(t.children.NW,e),this._drawBranch(t.children.NE,e),this._drawBranch(t.children.SE,e),this._drawBranch(t.children.SW,e)),e.strokeStyle=i,e.beginPath(),e.moveTo(t.range.minX,t.range.minY),e.lineTo(t.range.maxX,t.range.minY),e.stroke(),e.beginPath(),e.moveTo(t.range.maxX,t.range.minY),e.lineTo(t.range.maxX,t.range.maxY),e.stroke(),e.beginPath(),e.moveTo(t.range.maxX,t.range.maxY),e.lineTo(t.range.minX,t.range.maxY),e.stroke(),e.beginPath(),e.moveTo(t.range.minX,t.range.maxY),e.lineTo(t.range.minX,t.range.minY),e.stroke()}}]),t}();e["default"]=n,t.exports=e["default"]},function(t,e){function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var o=function(){function t(t,e){for(var i=0;ii&&(s=.5*u>i?1:c*i+p,s/=i,o=t*s,n=e*s,l[r.id].x-=o,l[r.id].y-=n,l[a.id].x+=o,l[a.id].y+=n)}}}]),t}();e["default"]=n,t.exports=e["default"]},function(t,e){function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var o=function(){function t(t,e){for(var i=0;ii?-Math.pow(f*i,2)+Math.pow(f*p,2):0,0===i?i=.01:s/=i,o=t*s,n=e*s,c[r.id].x-=o,c[r.id].y-=n,c[a.id].x+=o,c[a.id].y+=n}}}]),t}();e["default"]=n,t.exports=e["default"]},function(t,e){function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var o=function(){function t(t,e){for(var i=0;i0){var s=n.edges.length+1,r=this.options.centralGravity*s*n.options.mass;o[n.id].x=e*r,o[n.id].y=i*r}}}]),e}(d["default"]);e["default"]=l,t.exports=e["default"]},function(t,e,i){function o(t){return t&&t.__esModule?t:{"default":t}}function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var s=function(){function t(t,e){for(var i=0;i=t&&i.push(n.id)}for(var o=0;o0&&Object.keys(p).length>0&&m===!0&&o.push({nodes:c,edges:p})}}}for(var u=0;uo?r.x:o,n=r.ys?r.y:s;return{x:.5*(i+o),y:.5*(n+s)}}},{key:"openCluster",value:function(t,e){var i=arguments.length<=2||void 0===arguments[2]?!0:arguments[2];if(void 0===t)throw new Error("No clusterNodeId supplied to openCluster.");if(void 0===this.body.nodes[t])throw new Error("The clusterNodeId supplied to openCluster does not exist.");if(void 0===this.body.nodes[t].containedNodes)return void console.log("The node:"+t+" is not a cluster.");var o=this.body.nodes[t],n=o.containedNodes,s=o.containedEdges;if(void 0!==e&&void 0!==e.releaseFunction&&"function"==typeof e.releaseFunction){var r={},h={x:o.x,y:o.y};for(var d in n)if(n.hasOwnProperty(d)){var u=this.body.nodes[d];r[d]={x:u.x,y:u.y}}var c=e.releaseFunction(h,r);for(var d in n)if(n.hasOwnProperty(d)){var u=this.body.nodes[d];void 0!==c[d]&&(u.x=void 0===c[d].x?o.x:c[d].x,u.y=void 0===c[d].y?o.y:c[d].y)}}else for(var d in n)if(n.hasOwnProperty(d)){var u=this.body.nodes[d];u=n[d],u.options.fixed.x===!1&&(u.x=o.x),u.options.fixed.y===!1&&(u.y=o.y)}for(var d in n)if(n.hasOwnProperty(d)){var u=this.body.nodes[d];u.vx=o.vx,u.vy=o.vy,u.setOptions({hidden:!1,physics:!0}),delete this.clusteredNodes[d]}for(var p=[],f=0;fo;)e.push(this.body.nodes[t].id),t=this.clusteredNodes[t].clusterId,o++;return e.push(this.body.nodes[t].id),e.reverse(),e}},{key:"_getConnectedId",value:function(t,e){return t.toId!=e?t.toId:t.fromId!=e?t.fromId:t.fromId}},{key:"_getHubSize",value:function(){for(var t=0,e=0,i=0,o=0,n=0;no&&(o=s.edges.length),t+=s.edges.length,e+=Math.pow(s.edges.length,2),i+=1}t/=i,e/=i;var r=e-Math.pow(t,2),a=Math.sqrt(r),h=Math.floor(t+2*a);return h>o&&(h=o),h}}]),t}();e["default"]=u,t.exports=e["default"]},function(t,e,i){function o(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var n=function(){function t(t,e){for(var i=0;i0)for(var a=0;ae.shape.boundingBox.left&&(s=e.shape.boundingBox.left),re.shape.boundingBox.top&&(o=e.shape.boundingBox.top),n0)for(var a=0;ae.x&&(s=e.x),re.y&&(o=e.y),n0,t.renderTimer=void 0}),this.body.emitter.on("destroy",function(){t.renderRequests=0,t.allowRedraw=!1,t.renderingActive=!1,t.requiresTimeout===!0?clearTimeout(t.renderTimer):cancelAnimationFrame(t.renderTimer),t.body.emitter.off()})}},{key:"setOptions",value:function(t){if(void 0!==t){var e=["hideEdgesOnDrag","hideNodesOnDrag"];s.selectiveDeepExtend(e,this.options,t)}}},{key:"_startRendering",value:function(){this.renderingActive===!0&&void 0===this.renderTimer&&(this.requiresTimeout===!0?this.renderTimer=window.setTimeout(this._renderStep.bind(this),this.simulationInterval):this.renderTimer=window.requestAnimationFrame(this._renderStep.bind(this)))}},{key:"_renderStep",value:function(){this.renderingActive===!0&&(this.renderTimer=void 0,this.requiresTimeout===!0&&this._startRendering(),this._redraw(),this.requiresTimeout===!1&&this._startRendering())}},{key:"redraw",value:function(){this.body.emitter.emit("setSize"),this._redraw()}},{key:"_requestRedraw",value:function(){var t=this;this.redrawRequested!==!0&&this.renderingActive===!1&&this.allowRedraw===!0&&(this.redrawRequested=!0,this.requiresTimeout===!0?window.setTimeout(function(){t._redraw(!1)},0):window.requestAnimationFrame(function(){t._redraw(!1)}))}},{key:"_redraw",value:function(){var t=arguments.length<=0||void 0===arguments[0]?!1:arguments[0];if(this.allowRedraw===!0){this.body.emitter.emit("initRedraw"),this.redrawRequested=!1;var e=this.canvas.frame.canvas.getContext("2d");(0===this.canvas.frame.canvas.width||0===this.canvas.frame.canvas.height)&&this.canvas.setSize(),this.pixelRatio=(window.devicePixelRatio||1)/(e.webkitBackingStorePixelRatio||e.mozBackingStorePixelRatio||e.msBackingStorePixelRatio||e.oBackingStorePixelRatio||e.backingStorePixelRatio||1),e.setTransform(this.pixelRatio,0,0,this.pixelRatio,0,0);var i=this.canvas.frame.canvas.clientWidth,o=this.canvas.frame.canvas.clientHeight;if(e.clearRect(0,0,i,o),0===this.canvas.frame.clientWidth)return;e.save(),e.translate(this.body.view.translation.x,this.body.view.translation.y),e.scale(this.body.view.scale,this.body.view.scale),e.beginPath(),this.body.emitter.emit("beforeDrawing",e),e.closePath(),t===!1&&(this.dragging===!1||this.dragging===!0&&this.options.hideEdgesOnDrag===!1)&&this._drawEdges(e),(this.dragging===!1||this.dragging===!0&&this.options.hideNodesOnDrag===!1)&&this._drawNodes(e,t),e.beginPath(),this.body.emitter.emit("afterDrawing",e),e.closePath(),e.restore(),t===!0&&e.clearRect(0,0,i,o)}}},{key:"_resizeNodes",value:function(){var t=this.canvas.frame.canvas.getContext("2d");void 0===this.pixelRatio&&(this.pixelRatio=(window.devicePixelRatio||1)/(t.webkitBackingStorePixelRatio||t.mozBackingStorePixelRatio||t.msBackingStorePixelRatio||t.oBackingStorePixelRatio||t.backingStorePixelRatio||1)),t.setTransform(this.pixelRatio,0,0,this.pixelRatio,0,0),t.save(),t.translate(this.body.view.translation.x,this.body.view.translation.y),t.scale(this.body.view.scale,this.body.view.scale);var e=this.body.nodes,i=void 0;for(var o in e)e.hasOwnProperty(o)&&(i=e[o],i.resize(t),i.updateBoundingBox(t,i.selected));t.restore()}},{key:"_drawNodes",value:function(t){for(var e=arguments.length<=1||void 0===arguments[1]?!1:arguments[1],i=this.body.nodes,o=this.body.nodeIndices,n=void 0,s=[],r=20,a=this.canvas.DOMtoCanvas({x:-r,y:-r}),h=this.canvas.DOMtoCanvas({x:this.canvas.frame.canvas.clientWidth+r,y:this.canvas.frame.canvas.clientHeight+r}),d={top:a.y,left:a.x,bottom:h.y,right:h.x},l=0;l0){var t=this.frame.canvas.width/this.pixelRatio/this.cameraState.previousWidth,e=this.frame.canvas.height/this.pixelRatio/this.cameraState.previousHeight,i=this.cameraState.scale;1!=t&&1!=e?i=.5*this.cameraState.scale*(t+e):1!=t?i=this.cameraState.scale*t:1!=e&&(i=this.cameraState.scale*e),this.body.view.scale=i;var o=this.DOMtoCanvas({x:.5*this.frame.canvas.clientWidth,y:.5*this.frame.canvas.clientHeight}),n={x:o.x-this.cameraState.position.x,y:o.y-this.cameraState.position.y};this.body.view.translation.x+=n.x*this.body.view.scale,this.body.view.translation.y+=n.y*this.body.view.scale}}},{key:"_prepareValue",value:function(t){if("number"==typeof t)return t+"px";if("string"==typeof t){if(-1!==t.indexOf("%")||-1!==t.indexOf("px"))return t;if(-1===t.indexOf("%"))return t+"px"}throw new Error("Could not use the value supplied for width or height:"+t)}},{key:"_create",value:function(){for(;this.body.container.hasChildNodes();)this.body.container.removeChild(this.body.container.firstChild);if(this.frame=document.createElement("div"),this.frame.className="vis-network",this.frame.style.position="relative",this.frame.style.overflow="hidden",this.frame.tabIndex=900,this.frame.canvas=document.createElement("canvas"),this.frame.canvas.style.position="relative",this.frame.appendChild(this.frame.canvas),this.frame.canvas.getContext){var t=this.frame.canvas.getContext("2d");this.pixelRatio=(window.devicePixelRatio||1)/(t.webkitBackingStorePixelRatio||t.mozBackingStorePixelRatio||t.msBackingStorePixelRatio||t.oBackingStorePixelRatio||t.backingStorePixelRatio||1),this.frame.canvas.getContext("2d").setTransform(this.pixelRatio,0,0,this.pixelRatio,0,0)}else{var e=document.createElement("DIV");e.style.color="red",e.style.fontWeight="bold",e.style.padding="10px",e.innerHTML="Error: your browser does not support HTML canvas",this.frame.canvas.appendChild(e)}this.body.container.appendChild(this.frame),this.body.view.scale=1,this.body.view.translation={x:.5*this.frame.canvas.clientWidth,y:.5*this.frame.canvas.clientHeight},this._bindHammer()}},{key:"_bindHammer",value:function(){var t=this;void 0!==this.hammer&&this.hammer.destroy(),this.drag={},this.pinch={},this.hammer=new s(this.frame.canvas),this.hammer.get("pinch").set({enable:!0}),this.hammer.get("pan").set({threshold:5,direction:30}),r.onTouch(this.hammer,function(e){t.body.eventListeners.onTouch(e)}),this.hammer.on("tap",function(e){t.body.eventListeners.onTap(e)}),this.hammer.on("doubletap",function(e){t.body.eventListeners.onDoubleTap(e)}),this.hammer.on("press",function(e){t.body.eventListeners.onHold(e)}),this.hammer.on("panstart",function(e){t.body.eventListeners.onDragStart(e)}),this.hammer.on("panmove",function(e){t.body.eventListeners.onDrag(e)}),this.hammer.on("panend",function(e){t.body.eventListeners.onDragEnd(e)}),this.hammer.on("pinch",function(e){t.body.eventListeners.onPinch(e)}),this.frame.canvas.addEventListener("mousewheel",function(e){t.body.eventListeners.onMouseWheel(e)}),this.frame.canvas.addEventListener("DOMMouseScroll",function(e){t.body.eventListeners.onMouseWheel(e)}),this.frame.canvas.addEventListener("mousemove",function(e){t.body.eventListeners.onMouseMove(e)}),this.frame.canvas.addEventListener("contextmenu",function(e){t.body.eventListeners.onContext(e)}),this.hammerFrame=new s(this.frame),r.onRelease(this.hammerFrame,function(e){t.body.eventListeners.onRelease(e)})}},{key:"setSize",value:function(){var t=arguments.length<=0||void 0===arguments[0]?this.options.width:arguments[0],e=arguments.length<=1||void 0===arguments[1]?this.options.height:arguments[1];t=this._prepareValue(t),e=this._prepareValue(e);var i=!1,o=this.frame.canvas.width,n=this.frame.canvas.height,s=this.frame.canvas.getContext("2d"),r=this.pixelRatio;return this.pixelRatio=(window.devicePixelRatio||1)/(s.webkitBackingStorePixelRatio||s.mozBackingStorePixelRatio||s.msBackingStorePixelRatio||s.oBackingStorePixelRatio||s.backingStorePixelRatio||1),t!=this.options.width||e!=this.options.height||this.frame.style.width!=t||this.frame.style.height!=e?(this._getCameraState(r),this.frame.style.width=t,this.frame.style.height=e,this.frame.canvas.style.width="100%",this.frame.canvas.style.height="100%",this.frame.canvas.width=Math.round(this.frame.canvas.clientWidth*this.pixelRatio),this.frame.canvas.height=Math.round(this.frame.canvas.clientHeight*this.pixelRatio),this.options.width=t,this.options.height=e,i=!0):((this.frame.canvas.width!=Math.round(this.frame.canvas.clientWidth*this.pixelRatio)||this.frame.canvas.height!=Math.round(this.frame.canvas.clientHeight*this.pixelRatio))&&this._getCameraState(r),this.frame.canvas.width!=Math.round(this.frame.canvas.clientWidth*this.pixelRatio)&&(this.frame.canvas.width=Math.round(this.frame.canvas.clientWidth*this.pixelRatio),i=!0),this.frame.canvas.height!=Math.round(this.frame.canvas.clientHeight*this.pixelRatio)&&(this.frame.canvas.height=Math.round(this.frame.canvas.clientHeight*this.pixelRatio),i=!0)),i===!0&&(this.body.emitter.emit("resize",{width:Math.round(this.frame.canvas.width/this.pixelRatio),height:Math.round(this.frame.canvas.height/this.pixelRatio),oldWidth:Math.round(o/this.pixelRatio),oldHeight:Math.round(n/this.pixelRatio)}),this._setCameraState()),i}},{key:"_XconvertDOMtoCanvas",value:function(t){return(t-this.body.view.translation.x)/this.body.view.scale}},{key:"_XconvertCanvasToDOM",value:function(t){return t*this.body.view.scale+this.body.view.translation.x}},{key:"_YconvertDOMtoCanvas",value:function(t){return(t-this.body.view.translation.y)/this.body.view.scale}},{key:"_YconvertCanvasToDOM",value:function(t){return t*this.body.view.scale+this.body.view.translation.y}},{key:"canvasToDOM",value:function(t){return{x:this._XconvertCanvasToDOM(t.x),y:this._YconvertCanvasToDOM(t.y)}}},{key:"DOMtoCanvas",value:function(t){return{x:this._XconvertDOMtoCanvas(t.x),y:this._YconvertDOMtoCanvas(t.y)}}}]),t}();e["default"]=h,t.exports=e["default"]},function(t,e,i){function o(t){return t&&t.__esModule?t:{"default":t}}function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var s=function(){function t(t,e){for(var i=0;i.5*this.body.nodeIndices.length)return void this.fit(t,!1);i=a["default"].getRange(this.body.nodes,t.nodes);var h=this.body.nodeIndices.length;o=12.662/(h+7.4147)+.0964822;var d=Math.min(this.canvas.frame.canvas.clientWidth/600,this.canvas.frame.canvas.clientHeight/600);o*=d}else{this.body.emitter.emit("_resizeNodes"),i=a["default"].getRange(this.body.nodes,t.nodes);var l=1.1*Math.abs(i.maxX-i.minX),u=1.1*Math.abs(i.maxY-i.minY),c=this.canvas.frame.canvas.clientWidth/l,p=this.canvas.frame.canvas.clientHeight/u;o=p>=c?c:p}o>1?o=1:0===o&&(o=1);var f=a["default"].findCenter(i),m={position:f,scale:o,animation:t.animation};this.moveTo(m)}},{key:"focus",value:function(t){var e=arguments.length<=1||void 0===arguments[1]?{}:arguments[1];if(void 0!==this.body.nodes[t]){var i={x:this.body.nodes[t].x,y:this.body.nodes[t].y};e.position=i,e.lockedOnNode=t,this.moveTo(e)}else console.log("Node: "+t+" cannot be found.")}},{key:"moveTo",value:function(t){return void 0===t?void(t={}):(void 0===t.offset&&(t.offset={x:0,y:0}),void 0===t.offset.x&&(t.offset.x=0),void 0===t.offset.y&&(t.offset.y=0),void 0===t.scale&&(t.scale=this.body.view.scale),void 0===t.position&&(t.position=this.getViewPosition()),void 0===t.animation&&(t.animation={duration:0}),t.animation===!1&&(t.animation={duration:0}),t.animation===!0&&(t.animation={}),void 0===t.animation.duration&&(t.animation.duration=1e3),void 0===t.animation.easingFunction&&(t.animation.easingFunction="easeInOutQuad"),void this.animateView(t))}},{key:"animateView",value:function(t){if(void 0!==t){this.animationEasingFunction=t.animation.easingFunction,this.releaseNode(),t.locked===!0&&(this.lockedOnNodeId=t.lockedOnNode,this.lockedOnNodeOffset=t.offset),0!=this.easingTime&&this._transitionRedraw(!0),this.sourceScale=this.body.view.scale,this.sourceTranslation=this.body.view.translation,this.targetScale=t.scale,this.body.view.scale=this.targetScale;var e=this.canvas.DOMtoCanvas({x:.5*this.canvas.frame.canvas.clientWidth,y:.5*this.canvas.frame.canvas.clientHeight}),i={x:e.x-t.position.x,y:e.y-t.position.y};this.targetTranslation={x:this.sourceTranslation.x+i.x*this.targetScale+t.offset.x,y:this.sourceTranslation.y+i.y*this.targetScale+t.offset.y},0===t.animation.duration?void 0!=this.lockedOnNodeId?(this.viewFunction=this._lockedRedraw.bind(this),this.body.emitter.on("initRedraw",this.viewFunction)):(this.body.view.scale=this.targetScale,this.body.view.translation=this.targetTranslation,this.body.emitter.emit("_requestRedraw")):(this.animationSpeed=1/(60*t.animation.duration*.001)||1/60,this.animationEasingFunction=t.animation.easingFunction,this.viewFunction=this._transitionRedraw.bind(this),this.body.emitter.on("initRedraw",this.viewFunction),this.body.emitter.emit("_startRendering"))}}},{key:"_lockedRedraw",value:function(){var t={x:this.body.nodes[this.lockedOnNodeId].x,y:this.body.nodes[this.lockedOnNodeId].y},e=this.canvas.DOMtoCanvas({x:.5*this.canvas.frame.canvas.clientWidth,y:.5*this.canvas.frame.canvas.clientHeight}),i={x:e.x-t.x,y:e.y-t.y},o=this.body.view.translation,n={x:o.x+i.x*this.body.view.scale+this.lockedOnNodeOffset.x,y:o.y+i.y*this.body.view.scale+this.lockedOnNodeOffset.y};this.body.view.translation=n}},{key:"releaseNode",value:function(){void 0!==this.lockedOnNodeId&&void 0!==this.viewFunction&&(this.body.emitter.off("initRedraw",this.viewFunction),this.lockedOnNodeId=void 0,this.lockedOnNodeOffset=void 0)}},{key:"_transitionRedraw",value:function(){var t=arguments.length<=0||void 0===arguments[0]?!1:arguments[0];this.easingTime+=this.animationSpeed,this.easingTime=t===!0?1:this.easingTime;var e=h.easingFunctions[this.animationEasingFunction](this.easingTime);this.body.view.scale=this.sourceScale+(this.targetScale-this.sourceScale)*e,this.body.view.translation={x:this.sourceTranslation.x+(this.targetTranslation.x-this.sourceTranslation.x)*e,y:this.sourceTranslation.y+(this.targetTranslation.y-this.sourceTranslation.y)*e},this.easingTime>=1&&(this.body.emitter.off("initRedraw",this.viewFunction),this.easingTime=0,void 0!=this.lockedOnNodeId&&(this.viewFunction=this._lockedRedraw.bind(this),this.body.emitter.on("initRedraw",this.viewFunction)),this.body.emitter.emit("animationFinished"))}},{key:"getScale",value:function(){return this.body.view.scale}},{key:"getViewPosition",value:function(){return this.canvas.DOMtoCanvas({x:.5*this.canvas.frame.canvas.clientWidth,y:.5*this.canvas.frame.canvas.clientHeight})}}]),t}();e["default"]=d,t.exports=e["default"]},function(t,e,i){function o(t){return t&&t.__esModule?t:{"default":t}}function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var s=function(){ +function t(t,e){for(var i=0;i50&&(this.drag.pointer=this.getPointer(t.center),this.drag.pinched=!1,this.pinch.scale=this.body.view.scale,this.touchTime=(new Date).valueOf())}},{key:"onTap",value:function(t){var e=this.getPointer(t.center),i=this.selectionHandler.options.multiselect&&(t.changedPointers[0].ctrlKey||t.changedPointers[0].metaKey);this.checkSelectionChanges(e,t,i),this.selectionHandler._generateClickEvent("click",t,e)}},{key:"onDoubleTap",value:function(t){var e=this.getPointer(t.center);this.selectionHandler._generateClickEvent("doubleClick",t,e)}},{key:"onHold",value:function(t){var e=this.getPointer(t.center),i=this.selectionHandler.options.multiselect;this.checkSelectionChanges(e,t,i),this.selectionHandler._generateClickEvent("click",t,e),this.selectionHandler._generateClickEvent("hold",t,e)}},{key:"onRelease",value:function(t){if((new Date).valueOf()-this.touchTime>10){var e=this.getPointer(t.center);this.selectionHandler._generateClickEvent("release",t,e),this.touchTime=(new Date).valueOf()}}},{key:"onContext",value:function(t){var e=this.getPointer({x:t.clientX,y:t.clientY});this.selectionHandler._generateClickEvent("oncontext",t,e)}},{key:"checkSelectionChanges",value:function(t,e){var i=arguments.length<=2||void 0===arguments[2]?!1:arguments[2],o=this.selectionHandler._getSelectedEdgeCount(),n=this.selectionHandler._getSelectedNodeCount(),s=this.selectionHandler.getSelection(),r=void 0;r=i===!0?this.selectionHandler.selectAdditionalOnPoint(t):this.selectionHandler.selectOnPoint(t);var a=this.selectionHandler._getSelectedEdgeCount(),h=this.selectionHandler._getSelectedNodeCount(),d=this.selectionHandler.getSelection(),l=this._determineIfDifferent(s,d),u=l.nodesChanges,c=l.edgesChanges,p=!1;h-n>0?(this.selectionHandler._generateClickEvent("selectNode",e,t),r=!0,p=!0):0>h-n?(this.selectionHandler._generateClickEvent("deselectNode",e,t,s),r=!0):h===n&&u===!0&&(this.selectionHandler._generateClickEvent("deselectNode",e,t,s),this.selectionHandler._generateClickEvent("selectNode",e,t),p=!0,r=!0),a-o>0&&p===!1?(this.selectionHandler._generateClickEvent("selectEdge",e,t),r=!0):0>a-o?(this.selectionHandler._generateClickEvent("deselectEdge",e,t,s),r=!0):a===o&&c===!0&&(this.selectionHandler._generateClickEvent("deselectEdge",e,t,s),this.selectionHandler._generateClickEvent("selectEdge",e,t),r=!0),r===!0&&this.selectionHandler._generateClickEvent("select",e,t)}},{key:"_determineIfDifferent",value:function(t,e){for(var i=!1,o=!1,n=0;nt&&(t=1e-5),t>10&&(t=10);var o=void 0;void 0!==this.drag&&this.drag.dragging===!0&&(o=this.canvas.DOMtoCanvas(this.drag.pointer));var n=this.body.view.translation,s=t/i,r=(1-s)*e.x+n.x*s,a=(1-s)*e.y+n.y*s;if(this.body.view.scale=t,this.body.view.translation={x:r,y:a},void 0!=o){var h=this.canvas.canvasToDOM(o);this.drag.pointer.x=h.x,this.drag.pointer.y=h.y}this.body.emitter.emit("_requestRedraw"),t>i?this.body.emitter.emit("zoom",{direction:"+",scale:this.body.view.scale}):this.body.emitter.emit("zoom",{direction:"-",scale:this.body.view.scale})}}},{key:"onMouseWheel",value:function(t){if(this.options.zoomView===!0){var e=0;if(t.wheelDelta?e=t.wheelDelta/120:t.detail&&(e=-t.detail/3),0!==e){var i=this.body.view.scale,o=e/10;0>e&&(o/=1-o),i*=1+o;var n=this.getPointer({x:t.clientX,y:t.clientY});this.zoom(i,n)}t.preventDefault()}}},{key:"onMouseMove",value:function(t){var e=this,i=this.getPointer({x:t.clientX,y:t.clientY}),o=!1;if(void 0!==this.popup&&(this.popup.hidden===!1&&this._checkHidePopup(i),this.popup.hidden===!1&&(o=!0,this.popup.setPosition(i.x+3,i.y-5),this.popup.show())),this.options.keyboard.bindToWindow===!1&&this.options.keyboard.enabled===!0&&this.canvas.frame.focus(),o===!1&&(void 0!==this.popupTimer&&(clearInterval(this.popupTimer),this.popupTimer=void 0),this.drag.dragging||(this.popupTimer=setTimeout(function(){return e._checkShowPopup(i)},this.options.tooltipDelay))),this.options.hover===!0){var n=this.selectionHandler.getNodeAt(i);void 0===n&&(n=this.selectionHandler.getEdgeAt(i)),this.selectionHandler.hoverObject(n)}}},{key:"_checkShowPopup",value:function(t){var e=this.canvas._XconvertDOMtoCanvas(t.x),i=this.canvas._YconvertDOMtoCanvas(t.y),o={left:e,top:i,right:e,bottom:i},n=void 0===this.popupObj?void 0:this.popupObj.id,s=!1,r="node";if(void 0===this.popupObj){for(var a=this.body.nodeIndices,h=this.body.nodes,l=void 0,u=[],c=0;c0&&(this.popupObj=h[u[u.length-1]],s=!0)}if(void 0===this.popupObj&&s===!1){for(var p=this.body.edgeIndices,f=this.body.edges,m=void 0,v=[],c=0;c0&&(this.popupObj=f[v[v.length-1]],r="edge")}void 0!==this.popupObj?this.popupObj.id!==n&&(void 0===this.popup&&(this.popup=new d["default"](this.canvas.frame)),this.popup.popupTargetType=r,this.popup.popupTargetId=this.popupObj.id,this.popup.setPosition(t.x+3,t.y-5),this.popup.setText(this.popupObj.getTitle()),this.popup.show(),this.body.emitter.emit("showPopup",this.popupObj.id)):void 0!==this.popup&&(this.popup.hide(),this.body.emitter.emit("hidePopup"))}},{key:"_checkHidePopup",value:function(t){var e=this.selectionHandler._pointerToPositionObject(t),i=!1;if("node"===this.popup.popupTargetType){if(void 0!==this.body.nodes[this.popup.popupTargetId]&&(i=this.body.nodes[this.popup.popupTargetId].isOverlappingWith(e),i===!0)){var o=this.selectionHandler.getNodeAt(t);i=o.id===this.popup.popupTargetId}}else void 0===this.selectionHandler.getNodeAt(t)&&void 0!==this.body.edges[this.popup.popupTargetId]&&(i=this.body.edges[this.popup.popupTargetId].isOverlappingWith(e));i===!1&&(this.popupObj=void 0,this.popup.hide(),this.body.emitter.emit("hidePopup"))}}]),t}();e["default"]=u,t.exports=e["default"]},function(t,e,i){function o(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var n=function(){function t(t,e){for(var i=0;i700&&(this.body.emitter.emit("fit",{duration:700}),this.touchTime=(new Date).valueOf())}},{key:"_stopMovement",value:function(){for(var t in this.boundFunctions)this.boundFunctions.hasOwnProperty(t)&&(this.body.emitter.off("initRedraw",this.boundFunctions[t]),this.body.emitter.emit("_stopRendering"));this.boundFunctions={}}},{key:"_moveUp",value:function(){this.body.view.translation.y+=this.options.keyboard.speed.y}},{key:"_moveDown",value:function(){this.body.view.translation.y-=this.options.keyboard.speed.y}},{key:"_moveLeft",value:function(){this.body.view.translation.x+=this.options.keyboard.speed.x}},{key:"_moveRight",value:function(){this.body.view.translation.x-=this.options.keyboard.speed.x}},{key:"_zoomIn",value:function(){this.body.view.scale*=1+this.options.keyboard.speed.zoom,this.body.emitter.emit("zoom",{direction:"+",scale:this.body.view.scale})}},{key:"_zoomOut",value:function(){this.body.view.scale/=1+this.options.keyboard.speed.zoom,this.body.emitter.emit("zoom",{direction:"-",scale:this.body.view.scale})}},{key:"configureKeyboardBindings",value:function(){var t=this;void 0!==this.keycharm&&this.keycharm.destroy(),this.options.keyboard.enabled===!0&&(this.options.keyboard.bindToWindow===!0?this.keycharm=a({container:window,preventDefault:!0}):this.keycharm=a({container:this.canvas.frame,preventDefault:!0}),this.keycharm.reset(),this.activated===!0&&(this.keycharm.bind("up",function(){t.bindToRedraw("_moveUp")},"keydown"),this.keycharm.bind("down",function(){t.bindToRedraw("_moveDown")},"keydown"),this.keycharm.bind("left",function(){t.bindToRedraw("_moveLeft")},"keydown"),this.keycharm.bind("right",function(){t.bindToRedraw("_moveRight")},"keydown"),this.keycharm.bind("=",function(){t.bindToRedraw("_zoomIn")},"keydown"),this.keycharm.bind("num+",function(){t.bindToRedraw("_zoomIn")},"keydown"),this.keycharm.bind("num-",function(){t.bindToRedraw("_zoomOut")},"keydown"),this.keycharm.bind("-",function(){t.bindToRedraw("_zoomOut")},"keydown"),this.keycharm.bind("[",function(){t.bindToRedraw("_zoomOut")},"keydown"),this.keycharm.bind("]",function(){t.bindToRedraw("_zoomIn")},"keydown"),this.keycharm.bind("pageup",function(){t.bindToRedraw("_zoomIn")},"keydown"),this.keycharm.bind("pagedown",function(){t.bindToRedraw("_zoomOut")},"keydown"),this.keycharm.bind("up",function(){t.unbindFromRedraw("_moveUp")},"keyup"),this.keycharm.bind("down",function(){t.unbindFromRedraw("_moveDown")},"keyup"),this.keycharm.bind("left",function(){t.unbindFromRedraw("_moveLeft")},"keyup"),this.keycharm.bind("right",function(){t.unbindFromRedraw("_moveRight")},"keyup"),this.keycharm.bind("=",function(){t.unbindFromRedraw("_zoomIn")},"keyup"),this.keycharm.bind("num+",function(){t.unbindFromRedraw("_zoomIn")},"keyup"),this.keycharm.bind("num-",function(){t.unbindFromRedraw("_zoomOut")},"keyup"),this.keycharm.bind("-",function(){t.unbindFromRedraw("_zoomOut")},"keyup"),this.keycharm.bind("[",function(){t.unbindFromRedraw("_zoomOut")},"keyup"),this.keycharm.bind("]",function(){t.unbindFromRedraw("_zoomIn")},"keyup"),this.keycharm.bind("pageup",function(){t.unbindFromRedraw("_zoomIn")},"keyup"),this.keycharm.bind("pagedown",function(){t.unbindFromRedraw("_zoomOut")},"keyup")))}}]),t}();e["default"]=h,t.exports=e["default"]},function(t,e){function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var o=function(){function t(t,e){for(var i=0;io&&(s=o-e-this.padding),sn&&(r=n-i-this.padding),r0?e===!0?this.body.nodes[o[o.length-1]]:o[o.length-1]:void 0}},{key:"_getEdgesOverlappingWith",value:function(t,e){for(var i=this.body.edges,o=0;o0?e===!0?this.body.edges[o[o.length-1]]:o[o.length-1]:void 0}},{key:"_addToSelection",value:function(t){t instanceof s?this.selectionObj.nodes[t.id]=t:this.selectionObj.edges[t.id]=t}},{key:"_addToHover",value:function(t){t instanceof s?this.hoverObj.nodes[t.id]=t:this.hoverObj.edges[t.id]=t}},{key:"_removeFromSelection",value:function(t){t instanceof s?(delete this.selectionObj.nodes[t.id],this._unselectConnectedEdges(t)):delete this.selectionObj.edges[t.id]}},{key:"unselectAll",value:function(){for(var t in this.selectionObj.nodes)this.selectionObj.nodes.hasOwnProperty(t)&&this.selectionObj.nodes[t].unselect();for(var e in this.selectionObj.edges)this.selectionObj.edges.hasOwnProperty(e)&&this.selectionObj.edges[e].unselect();this.selectionObj={nodes:{},edges:{}}}},{key:"_getSelectedNodeCount",value:function(){var t=0;for(var e in this.selectionObj.nodes)this.selectionObj.nodes.hasOwnProperty(e)&&(t+=1);return t}},{key:"_getSelectedNode",value:function(){for(var t in this.selectionObj.nodes)if(this.selectionObj.nodes.hasOwnProperty(t))return this.selectionObj.nodes[t]}},{key:"_getSelectedEdge",value:function(){for(var t in this.selectionObj.edges)if(this.selectionObj.edges.hasOwnProperty(t))return this.selectionObj.edges[t]}},{key:"_getSelectedEdgeCount",value:function(){var t=0;for(var e in this.selectionObj.edges)this.selectionObj.edges.hasOwnProperty(e)&&(t+=1);return t}},{key:"_getSelectedObjectCount",value:function(){var t=0;for(var e in this.selectionObj.nodes)this.selectionObj.nodes.hasOwnProperty(e)&&(t+=1);for(var i in this.selectionObj.edges)this.selectionObj.edges.hasOwnProperty(i)&&(t+=1);return t}},{key:"_selectionIsEmpty",value:function(){for(var t in this.selectionObj.nodes)if(this.selectionObj.nodes.hasOwnProperty(t))return!1;for(var e in this.selectionObj.edges)if(this.selectionObj.edges.hasOwnProperty(e))return!1;return!0}},{key:"_clusterInSelection",value:function(){for(var t in this.selectionObj.nodes)if(this.selectionObj.nodes.hasOwnProperty(t)&&this.selectionObj.nodes[t].clusterSize>1)return!0;return!1}},{key:"_selectConnectedEdges",value:function(t){for(var e=0;e0&&(this.options.hierarchical.levelSeparation*=-1):this.options.hierarchical.levelSeparation<0&&(this.options.hierarchical.levelSeparation*=-1),this.body.emitter.emit("_resetHierarchicalLayout"),this.adaptAllOptionsForHierarchicalLayout(e);if(i===!0)return this.body.emitter.emit("refresh"),d.deepExtend(e,this.optionsBackup)}return e}},{key:"adaptAllOptionsForHierarchicalLayout",value:function(t){if(this.options.hierarchical.enabled===!0){void 0===t.physics||t.physics===!0?(t.physics={enabled:void 0===this.optionsBackup.physics.enabled?!0:this.optionsBackup.physics.enabled,solver:"hierarchicalRepulsion"},this.optionsBackup.physics.enabled=void 0===this.optionsBackup.physics.enabled?!0:this.optionsBackup.physics.enabled,this.optionsBackup.physics.solver=this.optionsBackup.physics.solver||"barnesHut"):"object"==typeof t.physics?(this.optionsBackup.physics.enabled=void 0===t.physics.enabled?!0:t.physics.enabled,this.optionsBackup.physics.solver=t.physics.solver||"barnesHut",t.physics.solver="hierarchicalRepulsion"):t.physics!==!1&&(this.optionsBackup.physics.solver="barnesHut",t.physics={solver:"hierarchicalRepulsion"});var e="horizontal";("RL"===this.options.hierarchical.direction||"LR"===this.options.hierarchical.direction)&&(e="vertical"),void 0===t.edges?(this.optionsBackup.edges={smooth:{enabled:!0,type:"dynamic"}},t.edges={smooth:!1}):void 0===t.edges.smooth?(this.optionsBackup.edges={smooth:{enabled:!0,type:"dynamic"}},t.edges.smooth=!1):"boolean"==typeof t.edges.smooth?(this.optionsBackup.edges={smooth:t.edges.smooth},t.edges.smooth={enabled:t.edges.smooth,type:e}):(void 0!==t.edges.smooth.type&&"dynamic"!==t.edges.smooth.type&&(e=t.edges.smooth.type),this.optionsBackup.edges={smooth:void 0===t.edges.smooth.enabled?!0:t.edges.smooth.enabled,type:void 0===t.edges.smooth.type?"dynamic":t.edges.smooth.type,roundness:void 0===t.edges.smooth.roundness?.5:t.edges.smooth.roundness,forceDirection:void 0===t.edges.smooth.forceDirection?!1:t.edges.smooth.forceDirection},t.edges.smooth={enabled:void 0===t.edges.smooth.enabled?!0:t.edges.smooth.enabled,type:e,roundness:void 0===t.edges.smooth.roundness?.5:t.edges.smooth.roundness,forceDirection:void 0===t.edges.smooth.forceDirection?!1:t.edges.smooth.forceDirection}),this.body.emitter.emit("_forceDisableDynamicCurves",e)}return t}},{key:"seededRandom",value:function(){var t=1e4*Math.sin(this.randomSeed++);return t-Math.floor(t)}},{key:"positionInitially",value:function(t){ +if(this.options.hierarchical.enabled!==!0){this.randomSeed=this.initialRandomSeed;for(var e=0;es){for(var r=this.body.nodeIndices.length;this.body.nodeIndices.length>s;){n+=1;var a=this.body.nodeIndices.length;n%3===0?this.body.modules.clustering.clusterBridges():this.body.modules.clustering.clusterOutliers();var h=this.body.nodeIndices.length;if(a==h&&n%3!==0||n>o)return this._declusterAll(),this.body.emitter.emit("_layoutFailed"),void console.info("This network could not be positioned by this version of the improved layout algorithm. Please disable improvedLayout for better performance.")}this.body.modules.kamadaKawai.setOptions({springLength:Math.max(150,2*r)})}this.body.modules.kamadaKawai.solve(this.body.nodeIndices,this.body.edgeIndices,!0),this._shiftToCenter();for(var d=70,e=0;e0){var t=void 0,e=void 0,i=!1,o=!0,n=!1;this.hierarchicalLevels={},this.lastNodeOnLevel={},this.hierarchicalParents={},this.hierarchicalChildren={},this.hierarchicalTrees={},this.treeIndex=-1,this.distributionOrdering={},this.distributionIndex={},this.distributionOrderingPresence={};for(e in this.body.nodes)this.body.nodes.hasOwnProperty(e)&&(t=this.body.nodes[e],void 0===t.options.x&&void 0===t.options.y&&(o=!1),void 0!==t.options.level?(i=!0,this.hierarchicalLevels[e]=t.options.level):n=!0);if(n===!0&&i===!0)throw new Error("To use the hierarchical layout, nodes require either no predefined levels or levels have to be defined for all nodes.");n===!0&&("hubsize"===this.options.hierarchical.sortMethod?this._determineLevelsByHubsize():"directed"===this.options.hierarchical.sortMethod?this._determineLevelsDirected():"custom"===this.options.hierarchical.sortMethod&&this._determineLevelsCustomCallback());for(var s in this.body.nodes)this.body.nodes.hasOwnProperty(s)&&void 0===this.hierarchicalLevels[s]&&(this.hierarchicalLevels[s]=0);var r=this._getDistribution();this._generateMap(),this._placeNodesByHierarchy(r),this._condenseHierarchy(),this._shiftToCenter()}}},{key:"_condenseHierarchy",value:function(){var t=this,e=!1,i={},o=function(){for(var e=a(),i=0;i0)for(var n=0;n=l&&(r=Math.min(u,r),a=Math.max(u,a))}return[r,a,o,n]},l=function _(e){var i=t.hierarchicalLevels[e];if(t.hierarchicalParents[e]){var o=t.hierarchicalParents[e].children;if(o.length>0)for(var n=0;n1)for(var a=0;at.options.hierarchical.nodeSpacing){var c={};c[i.id]=!0;var p={};p[o.id]=!0,h(i,c),h(o,p);var f=u(i,o),m=d(c,f),v=s(m,4),g=(v[0],v[1]),y=(v[2],v[3],d(p,f)),b=s(y,4),_=b[0],w=(b[1],b[2]),x=(b[3],Math.abs(g-_));if(x>t.options.hierarchical.nodeSpacing){var k=g-_+t.options.hierarchical.nodeSpacing;k<-w+t.options.hierarchical.nodeSpacing&&(k=-w+t.options.hierarchical.nodeSpacing),0>k&&(t._shiftBlock(o.id,k),e=!0,n===!0&&t._centerParent(o))}}},m=function(o,n){for(var r=n.id,a=n.edges,l=t.hierarchicalLevels[n.id],u=t.options.hierarchical.levelSeparation*t.options.hierarchical.levelSeparation,c={},p=[],f=0;fr;r++){var a=g(o,i),h=y(o,i),d=40,l=Math.max(-d,Math.min(d,Math.round(a/h)));if(o-=l,void 0!==s[o])break;s[o]=r}return o},_=function(o){var r=t._getPositionForHierarchy(n);if(void 0===i[n.id]){var a={};a[n.id]=!0,h(n,a),i[n.id]=a}var l=d(i[n.id]),u=s(l,4),c=(u[0],u[1],u[2]),p=u[3],f=o-r,m=0;f>0?m=Math.min(f,p-t.options.hierarchical.nodeSpacing):0>f&&(m=-Math.min(-f,c-t.options.hierarchical.nodeSpacing)),0!=m&&(t._shiftBlock(n.id,m),e=!0)},w=function(i){var o=t._getPositionForHierarchy(n),r=t._getSpaceAroundNode(n),a=s(r,2),h=a[0],d=a[1],l=i-o,u=o;l>0?u=Math.min(o+(d-t.options.hierarchical.nodeSpacing),i):0>l&&(u=Math.max(o-(h-t.options.hierarchical.nodeSpacing),i)),u!==o&&(t._setPositionForHierarchy(n,u,void 0,!0),e=!0)},x=b(o,p);_(x),x=b(o,a),w(x)},v=function(i){var o=Object.keys(t.distributionOrdering);o=o.reverse();for(var n=0;i>n;n++){e=!1;for(var s=0;sn&&(e=!1,p(f,o,!0),e===!0);n++);},y=function(){for(var e in t.body.nodes)t.body.nodes.hasOwnProperty(e)&&t._centerParent(t.body.nodes[e])};this.options.hierarchical.blockShifting===!0&&(g(5),y()),this.options.hierarchical.edgeMinimization===!0&&v(20),o()}},{key:"_getSpaceAroundNode",value:function(t,e){var i=!0;void 0===e&&(i=!1);var o=this.hierarchicalLevels[t.id];if(void 0!==o){var n=this.distributionIndex[t.id],s=this._getPositionForHierarchy(t),r=1e9,a=1e9;if(0!==n){var h=this.distributionOrdering[o][n-1];if(i===!0&&void 0===e[h.id]||i===!1){var d=this._getPositionForHierarchy(h);r=s-d}}if(n!=this.distributionOrdering[o].length-1){var l=this.distributionOrdering[o][n+1];if(i===!0&&void 0===e[l.id]||i===!1){var u=this._getPositionForHierarchy(l);a=Math.min(a,u-s)}}return[r,a]}return[0,0]}},{key:"_centerParent",value:function(t){if(this.hierarchicalChildren[t.id])for(var e=this.hierarchicalChildren[t.id].parents,i=0;i0)for(var d=0;dg&&Math.abs(g)0&&Math.abs(g)0&&(e=this._getHubSize(),0!==e);)for(var o in this.body.nodes)if(this.body.nodes.hasOwnProperty(o)){var n=this.body.nodes[o];n.edges.length===e&&this._crawlNetwork(i,o)}}},{key:"_determineLevelsCustomCallback",value:function(){var t=this,e=1e5,i=function(t,e,i){},o=function(o,n,s){var r=t.hierarchicalLevels[o.id];void 0===r&&(t.hierarchicalLevels[o.id]=e);var a=i(h["default"].cloneOptions(o,"node"),h["default"].cloneOptions(n,"node"),h["default"].cloneOptions(s,"edge"));t.hierarchicalLevels[n.id]=t.hierarchicalLevels[o.id]+a};this._crawlNetwork(o),this._setMinLevelToZero()}},{key:"_determineLevelsDirected",value:function(){var t=this,e=1e4,i=function(i,o,n){var s=t.hierarchicalLevels[i.id];void 0===s&&(t.hierarchicalLevels[i.id]=e),n.toId==o.id?t.hierarchicalLevels[o.id]=t.hierarchicalLevels[i.id]+1:t.hierarchicalLevels[o.id]=t.hierarchicalLevels[i.id]-1};this._crawlNetwork(i),this._setMinLevelToZero()}},{key:"_setMinLevelToZero",value:function(){var t=1e9;for(var e in this.body.nodes)this.body.nodes.hasOwnProperty(e)&&void 0!==this.hierarchicalLevels[e]&&(t=Math.min(this.hierarchicalLevels[e],t));for(var e in this.body.nodes)this.body.nodes.hasOwnProperty(e)&&void 0!==this.hierarchicalLevels[e]&&(this.hierarchicalLevels[e]-=t)}},{key:"_generateMap",value:function(){var t=this,e=function(e,i){if(t.hierarchicalLevels[i.id]>t.hierarchicalLevels[e.id]){var o=e.id,n=i.id;void 0===t.hierarchicalParents[o]&&(t.hierarchicalParents[o]={children:[],amount:0}),t.hierarchicalParents[o].children.push(n),void 0===t.hierarchicalChildren[n]&&(t.hierarchicalChildren[n]={parents:[],amount:0}),t.hierarchicalChildren[n].parents.push(o)}};this._crawlNetwork(e)}},{key:"_crawlNetwork",value:function(t,e){void 0===t&&(t=function(){});var i={},o=function r(e){if(void 0===i[e.id]){i[e.id]=!0;for(var o=void 0,n=0;ne&&void 0===this.positionedNodes[n.id]))return;var r=void 0;if(r=0===o?this._getPositionForHierarchy(this.body.nodes[t]):this._getPositionForHierarchy(i[o-1])+this.options.hierarchical.nodeSpacing,this._setPositionForHierarchy(n,r,s),void 0!==this.lastNodeOnLevel[s]){var a=this._getPositionForHierarchy(this.body.nodes[this.lastNodeOnLevel[s]]);if(r-a1&&("UD"===this.options.hierarchical.direction||"DU"===this.options.hierarchical.direction?t.sort(function(t,e){return t.x-e.x}):t.sort(function(t,e){return t.y-e.y}))}}]),t}();e["default"]=l,t.exports=e["default"]},function(t,e,i){function o(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var n=function(){function t(t,e){for(var i=0;i0&&this.options.deleteNode!==!1?(n===!0&&this._createSeperator(4),this._createDeleteButton(o)):0===t&&this.options.deleteEdge!==!1&&(n===!0&&this._createSeperator(4),this._createDeleteButton(o))),this._bindHammerToDiv(this.closeDiv,this.toggleEditMode.bind(this)),this._temporaryBindEvent("select",this.showManipulatorToolbar.bind(this))}this.body.emitter.emit("_redraw")}},{key:"addNodeMode",value:function(){if(this.editMode!==!0&&this.enableEditMode(),this._clean(),this.inMode="addNode",this.guiEnabled===!0){var t=this.options.locales[this.options.locale];this.manipulationDOM={},this._createBackButton(t),this._createSeperator(),this._createDescription(t.addDescription||this.options.locales.en.addDescription),this._bindHammerToDiv(this.closeDiv,this.toggleEditMode.bind(this))}this._temporaryBindEvent("click",this._performAddNode.bind(this))}},{key:"editNode",value:function(){var t=this;this.editMode!==!0&&this.enableEditMode(),this._clean();var e=this.selectionHandler._getSelectedNode();if(void 0!==e){if(this.inMode="editNode","function"!=typeof this.options.editNode)throw new Error("No function has been configured to handle the editing of nodes.");if(e.isCluster!==!0){var i=s.deepExtend({},e.options,!0);if(i.x=e.x,i.y=e.y,2!==this.options.editNode.length)throw new Error("The function for edit does not support two arguments (data, callback)");this.options.editNode(i,function(e){null!==e&&void 0!==e&&"editNode"===t.inMode&&t.body.data.nodes.getDataSet().update(e),t.showManipulatorToolbar()})}else alert(this.options.locales[this.options.locale].editClusterError||this.options.locales.en.editClusterError)}else this.showManipulatorToolbar()}},{key:"addEdgeMode",value:function(){if(this.editMode!==!0&&this.enableEditMode(),this._clean(),this.inMode="addEdge",this.guiEnabled===!0){var t=this.options.locales[this.options.locale];this.manipulationDOM={},this._createBackButton(t),this._createSeperator(),this._createDescription(t.edgeDescription||this.options.locales.en.edgeDescription),this._bindHammerToDiv(this.closeDiv,this.toggleEditMode.bind(this))}this._temporaryBindUI("onTouch",this._handleConnect.bind(this)),this._temporaryBindUI("onDragEnd",this._finishConnect.bind(this)),this._temporaryBindUI("onDrag",this._dragControlNode.bind(this)),this._temporaryBindUI("onRelease",this._finishConnect.bind(this)),this._temporaryBindUI("onDragStart",function(){}),this._temporaryBindUI("onHold",function(){})}},{key:"editEdgeMode",value:function(){var t=this;if(this.editMode!==!0&&this.enableEditMode(),this._clean(),this.inMode="editEdge",this.guiEnabled===!0){var e=this.options.locales[this.options.locale];this.manipulationDOM={},this._createBackButton(e),this._createSeperator(),this._createDescription(e.editEdgeDescription||this.options.locales.en.editEdgeDescription),this._bindHammerToDiv(this.closeDiv,this.toggleEditMode.bind(this))}this.edgeBeingEditedId=this.selectionHandler.getSelectedEdges()[0],void 0!==this.edgeBeingEditedId?!function(){var e=t.body.edges[t.edgeBeingEditedId],i=t._getNewTargetNode(e.from.x,e.from.y),o=t._getNewTargetNode(e.to.x,e.to.y);t.temporaryIds.nodes.push(i.id),t.temporaryIds.nodes.push(o.id),t.body.nodes[i.id]=i,t.body.nodeIndices.push(i.id),t.body.nodes[o.id]=o,t.body.nodeIndices.push(o.id),t._temporaryBindUI("onTouch",t._controlNodeTouch.bind(t)),t._temporaryBindUI("onTap",function(){}),t._temporaryBindUI("onHold",function(){}),t._temporaryBindUI("onDragStart",t._controlNodeDragStart.bind(t)),t._temporaryBindUI("onDrag",t._controlNodeDrag.bind(t)),t._temporaryBindUI("onDragEnd",t._controlNodeDragEnd.bind(t)),t._temporaryBindUI("onMouseMove",function(){}),t._temporaryBindEvent("beforeDrawing",function(t){var n=e.edgeType.findBorderPositions(t);i.selected===!1&&(i.x=n.from.x,i.y=n.from.y),o.selected===!1&&(o.x=n.to.x,o.y=n.to.y)}),t.body.emitter.emit("_redraw")}():this.showManipulatorToolbar()}},{key:"deleteSelected",value:function(){var t=this;this.editMode!==!0&&this.enableEditMode(),this._clean(),this.inMode="delete";var e=this.selectionHandler.getSelectedNodes(),i=this.selectionHandler.getSelectedEdges(),o=void 0;if(e.length>0){for(var n=0;n0&&"function"==typeof this.options.deleteEdge&&(o=this.options.deleteEdge);if("function"==typeof o){var s={nodes:e,edges:i};if(2!==o.length)throw new Error("The function for delete does not support two arguments (data, callback)");o(s,function(e){null!==e&&void 0!==e&&"delete"===t.inMode?(t.body.data.edges.getDataSet().remove(e.edges),t.body.data.nodes.getDataSet().remove(e.nodes),t.body.emitter.emit("startSimulation"),t.showManipulatorToolbar()):(t.body.emitter.emit("startSimulation"),t.showManipulatorToolbar())})}else this.body.data.edges.getDataSet().remove(i),this.body.data.nodes.getDataSet().remove(e),this.body.emitter.emit("startSimulation"),this.showManipulatorToolbar()}},{key:"_setup",value:function(){this.options.enabled===!0?(this.guiEnabled=!0,this._createWrappers(),this.editMode===!1?this._createEditButton():this.showManipulatorToolbar()):(this._removeManipulationDOM(),this.guiEnabled=!1)}},{key:"_createWrappers",value:function(){void 0===this.manipulationDiv&&(this.manipulationDiv=document.createElement("div"),this.manipulationDiv.className="vis-manipulation",this.editMode===!0?this.manipulationDiv.style.display="block":this.manipulationDiv.style.display="none",this.canvas.frame.appendChild(this.manipulationDiv)),void 0===this.editModeDiv&&(this.editModeDiv=document.createElement("div"),this.editModeDiv.className="vis-edit-mode",this.editMode===!0?this.editModeDiv.style.display="none":this.editModeDiv.style.display="block",this.canvas.frame.appendChild(this.editModeDiv)),void 0===this.closeDiv&&(this.closeDiv=document.createElement("div"),this.closeDiv.className="vis-close",this.closeDiv.style.display=this.manipulationDiv.style.display,this.canvas.frame.appendChild(this.closeDiv))}},{key:"_getNewTargetNode",value:function(t,e){var i=s.deepExtend({},this.options.controlNodeStyle);i.id="targetNode"+s.randomUUID(),i.hidden=!1,i.physics=!1,i.x=t,i.y=e;var o=this.body.functions.createNode(i);return o.shape.boundingBox={left:t,right:t,top:e,bottom:e},o}},{key:"_createEditButton",value:function(){this._clean(),this.manipulationDOM={},s.recursiveDOMDelete(this.editModeDiv);var t=this.options.locales[this.options.locale],e=this._createButton("editMode","vis-button vis-edit vis-edit-mode",t.edit||this.options.locales.en.edit);this.editModeDiv.appendChild(e),this._bindHammerToDiv(e,this.toggleEditMode.bind(this))}},{key:"_clean",value:function(){this.inMode=!1,this.guiEnabled===!0&&(s.recursiveDOMDelete(this.editModeDiv),s.recursiveDOMDelete(this.manipulationDiv),this._cleanManipulatorHammers()),this._cleanupTemporaryNodesAndEdges(),this._unbindTemporaryUIs(),this._unbindTemporaryEvents(),this.body.emitter.emit("restorePhysics")}},{key:"_cleanManipulatorHammers",value:function(){if(0!=this.manipulationHammers.length){for(var t=0;t=0;r--)if(n[r]!==this.selectedControlNode.id){s=this.body.nodes[n[r]];break}if(void 0!==s&&void 0!==this.selectedControlNode)if(s.isCluster===!0)alert(this.options.locales[this.options.locale].createEdgeError||this.options.locales.en.createEdgeError);else{var a=this.body.nodes[this.temporaryIds.nodes[0]];this.selectedControlNode.id===a.id?this._performEditEdge(s.id,o.to.id):this._performEditEdge(o.from.id,s.id)}else o.updateEdgeType(),this.body.emitter.emit("restorePhysics");this.body.emitter.emit("_redraw")}}},{key:"_handleConnect",value:function(t){if((new Date).valueOf()-this.touchTime>100){this.lastTouch=this.body.functions.getPointer(t.center),this.lastTouch.translation=s.extend({},this.body.view.translation);var e=this.lastTouch,i=this.selectionHandler.getNodeAt(e);if(void 0!==i)if(i.isCluster===!0)alert(this.options.locales[this.options.locale].createEdgeError||this.options.locales.en.createEdgeError);else{var o=this._getNewTargetNode(i.x,i.y);this.body.nodes[o.id]=o,this.body.nodeIndices.push(o.id);var n=this.body.functions.createEdge({id:"connectionEdge"+s.randomUUID(),from:i.id,to:o.id,physics:!1,smooth:{enabled:!0,type:"continuous",roundness:.5}});this.body.edges[n.id]=n,this.body.edgeIndices.push(n.id),this.temporaryIds.nodes.push(o.id),this.temporaryIds.edges.push(n.id)}this.touchTime=(new Date).valueOf()}}},{key:"_dragControlNode",value:function(t){var e=this.body.functions.getPointer(t.center);if(void 0!==this.temporaryIds.nodes[0]){var i=this.body.nodes[this.temporaryIds.nodes[0]];i.x=this.canvas._XconvertDOMtoCanvas(e.x),i.y=this.canvas._YconvertDOMtoCanvas(e.y),this.body.emitter.emit("_redraw")}else{var o=e.x-this.lastTouch.x,n=e.y-this.lastTouch.y;this.body.view.translation={x:this.lastTouch.translation.x+o,y:this.lastTouch.translation.y+n}}}},{key:"_finishConnect",value:function(t){var e=this.body.functions.getPointer(t.center),i=this.selectionHandler._pointerToPositionObject(e),o=void 0;void 0!==this.temporaryIds.edges[0]&&(o=this.body.edges[this.temporaryIds.edges[0]].fromId);for(var n=this.selectionHandler._getAllNodesOverlappingWith(i),s=void 0,r=n.length-1;r>=0;r--)if(-1===this.temporaryIds.nodes.indexOf(n[r])){s=this.body.nodes[n[r]];break}this._cleanupTemporaryNodesAndEdges(),void 0!==s&&(s.isCluster===!0?alert(this.options.locales[this.options.locale].createEdgeError||this.options.locales.en.createEdgeError):void 0!==this.body.nodes[o]&&void 0!==this.body.nodes[s.id]&&this._performAddEdge(o,s.id)),this.body.emitter.emit("_redraw")}},{key:"_performAddNode",value:function(t){var e=this,i={id:s.randomUUID(),x:t.pointer.canvas.x,y:t.pointer.canvas.y,label:"new"};if("function"==typeof this.options.addNode){if(2!==this.options.addNode.length)throw new Error("The function for add does not support two arguments (data,callback)");this.options.addNode(i,function(t){null!==t&&void 0!==t&&"addNode"===e.inMode&&(e.body.data.nodes.getDataSet().add(t),e.showManipulatorToolbar())})}else this.body.data.nodes.getDataSet().add(i),this.showManipulatorToolbar()}},{key:"_performAddEdge",value:function(t,e){var i=this,o={from:t,to:e};if("function"==typeof this.options.addEdge){if(2!==this.options.addEdge.length)throw new Error("The function for connect does not support two arguments (data,callback)");this.options.addEdge(o,function(t){null!==t&&void 0!==t&&"addEdge"===i.inMode&&(i.body.data.edges.getDataSet().add(t),i.selectionHandler.unselectAll(),i.showManipulatorToolbar())})}else this.body.data.edges.getDataSet().add(o),this.selectionHandler.unselectAll(),this.showManipulatorToolbar()}},{key:"_performEditEdge",value:function(t,e){var i=this,o={id:this.edgeBeingEditedId,from:t,to:e};if("function"==typeof this.options.editEdge){if(2!==this.options.editEdge.length)throw new Error("The function for edit does not support two arguments (data, callback)");this.options.editEdge(o,function(t){null===t||void 0===t||"editEdge"!==i.inMode?(i.body.edges[o.id].updateEdgeType(),i.body.emitter.emit("_redraw")):(i.body.data.edges.getDataSet().update(t),i.selectionHandler.unselectAll(),i.showManipulatorToolbar())})}else this.body.data.edges.getDataSet().update(o),this.selectionHandler.unselectAll(),this.showManipulatorToolbar()}}]),t}();e["default"]=h,t.exports=e["default"]},function(t,e){Object.defineProperty(e,"__esModule",{value:!0});var i="string",o="boolean",n="number",s="array",r="object",a="dom",h="any",d={configure:{enabled:{"boolean":o},filter:{"boolean":o,string:i,array:s,"function":"function"},container:{dom:a},showButton:{"boolean":o},__type__:{object:r,"boolean":o,string:i,array:s,"function":"function"}},edges:{arrows:{to:{enabled:{"boolean":o},scaleFactor:{number:n},__type__:{object:r,"boolean":o}},middle:{enabled:{"boolean":o},scaleFactor:{number:n},__type__:{object:r,"boolean":o}},from:{enabled:{"boolean":o},scaleFactor:{number:n},__type__:{object:r,"boolean":o}},__type__:{string:["from","to","middle"],object:r}},arrowStrikethrough:{"boolean":o},color:{color:{string:i},highlight:{string:i},hover:{string:i},inherit:{string:["from","to","both"],"boolean":o},opacity:{number:n},__type__:{object:r,string:i}},dashes:{"boolean":o,array:s},font:{color:{string:i},size:{number:n},face:{string:i},background:{string:i},strokeWidth:{number:n},strokeColor:{string:i},align:{string:["horizontal","top","middle","bottom"]},__type__:{object:r,string:i}},hidden:{"boolean":o},hoverWidth:{"function":"function",number:n},label:{string:i,undefined:"undefined"},labelHighlightBold:{"boolean":o},length:{number:n,undefined:"undefined"},physics:{"boolean":o},scaling:{min:{number:n},max:{number:n},label:{enabled:{"boolean":o},min:{number:n},max:{number:n},maxVisible:{number:n},drawThreshold:{number:n},__type__:{object:r,"boolean":o}},customScalingFunction:{"function":"function"},__type__:{object:r}},selectionWidth:{"function":"function",number:n},selfReferenceSize:{number:n},shadow:{enabled:{"boolean":o},color:{string:i},size:{number:n},x:{number:n},y:{number:n},__type__:{object:r,"boolean":o}},smooth:{enabled:{"boolean":o},type:{string:["dynamic","continuous","discrete","diagonalCross","straightCross","horizontal","vertical","curvedCW","curvedCCW","cubicBezier"]},roundness:{number:n},forceDirection:{string:["horizontal","vertical","none"],"boolean":o},__type__:{object:r,"boolean":o}},title:{string:i,undefined:"undefined"},width:{number:n},value:{number:n,undefined:"undefined"},__type__:{object:r}},groups:{useDefaultGroups:{"boolean":o},__any__:"get from nodes, will be overwritten below",__type__:{object:r}},interaction:{dragNodes:{"boolean":o},dragView:{"boolean":o},hideEdgesOnDrag:{"boolean":o},hideNodesOnDrag:{"boolean":o},hover:{"boolean":o},keyboard:{enabled:{"boolean":o},speed:{x:{number:n},y:{number:n},zoom:{number:n},__type__:{object:r}},bindToWindow:{"boolean":o},__type__:{object:r,"boolean":o}},multiselect:{"boolean":o},navigationButtons:{"boolean":o},selectable:{"boolean":o},selectConnectedEdges:{"boolean":o},hoverConnectedEdges:{"boolean":o},tooltipDelay:{number:n},zoomView:{"boolean":o},__type__:{object:r}},layout:{randomSeed:{undefined:"undefined",number:n},improvedLayout:{"boolean":o},hierarchical:{enabled:{"boolean":o},levelSeparation:{number:n},nodeSpacing:{number:n},treeSpacing:{number:n},blockShifting:{"boolean":o},edgeMinimization:{"boolean":o},direction:{string:["UD","DU","LR","RL"]},sortMethod:{string:["hubsize","directed"]},__type__:{object:r,"boolean":o}},__type__:{object:r}},manipulation:{enabled:{"boolean":o},initiallyActive:{"boolean":o},addNode:{"boolean":o,"function":"function"},addEdge:{"boolean":o,"function":"function"},editNode:{"function":"function"},editEdge:{"boolean":o,"function":"function"},deleteNode:{"boolean":o,"function":"function"},deleteEdge:{"boolean":o,"function":"function"},controlNodeStyle:"get from nodes, will be overwritten below",__type__:{object:r,"boolean":o}},nodes:{borderWidth:{number:n},borderWidthSelected:{number:n,undefined:"undefined"},brokenImage:{string:i,undefined:"undefined"},color:{border:{string:i},background:{string:i},highlight:{border:{string:i},background:{string:i},__type__:{object:r,string:i}},hover:{border:{string:i},background:{string:i},__type__:{object:r,string:i}},__type__:{object:r,string:i}},fixed:{x:{"boolean":o},y:{"boolean":o},__type__:{object:r,"boolean":o}},font:{color:{string:i},size:{number:n},face:{string:i},background:{string:i},strokeWidth:{number:n},strokeColor:{string:i},__type__:{object:r,string:i}},group:{string:i,number:n,undefined:"undefined"},hidden:{"boolean":o},icon:{face:{string:i},code:{string:i},size:{number:n},color:{string:i},__type__:{object:r}},id:{string:i,number:n},image:{string:i,undefined:"undefined"},label:{string:i,undefined:"undefined"},labelHighlightBold:{"boolean":o},level:{number:n,undefined:"undefined"},mass:{number:n},physics:{"boolean":o},scaling:{min:{number:n},max:{number:n},label:{enabled:{"boolean":o},min:{number:n},max:{number:n},maxVisible:{number:n},drawThreshold:{number:n},__type__:{object:r,"boolean":o}},customScalingFunction:{"function":"function"},__type__:{object:r}},shadow:{enabled:{"boolean":o},color:{string:i},size:{number:n},x:{number:n},y:{number:n},__type__:{object:r,"boolean":o}},shape:{string:["ellipse","circle","database","box","text","image","circularImage","diamond","dot","star","triangle","triangleDown","square","icon"]},shapeProperties:{borderDashes:{"boolean":o,array:s},borderRadius:{number:n},useImageSize:{"boolean":o},useBorderWithImage:{"boolean":o},__type__:{object:r}},size:{number:n},title:{string:i,undefined:"undefined"},value:{number:n,undefined:"undefined"},x:{number:n},y:{number:n},__type__:{object:r}},physics:{enabled:{"boolean":o},barnesHut:{gravitationalConstant:{number:n},centralGravity:{number:n},springLength:{number:n},springConstant:{number:n},damping:{number:n},avoidOverlap:{number:n},__type__:{object:r}},forceAtlas2Based:{gravitationalConstant:{number:n},centralGravity:{number:n},springLength:{number:n},springConstant:{number:n},damping:{number:n},avoidOverlap:{number:n},__type__:{object:r}},repulsion:{centralGravity:{number:n},springLength:{number:n},springConstant:{number:n},nodeDistance:{number:n},damping:{number:n},__type__:{object:r}},hierarchicalRepulsion:{centralGravity:{number:n},springLength:{number:n},springConstant:{number:n},nodeDistance:{number:n},damping:{number:n},__type__:{object:r}},maxVelocity:{number:n},minVelocity:{number:n},solver:{string:["barnesHut","repulsion","hierarchicalRepulsion","forceAtlas2Based"]},stabilization:{enabled:{"boolean":o},iterations:{number:n},updateInterval:{number:n},onlyDynamicEdges:{"boolean":o},fit:{"boolean":o},__type__:{object:r,"boolean":o}},timestep:{number:n},adaptiveTimestep:{"boolean":o},__type__:{object:r,"boolean":o}},autoResize:{"boolean":o},clickToUse:{"boolean":o},locale:{string:i},locales:{__any__:{any:h},__type__:{object:r}},height:{string:i},width:{string:i},__type__:{object:r}};d.groups.__any__=d.nodes,d.manipulation.controlNodeStyle=d.nodes;var l={nodes:{borderWidth:[1,0,10,1],borderWidthSelected:[2,0,10,1],color:{border:["color","#2B7CE9"],background:["color","#97C2FC"],highlight:{border:["color","#2B7CE9"],background:["color","#D2E5FF"]},hover:{border:["color","#2B7CE9"],background:["color","#D2E5FF"]}},fixed:{x:!1,y:!1},font:{color:["color","#343434"],size:[14,0,100,1],face:["arial","verdana","tahoma"],background:["color","none"],strokeWidth:[0,0,50,1],strokeColor:["color","#ffffff"]},hidden:!1,labelHighlightBold:!0,physics:!0,scaling:{min:[10,0,200,1],max:[30,0,200,1],label:{enabled:!1,min:[14,0,200,1],max:[30,0,200,1],maxVisible:[30,0,200,1],drawThreshold:[5,0,20,1]}},shadow:{enabled:!1,color:"rgba(0,0,0,0.5)",size:[10,0,20,1],x:[5,-30,30,1],y:[5,-30,30,1]},shape:["ellipse","box","circle","database","diamond","dot","square","star","text","triangle","triangleDown"],shapeProperties:{borderDashes:!1,borderRadius:[6,0,20,1],useImageSize:!1},size:[25,0,200,1]},edges:{arrows:{to:{enabled:!1,scaleFactor:[1,0,3,.05]},middle:{enabled:!1,scaleFactor:[1,0,3,.05]},from:{enabled:!1,scaleFactor:[1,0,3,.05]}},arrowStrikethrough:!0,color:{color:["color","#848484"],highlight:["color","#848484"],hover:["color","#848484"],inherit:["from","to","both",!0,!1],opacity:[1,0,1,.05]},dashes:!1,font:{color:["color","#343434"],size:[14,0,100,1],face:["arial","verdana","tahoma"],background:["color","none"],strokeWidth:[2,0,50,1],strokeColor:["color","#ffffff"],align:["horizontal","top","middle","bottom"]},hidden:!1,hoverWidth:[1.5,0,5,.1],labelHighlightBold:!0,physics:!0,scaling:{min:[1,0,100,1],max:[15,0,100,1],label:{enabled:!0,min:[14,0,200,1],max:[30,0,200,1],maxVisible:[30,0,200,1],drawThreshold:[5,0,20,1]}},selectionWidth:[1.5,0,5,.1],selfReferenceSize:[20,0,200,1],shadow:{enabled:!1,color:"rgba(0,0,0,0.5)",size:[10,0,20,1],x:[5,-30,30,1],y:[5,-30,30,1]},smooth:{enabled:!0,type:["dynamic","continuous","discrete","diagonalCross","straightCross","horizontal","vertical","curvedCW","curvedCCW","cubicBezier"],forceDirection:["horizontal","vertical","none"],roundness:[.5,0,1,.05]},width:[1,0,30,1]},layout:{hierarchical:{enabled:!1,levelSeparation:[150,20,500,5],nodeSpacing:[100,20,500,5],treeSpacing:[200,20,500,5],blockShifting:!0,edgeMinimization:!0,direction:["UD","DU","LR","RL"],sortMethod:["hubsize","directed"]}},interaction:{dragNodes:!0,dragView:!0,hideEdgesOnDrag:!1,hideNodesOnDrag:!1,hover:!1,keyboard:{enabled:!1,speed:{x:[10,0,40,1],y:[10,0,40,1],zoom:[.02,0,.1,.005]},bindToWindow:!0},multiselect:!1,navigationButtons:!1,selectable:!0,selectConnectedEdges:!0,hoverConnectedEdges:!0,tooltipDelay:[300,0,1e3,25],zoomView:!0},manipulation:{enabled:!1,initiallyActive:!1},physics:{enabled:!0,barnesHut:{gravitationalConstant:[-2e3,-3e4,0,50],centralGravity:[.3,0,10,.05],springLength:[95,0,500,5],springConstant:[.04,0,1.2,.005],damping:[.09,0,1,.01],avoidOverlap:[0,0,1,.01]},forceAtlas2Based:{gravitationalConstant:[-50,-500,0,1],centralGravity:[.01,0,1,.005],springLength:[95,0,500,5],springConstant:[.08,0,1.2,.005],damping:[.4,0,1,.01],avoidOverlap:[0,0,1,.01]},repulsion:{centralGravity:[.2,0,10,.05],springLength:[200,0,500,5],springConstant:[.05,0,1.2,.005],nodeDistance:[100,0,500,5],damping:[.09,0,1,.01]},hierarchicalRepulsion:{centralGravity:[.2,0,10,.05],springLength:[100,0,500,5],springConstant:[.01,0,1.2,.005],nodeDistance:[120,0,500,5],damping:[.09,0,1,.01]},maxVelocity:[50,0,150,1],minVelocity:[.1,.01,.5,.01],solver:["barnesHut","forceAtlas2Based","repulsion","hierarchicalRepulsion"],timestep:[.5,.01,1,.01]},global:{locale:["en","nl"]}};e.allOptions=d,e.configureOptions=l},function(t,e,i){function o(t){return t&&t.__esModule?t:{"default":t}}function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var s=function(){function t(t,e){var i=[],o=!0,n=!1,s=void 0;try{for(var r,a=t[Symbol.iterator]();!(o=(r=a.next()).done)&&(i.push(r.value),!e||i.length!==e);o=!0);}catch(h){n=!0,s=h}finally{try{!o&&a["return"]&&a["return"]()}finally{if(n)throw s}}return i}return function(e,i){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,i);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),r=function(){function t(t,e){for(var i=0;in&&h>a;){a+=1;var v=this._getHighestEnergyNode(i),g=s(v,4);for(u=g[0],l=g[1],c=g[2],p=g[3],f=l,m=0;f>r&&d>m;){m+=1,this._moveNode(u,c,p);var y=this._getEnergy(u),b=s(y,3);f=b[0],c=b[1],p=b[2]}}}},{key:"_getHighestEnergyNode",value:function(t){for(var e=this.body.nodeIndices,i=this.body.nodes,o=0,n=e[0],r=0,a=0,h=0;ho&&(o=c,n=d,r=p,a=f)}}return[n,o,r,a]}},{key:"_getEnergy",value:function(t){for(var e=this.body.nodeIndices,i=this.body.nodes,o=i[t].x,n=i[t].y,s=0,r=0,a=0;ad;d++)for(var s=0;h-1>s;s++)for(var r=s+1;h>r;r++)o[e[s]][e[r]]=Math.min(o[e[s]][e[r]],o[e[s]][e[d]]+o[e[d]][e[r]]),o[e[r]][e[s]]=o[e[s]][e[r]];return o}}]),t}();e["default"]=n,t.exports=e["default"]},function(t,e){"undefined"!=typeof CanvasRenderingContext2D&&(CanvasRenderingContext2D.prototype.circle=function(t,e,i){this.beginPath(),this.arc(t,e,i,0,2*Math.PI,!1),this.closePath()},CanvasRenderingContext2D.prototype.square=function(t,e,i){this.beginPath(),this.rect(t-i,e-i,2*i,2*i),this.closePath()},CanvasRenderingContext2D.prototype.triangle=function(t,e,i){this.beginPath(),i*=1.15,e+=.275*i;var o=2*i,n=o/2,s=Math.sqrt(3)/6*o,r=Math.sqrt(o*o-n*n);this.moveTo(t,e-(r-s)),this.lineTo(t+n,e+s),this.lineTo(t-n,e+s),this.lineTo(t,e-(r-s)),this.closePath()},CanvasRenderingContext2D.prototype.triangleDown=function(t,e,i){this.beginPath(),i*=1.15,e-=.275*i;var o=2*i,n=o/2,s=Math.sqrt(3)/6*o,r=Math.sqrt(o*o-n*n);this.moveTo(t,e+(r-s)),this.lineTo(t+n,e-s),this.lineTo(t-n,e-s),this.lineTo(t,e+(r-s)),this.closePath()},CanvasRenderingContext2D.prototype.star=function(t,e,i){this.beginPath(),i*=.82,e+=.1*i;for(var o=0;10>o;o++){var n=o%2===0?1.3*i:.5*i;this.lineTo(t+n*Math.sin(2*o*Math.PI/10),e-n*Math.cos(2*o*Math.PI/10))}this.closePath()},CanvasRenderingContext2D.prototype.diamond=function(t,e,i){this.beginPath(),this.lineTo(t,e+i),this.lineTo(t+i,e),this.lineTo(t,e-i),this.lineTo(t-i,e),this.closePath()},CanvasRenderingContext2D.prototype.roundRect=function(t,e,i,o,n){var s=Math.PI/180;0>i-2*n&&(n=i/2),0>o-2*n&&(n=o/2),this.beginPath(),this.moveTo(t+n,e),this.lineTo(t+i-n,e),this.arc(t+i-n,e+n,n,270*s,360*s,!1),this.lineTo(t+i,e+o-n),this.arc(t+i-n,e+o-n,n,0,90*s,!1),this.lineTo(t+n,e+o),this.arc(t+n,e+o-n,n,90*s,180*s,!1),this.lineTo(t,e+n),this.arc(t+n,e+n,n,180*s,270*s,!1),this.closePath()},CanvasRenderingContext2D.prototype.ellipse=function(t,e,i,o){var n=.5522848,s=i/2*n,r=o/2*n,a=t+i,h=e+o,d=t+i/2,l=e+o/2;this.beginPath(),this.moveTo(t,l),this.bezierCurveTo(t,l-r,d-s,e,d,e),this.bezierCurveTo(d+s,e,a,l-r,a,l),this.bezierCurveTo(a,l+r,d+s,h,d,h),this.bezierCurveTo(d-s,h,t,l+r,t,l),this.closePath()},CanvasRenderingContext2D.prototype.database=function(t,e,i,o){var n=1/3,s=i,r=o*n,a=.5522848,h=s/2*a,d=r/2*a,l=t+s,u=e+r,c=t+s/2,p=e+r/2,f=e+(o-r/2),m=e+o;this.beginPath(),this.moveTo(l,p),this.bezierCurveTo(l,p+d,c+h,u,c,u),this.bezierCurveTo(c-h,u,t,p+d,t,p),this.bezierCurveTo(t,p-d,c-h,e,c,e),this.bezierCurveTo(c+h,e,l,p-d,l,p),this.lineTo(l,f),this.bezierCurveTo(l,f+d,c+h,m,c,m),this.bezierCurveTo(c-h,m,t,f+d,t,f),this.lineTo(t,p)},CanvasRenderingContext2D.prototype.arrow=function(t,e,i,o){var n=t-o*Math.cos(i),s=e-o*Math.sin(i),r=t-.9*o*Math.cos(i),a=e-.9*o*Math.sin(i),h=n+o/3*Math.cos(i+.5*Math.PI),d=s+o/3*Math.sin(i+.5*Math.PI),l=n+o/3*Math.cos(i-.5*Math.PI),u=s+o/3*Math.sin(i-.5*Math.PI);this.beginPath(),this.moveTo(t,e),this.lineTo(h,d),this.lineTo(r,a),this.lineTo(l,u),this.closePath()},CanvasRenderingContext2D.prototype.dashedLine=function(t,e,i,o,n){this.beginPath(),this.moveTo(t,e);for(var s=n.length,r=i-t,a=o-e,h=a/r,d=Math.sqrt(r*r+a*a),l=0,u=!0,c=0,p=n[0];d>=.1;)p=n[l++%s],p>d&&(p=d),c=Math.sqrt(p*p/(1+h*h)),c=0>r?-c:c,t+=c,e+=h*c,u===!0?this.lineTo(t,e):this.moveTo(t,e),d-=p,u=!u})},function(t,e){function i(t){return P=t,p()}function o(){I=0,N=P.charAt(0)}function n(){I++,N=P.charAt(I)}function s(){return P.charAt(I+1)}function r(t){return A.test(t)}function a(t,e){if(t||(t={}),e)for(var i in e)e.hasOwnProperty(i)&&(t[i]=e[i]);return t}function h(t,e,i){for(var o=e.split("."),n=t;o.length;){var s=o.shift();o.length?(n[s]||(n[s]={}),n=n[s]):n[s]=i}}function d(t,e){for(var i,o,n=null,s=[t],r=t;r.parent;)s.push(r.parent),r=r.parent;if(r.nodes)for(i=0,o=r.nodes.length;o>i;i++)if(e.id===r.nodes[i].id){n=r.nodes[i];break}for(n||(n={id:e.id},t.node&&(n.attr=a(n.attr,t.node))),i=s.length-1;i>=0;i--){var h=s[i];h.nodes||(h.nodes=[]),-1===h.nodes.indexOf(n)&&h.nodes.push(n)}e.attr&&(n.attr=a(n.attr,e.attr))}function l(t,e){if(t.edges||(t.edges=[]),t.edges.push(e),t.edge){var i=a({},t.edge);e.attr=a(i,e.attr)}}function u(t,e,i,o,n){var s={from:e,to:i,type:o};return t.edge&&(s.attr=a({},t.edge)),s.attr=a(s.attr||{},n),s}function c(){for(L=T.NULL,z="";" "===N||" "===N||"\n"===N||"\r"===N;)n();do{var t=!1;if("#"===N){for(var e=I-1;" "===P.charAt(e)||" "===P.charAt(e);)e--;if("\n"===P.charAt(e)||""===P.charAt(e)){for(;""!=N&&"\n"!=N;)n();t=!0}}if("/"===N&&"/"===s()){for(;""!=N&&"\n"!=N;)n();t=!0}if("/"===N&&"*"===s()){for(;""!=N;){if("*"===N&&"/"===s()){n(),n();break}n()}t=!0}for(;" "===N||" "===N||"\n"===N||"\r"===N;)n()}while(t);if(""===N)return void(L=T.DELIMITER);var i=N+s();if(E[i])return L=T.DELIMITER,z=i,n(),void n();if(E[N])return L=T.DELIMITER,z=N,void n();if(r(N)||"-"===N){for(z+=N,n();r(N);)z+=N,n();return"false"===z?z=!1:"true"===z?z=!0:isNaN(Number(z))||(z=Number(z)),void(L=T.IDENTIFIER)}if('"'===N){for(n();""!=N&&('"'!=N||'"'===N&&'"'===s());)z+=N,'"'===N&&n(),n();if('"'!=N)throw w('End of string " expected');return n(),void(L=T.IDENTIFIER)}for(L=T.UNKNOWN;""!=N;)z+=N,n();throw new SyntaxError('Syntax error in part "'+x(z,30)+'"')}function p(){var t={};if(o(),c(),"strict"===z&&(t.strict=!0,c()),("graph"===z||"digraph"===z)&&(t.type=z,c()),L===T.IDENTIFIER&&(t.id=z,c()),"{"!=z)throw w("Angle bracket { expected");if(c(),f(t),"}"!=z)throw w("Angle bracket } expected");if(c(),""!==z)throw w("End of file expected");return c(),delete t.node,delete t.edge,delete t.graph,t}function f(t){for(;""!==z&&"}"!=z;)m(t),";"===z&&c()}function m(t){var e=v(t);if(e)return void b(t,e);var i=g(t);if(!i){if(L!=T.IDENTIFIER)throw w("Identifier expected");var o=z;if(c(),"="===z){if(c(),L!=T.IDENTIFIER)throw w("Identifier expected");t[o]=z,c()}else y(t,o)}}function v(t){var e=null;if("subgraph"===z&&(e={},e.type="subgraph",c(),L===T.IDENTIFIER&&(e.id=z,c())),"{"===z){if(c(),e||(e={}),e.parent=t,e.node=t.node,e.edge=t.edge,e.graph=t.graph,f(e),"}"!=z)throw w("Angle bracket } expected");c(),delete e.node,delete e.edge,delete e.graph,delete e.parent,t.subgraphs||(t.subgraphs=[]),t.subgraphs.push(e)}return e}function g(t){return"node"===z?(c(),t.node=_(),"node"):"edge"===z?(c(),t.edge=_(),"edge"):"graph"===z?(c(),t.graph=_(),"graph"):null}function y(t,e){var i={id:e},o=_();o&&(i.attr=o),d(t,i),b(t,e)}function b(t,e){for(;"->"===z||"--"===z;){var i,o=z;c();var n=v(t);if(n)i=n;else{if(L!=T.IDENTIFIER)throw w("Identifier or subgraph expected");i=z,d(t,{id:i}),c()}var s=_(),r=u(t,e,i,o,s);l(t,r),e=i}}function _(){for(var t=null;"["===z;){for(c(),t={};""!==z&&"]"!=z;){if(L!=T.IDENTIFIER)throw w("Attribute name expected");var e=z;if(c(),"="!=z)throw w("Equal sign = expected");if(c(),L!=T.IDENTIFIER)throw w("Attribute value expected");var i=z;h(t,e,i),c(),","==z&&c()}if("]"!=z)throw w("Bracket ] expected");c()}return t}function w(t){return new SyntaxError(t+', got "'+x(z,30)+'" (char '+I+")")}function x(t,e){return t.length<=e?t:t.substr(0,27)+"..."}function k(t,e,i){Array.isArray(t)?t.forEach(function(t){Array.isArray(e)?e.forEach(function(e){i(t,e)}):i(t,e)}):Array.isArray(e)?e.forEach(function(e){i(t,e)}):i(t,e)}function O(t,e,i){for(var o=e.split("."),n=o.pop(),s=t,r=0;r":!0,"--":!0},P="",I=0,N="",z="",L=T.NULL,A=/[a-zA-Z_0-9.:#]/;e.parseDOT=i,e.DOTToGraph=D},function(t,e){function i(t,e){var i=[],o=[],n={edges:{inheritColor:!1},nodes:{fixed:!1,parseColor:!1}};void 0!==e&&(void 0!==e.fixed&&(n.nodes.fixed=e.fixed),void 0!==e.parseColor&&(n.nodes.parseColor=e.parseColor),void 0!==e.inheritColor&&(n.edges.inheritColor=e.inheritColor));for(var s=t.edges,r=t.nodes,a=0;aObject | Array Get a single item, multiple items, or all items from the DataSet. - Usage examples can be found in section Getting Data, and the available options are described in section Data Selection. + Usage examples can be found in section Getting Data, and the available options are described in section Data Selection. When no item is found, null is returned when a single item was requested, and and empty Array is returned in case of multiple id's. @@ -431,7 +431,7 @@ var data = new vis.DataSet([data] [, options]) Number[] - Update on ore multiple existing items. data can be a single item or an array with items. When an item doesn't exist, it will be created. Returns an array with the ids of the removed items. See section Data Manipulation. + Update one or multiple existing items. data can be a single item or an array with items. When an item doesn't exist, it will be created. Returns an array with the ids of the removed items. See section Data Manipulation. @@ -598,9 +598,9 @@ function (event, properties, senderId) { update, and remove, properties is always an object containing a property items, which contains an array with the ids of the affected - items. The update event has an extra field data - containing the original data of the updated items, i.e. the gives the - changed fields of the changed items. + items. The update event has an extra field oldData + containing the original data of the updated items, and a field data + containing the changes: the properties of the items that are being updated. @@ -1020,4 +1020,4 @@ var positiveBalance = dataset.get({ - \ No newline at end of file + diff --git a/lib/vis/docs/data/dataview.html b/lib/vis/docs/data/dataview.html index 1b1246b3d4..9a98f7f2ed 100644 --- a/lib/vis/docs/data/dataview.html +++ b/lib/vis/docs/data/dataview.html @@ -248,7 +248,7 @@ var data = new vis.DataView(dataset, options) Object | Array Get a single item, multiple items, or all items from the DataView. - Usage examples can be found in section Getting Data, and the available options are described in section Data Selection. + Usage examples can be found in section Getting Data, and the available options are described in section Data Selection. When no item is found, null is returned when a single item was requested, and and empty Array is returned in case of multiple id's. @@ -307,7 +307,7 @@ var view = new vis.DataView(data, { - setDataSet(data) + setData(data) none diff --git a/lib/vis/docs/graph2d/index.html b/lib/vis/docs/graph2d/index.html index b70f0ebecb..abea895d9e 100644 --- a/lib/vis/docs/graph2d/index.html +++ b/lib/vis/docs/graph2d/index.html @@ -145,7 +145,6 @@

Contents

    -
  • Overview
  • Data Format @@ -227,7 +226,7 @@ Options is a name-value map in the JSON format. The available options are described in section Configuration Options. Groups is a vis DataSet containing groups. The available options and the method of construction - are described in section Data Format. + are described in section Data Format.

    var graph = new vis.Graph2d(container [, data] [, groups] [, options]);
    For backwards compatibility, groups and options can be interchanged. @@ -245,10 +244,8 @@

    Data Format

    - Graph2d can load data from an Array, a DataSet or a DataView. + Graph2d can load data from an Array, a DataSet (offering 2 way data binding), or a DataView (offering one way data binding). Objects are added to this DataSet by using the add() function. - Data points must have properties x, y, and z, - and can optionally have a property style and filter.

    Graph2d can be provided with two types of data:

    @@ -384,8 +381,8 @@ groups.add({ visible Boolean - true - This field is optional. If false, this group will not be drawn. + no + This field is optional. If false, this group will not be drawn. By default it is true. @@ -437,7 +434,7 @@ var options = { barChart.sideBySide Boolean false - If two datapoints of a barchart overlap, they are drawn over eachother by default. If sideBySide is set to true, they will be drawn side by side. + If two datapoints of a barchart overlap, they are drawn over eachother by default. If sideBySide is set to true, they will be drawn side by side, within the same width as a single bar.. See example 10 for more information. When using groups, see example 11. @@ -448,7 +445,12 @@ var options = { 50 The width of the bars. - + + barChart.minWidth + Number + + The minimum width of the bars in pixels: by default the bars get smaller while zooming out to prevent overlap, this value is the minimum width of the bar. Default behavior (when minWidth is not set) is 10% of the bar width. + dataAxis Object @@ -473,12 +475,11 @@ var options = { Function Insert a custom function on how to format the label. The function will receive a numeric value and has to return a string. Default function is: -
    +            
     function (value) {
    -  return value;
    -}
    -            
    - which does nothing to it. + return ''+value.toPrecision(3); +}
    + dataAxis.left.range.min @@ -579,7 +580,7 @@ drawPoints: { 3. Function: If a function is provided it will be used as a callback. The function may return values from listing 1 or 2.
    -drawPoints: function(item, group, graph2d) {
    +drawPoints: function(item, group) {
       ...
     }
                 
    @@ -718,6 +719,14 @@ onRender: function(item, group, graph2d) { 'top-right' Determine the position of the legend coupled to the right axis. Options are 'top-left', 'top-right', 'bottom-left' or 'bottom-right'. + + + moment + function + vis.moment + A constructor for creating a moment.js Date. Allows for applying a custom time zone. See section Time zone for more information. + + sampling Boolean @@ -736,7 +745,7 @@ onRender: function(item, group, graph2d) { stack Boolean true - If stack is enabled, the graphs will be stacked upon eachother when applicable. This currently only works with bar graphs but linegraph support is being worked on. + If stack is enabled, the graphs will be stacked upon each-other when applicable. A group can opt-out of stacking through the "excludeFromStacking" option. shaded @@ -754,7 +763,17 @@ onRender: function(item, group, graph2d) { shaded.orientation String 'bottom' - This determines if the shaded area is at the bottom or at the top of the curve. The options are 'bottom' or 'top'. + This determines if the shaded area is at the bottom or at the top of the curve, or always towards the zero-axis of the graph. + The options are 'zero', 'bottom', 'top', or the special case of 'group'. If group is chosen, the option groupId is required. + See Example 20 what these options look like. + + + + shaded.groupId + String + undefined + The id of the group which should be used as the other shading limit. + shaded.style @@ -775,6 +794,18 @@ onRender: function(item, group, graph2d) { This defines with which axis, left or right, the graph is coupled. Example 5 shows groups with different Y axis. If no groups are coupled with an axis, it will not be shown. + + excludeFromLegend + Boolean + false + Group option only. Excludes the group from being listed in the legend. + + + excludeFromStacking + Boolean + false + Group option only. Excludes the group from being included in the stacking. +

    Timeline Options

    @@ -888,14 +919,14 @@ function (option, path) { locale String none - Select a locale for the Graph2d. See section Localization for more information. + Select a locale for the Graph2d. See section Localization for more information. locales Object none - A map with i18n locales. See section Localization for more information. + A map with i18n locales. See section Localization for more information. @@ -914,6 +945,16 @@ function (option, path) { Specifies the maximum height for the Timeline. Can be a number in pixels or a string like "300px". + + maxMinorChars + number + 7 + + Specifies the maximum number of characters that should fit in minor grid labels. + If larger, less and wider grids will be drawn. + + + min Date or Number or String @@ -984,22 +1025,6 @@ function (option, path) { visible. - - showMajorLines - Boolean - true - By default, the timeline shows both minor and major date lines on the - time axis. You can use this option to hide the lines from the major dates. - - - - showMinorLines - Boolean - true - By default, the timeline shows both minor and major date lines on the - time axis. You can use this option to hide the lines from the minor dates. - - start Date or Number or String @@ -1310,16 +1335,14 @@ Graph2d.off('rangechanged', onChange); Fired when double clicked inside the Graph2d. - - finishedRedraw + changed - none. + Has no properties. - Fired after a redraw is complete. When moving the Graph2d around, this could be fired frequently. + Fired once after each graph redraw. - rangechange @@ -1343,6 +1366,7 @@ Graph2d.off('rangechanged', onChange); Fired once after the user has dragged the Graph2d window. + timechange @@ -1425,6 +1449,32 @@ Graph2d.off('rangechanged', onChange); +

    Time zone

    +

    + By default, the Timeline displays time in local time. To display a Timeline in an other time zone or in UTC, the date constructor can be overloaded via the configuration option moment, which by default is the constructor function of moment.js. More information about UTC with moment.js can be found in the docs: http://momentjs.com/docs/#/parsing/utc/. +

    + +

    + Examples: +

    + +
    // display in UTC
    +var options = {
    +  moment: function(date) {
    +    return vis.moment(date).utc();
    +  }
    +};
    +
    +// display in UTC +08:00
    +var options = {
    +  moment: function(date) {
    +    return vis.moment(date).utcOffset('+08:00');
    +  }
    +};
    +
    + + +

    Styles

    All parts of the Graph2d have a class name and a default css style just like the Graph2d. @@ -1453,4 +1503,4 @@ Graph2d.off('rangechanged', onChange); - \ No newline at end of file + diff --git a/lib/vis/docs/graph3d/index.html b/lib/vis/docs/graph3d/index.html index 426a41a71a..c0e604a761 100644 --- a/lib/vis/docs/graph3d/index.html +++ b/lib/vis/docs/graph3d/index.html @@ -199,7 +199,7 @@

    Data Format

    - Graph3d can load data from an Array, a DataSet or a DataView. + Graph3d can load data from an Array, a DataSet (offering 2 way data binding), or a DataView (offering 1 way data binding). JSON objects are added to this DataSet by using the add() function. Data points must have properties x, y, and z, and can optionally have a property style and filter. @@ -379,6 +379,13 @@ var options = { The line width of dots, bars and lines. Applicable for all styles. + + dotSizeRatio + number + 0.02 + Ratio of the size of the dots with respect to the width of the graph. + + gridColor string diff --git a/lib/vis/docs/network/edges.html b/lib/vis/docs/network/edges.html index a71f54c2f6..42c132ac0f 100644 --- a/lib/vis/docs/network/edges.html +++ b/lib/vis/docs/network/edges.html @@ -119,6 +119,7 @@ var options = { middle: {enabled: false, scaleFactor:1}, from: {enabled: false, scaleFactor:1} }, + arrowStrikethrough: true, color: { color:'#848484', highlight:'#848484', @@ -166,6 +167,7 @@ var options = { selfReferenceSize:20, shadow:{ enabled: false, + color: 'rgba(0,0,0,0.5)', size:10, x:5, y:5 @@ -253,6 +255,12 @@ network.setOptions(options); Object Exactly the same as the to object but with an arrowhead at the from node of the edge. + + arrowStrikethrough + Boolean + true + When false, the edge stops at the arrow. This can be useful if you have thick lines and you want the arrow to end in a point. Middle arrows are not affected by this. + color Object or String @@ -581,6 +589,12 @@ var options: { in this object are defined. + + shadow.color + String + 'rgba(0,0,0,0.5)' + The color size of the shadow as a string. Supported formats are 'rgb(255,255,255)', 'rgba(255,255,255,1)' and '#FFFFFF'. + shadow.size Number @@ -623,13 +637,21 @@ var options: { String 'dynamic' Possible options: 'dynamic', 'continuous', 'discrete', 'diagonalCross', 'straightCross', 'horizontal', - 'vertical', 'curvedCW', 'curvedCCW'. Take a look at our example 26 to see what these look like + 'vertical', 'curvedCW', 'curvedCCW', 'cubicBezier'. Take a look at our example 26 to see what these look like and pick the one that you like best!

    When using dynamic, the edges will have an invisible support node guiding the shape. This node is part of the physics simulation. + + smooth.forceDirection + String or Boolean + false + Accepted options: ['horizontal', 'vertical', 'none']. This options is only used with the cubicBezier curves. When true, horizontal is chosen, when false, + the direction that is larger (x distance between nodes vs y distance between nodes) is used. If the x distance is larger, horizontal. This is ment to be used with hierarchical layouts. + + smooth.roundness Number diff --git a/lib/vis/docs/network/index.html b/lib/vis/docs/network/index.html index 1940bbf997..4fe58dfb49 100644 --- a/lib/vis/docs/network/index.html +++ b/lib/vis/docs/network/index.html @@ -227,33 +227,33 @@ Generates an interactive option editor with filtering. - edges + edges Handles the creation and deletion of edges and contains the global edge options and styles. - groups + groups Contains the groups and some options on how to handle nodes with non-existing groups. - interaction + interaction Used for all user interaction with the network. Handles mouse and touch events and selection as well as the navigation buttons and the popups. - layout + layout Governs the initial and hierarchical positioning. - manipulation + manipulation Supplies an API and optional GUI to alter the data in the network. - nodes + nodes Handles the creation and deletion of nodes and contains the global node options and styles. - physics + physics Does all the simulation moving the nodes and edges to their final positions, also governs stabilization. @@ -323,7 +323,7 @@ network.setOptions(options); locales Object defaultLocales - Locales object. By default only 'en' and 'nl' are supported. Take a look + Locales object. By default only 'en', 'de', 'es' and 'nl' are supported. Take a look at the locales @@ -333,11 +333,7 @@ network.setOptions(options); clickToUse Boolean false - Locales object. By default only 'en' and 'nl' are supported. Take a look - at - the locales - section below for more explaination on how to customize this. + When a Network is configured to be clickToUse, it will react to mouse and touch events only when active. When active, a blue shadow border is displayed around the Network. The network is set active by clicking on it, and is changed to inactive again by clicking outside the Network or by pressing the ESC key. configure @@ -780,8 +776,14 @@ function releaseFunction (clusterPosition, containedNodesPositions) { positions when using clusters since they cannot be correctly initialized from just the positions. - - + + + moveNode(nodeId, Number x, Number y) + + + Returns: none + You can use this to programatically move a node. The supplied x and y positions have to be in canvas space! + getBoundingBox(String @@ -938,6 +940,28 @@ function releaseFunction (clusterPosition, containedNodesPositions) { before selecting its own objects. Does not fire events. + + setSelection( + Object selection, + [Object options]) + + + Returns: none + Sets the selection, wich must be an object like this: +

    +{
    +  nodes: [Array of nodeIds],
    +  edges: [Array of edgeIds]
    +}
    + You can also pass only nodes or edges in selection object. + Available options are: +
    +{
    +  unselectAll: Boolean,
    +  highlightEdges: Boolean
    +}
    + + unselectAll() @@ -962,8 +986,8 @@ function releaseFunction (clusterPosition, containedNodesPositions) { getViewPosition() - Returns: Number - Returns the current central focus point of the view. + Returns: Object + Returns the current central focus point of the view in the form: { x: {Number}, y: {Number} } @@ -1295,19 +1319,19 @@ var options = { hoverNode {node: nodeId} - Fired interaction:{hover:true} and the mouse hovers over a node. + Fired if the option interaction:{hover:true} is enabled and the mouse hovers over a node. blurNode {node: nodeId} - Fired interaction:{hover:true} and the mouse moved away from a node it was hovering over before. + Fired if the option interaction:{hover:true} is enabled and the mouse moved away from a node it was hovering over before. hoverEdge {edge: edgeId} - Fired interaction:{hover:true} and the mouse hovers over an edge. + Fired if the option interaction:{hover:true} is enabled and the mouse hovers over an edge. blurEdge {edge: edgeId} - Fired interaction:{hover:true} and the mouse moved away from an edge it was hovering over before. + Fired if the option interaction:{hover:true} is enabled and the mouse moved away from an edge it was hovering over before. zoom {direction:'+'/'-', scale: Number} @@ -1551,4 +1575,4 @@ var network = new vis.Network(container, data, options); - \ No newline at end of file + diff --git a/lib/vis/docs/network/layout.html b/lib/vis/docs/network/layout.html index ea33c7ddb9..08f1eca982 100644 --- a/lib/vis/docs/network/layout.html +++ b/lib/vis/docs/network/layout.html @@ -101,11 +101,16 @@ var options = { layout: { randomSeed: undefined, + improvedLayout:true, hierarchical: { enabled:false, levelSeparation: 150, - direction: 'UD', // UD, DU, LR, RL - sortMethod: 'hubsize' // hubsize, directed + nodeSpacing: 100, + treeSpacing: 200, + blockShifting: true, + edgeMinimization: true, + direction: 'UD', // UD, DU, LR, RL + sortMethod: 'hubsize' // hubsize, directed } } } @@ -127,9 +132,16 @@ network.setOptions(options); + + + + + + This example code will show a popup if you connect a node to itself to ask you if that was what you wanted. If you do not want the edge created, do not call the callback function or call the callback function null or no argument. - + - - + + @@ -370,7 +377,9 @@ network.setOptions(options); - + @@ -577,6 +586,12 @@ mySize = minSize + diff * scale; in this object are defined. + + + + + + @@ -619,7 +634,32 @@ mySize = minSize + diff * scale; + + + + + + + + + + + + + + + + + + @@ -684,4 +724,4 @@ mySize = minSize + diff * scale; - \ No newline at end of file + diff --git a/lib/vis/docs/network/physics.html b/lib/vis/docs/network/physics.html index cb9acb076b..c8fe992081 100644 --- a/lib/vis/docs/network/physics.html +++ b/lib/vis/docs/network/physics.html @@ -138,7 +138,8 @@ var options = { onlyDynamicEdges: false, fit: true }, - timestep: 0.5 + timestep: 0.5, + adaptiveTimestep: true } } @@ -201,6 +202,7 @@ network.setOptions(options); +
    NameTypeDefaultDescription
    randomSeedNumberundefined When NOT using the hierarchical layout, the nodes are randomly positioned initially. This means that the settled result is different every time. If you provide a random seed manually, the layout will be the same every time. Ideally you try with an undefined seed, reload until you are happy with the layout and use the getSeed() method to ascertain the seed.
    improvedLayoutBooleantrue When enabled, the network will use the Kamada Kawai algorithm for initial layout. For networks larger than 100 nodes, clustering will be performed automatically to reduce the amount of nodes. This can greatly improve the stabilization times. If the network is very interconnected (no or few leaf nodes), this may not work and it will revert back to the old method. Performance will be improved in the future.
    hierarchicalObject or BooleanObject When true, the layout engine positions the nodes in a hierarchical fashion using default settings. For customization you can supply an object.
    editNode Function undefined Editing of nodes is only possible when a handling function is supplied. If this is not the case, editing of nodes will be disabled. The function will be called when a node is selected and the 'Edit Node' button on the toolbar is pressed. This function will be called like the addNode function with the node's data and a callback function.
    editEdge Boolean or Function true If boolean, toggle the editing of edges in the GUI. When a function is supplied, it will be called when an edge is selcted and the 'Edit Edge' button on the toolbar is pressed. This function will be called in the same way the addEdge function was called. If the callback is not performed, the edge will remain hanging where it was released. To cancel, call the callback function with null as argument or without arguments.
    editEdge Boolean or Function true If boolean, toggle the editing of edges in the GUI. When a function is supplied, it will be called when an edge is selected and the 'Edit Edge' button on the toolbar is pressed. This function will be called in the same way the addEdge function was called. If the callback is not performed, the edge will remain hanging where it was released. To cancel, call the callback function with null as argument or without arguments.
    deleteNode Boolean or Function true If boolean, toggle the deletion of nodes in the GUI. If function, it will be called when a node is selected and the 'Delete selected' button is pressed. When using a function, it will receive a callback and an object with an array of selected nodeIds and an array of selected edges Ids. These are the items that will be deleted if the callback is performed.
    deleteEdge Boolean or Function true If boolean, toggle the deletion of edges in the GUI. If function, it will be called when an edge is selected and the 'Delete selected' button is pressed. When using a function, it will receive a callback and an object with an array of selected nodeIds (empty) and an array of selected edges Ids. These are the items that will be deleted if the callback is performed.
    controlNodeStyle Object ObjectYou can supply any styling information you'd like here. All fields described in the nodes module are allowed except obviously for id, x, y and fixed.

    Default: diff --git a/lib/vis/docs/network/nodes.html b/lib/vis/docs/network/nodes.html index 79865bca4b..146a2233dd 100644 --- a/lib/vis/docs/network/nodes.html +++ b/lib/vis/docs/network/nodes.html @@ -93,7 +93,7 @@

    Options

    The options for the nodes have to be contained in an object titled 'nodes'. All of these options can be supplied per node as well. Obviously, 'id' should not be defined globally but per node. Options defined in the global nodes object, are applied to all nodes. If a node has options of its own, those will be used instead of the global options.

    -

    When you have given a node an option, you will override the global option for that property. If you then set that option to null, +

    When you have given a node an option, you will override the global option for that property, and also the group option for that property if the node is in a group. If you then set that option to null, it will revert back to the default value.

    Click on the full options or shorthand options to show how these options are supposed to be used.

    @@ -108,7 +108,7 @@ var options = { nodes:{ borderWidth: 1, - borderWidthSelected: undefined, + borderWidthSelected: 2, brokenImage:undefined, color: { border: '#2B7CE9', @@ -171,11 +171,18 @@ var options = { }, shadow:{ enabled: false, + color: 'rgba(0,0,0,0.5)', size:10, x:5, y:5 }, shape: 'ellipse', + shapeProperties: { + borderDashes: false, // only for borders + borderRadius: 6, // only for box shape + useImageSize: false, // only for image and circularImage shapes + useBorderWithImage: false // only for image shape + } size: 25, title: undefined, value: undefined, @@ -220,8 +227,8 @@ network.setOptions(options);
    borderWidthSelected NumberundefinedThe width of the border of the node when it is selected. When undefined, the borderWidth is used2The width of the border of the node when it is selected. When undefined, the borderWidth * 2 is used.
    brokenImagegroup String undefinedWhen not undefined, theWhen not undefined, the node will belong to the defined group. Styling information of + that group will apply to this node. Node specific styling overrides group styling. +
    hidden
    timestep Number 0.5 The physics simulation is discrete. This means we take a step in time, calculate the forces, move the nodes and take another step. If you increase this number the steps will be too large and the network can get unstable. If you see a lot of jittery movement in the network, you may want to reduce this value a little.
    adaptiveTimestep Boolean true If this is enabled, the timestep will intelligently be adapted (only during the stabilization stage if stabilization is enabled!) to greatly decrease stabilization times. The timestep configured above is taken as the minimum timestep. This can be further improved by using the improvedLayout algorithm.
    diff --git a/lib/vis/docs/timeline/index.html b/lib/vis/docs/timeline/index.html index 7948750945..83f9afe543 100644 --- a/lib/vis/docs/timeline/index.html +++ b/lib/vis/docs/timeline/index.html @@ -108,14 +108,14 @@
  • Editing Items
  • Templates
  • Localization
  • +
  • Time zone
  • Styles
  • -
  • Data Policy

Example

The following code shows how to create a Timeline and provide it with data. - More examples can be found in the examples directory. + More examples can be found in the timeline examples page.

<!DOCTYPE HTML>
@@ -209,19 +209,20 @@
 
   

Items

- The Timeline uses regular Arrays and Objects as data format. - Data items can contain the properties start, + For items, the Timeline accepts an Array, a DataSet (offering 2 way data binding), + or a DataView (offering 1 way data binding). + Items are regular objects and can contain the properties start, end (optional), content, group (optional), className (optional), editable (optional), and style (optional).

- A table is constructed as: + A DataSet is constructed as:

-var items = [
+var items = new vis.DataSet([
   {
     start: new Date(2010, 7, 15),
     end: new Date(2010, 8, 2),  // end is optional
@@ -343,7 +344,9 @@ var items = [
 
   

Groups

- Like the items, groups are regular JavaScript Arrays and Objects. + For the items, groups can be an Array, a DataSet (offering 2 way data binding), + or a DataView (offering 1 way data binding). + Using groups, items can be grouped together. Items are filtered per group, and displayed as @@ -585,12 +588,51 @@ function (option, path) { + + groupEditable + boolean or Object + false + If true, the groups in the timeline can be manipulated. See also the callbacks onAddGroup, onMoveGroup, and onRemoveGroup. When groupEditable is an object, one can enable or disable individual manipulation actions. + The editing of groups follows the same principles as for items, see section Editing Items for a detailed explanation. + + + + groupEditable.add + boolean + false + If true, new groups can be created in the Timeline. For now adding new groups is done by the user. + + + groupEditable.remove + boolean + false + If true, groups can be deleted. For now removing groups is done by the user. + + + groupEditable.order + boolean + false + If true, groups can be dragged to change their order. Only applicable when the Timeline has groups. For this option to work properly the groupOrder and groupOrderSwap options have to be set as well. + + groupOrder String or Function - none + 'order' Order the groups by a field name or custom sort function. - By default, groups are not ordered. + By default, groups are ordered by a property order (if set). + If no order properties are provided, the order will be undetermined. + + + + + groupOrderSwap + Function + none + Swaps the positions of two groups. If groups have a custom order (via groupOrder) and groups are configured to be reorderable (via groupEditable.order), the user has to provide a function that swaps the positions of two given groups. + If this option is not set, the default implementation assumes that groups hold an attribute order which values are changed. The signature of the groupOrderWap function is: +

function groupOrderSwap(fromGroup: Object, toGroup: Object, groups: DataSet)
+ The first to arguments hold the groups of which the positions are to be swapped and the third argument holds the DataSet with all groups. @@ -624,6 +666,14 @@ function (option, path) { and set repeat to weekly. + + + itemsAlwaysDraggable + boolean + false + If true, all items in the Timeline are draggable without being selected. If false, only the selected item(s) are draggable. + + locale String @@ -638,6 +688,13 @@ function (option, path) { A map with i18n locales. See section Localization for more information. + + moment + function + vis.moment + A constructor for creating a moment.js Date. Allows for applying a custom time zone. See section Time zone for more information. + + margin number or Object @@ -685,6 +742,16 @@ function (option, path) { Specifies the maximum height for the Timeline. Can be a number in pixels or a string like "300px". + + maxMinorChars + number + 7 + + Specifies the maximum number of characters that should fit in minor grid labels. + If larger, less and wider grids will be drawn. + + + min Date or Number or String or Moment @@ -720,6 +787,16 @@ function (option, path) { Only applicable when option selectable is true. + + + multiselectPerGroup + boolean + false + + If true, selecting multiple items using shift+click will only select items residing in the same group as the first selected item. + Only applicable when option selectable and multiselect are true. + + onAdd @@ -728,6 +805,14 @@ function (option, path) { Callback function triggered when an item is about to be added: when the user double taps an empty space in the Timeline. See section Editing Items for more information. Only applicable when both options selectable and editable.add are set true. + + + onAddGroup + function + none + Callback function triggered when a group is about to be added. The signature and semantics are the same as for onAdd. + + onUpdate @@ -744,6 +829,14 @@ function (option, path) { Callback function triggered when an item has been moved: after the user has dragged the item to an other position. See section Editing Items for more information. Only applicable when both options selectable and editable.updateTime or editable.updateGroup are set true. + + + onMoveGroup + function + none + Callback function triggered when a group has been moved: after the user has dragged the group to an other position. The signature and semantics are the same as for onMove. + + onMoving @@ -760,6 +853,14 @@ function (option, path) { Callback function triggered when an item is about to be removed: when the user tapped the delete button on the top right of a selected item. See section Editing Items for more information. Only applicable when both options selectable and editable.remove are set true. + + + onRemoveGroup + function + none + Callback function triggered when a group is about to be removed. The signature and semantics are the same as for onRemove. + + order @@ -866,6 +967,13 @@ function (option, path) { A template function used to generate the contents of the items. The function is called by the Timeline with an items data as argument, and must return HTML code as result. When the option template is specified, the items do not need to have a field content. See section Templates for a detailed explanation. + + throttleRedraw + number + 0 + Limit the maximum number of redraws to once every x milliseconds. For example setting throttleRedraw to `100` milliseconds will limit the number of redraws to 10 times per second. + + timeAxis Object @@ -882,6 +990,7 @@ function (option, path) { }
+ timeAxis.step number @@ -1115,14 +1224,23 @@ document.getElementById('myTimeline').onclick = function (event) { + + setCustomTimeTitle(title [, id]) + none + Adjust the title attribute of a custom time bar. + Parameter title is the string to be set as title. Use empty string to hide the title completely. + Parameter id is the id of the custom time bar, and is undefined by default. + + + setData({
  groups: groups,
  items: items
}) none Set both groups and items at once. Both properties are optional. This is a convenience method for individually calling both setItems(items) and setGroups(groups). Both items and groups can be an Array with Objects, - a DataSet, or a DataView. For each of the groups, the items of the - timeline are filtered on the property group, which - must correspond with the id of the group. + a DataSet (offering 2 way data binding), or a DataView (offering 1 way data binding). + For each of the groups, the items of the timeline are filtered on the + property group, which must correspond with the id of the group. @@ -1131,9 +1249,9 @@ document.getElementById('myTimeline').onclick = function (event) { none Set a data set with groups for the Timeline. groups can be an Array with Objects, - a DataSet, or a DataView. For each of the groups, the items of the - timeline are filtered on the property group, which - must correspond with the id of the group. + a DataSet (offering 2 way data binding), or a DataView (offering 1 way data binding). + For each of the groups, the items of the timeline are filtered on the + property group, which must correspond with the id of the group. @@ -1142,7 +1260,7 @@ document.getElementById('myTimeline').onclick = function (event) { none Set a data set with items for the Timeline. items can be an Array with Objects, - a DataSet, or a DataView. + a DataSet (offering 2 way data binding), or a DataView (offering 1 way data binding). @@ -1256,6 +1374,23 @@ timeline.off('select', onSelect); + + groupDragged + + Passes the id of the dragged group. + + Fired after the dragging of a group is finished. + + + + + changed + + Has no properties. + + Fired once after each graph redraw. + + rangechange @@ -1402,7 +1537,7 @@ var items = new vis.DataSet([ };
- A full example is available here: 08_manipulation_callbacks.html. + A full example is available here: editingItemsCallbacks.html.

Templates

@@ -1540,6 +1675,32 @@ var options = { +

Time zone

+

+ By default, the Timeline displays time in local time. To display a Timeline in an other time zone or in UTC, the date constructor can be overloaded via the configuration option moment, which by default is the constructor function of moment.js. More information about UTC with moment.js can be found in the docs: http://momentjs.com/docs/#/parsing/utc/. +

+ +

+ Examples: +

+ +
// display in UTC
+var options = {
+  moment: function(date) {
+    return vis.moment(date).utc();
+  }
+};
+
+// display in UTC +08:00
+var options = {
+  moment: function(date) {
+    return vis.moment(date).utcOffset('+08:00');
+  }
+};
+
+ + +

Styles

All parts of the Timeline have a class name and a default css style. @@ -1617,13 +1778,6 @@ var options = { </style> - -

Data Policy

-

- All code and data is processed and rendered in the browser. - No data is sent to any server. -

- + + +

+ This example demonstrates editable groups (for now only reordering). +

+
+ + + + \ No newline at end of file diff --git a/lib/vis/examples/timeline/other/timezone.html b/lib/vis/examples/timeline/other/timezone.html new file mode 100644 index 0000000000..fd7a22c00b --- /dev/null +++ b/lib/vis/examples/timeline/other/timezone.html @@ -0,0 +1,80 @@ + + + + Timeline | Time zone + + + + + + + + + +

Time zone

+ +

+ The following demo shows how to display items in local time (default), in UTC, or for a specific time zone offset. By configuring your own moment constructor, you can display items in the time zone that you want. All timelines have the same start and end date. +

+ +

Local time

+
+ +

UTC

+
+ +

UTC +08:00

+
+ + + + + + \ No newline at end of file diff --git a/lib/vis/gulpfile.js b/lib/vis/gulpfile.js index 636061b93b..af46d93fed 100644 --- a/lib/vis/gulpfile.js +++ b/lib/vis/gulpfile.js @@ -100,6 +100,7 @@ gulp.task('bundle-css', ['clean'], function () { var files = [ './lib/shared/activator.css', './lib/shared/bootstrap.css', + './lib/shared/configuration.css', './lib/timeline/component/css/timeline.css', './lib/timeline/component/css/panel.css', @@ -115,9 +116,8 @@ gulp.task('bundle-css', ['clean'], function () { './lib/timeline/component/css/pathStyles.css', './lib/network/css/network-manipulation.css', - './lib/network/css/network-navigation.css', './lib/network/css/network-tooltip.css', - './lib/network/css/network-configuration.css', + './lib/network/css/network-navigation.css', './lib/network/css/network-colorpicker.css' ]; @@ -132,13 +132,13 @@ gulp.task('bundle-css', ['clean'], function () { }); gulp.task('copy', ['clean'], function () { - var network = gulp.src('./lib/network/img/**/*') + var network = gulp.src('./lib/network/img/**/*') .pipe(gulp.dest(DIST + '/img/network')); - var timeline = gulp.src('./lib/timeline/img/**/*') + var timeline = gulp.src('./lib/timeline/img/**/*') .pipe(gulp.dest(DIST + '/img/timeline')); - return merge(network, timeline); + return merge(network, timeline); }); gulp.task('minify', ['bundle-js'], function (cb) { @@ -148,7 +148,7 @@ gulp.task('minify', ['bundle-js'], function (cb) { // any issues when concatenating the file downstream (the file ends // with a comment). fs.writeFileSync(DIST + '/' + VIS_MIN_JS, result.code + '\n'); - fs.writeFileSync(DIST + '/' + VIS_MAP, result.map); + fs.writeFileSync(DIST + '/' + VIS_MAP, result.map.replace(/"\.\/dist\//g, '"')); cb(); }); diff --git a/lib/vis/index.js b/lib/vis/index.js index 71ef933895..d84e82e8da 100644 --- a/lib/vis/index.js +++ b/lib/vis/index.js @@ -22,8 +22,8 @@ exports.graph3d = { exports.Timeline = require('./lib/timeline/Timeline'); exports.Graph2d = require('./lib/timeline/Graph2d'); exports.timeline = { + Core: require('./lib/timeline/Core'), DateUtil: require('./lib/timeline/DateUtil'), - DataStep: require('./lib/timeline/DataStep'), Range: require('./lib/timeline/Range'), stack: require('./lib/timeline/Stack'), TimeStep: require('./lib/timeline/TimeStep'), @@ -37,13 +37,14 @@ exports.timeline = { RangeItem: require('./lib/timeline/component/item/RangeItem') }, + BackgroundGroup: require('./lib/timeline/component/BackgroundGroup'), Component: require('./lib/timeline/component/Component'), CurrentTime: require('./lib/timeline/component/CurrentTime'), CustomTime: require('./lib/timeline/component/CustomTime'), DataAxis: require('./lib/timeline/component/DataAxis'), + DataScale: require('./lib/timeline/component/DataScale'), GraphGroup: require('./lib/timeline/component/GraphGroup'), Group: require('./lib/timeline/component/Group'), - BackgroundGroup: require('./lib/timeline/component/BackgroundGroup'), ItemSet: require('./lib/timeline/component/ItemSet'), Legend: require('./lib/timeline/component/Legend'), LineGraph: require('./lib/timeline/component/LineGraph'), @@ -62,13 +63,7 @@ exports.network = { exports.network.convertDot = function (input) {return exports.network.dotparser.DOTToGraph(input)}; exports.network.convertGephi = function (input,options) {return exports.network.gephiParser.parseGephi(input,options)}; -// Deprecated since v3.0.0 -exports.Graph = function () { - throw new Error('Graph is renamed to Network. Please create a graph as new vis.Network(...)'); -}; - // bundled external libraries exports.moment = require('./lib/module/moment'); -exports.hammer = require('./lib/module/hammer'); // TODO: deprecate exports.hammer some day exports.Hammer = require('./lib/module/hammer'); exports.keycharm = require('keycharm'); \ No newline at end of file diff --git a/lib/vis/lib/DOMutil.js b/lib/vis/lib/DOMutil.js index ebedeb21b4..1e778bc0f8 100644 --- a/lib/vis/lib/DOMutil.js +++ b/lib/vis/lib/DOMutil.js @@ -36,6 +36,16 @@ exports.cleanupElements = function(JSONcontainer) { } }; +/** + * Ensures that all elements are removed first up so they can be recreated cleanly + * @param JSONcontainer + */ +exports.resetElements = function(JSONcontainer) { + exports.prepareElements(JSONcontainer); + exports.cleanupElements(JSONcontainer); + exports.prepareElements(JSONcontainer); +} + /** * Allocate or generate an SVG element if needed. Store a reference to it in the JSON container and draw it in the svgContainer * the JSON container and the SVG container have to be supplied so other svg containers (like the legend) can use this. @@ -149,8 +159,8 @@ exports.drawPoint = function(x, y, groupTemplate, JSONcontainer, svgContainer, l point.setAttributeNS(null, "height", groupTemplate.size); } - if (groupTemplate.style !== undefined) { - point.setAttributeNS(null, "style", groupTemplate.style); + if (groupTemplate.styles !== undefined) { + point.setAttributeNS(null, "style", groupTemplate.styles); } point.setAttributeNS(null, "class", groupTemplate.className + " vis-point"); //handle label diff --git a/lib/vis/lib/DataSet.js b/lib/vis/lib/DataSet.js index e8d1c973ca..fbc6b92a06 100644 --- a/lib/vis/lib/DataSet.js +++ b/lib/vis/lib/DataSet.js @@ -60,15 +60,15 @@ function DataSet (data, options) { // all variants of a Date are internally stored as Date, so we can convert // from everything to everything (also from ISODate to Number for example) if (this._options.type) { - for (var field in this._options.type) { - if (this._options.type.hasOwnProperty(field)) { - var value = this._options.type[field]; - if (value == 'Date' || value == 'ISODate' || value == 'ASPDate') { - this._type[field] = 'Date'; - } - else { - this._type[field] = value; - } + var fields = Object.keys(this._options.type); + for (var i = 0, len = fields.length; i < len; i++) { + var field = fields[i]; + var value = this._options.type[field]; + if (value == 'Date' || value == 'ISODate' || value == 'ASPDate') { + this._type[field] = 'Date'; + } + else { + this._type[field] = value; } } } @@ -184,7 +184,7 @@ DataSet.prototype._trigger = function (event, params, senderId) { subscribers = subscribers.concat(this._subscribers['*']); } - for (var i = 0; i < subscribers.length; i++) { + for (var i = 0, len = subscribers.length; i < len; i++) { var subscriber = subscribers[i]; if (subscriber.callback) { subscriber.callback(event, params, senderId || null); @@ -236,6 +236,7 @@ DataSet.prototype.add = function (data, senderId) { DataSet.prototype.update = function (data, senderId) { var addedIds = []; var updatedIds = []; + var oldData = []; var updatedData = []; var me = this; var fieldId = me._fieldId; @@ -243,10 +244,12 @@ DataSet.prototype.update = function (data, senderId) { var addOrUpdate = function (item) { var id = item[fieldId]; if (me._data[id]) { + var oldItem = util.extend({}, me._data[id]); // update item id = me._updateItem(item); updatedIds.push(id); updatedData.push(item); + oldData.push(oldItem); } else { // add new item @@ -258,7 +261,11 @@ DataSet.prototype.update = function (data, senderId) { if (Array.isArray(data)) { // Array for (var i = 0, len = data.length; i < len; i++) { - addOrUpdate(data[i]); + if (data[i] instanceof Object){ + addOrUpdate(data[i]); + } else { + console.warn('Ignoring input item, which is not an object at index ' + i); + } } } else if (data instanceof Object) { @@ -273,7 +280,15 @@ DataSet.prototype.update = function (data, senderId) { this._trigger('add', {items: addedIds}, senderId); } if (updatedIds.length) { - this._trigger('update', {items: updatedIds, data: updatedData}, senderId); + var props = { items: updatedIds, oldData: oldData, data: updatedData }; + // TODO: remove deprecated property 'data' some day + //Object.defineProperty(props, 'data', { + // 'get': (function() { + // console.warn('Property data is deprecated. Use DataSet.get(ids) to retrieve the new data, use the oldData property on this object to get the old data'); + // return updatedData; + // }).bind(this) + //}); + this._trigger('update', props, senderId); } return addedIds.concat(updatedIds); @@ -340,13 +355,13 @@ DataSet.prototype.get = function (args) { // build options var type = options && options.type || this._options.type; var filter = options && options.filter; - var items = [], item, itemId, i, len; + var items = [], item, itemIds, itemId, i, len; // convert items if (id != undefined) { // return a single item item = me._getItem(id, type); - if (filter && !filter(item)) { + if (item && filter && !filter(item)) { item = null; } } @@ -361,12 +376,12 @@ DataSet.prototype.get = function (args) { } else { // return all items - for (itemId in this._data) { - if (this._data.hasOwnProperty(itemId)) { - item = me._getItem(itemId, type); - if (!filter || filter(item)) { - items.push(item); - } + itemIds = Object.keys(this._data); + for (i = 0, len = itemIds.length; i < len; i++) { + itemId = itemIds[i]; + item = me._getItem(itemId, type); + if (!filter || filter(item)) { + items.push(item); } } } @@ -391,9 +406,11 @@ DataSet.prototype.get = function (args) { // return the results if (returnType == 'Object') { - var result = {}; - for (i = 0; i < items.length; i++) { - result[items[i].id] = items[i]; + var result = {}, + resultant; + for (i = 0, len = items.length; i < len; i++) { + resultant = items[i]; + result[resultant.id] = resultant; } return result; } @@ -422,6 +439,7 @@ DataSet.prototype.getIds = function (options) { filter = options && options.filter, order = options && options.order, type = options && options.type || this._options.type, + itemIds = Object.keys(data), i, len, id, @@ -434,29 +452,27 @@ DataSet.prototype.getIds = function (options) { if (order) { // create ordered list items = []; - for (id in data) { - if (data.hasOwnProperty(id)) { - item = this._getItem(id, type); - if (filter(item)) { - items.push(item); - } + for (i = 0, len = itemIds.length; i < len; i++) { + id = itemIds[i]; + item = this._getItem(id, type); + if (filter(item)) { + items.push(item); } } this._sort(items, order); for (i = 0, len = items.length; i < len; i++) { - ids[i] = items[i][this._fieldId]; + ids.push(items[i][this._fieldId]); } } else { // create unordered list - for (id in data) { - if (data.hasOwnProperty(id)) { - item = this._getItem(id, type); - if (filter(item)) { - ids.push(item[this._fieldId]); - } + for (i = 0, len = itemIds.length; i < len; i++) { + id = itemIds[i]; + item = this._getItem(id, type); + if (filter(item)) { + ids.push(item[this._fieldId]); } } } @@ -466,25 +482,23 @@ DataSet.prototype.getIds = function (options) { if (order) { // create an ordered list items = []; - for (id in data) { - if (data.hasOwnProperty(id)) { - items.push(data[id]); - } + for (i = 0, len = itemIds.length; i < len; i++) { + id = itemIds[i]; + items.push(data[id]); } this._sort(items, order); for (i = 0, len = items.length; i < len; i++) { - ids[i] = items[i][this._fieldId]; + ids.push(items[i][this._fieldId]); } } else { // create unordered list - for (id in data) { - if (data.hasOwnProperty(id)) { - item = data[id]; - ids.push(item[this._fieldId]); - } + for (i = 0, len = itemIds.length; i < len; i++) { + id = itemIds[i]; + item = data[id]; + ids.push(item[this._fieldId]); } } } @@ -514,6 +528,9 @@ DataSet.prototype.forEach = function (callback, options) { var filter = options && options.filter, type = options && options.type || this._options.type, data = this._data, + itemIds = Object.keys(data), + i, + len, item, id; @@ -521,7 +538,7 @@ DataSet.prototype.forEach = function (callback, options) { // execute forEach on ordered list var items = this.get(options); - for (var i = 0, len = items.length; i < len; i++) { + for (i = 0, len = items.length; i < len; i++) { item = items[i]; id = item[this._fieldId]; callback(item, id); @@ -529,12 +546,11 @@ DataSet.prototype.forEach = function (callback, options) { } else { // unordered - for (id in data) { - if (data.hasOwnProperty(id)) { - item = this._getItem(id, type); - if (!filter || filter(item)) { - callback(item, id); - } + for (i = 0, len = itemIds.length; i < len; i++) { + id = itemIds[i]; + item = this._getItem(id, type); + if (!filter || filter(item)) { + callback(item, id); } } } @@ -556,15 +572,18 @@ DataSet.prototype.map = function (callback, options) { type = options && options.type || this._options.type, mappedItems = [], data = this._data, + itemIds = Object.keys(data), + i, + len, + id, item; // convert and filter items - for (var id in data) { - if (data.hasOwnProperty(id)) { - item = this._getItem(id, type); - if (!filter || filter(item)) { - mappedItems.push(callback(item, id)); - } + for (i = 0, len = itemIds.length; i < len; i++) { + id = itemIds[i]; + item = this._getItem(id, type); + if (!filter || filter(item)) { + mappedItems.push(callback(item, id)); } } @@ -588,17 +607,23 @@ DataSet.prototype._filterFields = function (item, fields) { return item; } - var filteredItem = {}; + var filteredItem = {}, + itemFields = Object.keys(item), + len = itemFields.length, + i, + field; if(Array.isArray(fields)){ - for (var field in item) { - if (item.hasOwnProperty(field) && (fields.indexOf(field) != -1)) { + for (i = 0; i < len; i++) { + field = itemFields[i]; + if (fields.indexOf(field) != -1) { filteredItem[field] = item[field]; } } }else{ - for (var field in item) { - if (item.hasOwnProperty(field) && fields.hasOwnProperty(field)) { + for (i = 0; i < len; i++) { + field = itemFields[i]; + if (fields.hasOwnProperty(field)) { filteredItem[fields[field]] = item[field]; } } @@ -683,7 +708,7 @@ DataSet.prototype._remove = function (id) { } else if (id instanceof Object) { var itemId = id[this._fieldId]; - if (itemId && this._data[itemId]) { + if (itemId !== undefined && this._data[itemId]) { delete this._data[itemId]; this.length--; return itemId; @@ -715,17 +740,19 @@ DataSet.prototype.clear = function (senderId) { */ DataSet.prototype.max = function (field) { var data = this._data, + itemIds = Object.keys(data), max = null, - maxField = null; + maxField = null, + i, + len; - for (var id in data) { - if (data.hasOwnProperty(id)) { - var item = data[id]; - var itemField = item[field]; - if (itemField != null && (!max || itemField > maxField)) { - max = item; - maxField = itemField; - } + for (i = 0, len = itemIds.length; i < len; i++) { + var id = itemIds[i]; + var item = data[id]; + var itemField = item[field]; + if (itemField != null && (!max || itemField > maxField)) { + max = item; + maxField = itemField; } } @@ -739,17 +766,19 @@ DataSet.prototype.max = function (field) { */ DataSet.prototype.min = function (field) { var data = this._data, + itemIds = Object.keys(data), min = null, - minField = null; + minField = null, + i, + len; - for (var id in data) { - if (data.hasOwnProperty(id)) { - var item = data[id]; - var itemField = item[field]; - if (itemField != null && (!min || itemField < minField)) { - min = item; - minField = itemField; - } + for (i = 0, len = itemIds.length; i < len; i++) { + var id = itemIds[i]; + var item = data[id]; + var itemField = item[field]; + if (itemField != null && (!min || itemField < minField)) { + min = item; + minField = itemField; } } @@ -765,31 +794,33 @@ DataSet.prototype.min = function (field) { */ DataSet.prototype.distinct = function (field) { var data = this._data; + var itemIds = Object.keys(data); var values = []; var fieldType = this._options.type && this._options.type[field] || null; var count = 0; - var i; + var i, + j, + len; - for (var prop in data) { - if (data.hasOwnProperty(prop)) { - var item = data[prop]; - var value = item[field]; - var exists = false; - for (i = 0; i < count; i++) { - if (values[i] == value) { - exists = true; - break; - } - } - if (!exists && (value !== undefined)) { - values[count] = value; - count++; + for (i = 0, len = itemIds.length; i < len; i++) { + var id = itemIds[i]; + var item = data[id]; + var value = item[field]; + var exists = false; + for (j = 0; j < count; j++) { + if (values[j] == value) { + exists = true; + break; } } + if (!exists && (value !== undefined)) { + values[count] = value; + count++; + } } if (fieldType) { - for (i = 0; i < values.length; i++) { + for (i = 0, len = values.length; i < len; i++) { values[i] = util.convert(values[i], fieldType); } } @@ -819,12 +850,14 @@ DataSet.prototype._addItem = function (item) { item[this._fieldId] = id; } - var d = {}; - for (var field in item) { - if (item.hasOwnProperty(field)) { - var fieldType = this._type[field]; // type may be undefined - d[field] = util.convert(item[field], fieldType); - } + var d = {}, + fields = Object.keys(item), + i, + len; + for (i = 0, len = fields.length; i < len; i++) { + var field = fields[i]; + var fieldType = this._type[field]; // type may be undefined + d[field] = util.convert(item[field], fieldType); } this._data[id] = d; this.length++; @@ -840,7 +873,7 @@ DataSet.prototype._addItem = function (item) { * @private */ DataSet.prototype._getItem = function (id, types) { - var field, value; + var field, value, i, len; // get the item from the dataset var raw = this._data[id]; @@ -849,22 +882,22 @@ DataSet.prototype._getItem = function (id, types) { } // convert the items field types - var converted = {}; + var converted = {}, + fields = Object.keys(raw); + if (types) { - for (field in raw) { - if (raw.hasOwnProperty(field)) { - value = raw[field]; - converted[field] = util.convert(value, types[field]); - } + for (i = 0, len = fields.length; i < len; i++) { + field = fields[i]; + value = raw[field]; + converted[field] = util.convert(value, types[field]); } } else { // no field types specified, no converting needed - for (field in raw) { - if (raw.hasOwnProperty(field)) { - value = raw[field]; - converted[field] = value; - } + for (i = 0, len = fields.length; i < len; i++) { + field = fields[i]; + value = raw[field]; + converted[field] = value; } } return converted; @@ -890,11 +923,11 @@ DataSet.prototype._updateItem = function (item) { } // merge with current item - for (var field in item) { - if (item.hasOwnProperty(field)) { - var fieldType = this._type[field]; // type may be undefined - d[field] = util.convert(item[field], fieldType); - } + var fields = Object.keys(item); + for (var i = 0, len = fields.length; i < len; i++) { + var field = fields[i]; + var fieldType = this._type[field]; // type may be undefined + d[field] = util.convert(item[field], fieldType); } return id; diff --git a/lib/vis/lib/DataView.js b/lib/vis/lib/DataView.js index 39da84ab3a..32a7325ab6 100644 --- a/lib/vis/lib/DataView.js +++ b/lib/vis/lib/DataView.js @@ -35,7 +35,7 @@ function DataView (data, options) { * @param {DataSet | DataView} data */ DataView.prototype.setData = function (data) { - var ids, i, len; + var ids, id, i, len; if (this._data) { // unsubscribe from current dataset @@ -44,12 +44,7 @@ DataView.prototype.setData = function (data) { } // trigger a remove of all items in memory - ids = []; - for (var id in this._ids) { - if (this._ids.hasOwnProperty(id)) { - ids.push(id); - } - } + ids = Object.keys(this._ids); this._ids = {}; this.length = 0; this._trigger('remove', {items: ids}); @@ -84,34 +79,34 @@ DataView.prototype.setData = function (data) { * containing a variable parameter. */ DataView.prototype.refresh = function () { - var id; + var id, i, len; var ids = this._data.getIds({filter: this._options && this._options.filter}); + var oldIds = Object.keys(this._ids); var newIds = {}; var added = []; var removed = []; // check for additions - for (var i = 0; i < ids.length; i++) { + for (i = 0, len = ids.length; i < len; i++) { id = ids[i]; newIds[id] = true; if (!this._ids[id]) { added.push(id); this._ids[id] = true; - this.length++; } } // check for removals - for (id in this._ids) { - if (this._ids.hasOwnProperty(id)) { - if (!newIds[id]) { - removed.push(id); - delete this._ids[id]; - this.length--; - } + for (i = 0, len = oldIds.length; i < len; i++) { + id = oldIds[i]; + if (!newIds[id]) { + removed.push(id); + delete this._ids[id]; } } + this.length += added.length - removed.length; + // trigger events if (added.length) { this._trigger('add', {items: added}); @@ -235,6 +230,49 @@ DataView.prototype.getIds = function (options) { return ids; }; +/** + * Map every item in the dataset. + * @param {function} callback + * @param {Object} [options] Available options: + * {Object.} [type] + * {String[]} [fields] filter fields + * {function} [filter] filter items + * {String | function} [order] Order the items by + * a field name or custom sort function. + * @return {Object[]} mappedItems + */ +DataView.prototype.map = function (callback,options) { + var mappedItems = []; + if (this._data) { + var defaultFilter = this._options.filter; + var filter; + + if (options && options.filter) { + if (defaultFilter) { + filter = function (item) { + return defaultFilter(item) && options.filter(item); + } + } + else { + filter = options.filter; + } + } + else { + filter = defaultFilter; + } + + mappedItems = this._data.map(callback,{ + filter: filter, + order: options && options.order + }); + } + else { + mappedItems = []; + } + + return mappedItems; +}; + /** * Get the DataSet to which this DataView is connected. In case there is a chain * of multiple DataViews, the root DataSet of this chain is returned. diff --git a/lib/vis/lib/graph3d/Graph3d.js b/lib/vis/lib/graph3d/Graph3d.js index 20c7b6b1e5..6839007957 100644 --- a/lib/vis/lib/graph3d/Graph3d.js +++ b/lib/vis/lib/graph3d/Graph3d.js @@ -96,6 +96,8 @@ function Graph3d(container, data, options) { strokeWidth: 1 // px }; + this.dotSizeRatio = 0.02; // size of the dots as a fraction of the graph width + // create a frame and canvas this.create(); @@ -844,6 +846,8 @@ Graph3d.prototype.setOptions = function (options) { if (options.yValueLabel !== undefined) this.yValueLabel = options.yValueLabel; if (options.zValueLabel !== undefined) this.zValueLabel = options.zValueLabel; + if (options.dotSizeRatio !== undefined) this.dotSizeRatio = options.dotSizeRatio; + if (options.style !== undefined) { var styleNumber = this._getStyleNumber(options.style); if (styleNumber !== -1) { @@ -976,7 +980,7 @@ Graph3d.prototype._redrawLegend = function() { if (this.style === Graph3d.STYLE.DOTCOLOR || this.style === Graph3d.STYLE.DOTSIZE) { - var dotSize = this.frame.clientWidth * 0.02; + var dotSize = this.frame.clientWidth * this.dotSizeRatio; var widthMin, widthMax; if (this.style === Graph3d.STYLE.DOTSIZE) { @@ -1613,7 +1617,7 @@ Graph3d.prototype._redrawDataDot = function() { this.dataPoints.sort(sortDepth); // draw the datapoints as colored circles - var dotSize = this.frame.clientWidth * 0.02; // px + var dotSize = this.frame.clientWidth * this.dotSizeRatio; // px for (i = 0; i < this.dataPoints.length; i++) { var point = this.dataPoints[i]; diff --git a/lib/vis/lib/hammerUtil.js b/lib/vis/lib/hammerUtil.js index 9a2f161511..4e1b79d2a8 100644 --- a/lib/vis/lib/hammerUtil.js +++ b/lib/vis/lib/hammerUtil.js @@ -7,23 +7,14 @@ var Hammer = require('./module/hammer'); */ exports.onTouch = function (hammer, callback) { callback.inputHandler = function (event) { - if (event.isFirst && !isTouching) { + if (event.isFirst) { callback(event); - - isTouching = true; - setTimeout(function () { - isTouching = false; - }, 0); } }; hammer.on('hammer.input', callback.inputHandler); }; -// isTouching is true while a touch action is being emitted -// this is a hack to prevent `touch` from being fired twice -var isTouching = false; - /** * Register a release event, taking place after a gesture * @param {Hammer} hammer A hammer instance @@ -31,13 +22,8 @@ var isTouching = false; */ exports.onRelease = function (hammer, callback) { callback.inputHandler = function (event) { - if (event.isFinal && !isReleasing) { + if (event.isFinal) { callback(event); - - isReleasing = true; - setTimeout(function () { - isReleasing = false; - }, 0); } }; @@ -45,11 +31,6 @@ exports.onRelease = function (hammer, callback) { }; -// isReleasing is true while a release action is being emitted -// this is a hack to prevent `release` from being fired twice -var isReleasing = false; - - /** * Unregister a touch event, taking place before a gesture * @param {Hammer} hammer A hammer instance diff --git a/lib/vis/lib/header.js b/lib/vis/lib/header.js index 2c8a3431d2..3045a79719 100644 --- a/lib/vis/lib/header.js +++ b/lib/vis/lib/header.js @@ -8,7 +8,7 @@ * @date @@date * * @license - * Copyright (C) 2011-2014 Almende B.V, http://almende.com + * Copyright (C) 2011-2016 Almende B.V, http://almende.com * * Vis.js is dual licensed under both * diff --git a/lib/vis/lib/network/Images.js b/lib/vis/lib/network/Images.js index a7354fae98..464e4585bf 100644 --- a/lib/vis/lib/network/Images.js +++ b/lib/vis/lib/network/Images.js @@ -2,71 +2,91 @@ * @class Images * This class loads images and keeps them stored. */ -function Images(callback) { - this.images = {}; - this.imageBroken = {}; - this.callback = callback; - +class Images{ + constructor(callback){ + this.images = {}; + this.imageBroken = {}; + this.callback = callback; + } + + /** + * @param {string} url The Url to cache the image as + * @return {Image} imageToLoadBrokenUrlOn The image object + */ + _addImageToCache (url, imageToCache) { + // IE11 fix -- thanks dponch! + if (imageToCache.width === 0) { + document.body.appendChild(imageToCache); + imageToCache.width = imageToCache.offsetWidth; + imageToCache.height = imageToCache.offsetHeight; + document.body.removeChild(imageToCache); + } + + this.images[url] = imageToCache; + } + + /** + * @param {string} url The original Url that failed to load, if the broken image is successfully loaded it will be added to the cache using this Url as the key so that subsequent requests for this Url will return the broken image + * @param {string} brokenUrl Url the broken image to try and load + * @return {Image} imageToLoadBrokenUrlOn The image object + */ + _tryloadBrokenUrl (url, brokenUrl, imageToLoadBrokenUrlOn) { + //If any of the parameters aren't specified then exit the function because nothing constructive can be done + if (url === undefined || brokenUrl === undefined || imageToLoadBrokenUrlOn === undefined) return; + + //Clear the old subscription to the error event and put a new in place that only handle errors in loading the brokenImageUrl + imageToLoadBrokenUrlOn.onerror = () => { + console.error("Could not load brokenImage:", brokenUrl); + //Add an empty image to the cache so that when subsequent load calls are made for the url we don't try load the image and broken image again + this._addImageToCache(url, new Image()); + }; + + //Set the source of the image to the brokenUrl, this is actually what kicks off the loading of the broken image + imageToLoadBrokenUrlOn.src = brokenUrl; + } + + /** + * @return {Image} imageToRedrawWith The images that will be passed to the callback when it is invoked + */ + _redrawWithImage (imageToRedrawWith) { + if (this.callback) { + this.callback(imageToRedrawWith); + } + } + + /** + * @param {string} url Url of the image + * @param {string} brokenUrl Url of an image to use if the url image is not found + * @return {Image} img The image object + */ + load (url, brokenUrl, id) { + //Try and get the image from the cache, if successful then return the cached image + var cachedImage = this.images[url]; + if (cachedImage) return cachedImage; + + //Create a new image + var img = new Image(); + + //Subscribe to the event that is raised if the image loads successfully + img.onload = () => { + //Add the image to the cache and then request a redraw + this._addImageToCache(url, img); + this._redrawWithImage(img); + }; + + //Subscribe to the event that is raised if the image fails to load + img.onerror = () => { + console.error("Could not load image:", url); + //Try and load the image specified by the brokenUrl using + this._tryloadBrokenUrl(url, brokenUrl, img); + } + + //Set the source of the image to the url, this is actuall what kicks off the loading of the image + img.src = url; + + //Return the new image + return img; + } } -/** - * - * @param {string} url Url of the image - * @param {string} url Url of an image to use if the url image is not found - * @return {Image} img The image object - */ -Images.prototype.load = function(url, brokenUrl, id) { - var img = this.images[url]; // make a pointer - if (img === undefined) { - // create the image - var me = this; - img = new Image(); - img.onload = function () { - // IE11 fix -- thanks dponch! - if (this.width === 0) { - document.body.appendChild(this); - this.width = this.offsetWidth; - this.height = this.offsetHeight; - document.body.removeChild(this); - } - - if (me.callback) { - me.images[url] = img; - me.callback(this); - } - }; - - img.onerror = function () { - if (brokenUrl === undefined) { - console.error("Could not load image:", url); - delete this.src; - if (me.callback) { - me.callback(this); - } - } - else { - if (me.imageBroken[id] && me.imageBroken[id][url] === true) { - console.error("Could not load brokenImage:", brokenUrl); - delete this.src; - if (me.callback) { - me.callback(this); - } - } - else { - console.error("Could not load image:", url); - this.src = brokenUrl; - if (me.imageBroken[id] === undefined) { - me.imageBroken[id] = {}; - } - me.imageBroken[id][url] = true; - } - } - }; - - img.src = url; - } - - return img; -}; - -module.exports = Images; +export default Images; \ No newline at end of file diff --git a/lib/vis/lib/network/Network.js b/lib/vis/lib/network/Network.js index 4a83cc5f3d..68d10c76c3 100644 --- a/lib/vis/lib/network/Network.js +++ b/lib/vis/lib/network/Network.js @@ -24,11 +24,11 @@ import InteractionHandler from './modules/InteractionHandler'; import SelectionHandler from "./modules/SelectionHandler"; import LayoutEngine from "./modules/LayoutEngine"; import ManipulationSystem from "./modules/ManipulationSystem"; -import Configurator from "./../shared/Configurator"; +import Configurator from "./../shared/Configurator"; import Validator from "./../shared/Validator"; import {printStyle} from "./../shared/Validator"; import {allOptions, configureOptions} from './options.js'; - +import KamadaKawai from "./modules/KamadaKawai.js" /** @@ -92,6 +92,7 @@ function Network(container, data, options) { createEdge: function() {}, getPointer: function() {} }, + modules: {}, view: { scale: 1, translation: {x: 0, y: 0} @@ -119,6 +120,9 @@ function Network(container, data, options) { this.nodesHandler = new NodesHandler(this.body, this.images, this.groups, this.layoutEngine); // Handle adding, deleting and updating of nodes as well as global options this.edgesHandler = new EdgesHandler(this.body, this.images, this.groups); // Handle adding, deleting and updating of edges as well as global options + this.body.modules["kamadaKawai"] = new KamadaKawai(this.body,150,0.05); // Layouting algorithm. + this.body.modules["clustering"] = this.clustering; + // create the DOM elements this.canvas._create(); @@ -140,7 +144,6 @@ Emitter(Network.prototype); */ Network.prototype.setOptions = function (options) { if (options !== undefined) { - let errorFound = Validator.validate(options, allOptions); if (errorFound === true) { console.log('%cErrors have been found in the supplied options object.', printStyle); @@ -243,7 +246,7 @@ Network.prototype._updateVisibleIndices = function () { for (let nodeId in nodes) { if (nodes.hasOwnProperty(nodeId)) { if (nodes[nodeId].options.hidden === false) { - this.body.nodeIndices.push(nodeId); + this.body.nodeIndices.push(nodes[nodeId].id); } } } @@ -251,7 +254,7 @@ Network.prototype._updateVisibleIndices = function () { for (let edgeId in edges) { if (edges.hasOwnProperty(edgeId)) { if (edges[edgeId].options.hidden === false) { - this.body.edgeIndices.push(edgeId); + this.body.edgeIndices.push(edges[edgeId].id); } } } @@ -266,7 +269,6 @@ Network.prototype.bindEventListeners = function () { this.body.emitter.on("_dataChanged", () => { // update shortcut lists this._updateVisibleIndices(); - this.physics.updatePhysicsData(); this.body.emitter.emit("_requestRedraw"); // call the dataUpdated event because the only difference between the two is the updating of the indices this.body.emitter.emit("_dataUpdated"); @@ -332,6 +334,9 @@ Network.prototype.setData = function (data) { // emit change in data this.body.emitter.emit("_dataChanged"); + // emit data loaded + this.body.emitter.emit("_dataLoaded"); + // find a stable position or start animating to a stable position this.body.emitter.emit("initPhysics"); }; @@ -439,12 +444,13 @@ Network.prototype.enableEditMode = function() {return this.manipulation.ena Network.prototype.disableEditMode = function() {return this.manipulation.disableEditMode.apply(this.manipulation,arguments);}; Network.prototype.addNodeMode = function() {return this.manipulation.addNodeMode.apply(this.manipulation,arguments);}; Network.prototype.editNode = function() {return this.manipulation.editNode.apply(this.manipulation,arguments);}; -Network.prototype.editNodeMode = function() {console.log("Depricated: Please use editNode instead of editNodeMode."); return this.manipulation.editNode.apply(this.manipulation,arguments);}; +Network.prototype.editNodeMode = function() {console.log("Deprecated: Please use editNode instead of editNodeMode."); return this.manipulation.editNode.apply(this.manipulation,arguments);}; Network.prototype.addEdgeMode = function() {return this.manipulation.addEdgeMode.apply(this.manipulation,arguments);}; Network.prototype.editEdgeMode = function() {return this.manipulation.editEdgeMode.apply(this.manipulation,arguments);}; Network.prototype.deleteSelected = function() {return this.manipulation.deleteSelected.apply(this.manipulation,arguments);}; Network.prototype.getPositions = function() {return this.nodesHandler.getPositions.apply(this.nodesHandler,arguments);}; Network.prototype.storePositions = function() {return this.nodesHandler.storePositions.apply(this.nodesHandler,arguments);}; +Network.prototype.moveNode = function() {return this.nodesHandler.moveNode.apply(this.nodesHandler,arguments);}; Network.prototype.getBoundingBox = function() {return this.nodesHandler.getBoundingBox.apply(this.nodesHandler,arguments);}; Network.prototype.getConnectedNodes = function(objectId) { if (this.body.nodes[objectId] !== undefined) { @@ -459,6 +465,7 @@ Network.prototype.startSimulation = function() {return this.physics.startSim Network.prototype.stopSimulation = function() {return this.physics.stopSimulation.apply(this.physics,arguments);}; Network.prototype.stabilize = function() {return this.physics.stabilize.apply(this.physics,arguments);}; Network.prototype.getSelection = function() {return this.selectionHandler.getSelection.apply(this.selectionHandler,arguments);}; +Network.prototype.setSelection = function() {return this.selectionHandler.setSelection.apply(this.selectionHandler,arguments);}; Network.prototype.getSelectedNodes = function() {return this.selectionHandler.getSelectedNodes.apply(this.selectionHandler,arguments);}; Network.prototype.getSelectedEdges = function() {return this.selectionHandler.getSelectedEdges.apply(this.selectionHandler,arguments);}; Network.prototype.getNodeAt = function() { @@ -477,7 +484,10 @@ Network.prototype.getEdgeAt = function() { }; Network.prototype.selectNodes = function() {return this.selectionHandler.selectNodes.apply(this.selectionHandler,arguments);}; Network.prototype.selectEdges = function() {return this.selectionHandler.selectEdges.apply(this.selectionHandler,arguments);}; -Network.prototype.unselectAll = function() {return this.selectionHandler.unselectAll.apply(this.selectionHandler,arguments);}; +Network.prototype.unselectAll = function() { + this.selectionHandler.unselectAll.apply(this.selectionHandler,arguments); + this.redraw(); +}; Network.prototype.redraw = function() {return this.renderer.redraw.apply(this.renderer,arguments);}; Network.prototype.getScale = function() {return this.view.getScale.apply(this.view,arguments);}; Network.prototype.getViewPosition = function() {return this.view.getViewPosition.apply(this.view,arguments);}; @@ -493,4 +503,6 @@ Network.prototype.getOptionsFromConfigurator = function() { return options; }; + + module.exports = Network; diff --git a/lib/vis/lib/network/NetworkUtil.js b/lib/vis/lib/network/NetworkUtil.js new file mode 100644 index 0000000000..07fa313f3c --- /dev/null +++ b/lib/vis/lib/network/NetworkUtil.js @@ -0,0 +1,96 @@ +let util = require("../util"); +class NetworkUtil { + constructor() {} + + /** + * Find the center position of the network considering the bounding boxes + */ + static getRange(allNodes, specificNodes = []) { + var minY = 1e9, maxY = -1e9, minX = 1e9, maxX = -1e9, node; + if (specificNodes.length > 0) { + for (var i = 0; i < specificNodes.length; i++) { + node = allNodes[specificNodes[i]]; + if (minX > node.shape.boundingBox.left) { + minX = node.shape.boundingBox.left; + } + if (maxX < node.shape.boundingBox.right) { + maxX = node.shape.boundingBox.right; + } + if (minY > node.shape.boundingBox.top) { + minY = node.shape.boundingBox.top; + } // top is negative, bottom is positive + if (maxY < node.shape.boundingBox.bottom) { + maxY = node.shape.boundingBox.bottom; + } // top is negative, bottom is positive + } + } + + if (minX === 1e9 && maxX === -1e9 && minY === 1e9 && maxY === -1e9) { + minY = 0, maxY = 0, minX = 0, maxX = 0; + } + return {minX: minX, maxX: maxX, minY: minY, maxY: maxY}; + } + + /** + * Find the center position of the network + */ + static getRangeCore(allNodes, specificNodes = []) { + var minY = 1e9, maxY = -1e9, minX = 1e9, maxX = -1e9, node; + if (specificNodes.length > 0) { + for (var i = 0; i < specificNodes.length; i++) { + node = allNodes[specificNodes[i]]; + if (minX > node.x) { + minX = node.x; + } + if (maxX < node.x) { + maxX = node.x; + } + if (minY > node.y) { + minY = node.y; + } // top is negative, bottom is positive + if (maxY < node.y) { + maxY = node.y; + } // top is negative, bottom is positive + } + } + + if (minX === 1e9 && maxX === -1e9 && minY === 1e9 && maxY === -1e9) { + minY = 0, maxY = 0, minX = 0, maxX = 0; + } + return {minX: minX, maxX: maxX, minY: minY, maxY: maxY}; + } + + + /** + * @param {object} range = {minX: minX, maxX: maxX, minY: minY, maxY: maxY}; + * @returns {{x: number, y: number}} + */ + static findCenter(range) { + return {x: (0.5 * (range.maxX + range.minX)), + y: (0.5 * (range.maxY + range.minY))}; + } + + + /** + * This returns a clone of the options or options of the edge or node to be used for construction of new edges or check functions for new nodes. + * @param item + * @param type + * @returns {{}} + */ + static cloneOptions(item, type) { + let clonedOptions = {}; + if (type === undefined || type === 'node') { + util.deepExtend(clonedOptions, item.options, true); + clonedOptions.x = item.x; + clonedOptions.y = item.y; + clonedOptions.amountOfConnections = item.edges.length; + } + else { + util.deepExtend(clonedOptions, item.options, true); + } + return clonedOptions; + } + +} + +export default NetworkUtil; \ No newline at end of file diff --git a/lib/vis/lib/network/css/network-colorpicker.css b/lib/vis/lib/network/css/network-colorpicker.css index db1d49c631..07406fa859 100644 --- a/lib/vis/lib/network/css/network-colorpicker.css +++ b/lib/vis/lib/network/css/network-colorpicker.css @@ -1,14 +1,17 @@ div.vis-color-picker { position:absolute; + top: 0px; + left: 30px; margin-top:-140px; margin-left:30px; - width:293px; - height:425px; + width:310px; + height:444px; + z-index: 1; padding: 10px; border-radius:15px; background-color:#ffffff; - display:none; + display: none; box-shadow: rgba(0,0,0,0.5) 0px 0px 10px 0px; } @@ -18,8 +21,8 @@ div.vis-color-picker div.vis-arrow { left:5px; } -div.vis-color-picker div.vis-arrow:after, -div.vis-color-picker div.vis-arrow:before { +div.vis-color-picker div.vis-arrow::after, +div.vis-color-picker div.vis-arrow::before { right: 100%; top: 50%; border: solid transparent; diff --git a/lib/vis/lib/network/css/network-manipulation.css b/lib/vis/lib/network/css/network-manipulation.css index 6014a2a2d4..89c1dc2cb3 100644 --- a/lib/vis/lib/network/css/network-manipulation.css +++ b/lib/vis/lib/network/css/network-manipulation.css @@ -12,17 +12,18 @@ div.vis-network div.vis-manipulation { background: linear-gradient(to bottom, #ffffff 0%,#fcfcfc 48%,#fafafa 50%,#fcfcfc 100%); /* W3C */ filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffffff', endColorstr='#fcfcfc',GradientType=0 ); /* IE6-9 */ + padding-top:4px; position: absolute; left: 0; top: 0; width: 100%; - height: 30px; + height: 28px; } div.vis-network div.vis-edit-mode { position:absolute; left: 0; - top: 15px; + top: 5px; height: 30px; } @@ -53,8 +54,7 @@ div.vis-network div.vis-close:hover { div.vis-network div.vis-manipulation div.vis-button, div.vis-network div.vis-edit-mode div.vis-button { - position:relative; - top:-7px; + float:left; font-family: verdana; font-size: 12px; -moz-border-radius: 15px; @@ -63,8 +63,8 @@ div.vis-network div.vis-edit-mode div.vis-button { background-position: 0px 0px; background-repeat:no-repeat; height:24px; - margin: 0px 0px 0px 10px; - vertical-align:middle; + margin-left: 10px; + /*vertical-align:middle;*/ cursor: pointer; padding: 0px 8px 0px 8px; -webkit-touch-callout: none; @@ -130,11 +130,12 @@ div.vis-network div.vis-edit-mode div.vis-label { line-height: 25px; } div.vis-network div.vis-manipulation div.vis-separator-line { + float:left; display:inline-block; width:1px; - height:20px; + height:21px; background-color: #bdbdbd; - margin: 5px 7px 0 15px; + margin: 0px 7px 0 15px; /*top right bottom left*/ } /* TODO: is this redundant? diff --git a/lib/vis/lib/network/gephiParser.js b/lib/vis/lib/network/gephiParser.js index a7deb34e13..124d6b4543 100644 --- a/lib/vis/lib/network/gephiParser.js +++ b/lib/vis/lib/network/gephiParser.js @@ -27,6 +27,11 @@ function parseGephi(gephiJSON, optionsObj) { edge['from'] = gEdge.source; edge['to'] = gEdge.target; edge['attributes'] = gEdge.attributes; + edge['label'] = gEdge.label; + edge['title'] = gEdge.attributes !== undefined ? gEdge.attributes.title : undefined; + if (gEdge['type'] === 'Directed') { + edge['arrows'] = 'to'; + } // edge['value'] = gEdge.attributes !== undefined ? gEdge.attributes.Weight : undefined; // edge['width'] = edge['value'] !== undefined ? undefined : edgegEdge.size; if (gEdge.color && options.inheritColor === false) { @@ -44,6 +49,7 @@ function parseGephi(gephiJSON, optionsObj) { node['x'] = gNode.x; node['y'] = gNode.y; node['label'] = gNode.label; + node['title'] = gNode.attributes !== undefined ? gNode.attributes.title : undefined; if (options.nodes.parseColor === true) { node['color'] = gNode.color; } diff --git a/lib/vis/lib/network/locales.js b/lib/vis/lib/network/locales.js index 82bf0c5570..ba53f3a42d 100644 --- a/lib/vis/lib/network/locales.js +++ b/lib/vis/lib/network/locales.js @@ -17,6 +17,42 @@ exports['en'] = { exports['en_EN'] = exports['en']; exports['en_US'] = exports['en']; +// German +exports['de'] = { + edit: 'Editieren', + del: 'L\u00f6sche Auswahl', + back: 'Zur\u00fcck', + addNode: 'Knoten hinzuf\u00fcgen', + addEdge: 'Kante hinzuf\u00fcgen', + editNode: 'Knoten editieren', + editEdge: 'Kante editieren', + addDescription: 'Klicke auf eine freie Stelle, um einen neuen Knoten zu plazieren.', + edgeDescription: 'Klicke auf einen Knoten und ziehe die Kante zu einem anderen Knoten, um diese zu verbinden.', + editEdgeDescription: 'Klicke auf die Verbindungspunkte und ziehe diese auf einen Knoten, um sie zu verbinden.', + createEdgeError: 'Es ist nicht m\u00f6glich, Kanten mit Clustern zu verbinden.', + deleteClusterError: 'Cluster k\u00f6nnen nicht gel\u00f6scht werden.', + editClusterError: 'Cluster k\u00f6nnen nicht editiert werden.' +}; +exports['de_DE'] = exports['de']; + +// Spanish +exports['es'] = { + edit: 'Editar', + del: 'Eliminar selecci\u00f3n', + back: '\u00c1tras', + addNode: 'A\u00f1adir nodo', + addEdge: 'A\u00f1adir arista', + editNode: 'Editar nodo', + editEdge: 'Editar arista', + addDescription: 'Haga clic en un lugar vac\u00edo para colocar un nuevo nodo.', + edgeDescription: 'Haga clic en un nodo y arrastre la arista hacia otro nodo para conectarlos.', + editEdgeDescription: 'Haga clic en un punto de control y arrastrelo a un nodo para conectarlo.', + createEdgeError: 'No se puede conectar una arista a un grupo.', + deleteClusterError: 'No es posible eliminar grupos.', + editClusterError: 'No es posible editar grupos.' +}; +exports['es_ES'] = exports['es']; + // Dutch exports['nl'] = { edit: 'Wijzigen', diff --git a/lib/vis/lib/network/modules/Canvas.js b/lib/vis/lib/network/modules/Canvas.js index 5589712efa..9abe1f5df3 100644 --- a/lib/vis/lib/network/modules/Canvas.js +++ b/lib/vis/lib/network/modules/Canvas.js @@ -16,6 +16,7 @@ class Canvas { this.pixelRatio = 1; this.resizeTimer = undefined; this.resizeFunction = this._onResize.bind(this); + this.cameraState = {}; this.options = {}; this.defaultOptions = { @@ -82,6 +83,58 @@ class Canvas { this.body.emitter.emit("_redraw"); } + /** + * Get and store the cameraState + * @private + */ + _getCameraState(pixelRatio = this.pixelRatio) { + this.cameraState.previousWidth = this.frame.canvas.width / pixelRatio; + this.cameraState.previousHeight = this.frame.canvas.height / pixelRatio; + this.cameraState.scale = this.body.view.scale; + this.cameraState.position = this.DOMtoCanvas({x: 0.5 * this.frame.canvas.width / pixelRatio, y: 0.5 * this.frame.canvas.height / pixelRatio}); + } + + /** + * Set the cameraState + * @private + */ + _setCameraState() { + if (this.cameraState.scale !== undefined && + this.frame.canvas.clientWidth !== 0 && + this.frame.canvas.clientHeight !== 0 && + this.pixelRatio !== 0 && + this.cameraState.previousWidth > 0) { + + let widthRatio = (this.frame.canvas.width / this.pixelRatio) / this.cameraState.previousWidth; + let heightRatio = (this.frame.canvas.height / this.pixelRatio) / this.cameraState.previousHeight; + let newScale = this.cameraState.scale; + + if (widthRatio != 1 && heightRatio != 1) { + newScale = this.cameraState.scale * 0.5 * (widthRatio + heightRatio); + } + else if (widthRatio != 1) { + newScale = this.cameraState.scale * widthRatio; + } + else if (heightRatio != 1) { + newScale = this.cameraState.scale * heightRatio; + } + + this.body.view.scale = newScale; + // this comes from the view module. + var currentViewCenter = this.DOMtoCanvas({ + x: 0.5 * this.frame.canvas.clientWidth, + y: 0.5 * this.frame.canvas.clientHeight + }); + + var distanceFromCenter = { // offset from view, distance view has to change by these x and y to center the node + x: currentViewCenter.x - this.cameraState.position.x, + y: currentViewCenter.y - this.cameraState.position.y + }; + this.body.view.translation.x += distanceFromCenter.x * this.body.view.scale; + this.body.view.translation.y += distanceFromCenter.y * this.body.view.scale; + } + } + _prepareValue(value) { if (typeof value === 'number') { return value + 'px'; @@ -94,7 +147,7 @@ class Canvas { return value + 'px'; } } - throw new Error('Could not use the value supplie for width or height:' + value); + throw new Error('Could not use the value supplied for width or height:' + value); } @@ -201,7 +254,18 @@ class Canvas { let oldWidth = this.frame.canvas.width; let oldHeight = this.frame.canvas.height; + // update the pixel ratio + let ctx = this.frame.canvas.getContext("2d"); + let previousRatio = this.pixelRatio; // we cache this because the camera state storage needs the old value + this.pixelRatio = (window.devicePixelRatio || 1) / (ctx.webkitBackingStorePixelRatio || + ctx.mozBackingStorePixelRatio || + ctx.msBackingStorePixelRatio || + ctx.oBackingStorePixelRatio || + ctx.backingStorePixelRatio || 1); + if (width != this.options.width || height != this.options.height || this.frame.style.width != width || this.frame.style.height != height) { + this._getCameraState(previousRatio); + this.frame.style.width = width; this.frame.style.height = height; @@ -220,6 +284,11 @@ class Canvas { // this would adapt the width of the canvas to the width from 100% if and only if // there is a change. + // store the camera if there is a change in size. + if (this.frame.canvas.width != Math.round(this.frame.canvas.clientWidth * this.pixelRatio) || this.frame.canvas.height != Math.round(this.frame.canvas.clientHeight * this.pixelRatio)) { + this._getCameraState(previousRatio); + } + if (this.frame.canvas.width != Math.round(this.frame.canvas.clientWidth * this.pixelRatio)) { this.frame.canvas.width = Math.round(this.frame.canvas.clientWidth * this.pixelRatio); emitEvent = true; @@ -237,6 +306,9 @@ class Canvas { oldWidth: Math.round(oldWidth / this.pixelRatio), oldHeight: Math.round(oldHeight / this.pixelRatio) }); + + // restore the camera on change. + this._setCameraState(); } return emitEvent; diff --git a/lib/vis/lib/network/modules/CanvasRenderer.js b/lib/vis/lib/network/modules/CanvasRenderer.js index 51653c2b09..a6c4ae1b2c 100644 --- a/lib/vis/lib/network/modules/CanvasRenderer.js +++ b/lib/vis/lib/network/modules/CanvasRenderer.js @@ -57,6 +57,7 @@ class CanvasRenderer { }); this.body.emitter.on('destroy', () => { this.renderRequests = 0; + this.allowRedraw = false; this.renderingActive = false; if (this.requiresTimeout === true) { clearTimeout(this.renderTimer); @@ -146,13 +147,11 @@ class CanvasRenderer { this.canvas.setSize(); } - if (this.pixelRatio === undefined) { - this.pixelRatio = (window.devicePixelRatio || 1) / (ctx.webkitBackingStorePixelRatio || - ctx.mozBackingStorePixelRatio || - ctx.msBackingStorePixelRatio || - ctx.oBackingStorePixelRatio || - ctx.backingStorePixelRatio || 1); - } + this.pixelRatio = (window.devicePixelRatio || 1) / (ctx.webkitBackingStorePixelRatio || + ctx.mozBackingStorePixelRatio || + ctx.msBackingStorePixelRatio || + ctx.oBackingStorePixelRatio || + ctx.backingStorePixelRatio || 1); ctx.setTransform(this.pixelRatio, 0, 0, this.pixelRatio, 0, 0); @@ -161,6 +160,11 @@ class CanvasRenderer { let h = this.canvas.frame.canvas.clientHeight; ctx.clearRect(0, 0, w, h); + // if the div is hidden, we stop the redraw here for performance. + if (this.canvas.frame.clientWidth === 0) { + return; + } + // set scaling and translation ctx.save(); ctx.translate(this.body.view.translation.x, this.body.view.translation.y); @@ -180,17 +184,13 @@ class CanvasRenderer { this._drawNodes(ctx, hidden); } - if (this.controlNodesActive === true) { - this._drawControlNodes(ctx); - } - ctx.beginPath(); - //this.physics.nodesSolver._debug(ctx,"#F00F0F"); this.body.emitter.emit("afterDrawing", ctx); ctx.closePath(); + + // restore original scaling and translation ctx.restore(); - if (hidden === true) { ctx.clearRect(0, 0, w, h); } @@ -255,7 +255,6 @@ class CanvasRenderer { }); let viewableArea = {top:topLeft.y,left:topLeft.x,bottom:bottomRight.y,right:bottomRight.x}; - // draw unselected nodes; for (let i = 0; i < nodeIndices.length; i++) { node = nodes[nodeIndices[i]]; @@ -303,23 +302,6 @@ class CanvasRenderer { } } - /** - * Redraw all edges - * The 2d context of a HTML canvas can be retrieved by canvas.getContext('2d'); - * @param {CanvasRenderingContext2D} ctx - * @private - */ - _drawControlNodes(ctx) { - let edges = this.body.edges; - let edgeIndices = this.body.edgeIndices; - let edge; - - for (let i = 0; i < edgeIndices.length; i++) { - edge = edges[edgeIndices[i]]; - edge._drawControlNodes(ctx); - } - } - /** * Determine if the browser requires a setTimeout or a requestAnimationFrame. This was required because * some implementations (safari and IE9) did not support requestAnimationFrame diff --git a/lib/vis/lib/network/modules/Clustering.js b/lib/vis/lib/network/modules/Clustering.js index 6b7eb0580b..6b3c14b214 100644 --- a/lib/vis/lib/network/modules/Clustering.js +++ b/lib/vis/lib/network/modules/Clustering.js @@ -1,16 +1,18 @@ let util = require("../../util"); +import NetworkUtil from '../NetworkUtil'; import Cluster from './components/nodes/Cluster' class ClusterEngine { constructor(body) { this.body = body; this.clusteredNodes = {}; + this.clusteredEdges = {}; this.options = {}; this.defaultOptions = {}; util.extend(this.options, this.defaultOptions); - this.body.emitter.on('_resetData', () => {this.clusteredNodes = {};}) + this.body.emitter.on('_resetData', () => {this.clusteredNodes = {}; this.clusteredEdges = {};}) } setOptions(options) { @@ -42,8 +44,9 @@ class ClusterEngine { } for (let i = 0; i < nodesToCluster.length; i++) { - this.clusterByConnection(nodesToCluster[i],options,false); + this.clusterByConnection(nodesToCluster[i],options,true); } + this.body.emitter.emit('_dataChanged'); } @@ -66,14 +69,16 @@ class ClusterEngine { for (let i = 0; i < this.body.nodeIndices.length; i++) { let nodeId = this.body.nodeIndices[i]; let node = this.body.nodes[nodeId]; - let clonedOptions = this._cloneOptions(node); + let clonedOptions = NetworkUtil.cloneOptions(node); if (options.joinCondition(clonedOptions) === true) { childNodesObj[nodeId] = this.body.nodes[nodeId]; // collect the nodes that will be in the cluster for (let i = 0; i < node.edges.length; i++) { let edge = node.edges[i]; - childEdgesObj[edge.id] = edge; + if (this.clusteredEdges[edge.id] === undefined) { + childEdgesObj[edge.id] = edge; + } } } } @@ -83,53 +88,67 @@ class ClusterEngine { /** - * Cluster all nodes in the network that have only 1 edge - * @param options - * @param refreshData - */ - clusterOutliers(options, refreshData = true) { + * Cluster all nodes in the network that have only X edges + * @param edgeCount + * @param options + * @param refreshData + */ + clusterByEdgeCount(edgeCount, options, refreshData = true) { options = this._checkOptions(options); let clusters = []; - + let usedNodes = {}; + let edge, edges, node, nodeId, relevantEdgeCount; // collect the nodes that will be in the cluster for (let i = 0; i < this.body.nodeIndices.length; i++) { let childNodesObj = {}; let childEdgesObj = {}; - let nodeId = this.body.nodeIndices[i]; - let visibleEdges = 0; - let edge; - for (let j = 0; j < this.body.nodes[nodeId].edges.length; j++) { - if (this.body.nodes[nodeId].edges[j].options.hidden === false) { - visibleEdges++; - edge = this.body.nodes[nodeId].edges[j]; + nodeId = this.body.nodeIndices[i]; + + // if this node is already used in another cluster this session, we do not have to re-evaluate it. + if (usedNodes[nodeId] === undefined) { + relevantEdgeCount = 0; + node = this.body.nodes[nodeId]; + edges = []; + for (let j = 0; j < node.edges.length; j++) { + edge = node.edges[j]; + if (this.clusteredEdges[edge.id] === undefined) { + if (edge.toId !== edge.fromId) { + relevantEdgeCount++; + } + edges.push(edge); + } } - } - if (visibleEdges === 1) { - // this is an outlier - let childNodeId = this._getConnectedId(edge, nodeId); - if (childNodeId !== nodeId) { - if (options.joinCondition === undefined) { - if (this._checkIfUsed(clusters,nodeId,edge.id) === false && this._checkIfUsed(clusters,childNodeId,edge.id) === false) { + // this node qualifies, we collect its neighbours to start the clustering process. + if (relevantEdgeCount === edgeCount) { + let gatheringSuccessful = true; + for (let j = 0; j < edges.length; j++) { + edge = edges[j]; + let childNodeId = this._getConnectedId(edge, nodeId); + // add the nodes to the list by the join condition. + if (options.joinCondition === undefined) { childEdgesObj[edge.id] = edge; childNodesObj[nodeId] = this.body.nodes[nodeId]; childNodesObj[childNodeId] = this.body.nodes[childNodeId]; + usedNodes[nodeId] = true; } - } - else { - let clonedOptions = this._cloneOptions(this.body.nodes[nodeId]); - if (options.joinCondition(clonedOptions) === true && this._checkIfUsed(clusters,nodeId,edge.id) === false) { - childEdgesObj[edge.id] = edge; - childNodesObj[nodeId] = this.body.nodes[nodeId]; - } - clonedOptions = this._cloneOptions(this.body.nodes[childNodeId]); - if (options.joinCondition(clonedOptions) === true && this._checkIfUsed(clusters,nodeId,edge.id) === false) { - childEdgesObj[edge.id] = edge; - childNodesObj[childNodeId] = this.body.nodes[childNodeId]; + else { + let clonedOptions = NetworkUtil.cloneOptions(this.body.nodes[nodeId]); + if (options.joinCondition(clonedOptions) === true) { + childEdgesObj[edge.id] = edge; + childNodesObj[nodeId] = this.body.nodes[nodeId]; + usedNodes[nodeId] = true; + } + else { + // this node does not qualify after all. + gatheringSuccessful = false; + break; + } } } - if (Object.keys(childNodesObj).length > 0 && Object.keys(childEdgesObj).length > 0) { + // add to the cluster queue + if (Object.keys(childNodesObj).length > 0 && Object.keys(childEdgesObj).length > 0 && gatheringSuccessful === true) { clusters.push({nodes: childNodesObj, edges: childEdgesObj}) } } @@ -145,17 +164,26 @@ class ClusterEngine { } } - - _checkIfUsed(clusters, nodeId, edgeId) { - for (let i = 0; i < clusters.length; i++) { - let cluster = clusters[i]; - if (cluster.nodes[nodeId] !== undefined || cluster.edges[edgeId] !== undefined) { - return true; - } - } - return false; + /** + * Cluster all nodes in the network that have only 1 edge + * @param options + * @param refreshData + */ + clusterOutliers(options, refreshData = true) { + this.clusterByEdgeCount(1,options,refreshData); } + /** + * Cluster all nodes in the network that have only 2 edge + * @param options + * @param refreshData + */ + clusterBridges(options, refreshData = true) { + this.clusterByEdgeCount(2,options,refreshData); + } + + + /** * suck all connected nodes of a node into the node. * @param nodeId @@ -181,31 +209,37 @@ class ClusterEngine { let childNodesObj = {}; let childEdgesObj = {}; let parentNodeId = node.id; - let parentClonedOptions = this._cloneOptions(node); + let parentClonedOptions = NetworkUtil.cloneOptions(node); childNodesObj[parentNodeId] = node; // collect the nodes that will be in the cluster for (let i = 0; i < node.edges.length; i++) { let edge = node.edges[i]; - let childNodeId = this._getConnectedId(edge, parentNodeId); + if (this.clusteredEdges[edge.id] === undefined) { + let childNodeId = this._getConnectedId(edge, parentNodeId); - if (childNodeId !== parentNodeId) { - if (options.joinCondition === undefined) { - childEdgesObj[edge.id] = edge; - childNodesObj[childNodeId] = this.body.nodes[childNodeId]; - } - else { - // clone the options and insert some additional parameters that could be interesting. - let childClonedOptions = this._cloneOptions(this.body.nodes[childNodeId]); - if (options.joinCondition(parentClonedOptions, childClonedOptions) === true) { + // if the child node is not in a cluster + if (this.clusteredNodes[childNodeId] === undefined) { + if (childNodeId !== parentNodeId) { + if (options.joinCondition === undefined) { + childEdgesObj[edge.id] = edge; + childNodesObj[childNodeId] = this.body.nodes[childNodeId]; + } + else { + // clone the options and insert some additional parameters that could be interesting. + let childClonedOptions = NetworkUtil.cloneOptions(this.body.nodes[childNodeId]); + if (options.joinCondition(parentClonedOptions, childClonedOptions) === true) { + childEdgesObj[edge.id] = edge; + childNodesObj[childNodeId] = this.body.nodes[childNodeId]; + } + } + } + else { + // swallow the edge if it is self-referencing. childEdgesObj[edge.id] = edge; - childNodesObj[childNodeId] = this.body.nodes[childNodeId]; } } } - else { - childEdgesObj[edge.id] = edge; - } } this._cluster(childNodesObj, childEdgesObj, options, refreshData); @@ -213,40 +247,22 @@ class ClusterEngine { /** - * This returns a clone of the options or options of the edge or node to be used for construction of new edges or check functions for new nodes. - * @param objId - * @param type - * @returns {{}} - * @private - */ - _cloneOptions(item, type) { - let clonedOptions = {}; - if (type === undefined || type === 'node') { - util.deepExtend(clonedOptions, item.options, true); - clonedOptions.x = item.x; - clonedOptions.y = item.y; - clonedOptions.amountOfConnections = item.edges.length; - } - else { - util.deepExtend(clonedOptions, item.options, true); - } - return clonedOptions; - } - - - /** - * This function creates the edges that will be attached to the cluster. + * This function creates the edges that will be attached to the cluster + * It looks for edges that are connected to the nodes from the "outside' of the cluster. * * @param childNodesObj * @param childEdgesObj - * @param newEdges - * @param options + * @param clusterNodeProperties + * @param clusterEdgeProperties * @private */ - _createClusterEdges (childNodesObj, childEdgesObj, newEdges, clusterNodeProperties, clusterEdgeProperties) { + _createClusterEdges (childNodesObj, childEdgesObj, clusterNodeProperties, clusterEdgeProperties) { let edge, childNodeId, childNode, toId, fromId, otherNodeId; + // loop over all child nodes and their edges to find edges going out of the cluster + // these edges will be replaced by clusterEdges. let childKeys = Object.keys(childNodesObj); + let createEdges = []; for (let i = 0; i < childKeys.length; i++) { childNodeId = childKeys[i]; childNode = childNodesObj[childNodeId]; @@ -254,31 +270,62 @@ class ClusterEngine { // construct new edges from the cluster to others for (let j = 0; j < childNode.edges.length; j++) { edge = childNode.edges[j]; - childEdgesObj[edge.id] = edge; + // we only handle edges that are visible to the system, not the disabled ones from the clustering process. + if (this.clusteredEdges[edge.id] === undefined) { + // self-referencing edges will be added to the "hidden" list + if (edge.toId == edge.fromId) { + childEdgesObj[edge.id] = edge; + } + else { + // set up the from and to. + if (edge.toId == childNodeId) { // this is a double equals because ints and strings can be interchanged here. + toId = clusterNodeProperties.id; + fromId = edge.fromId; + otherNodeId = fromId; + } + else { + toId = edge.toId; + fromId = clusterNodeProperties.id; + otherNodeId = toId; + } + } - // childNodeId position will be replaced by the cluster. - if (edge.toId == childNodeId) { // this is a double equals because ints and strings can be interchanged here. - toId = clusterNodeProperties.id; - fromId = edge.fromId; - otherNodeId = fromId; - } - else { - toId = edge.toId; - fromId = clusterNodeProperties.id; - otherNodeId = toId; - } - - // if the node connected to the cluster is also in the cluster we do not need a new edge. - if (childNodesObj[otherNodeId] === undefined) { - let clonedOptions = this._cloneOptions(edge, 'edge'); - util.deepExtend(clonedOptions, clusterEdgeProperties); - clonedOptions.from = fromId; - clonedOptions.to = toId; - clonedOptions.id = 'clusterEdge:' + util.randomUUID(); - newEdges.push(this.body.functions.createEdge(clonedOptions)); + // Only edges from the cluster outwards are being replaced. + if (childNodesObj[otherNodeId] === undefined) { + createEdges.push({edge: edge, fromId: fromId, toId: toId}); + } } } } + + // here we actually create the replacement edges. We could not do this in the loop above as the creation process + // would add an edge to the edges array we are iterating over. + for (let j = 0; j < createEdges.length; j++) { + let edge = createEdges[j].edge; + // copy the options of the edge we will replace + let clonedOptions = NetworkUtil.cloneOptions(edge, 'edge'); + // make sure the properties of clusterEdges are superimposed on it + util.deepExtend(clonedOptions, clusterEdgeProperties); + + // set up the edge + clonedOptions.from = createEdges[j].fromId; + clonedOptions.to = createEdges[j].toId; + clonedOptions.id = 'clusterEdge:' + util.randomUUID(); + //clonedOptions.id = '(cf: ' + createEdges[j].fromId + " to: " + createEdges[j].toId + ")" + Math.random(); + + // create the edge and give a reference to the one it replaced. + let newEdge = this.body.functions.createEdge(clonedOptions); + newEdge.clusteringEdgeReplacingId = edge.id; + + // connect the edge. + this.body.edges[newEdge.id] = newEdge; + newEdge.connect(); + + // hide the replaced edge + this._backupEdgeOptions(edge); + edge.setOptions({physics:false, hidden:true}); + } + } /** @@ -304,8 +351,17 @@ class ClusterEngine { * @private */ _cluster(childNodesObj, childEdgesObj, options, refreshData = true) { - // kill condition: no children so cant cluster - if (Object.keys(childNodesObj).length === 0) {return;} + // kill condition: no children so can't cluster or only one node in the cluster, don't bother + if (Object.keys(childNodesObj).length < 2) {return;} + + // check if this cluster call is not trying to cluster anything that is in another cluster. + for (let nodeId in childNodesObj) { + if (childNodesObj.hasOwnProperty(nodeId)) { + if (this.clusteredNodes[nodeId] !== undefined) { + return; + } + } + } let clusterNodeProperties = util.deepExtend({},options.clusterNodeProperties); @@ -314,17 +370,21 @@ class ClusterEngine { // get the childNode options let childNodesOptions = []; for (let nodeId in childNodesObj) { - let clonedOptions = this._cloneOptions(childNodesObj[nodeId]); - childNodesOptions.push(clonedOptions); + if (childNodesObj.hasOwnProperty(nodeId)) { + let clonedOptions = NetworkUtil.cloneOptions(childNodesObj[nodeId]); + childNodesOptions.push(clonedOptions); + } } - // get clusterproperties based on childNodes + // get cluster properties based on childNodes let childEdgesOptions = []; for (let edgeId in childEdgesObj) { - // these cluster edges will be removed on creation of the cluster. - if (edgeId.substr(0,12) !== "clusterEdge:") { - let clonedOptions = this._cloneOptions(childEdgesObj[edgeId], 'edge'); - childEdgesOptions.push(clonedOptions); + if (childEdgesObj.hasOwnProperty(edgeId)) { + // these cluster edges will be removed on creation of the cluster. + if (edgeId.substr(0, 12) !== "clusterEdge:") { + let clonedOptions = NetworkUtil.cloneOptions(childEdgesObj[edgeId], 'edge'); + childEdgesOptions.push(clonedOptions); + } } } @@ -343,16 +403,14 @@ class ClusterEngine { } - // give the clusterNode a postion if it does not have one. + // give the clusterNode a position if it does not have one. let pos = undefined; if (clusterNodeProperties.x === undefined) { pos = this._getClusterPosition(childNodesObj); clusterNodeProperties.x = pos.x; } if (clusterNodeProperties.y === undefined) { - if (pos === undefined) { - pos = this._getClusterPosition(childNodesObj); - } + if (pos === undefined) {pos = this._getClusterPosition(childNodesObj);} clusterNodeProperties.y = pos.y; } @@ -370,48 +428,18 @@ class ClusterEngine { // finally put the cluster node into global this.body.nodes[clusterNodeProperties.id] = clusterNode; - // create the new edges that will connect to the cluster - let newEdges = []; - this._createClusterEdges(childNodesObj, childEdgesObj, newEdges, clusterNodeProperties, options.clusterEdgeProperties); + // create the new edges that will connect to the cluster, all self-referencing edges will be added to childEdgesObject here. + this._createClusterEdges(childNodesObj, childEdgesObj, clusterNodeProperties, options.clusterEdgeProperties); // disable the childEdges for (let edgeId in childEdgesObj) { if (childEdgesObj.hasOwnProperty(edgeId)) { if (this.body.edges[edgeId] !== undefined) { let edge = this.body.edges[edgeId]; - - // if the edge is a clusterEdge, we delete it. The opening of the clusters will restore these edges when required. - if (edgeId.substr(0,12) === "clusterEdge:") { - // we only delete the cluster edge if there is another edge to the node that is not a cluster. - let target = edge.from.isCluster === true ? edge.toId : edge.fromId; - let deleteEdge = false; - - // search the contained edges for an edge that has a link to the targetNode - for (let edgeId2 in childEdgesObj) { - if (childEdgesObj.hasOwnProperty(edgeId2)) { - if (this.body.edges[edgeId2] !== undefined && edgeId2 !== edgeId) { - let edge2 = this.body.edges[edgeId2]; - if (edge2.fromId == target || edge2.toId == target) { - deleteEdge = true; - break; - } - } - } - } - - // if we found the edge that will trigger the recreation of a new cluster edge on opening, we can delete this edge. - if (deleteEdge === true) { - edge.edgeType.cleanup(); - // this removes the edge from node.edges, which is why edgeIds is formed - edge.disconnect(); - delete childEdgesObj[edgeId]; - delete this.body.edges[edgeId]; - } - } - else { - edge.togglePhysics(false); - edge.options.hidden = true; - } + // cache the options before changing + this._backupEdgeOptions(edge); + // disable physics and hide the edge + edge.setOptions({physics:false, hidden:true}); } } } @@ -420,17 +448,10 @@ class ClusterEngine { for (let nodeId in childNodesObj) { if (childNodesObj.hasOwnProperty(nodeId)) { this.clusteredNodes[nodeId] = {clusterId:clusterNodeProperties.id, node: this.body.nodes[nodeId]}; - this.body.nodes[nodeId].togglePhysics(false); - this.body.nodes[nodeId].options.hidden = true; + this.body.nodes[nodeId].setOptions({hidden:true, physics:false}); } } - // push new edges to global - for (let i = 0; i < newEdges.length; i++) { - this.body.edges[newEdges[i].id] = newEdges[i]; - this.body.edges[newEdges[i].id].connect(); - } - // set ID to undefined so no duplicates arise clusterNodeProperties.id = undefined; @@ -440,6 +461,20 @@ class ClusterEngine { } } + _backupEdgeOptions(edge) { + if (this.clusteredEdges[edge.id] === undefined) { + this.clusteredEdges[edge.id] = {physics: edge.options.physics, hidden: edge.options.hidden}; + } + } + + _restoreEdge(edge) { + let originalOptions = this.clusteredEdges[edge.id]; + if (originalOptions !== undefined) { + edge.setOptions({physics: originalOptions.physics, hidden: originalOptions.hidden}); + delete this.clusteredEdges[edge.id]; + } + } + /** * Check if a node is a cluster. @@ -516,8 +551,8 @@ class ClusterEngine { if (containedNodes.hasOwnProperty(nodeId)) { let containedNode = this.body.nodes[nodeId]; if (newPositions[nodeId] !== undefined) { - containedNode.x = newPositions[nodeId].x || clusterNode.x; - containedNode.y = newPositions[nodeId].y || clusterNode.y; + containedNode.x = (newPositions[nodeId].x === undefined ? clusterNode.x : newPositions[nodeId].x); + containedNode.y = (newPositions[nodeId].y === undefined ? clusterNode.y : newPositions[nodeId].y); } } } @@ -529,8 +564,8 @@ class ClusterEngine { let containedNode = this.body.nodes[nodeId]; containedNode = containedNodes[nodeId]; // inherit position - containedNode.x = clusterNode.x; - containedNode.y = clusterNode.y; + if (containedNode.options.fixed.x === false) {containedNode.x = clusterNode.x;} + if (containedNode.options.fixed.y === false) {containedNode.y = clusterNode.y;} } } } @@ -544,76 +579,78 @@ class ClusterEngine { containedNode.vx = clusterNode.vx; containedNode.vy = clusterNode.vy; - containedNode.options.hidden = false; - containedNode.togglePhysics(true); + // we use these methods to avoid re-instantiating the shape, which happens with setOptions. + containedNode.setOptions({hidden:false, physics:true}); delete this.clusteredNodes[nodeId]; } } - // release edges - for (let edgeId in containedEdges) { - if (containedEdges.hasOwnProperty(edgeId)) { - let edge = containedEdges[edgeId]; - // if this edge was a temporary edge and it's connected nodes do not exist anymore, we remove it from the data - if (this.body.nodes[edge.fromId] === undefined || this.body.nodes[edge.toId] === undefined || edge.toId == clusterNodeId || edge.fromId == clusterNodeId) { - edge.edgeType.cleanup(); - // this removes the edge from node.edges, which is why edgeIds is formed - edge.disconnect(); - delete this.body.edges[edgeId]; - } - else { - // one of the nodes connected to this edge is in a cluster. We give the edge to that cluster so it will be released when that cluster is opened. - if (this.clusteredNodes[edge.fromId] !== undefined || this.clusteredNodes[edge.toId] !== undefined) { - let fromId, toId; - let clusteredNode = this.clusteredNodes[edge.fromId] || this.clusteredNodes[edge.toId]; - let clusterId = clusteredNode.clusterId; - let clusterNode = this.body.nodes[clusterId]; - clusterNode.containedEdges[edgeId] = edge; + // copy the clusterNode edges because we cannot iterate over an object that we add or remove from. + let edgesToBeDeleted = []; + for (let i = 0; i < clusterNode.edges.length; i++) { + edgesToBeDeleted.push(clusterNode.edges[i]); + } - if (this.clusteredNodes[edge.fromId] !== undefined) { - fromId = clusterId; - toId = edge.toId; - } - else { - fromId = edge.fromId; - toId = clusterId; - } + // actually handling the deleting. + for (let i = 0; i < edgesToBeDeleted.length; i++) { + let edge = edgesToBeDeleted[i]; - // if both from and to nodes are visible, we create a new temporary edge - if (this.body.nodes[fromId].options.hidden !== true && this.body.nodes[toId].options.hidden !== true) { - let clonedOptions = this._cloneOptions(edge, 'edge'); - let id = 'clusterEdge:' + util.randomUUID(); - util.deepExtend(clonedOptions, clusterNode.clusterEdgeProperties); - util.deepExtend(clonedOptions, {from: fromId, to: toId, hidden: false, physics: true, id: id}); - let newEdge = this.body.functions.createEdge(clonedOptions); + let otherNodeId = this._getConnectedId(edge, clusterNodeId); + // if the other node is in another cluster, we transfer ownership of this edge to the other cluster + if (this.clusteredNodes[otherNodeId] !== undefined) { + // transfer ownership: + let otherCluster = this.body.nodes[this.clusteredNodes[otherNodeId].clusterId]; + let transferEdge = this.body.edges[edge.clusteringEdgeReplacingId]; + if (transferEdge !== undefined) { + otherCluster.containedEdges[transferEdge.id] = transferEdge; - this.body.edges[id] = newEdge; - this.body.edges[id].connect(); - } + // delete local reference + delete containedEdges[transferEdge.id]; + + // create new cluster edge from the otherCluster: + // get to and from + let fromId = transferEdge.fromId; + let toId = transferEdge.toId; + if (transferEdge.toId == otherNodeId) { + toId = this.clusteredNodes[otherNodeId].clusterId; } else { - edge.options.hidden = false; - edge.togglePhysics(true); + fromId = this.clusteredNodes[otherNodeId].clusterId; } + + // clone the options and apply the cluster options to them + let clonedOptions = NetworkUtil.cloneOptions(transferEdge, 'edge'); + util.deepExtend(clonedOptions, otherCluster.clusterEdgeProperties); + + // apply the edge specific options to it. + let id = 'clusterEdge:' + util.randomUUID(); + util.deepExtend(clonedOptions, {from: fromId, to: toId, hidden: false, physics: true, id: id}); + + // create it + let newEdge = this.body.functions.createEdge(clonedOptions); + newEdge.clusteringEdgeReplacingId = transferEdge.id; + this.body.edges[id] = newEdge; + this.body.edges[id].connect(); } } - } - - // remove all temporary edges, make an array of ids so we don't remove from the list we're iterating over. - let removeIds = []; - for (let i = 0; i < clusterNode.edges.length; i++) { - let edgeId = clusterNode.edges[i].id; - removeIds.push(edgeId); - } - - // actually removing the edges - for (let i = 0; i < removeIds.length; i++) { - let edgeId = removeIds[i]; - this.body.edges[edgeId].edgeType.cleanup(); + else { + let replacedEdge = this.body.edges[edge.clusteringEdgeReplacingId]; + if (replacedEdge !== undefined) { + this._restoreEdge(replacedEdge); + } + } + edge.cleanup(); // this removes the edge from node.edges, which is why edgeIds is formed - this.body.edges[edgeId].disconnect(); - delete this.body.edges[edgeId]; + edge.disconnect(); + delete this.body.edges[edge.id]; + } + + // handle the releasing of the edges + for (let edgeId in containedEdges) { + if (containedEdges.hasOwnProperty(edgeId)) { + this._restoreEdge(containedEdges[edgeId]); + } } // remove clusterNode @@ -625,12 +662,12 @@ class ClusterEngine { } getNodesInCluster(clusterId) { - let nodesArray = [] + let nodesArray = []; if (this.isCluster(clusterId) === true) { let containedNodes = this.body.nodes[clusterId].containedNodes; for (let nodeId in containedNodes) { if (containedNodes.hasOwnProperty(nodeId)) { - nodesArray.push(nodeId) + nodesArray.push(this.body.nodes[nodeId].id) } } } @@ -642,7 +679,6 @@ class ClusterEngine { * Get the stack clusterId's that a certain node resides in. cluster A -> cluster B -> cluster C -> node * @param nodeId * @returns {Array} - * @private */ findNode(nodeId) { let stack = []; @@ -650,11 +686,13 @@ class ClusterEngine { let counter = 0; while (this.clusteredNodes[nodeId] !== undefined && counter < max) { - stack.push(this.clusteredNodes[nodeId].node); + stack.push(this.body.nodes[nodeId].id); nodeId = this.clusteredNodes[nodeId].clusterId; counter++; } - stack.push(this.body.nodes[nodeId]); + stack.push(this.body.nodes[nodeId].id); + stack.reverse(); + return stack; } @@ -702,8 +740,8 @@ class ClusterEngine { average = average / hubCounter; averageSquared = averageSquared / hubCounter; - let letiance = averageSquared - Math.pow(average,2); - let standardDeviation = Math.sqrt(letiance); + let variance = averageSquared - Math.pow(average,2); + let standardDeviation = Math.sqrt(variance); let hubThreshold = Math.floor(average + 2*standardDeviation); diff --git a/lib/vis/lib/network/modules/EdgesHandler.js b/lib/vis/lib/network/modules/EdgesHandler.js index cde73d5b3b..4be26d95d1 100644 --- a/lib/vis/lib/network/modules/EdgesHandler.js +++ b/lib/vis/lib/network/modules/EdgesHandler.js @@ -27,6 +27,7 @@ class EdgesHandler { middle: {enabled: false, scaleFactor:1}, from: {enabled: false, scaleFactor:1} }, + arrowStrikethrough: true, color: { color:'#848484', highlight:'#848484', @@ -74,6 +75,7 @@ class EdgesHandler { selfReferenceSize:20, shadow:{ enabled: false, + color: 'rgba(0,0,0,0.5)', size:10, x:5, y:5 @@ -81,6 +83,7 @@ class EdgesHandler { smooth: { enabled: true, type: "dynamic", + forceDirection:'none', roundness: 0.5 }, title:undefined, @@ -105,7 +108,7 @@ class EdgesHandler { let edge = this.body.edges[edgeId]; let edgeData = this.body.data.edges._data[edgeId]; - // only forcilby remove the smooth curve if the data has been set of the edge has the smooth curves defined. + // only forcibly remove the smooth curve if the data has been set of the edge has the smooth curves defined. // this is because a change in the global would not affect these curves. if (edgeData !== undefined) { let edgeOptions = edgeData.smooth; @@ -138,6 +141,10 @@ class EdgesHandler { this.body.emitter.on("refreshEdges", this.refresh.bind(this)); this.body.emitter.on("refresh", this.refresh.bind(this)); this.body.emitter.on("destroy", () => { + util.forEach(this.edgesListeners, (callback, event) => { + if (this.body.data.edges) + this.body.data.edges.off(event, callback); + }); delete this.body.functions.createEdge; delete this.edgesListeners.add; delete this.edgesListeners.update; @@ -152,7 +159,7 @@ class EdgesHandler { // use the parser from the Edge class to fill in all shorthand notations Edge.parseOptions(this.options, options); - // hanlde multiple input cases for color + // handle multiple input cases for color if (options.color !== undefined) { this.markAllEdgesAsDirty(); } @@ -275,7 +282,7 @@ class EdgesHandler { var id = ids[i]; var data = edgesData.get(id); var edge = edges[id]; - if (edge === null) { + if (edge !== undefined) { // update edge edge.disconnect(); dataChanged = edge.setOptions(data) || dataChanged; // if a support node is added, data can be changed. @@ -309,7 +316,7 @@ class EdgesHandler { var id = ids[i]; var edge = edges[id]; if (edge !== undefined) { - edge.edgeType.cleanup(); + edge.cleanup(); edge.disconnect(); delete edges[id]; } diff --git a/lib/vis/lib/network/modules/InteractionHandler.js b/lib/vis/lib/network/modules/InteractionHandler.js index 831dde5e58..f1b7fecd02 100644 --- a/lib/vis/lib/network/modules/InteractionHandler.js +++ b/lib/vis/lib/network/modules/InteractionHandler.js @@ -190,10 +190,12 @@ class InteractionHandler { let currentSelection = this.selectionHandler.getSelection(); let {nodesChanges, edgesChanges} = this._determineIfDifferent(previousSelection, currentSelection); + let nodeSelected = false; if (selectedNodesCount - previouslySelectedNodeCount > 0) { // node was selected this.selectionHandler._generateClickEvent('selectNode', event, pointer); selected = true; + nodeSelected = true; } else if (selectedNodesCount - previouslySelectedNodeCount < 0) { // node was deselected this.selectionHandler._generateClickEvent('deselectNode', event, pointer, previousSelection); @@ -202,10 +204,12 @@ class InteractionHandler { else if (selectedNodesCount === previouslySelectedNodeCount && nodesChanges === true) { this.selectionHandler._generateClickEvent('deselectNode', event, pointer, previousSelection); this.selectionHandler._generateClickEvent('selectNode', event, pointer); + nodeSelected = true; selected = true; } - if (selectedEdgesCount - previouslySelectedEdgeCount > 0) { // edge was selected + // handle the selected edges + if (selectedEdgesCount - previouslySelectedEdgeCount > 0 && nodeSelected === false) { // edge was selected this.selectionHandler._generateClickEvent('selectEdge', event, pointer); selected = true; } @@ -219,7 +223,7 @@ class InteractionHandler { selected = true; } - + // fire the select event if anything has been selected or deselected if (selected === true) { // select or unselect this.selectionHandler._generateClickEvent('select', event, pointer); } @@ -483,38 +487,41 @@ class InteractionHandler { * @private */ onMouseWheel(event) { - // retrieve delta - let delta = 0; - if (event.wheelDelta) { /* IE/Opera. */ - delta = event.wheelDelta / 120; - } else if (event.detail) { /* Mozilla case. */ - // In Mozilla, sign of delta is different than in IE. - // Also, delta is multiple of 3. - delta = -event.detail / 3; - } - - // If delta is nonzero, handle it. - // Basically, delta is now positive if wheel was scrolled up, - // and negative, if wheel was scrolled down. - if (delta !== 0) { - - // calculate the new scale - let scale = this.body.view.scale; - let zoom = delta / 10; - if (delta < 0) { - zoom = zoom / (1 - zoom); + if (this.options.zoomView === true) { + // retrieve delta + let delta = 0; + if (event.wheelDelta) { /* IE/Opera. */ + delta = event.wheelDelta / 120; + } + else if (event.detail) { /* Mozilla case. */ + // In Mozilla, sign of delta is different than in IE. + // Also, delta is multiple of 3. + delta = -event.detail / 3; } - scale *= (1 + zoom); - // calculate the pointer location - let pointer = this.getPointer({x:event.clientX, y:event.clientY}); + // If delta is nonzero, handle it. + // Basically, delta is now positive if wheel was scrolled up, + // and negative, if wheel was scrolled down. + if (delta !== 0) { - // apply the new scale - this.zoom(scale, pointer); + // calculate the new scale + let scale = this.body.view.scale; + let zoom = delta / 10; + if (delta < 0) { + zoom = zoom / (1 - zoom); + } + scale *= (1 + zoom); + + // calculate the pointer location + let pointer = this.getPointer({x: event.clientX, y: event.clientY}); + + // apply the new scale + this.zoom(scale, pointer); + } + + // Prevent default actions caused by mouse wheel. + event.preventDefault(); } - - // Prevent default actions caused by mouse wheel. - event.preventDefault(); } diff --git a/lib/vis/lib/network/modules/KamadaKawai.js b/lib/vis/lib/network/modules/KamadaKawai.js new file mode 100644 index 0000000000..63d620ff83 --- /dev/null +++ b/lib/vis/lib/network/modules/KamadaKawai.js @@ -0,0 +1,215 @@ +// distance finding algorithm +import FloydWarshall from "./components/algorithms/FloydWarshall.js" + + +/** + * KamadaKawai positions the nodes initially based on + * + * "AN ALGORITHM FOR DRAWING GENERAL UNDIRECTED GRAPHS" + * -- Tomihisa KAMADA and Satoru KAWAI in 1989 + * + * Possible optimizations in the distance calculation can be implemented. + */ +class KamadaKawai { + constructor(body, edgeLength, edgeStrength) { + this.body = body; + this.springLength = edgeLength; + this.springConstant = edgeStrength; + this.distanceSolver = new FloydWarshall(); + } + + /** + * Not sure if needed but can be used to update the spring length and spring constant + * @param options + */ + setOptions(options) { + if (options) { + if (options.springLength) { + this.springLength = options.springLength; + } + if (options.springConstant) { + this.springConstant = options.springConstant; + } + } + } + + + /** + * Position the system + * @param nodesArray + * @param edgesArray + */ + solve(nodesArray, edgesArray, ignoreClusters = false) { + // get distance matrix + let D_matrix = this.distanceSolver.getDistances(this.body, nodesArray, edgesArray); // distance matrix + + // get the L Matrix + this._createL_matrix(D_matrix); + + // get the K Matrix + this._createK_matrix(D_matrix); + + // calculate positions + let threshold = 0.01; + let innerThreshold = 1; + let iterations = 0; + let maxIterations = Math.max(1000,Math.min(10*this.body.nodeIndices.length,6000)); + let maxInnerIterations = 5; + + let maxEnergy = 1e9; + let highE_nodeId = 0, dE_dx = 0, dE_dy = 0, delta_m = 0, subIterations = 0; + + while (maxEnergy > threshold && iterations < maxIterations) { + iterations += 1; + [highE_nodeId, maxEnergy, dE_dx, dE_dy] = this._getHighestEnergyNode(ignoreClusters); + delta_m = maxEnergy; + subIterations = 0; + while(delta_m > innerThreshold && subIterations < maxInnerIterations) { + subIterations += 1; + this._moveNode(highE_nodeId, dE_dx, dE_dy); + [delta_m,dE_dx,dE_dy] = this._getEnergy(highE_nodeId); + } + } + } + + /** + * get the node with the highest energy + * @returns {*[]} + * @private + */ + _getHighestEnergyNode(ignoreClusters) { + let nodesArray = this.body.nodeIndices; + let nodes = this.body.nodes; + let maxEnergy = 0; + let maxEnergyNodeId = nodesArray[0]; + let dE_dx_max = 0, dE_dy_max = 0; + + for (let nodeIdx = 0; nodeIdx < nodesArray.length; nodeIdx++) { + let m = nodesArray[nodeIdx]; + // by not evaluating nodes with predefined positions we should only move nodes that have no positions. + if ((nodes[m].predefinedPosition === false || nodes[m].isCluster === true && ignoreClusters === true) || nodes[m].options.fixed.x === true || nodes[m].options.fixed.y === true) { + let [delta_m,dE_dx,dE_dy] = this._getEnergy(m); + if (maxEnergy < delta_m) { + maxEnergy = delta_m; + maxEnergyNodeId = m; + dE_dx_max = dE_dx; + dE_dy_max = dE_dy; + } + } + } + + return [maxEnergyNodeId, maxEnergy, dE_dx_max, dE_dy_max]; + } + + /** + * calculate the energy of a single node + * @param m + * @returns {*[]} + * @private + */ + _getEnergy(m) { + let nodesArray = this.body.nodeIndices; + let nodes = this.body.nodes; + + let x_m = nodes[m].x; + let y_m = nodes[m].y; + let dE_dx = 0; + let dE_dy = 0; + for (let iIdx = 0; iIdx < nodesArray.length; iIdx++) { + let i = nodesArray[iIdx]; + if (i !== m) { + let x_i = nodes[i].x; + let y_i = nodes[i].y; + let denominator = 1.0 / Math.sqrt(Math.pow(x_m - x_i, 2) + Math.pow(y_m - y_i, 2)); + dE_dx += this.K_matrix[m][i] * ((x_m - x_i) - this.L_matrix[m][i] * (x_m - x_i) * denominator); + dE_dy += this.K_matrix[m][i] * ((y_m - y_i) - this.L_matrix[m][i] * (y_m - y_i) * denominator); + } + } + + let delta_m = Math.sqrt(Math.pow(dE_dx, 2) + Math.pow(dE_dy, 2)); + return [delta_m, dE_dx, dE_dy]; + } + + /** + * move the node based on it's energy + * the dx and dy are calculated from the linear system proposed by Kamada and Kawai + * @param m + * @param dE_dx + * @param dE_dy + * @private + */ + _moveNode(m, dE_dx, dE_dy) { + let nodesArray = this.body.nodeIndices; + let nodes = this.body.nodes; + let d2E_dx2 = 0; + let d2E_dxdy = 0; + let d2E_dy2 = 0; + + let x_m = nodes[m].x; + let y_m = nodes[m].y; + for (let iIdx = 0; iIdx < nodesArray.length; iIdx++) { + let i = nodesArray[iIdx]; + if (i !== m) { + let x_i = nodes[i].x; + let y_i = nodes[i].y; + let denominator = 1.0 / Math.pow(Math.pow(x_m - x_i, 2) + Math.pow(y_m - y_i, 2), 1.5); + d2E_dx2 += this.K_matrix[m][i] * (1 - this.L_matrix[m][i] * Math.pow(y_m - y_i, 2) * denominator); + d2E_dxdy += this.K_matrix[m][i] * (this.L_matrix[m][i] * (x_m - x_i) * (y_m - y_i) * denominator); + d2E_dy2 += this.K_matrix[m][i] * (1 - this.L_matrix[m][i] * Math.pow(x_m - x_i, 2) * denominator); + } + } + // make the variable names easier to make the solving of the linear system easier to read + let A = d2E_dx2, B = d2E_dxdy, C = dE_dx, D = d2E_dy2, E = dE_dy; + + // solve the linear system for dx and dy + let dy = (C / A + E / B) / (B / A - D / B); + let dx = -(B * dy + C) / A; + + // move the node + nodes[m].x += dx; + nodes[m].y += dy; + } + + + /** + * Create the L matrix: edge length times shortest path + * @param D_matrix + * @private + */ + _createL_matrix(D_matrix) { + let nodesArray = this.body.nodeIndices; + let edgeLength = this.springLength; + + this.L_matrix = []; + for (let i = 0; i < nodesArray.length; i++) { + this.L_matrix[nodesArray[i]] = {}; + for (let j = 0; j < nodesArray.length; j++) { + this.L_matrix[nodesArray[i]][nodesArray[j]] = edgeLength * D_matrix[nodesArray[i]][nodesArray[j]]; + } + } + } + + + /** + * Create the K matrix: spring constants times shortest path + * @param D_matrix + * @private + */ + _createK_matrix(D_matrix) { + let nodesArray = this.body.nodeIndices; + let edgeStrength = this.springConstant; + + this.K_matrix = []; + for (let i = 0; i < nodesArray.length; i++) { + this.K_matrix[nodesArray[i]] = {}; + for (let j = 0; j < nodesArray.length; j++) { + this.K_matrix[nodesArray[i]][nodesArray[j]] = edgeStrength * Math.pow(D_matrix[nodesArray[i]][nodesArray[j]], -2); + } + } + } + + + +} + +export default KamadaKawai; \ No newline at end of file diff --git a/lib/vis/lib/network/modules/LayoutEngine.js b/lib/vis/lib/network/modules/LayoutEngine.js index d663e1bd43..8e4fc6b354 100644 --- a/lib/vis/lib/network/modules/LayoutEngine.js +++ b/lib/vis/lib/network/modules/LayoutEngine.js @@ -1,6 +1,7 @@ -'use strict' +'use strict'; -var util = require('../../util'); +let util = require('../../util'); +import NetworkUtil from '../NetworkUtil'; class LayoutEngine { constructor(body) { @@ -8,22 +9,25 @@ class LayoutEngine { this.initialRandomSeed = Math.round(Math.random() * 1000000); this.randomSeed = this.initialRandomSeed; + this.setPhysics = false; this.options = {}; - this.optionsBackup = {}; + this.optionsBackup = {physics:{}}; this.defaultOptions = { randomSeed: undefined, + improvedLayout: true, hierarchical: { enabled:false, levelSeparation: 150, + nodeSpacing: 100, + treeSpacing: 200, + blockShifting: true, + edgeMinimization: true, direction: 'UD', // UD, DU, LR, RL sortMethod: 'hubsize' // hubsize, directed } }; util.extend(this.options, this.defaultOptions); - - this.hierarchicalLevels = {}; - this.bindEventListeners(); } @@ -31,6 +35,9 @@ class LayoutEngine { this.body.emitter.on('_dataChanged', () => { this.setupHierarchicalLayout(); }); + this.body.emitter.on('_dataLoaded', () => { + this.layoutNetwork(); + }); this.body.emitter.on('_resetHierarchicalLayout', () => { this.setupHierarchicalLayout(); }); @@ -39,19 +46,17 @@ class LayoutEngine { setOptions(options, allOptions) { if (options !== undefined) { let prevHierarchicalState = this.options.hierarchical.enabled; - + util.selectiveDeepExtend(["randomSeed", "improvedLayout"],this.options, options); util.mergeOptions(this.options, options, 'hierarchical'); - if (options.randomSeed !== undefined) { - this.initialRandomSeed = options.randomSeed; - } + if (options.randomSeed !== undefined) {this.initialRandomSeed = options.randomSeed;} if (this.options.hierarchical.enabled === true) { if (prevHierarchicalState === true) { // refresh the overridden options for nodes and edges. - this.body.emitter.emit('refresh'); + this.body.emitter.emit('refresh', true); } - // make sure the level seperation is the right way up + // make sure the level separation is the right way up if (this.options.hierarchical.direction === 'RL' || this.options.hierarchical.direction === 'DU') { if (this.options.hierarchical.levelSeparation > 0) { this.options.hierarchical.levelSeparation *= -1; @@ -65,7 +70,7 @@ class LayoutEngine { this.body.emitter.emit('_resetHierarchicalLayout'); // because the hierarchical system needs it's own physics and smooth curve settings, we adapt the other options if needed. - return this.adaptAllOptions(allOptions); + return this.adaptAllOptionsForHierarchicalLayout(allOptions); } else { if (prevHierarchicalState === true) { @@ -78,23 +83,25 @@ class LayoutEngine { return allOptions; } - adaptAllOptions(allOptions) { + adaptAllOptionsForHierarchicalLayout(allOptions) { if (this.options.hierarchical.enabled === true) { // set the physics if (allOptions.physics === undefined || allOptions.physics === true) { - allOptions.physics = {solver: 'hierarchicalRepulsion'}; - this.optionsBackup.physics = {solver:'barnesHut'}; + allOptions.physics = { + enabled:this.optionsBackup.physics.enabled === undefined ? true : this.optionsBackup.physics.enabled, + solver:'hierarchicalRepulsion' + }; + this.optionsBackup.physics.enabled = this.optionsBackup.physics.enabled === undefined ? true : this.optionsBackup.physics.enabled; + this.optionsBackup.physics.solver = this.optionsBackup.physics.solver || 'barnesHut'; } else if (typeof allOptions.physics === 'object') { - this.optionsBackup.physics = {solver:'barnesHut'}; - if (allOptions.physics.solver !== undefined) { - this.optionsBackup.physics = {solver:allOptions.physics.solver}; - } - allOptions.physics['solver'] = 'hierarchicalRepulsion'; + this.optionsBackup.physics.enabled = allOptions.physics.enabled === undefined ? true : allOptions.physics.enabled; + this.optionsBackup.physics.solver = allOptions.physics.solver || 'barnesHut'; + allOptions.physics.solver = 'hierarchicalRepulsion'; } else if (allOptions.physics !== false) { - this.optionsBackup.physics = {solver:'barnesHut'}; - allOptions.physics['solver'] = 'hierarchicalRepulsion'; + this.optionsBackup.physics.solver ='barnesHut'; + allOptions.physics = {solver:'hierarchicalRepulsion'}; } // get the type of static smooth curve in case it is required @@ -125,13 +132,15 @@ class LayoutEngine { this.optionsBackup.edges = { smooth: allOptions.edges.smooth.enabled === undefined ? true : allOptions.edges.smooth.enabled, - type:allOptions.edges.smooth.type === undefined ? 'dynamic' : allOptions.edges.smooth.type, - roundness: allOptions.edges.smooth.roundness === undefined ? 0.5 : allOptions.edges.smooth.roundness + type: allOptions.edges.smooth.type === undefined ? 'dynamic' : allOptions.edges.smooth.type, + roundness: allOptions.edges.smooth.roundness === undefined ? 0.5 : allOptions.edges.smooth.roundness, + forceDirection: allOptions.edges.smooth.forceDirection === undefined ? false : allOptions.edges.smooth.forceDirection }; allOptions.edges.smooth = { enabled: allOptions.edges.smooth.enabled === undefined ? true : allOptions.edges.smooth.enabled, type:type, - roundness: allOptions.edges.smooth.roundness === undefined ? 0.5 : allOptions.edges.smooth.roundness + roundness: allOptions.edges.smooth.roundness === undefined ? 0.5 : allOptions.edges.smooth.roundness, + forceDirection: allOptions.edges.smooth.forceDirection === undefined ? false : allOptions.edges.smooth.forceDirection } } } @@ -139,11 +148,12 @@ class LayoutEngine { // force all edges into static smooth curves. Only applies to edges that do not use the global options for smooth. this.body.emitter.emit('_forceDisableDynamicCurves', type); } + return allOptions; } seededRandom() { - var x = Math.sin(this.randomSeed++) * 10000; + let x = Math.sin(this.randomSeed++) * 10000; return x - Math.floor(x); } @@ -164,6 +174,107 @@ class LayoutEngine { } } + + /** + * Use Kamada Kawai to position nodes. This is quite a heavy algorithm so if there are a lot of nodes we + * cluster them first to reduce the amount. + */ + layoutNetwork() { + if (this.options.hierarchical.enabled !== true && this.options.improvedLayout === true) { + // first check if we should Kamada Kawai to layout. The threshold is if less than half of the visible + // nodes have predefined positions we use this. + let positionDefined = 0; + for (let i = 0; i < this.body.nodeIndices.length; i++) { + let node = this.body.nodes[this.body.nodeIndices[i]]; + if (node.predefinedPosition === true) { + positionDefined += 1; + } + } + + // if less than half of the nodes have a predefined position we continue + if (positionDefined < 0.5 * this.body.nodeIndices.length) { + let MAX_LEVELS = 10; + let level = 0; + let clusterThreshold = 100; + // if there are a lot of nodes, we cluster before we run the algorithm. + if (this.body.nodeIndices.length > clusterThreshold) { + let startLength = this.body.nodeIndices.length; + while (this.body.nodeIndices.length > clusterThreshold) { + //console.time("clustering") + level += 1; + let before = this.body.nodeIndices.length; + // if there are many nodes we do a hubsize cluster + if (level % 3 === 0) { + this.body.modules.clustering.clusterBridges(); + } + else { + this.body.modules.clustering.clusterOutliers(); + } + let after = this.body.nodeIndices.length; + if ((before == after && level % 3 !== 0) || level > MAX_LEVELS) { + this._declusterAll(); + this.body.emitter.emit("_layoutFailed"); + console.info("This network could not be positioned by this version of the improved layout algorithm. Please disable improvedLayout for better performance."); + return; + } + //console.timeEnd("clustering") + //console.log(level,after) + } + // increase the size of the edges + this.body.modules.kamadaKawai.setOptions({springLength: Math.max(150, 2 * startLength)}) + } + + // position the system for these nodes and edges + this.body.modules.kamadaKawai.solve(this.body.nodeIndices, this.body.edgeIndices, true); + + // shift to center point + this._shiftToCenter(); + + // perturb the nodes a little bit to force the physics to kick in + let offset = 70; + for (let i = 0; i < this.body.nodeIndices.length; i++) { + this.body.nodes[this.body.nodeIndices[i]].x += (0.5 - this.seededRandom())*offset; + this.body.nodes[this.body.nodeIndices[i]].y += (0.5 - this.seededRandom())*offset; + } + + // uncluster all clusters + this._declusterAll(); + + // reposition all bezier nodes. + this.body.emitter.emit("_repositionBezierNodes"); + } + } + } + + /** + * Move all the nodes towards to the center so gravitational pull wil not move the nodes away from view + * @private + */ + _shiftToCenter() { + let range = NetworkUtil.getRangeCore(this.body.nodes, this.body.nodeIndices); + let center = NetworkUtil.findCenter(range); + for (let i = 0; i < this.body.nodeIndices.length; i++) { + this.body.nodes[this.body.nodeIndices[i]].x -= center.x; + this.body.nodes[this.body.nodeIndices[i]].y -= center.y; + } + } + + _declusterAll() { + let clustersPresent = true; + while (clustersPresent === true) { + clustersPresent = false; + for (let i = 0; i < this.body.nodeIndices.length; i++) { + if (this.body.nodes[this.body.nodeIndices[i]].isCluster === true) { + clustersPresent = true; + this.body.modules.clustering.openCluster(this.body.nodeIndices[i], {}, false); + } + } + if (clustersPresent === true) { + this.body.emitter.emit('_dataChanged'); + } + } + } + getSeed() { return this.initialRandomSeed; } @@ -179,13 +290,26 @@ class LayoutEngine { // get the size of the largest hubs and check if the user has defined a level for a node. let node, nodeId; let definedLevel = false; + let definedPositions = true; let undefinedLevel = false; this.hierarchicalLevels = {}; - this.nodeSpacing = 100; + this.lastNodeOnLevel = {}; + this.hierarchicalParents = {}; + this.hierarchicalChildren = {}; + this.hierarchicalTrees = {}; + this.treeIndex = -1; + + this.distributionOrdering = {}; + this.distributionIndex = {}; + this.distributionOrderingPresence = {}; + for (nodeId in this.body.nodes) { if (this.body.nodes.hasOwnProperty(nodeId)) { node = this.body.nodes[nodeId]; + if (node.options.x === undefined && node.options.y === undefined) { + definedPositions = false; + } if (node.options.level !== undefined) { definedLevel = true; this.hierarchicalLevels[nodeId] = node.options.level; @@ -202,28 +326,506 @@ class LayoutEngine { return; } else { - // setup the system to use hierarchical method. - //this._changeConstants(); - - // define levels if undefined by the users. Based on hubsize + // define levels if undefined by the users. Based on hubsize. if (undefinedLevel === true) { if (this.options.hierarchical.sortMethod === 'hubsize') { this._determineLevelsByHubsize(); } - else if (this.options.hierarchical.sortMethod === 'directed' || 'direction') { + else if (this.options.hierarchical.sortMethod === 'directed') { this._determineLevelsDirected(); } + else if (this.options.hierarchical.sortMethod === 'custom') { + this._determineLevelsCustomCallback(); + } } + + // fallback for cases where there are nodes but no edges + for (let nodeId in this.body.nodes) { + if (this.body.nodes.hasOwnProperty(nodeId)) { + if (this.hierarchicalLevels[nodeId] === undefined) { + this.hierarchicalLevels[nodeId] = 0; + } + } + } // check the distribution of the nodes per level. let distribution = this._getDistribution(); + // get the parent children relations. + this._generateMap(); + // place the nodes on the canvas. this._placeNodesByHierarchy(distribution); + + // condense the whitespace. + this._condenseHierarchy(); + + // shift to center so gravity does not have to do much + this._shiftToCenter(); } } } + /** + * @private + */ + _condenseHierarchy() { + // Global var in this scope to define when the movement has stopped. + let stillShifting = false; + let branches = {}; + // first we have some methods to help shifting trees around. + // the main method to shift the trees + let shiftTrees = () => { + let treeSizes = getTreeSizes(); + for (let i = 0; i < treeSizes.length - 1; i++) { + let diff = treeSizes[i].max - treeSizes[i+1].min; + if (diff !== this.options.hierarchical.treeSpacing) { + shiftTree(i + 1, diff - this.options.hierarchical.treeSpacing); + } + } + }; + + // shift a single tree by an offset + let shiftTree = (index, offset) => { + for (let nodeId in this.hierarchicalTrees) { + if (this.hierarchicalTrees.hasOwnProperty(nodeId)) { + if (this.hierarchicalTrees[nodeId] === index) { + this._setPositionForHierarchy(this.body.nodes[nodeId], offset, undefined, true); + } + } + } + }; + + // get the width of a tree + let getTreeSize = (index) => { + let min = 1e9; + let max = -1e9; + for (let nodeId in this.hierarchicalTrees) { + if (this.hierarchicalTrees.hasOwnProperty(nodeId)) { + if (this.hierarchicalTrees[nodeId] === index) { + let pos = this._getPositionForHierarchy(this.body.nodes[nodeId]); + min = Math.min(pos, min); + max = Math.max(pos, max); + } + } + } + return {min:min, max:max}; + }; + + // get the width of all trees + let getTreeSizes = () => { + let treeWidths = []; + for (let i = 0; i < this.treeIndex; i++) { + treeWidths.push(getTreeSize(i)); + } + return treeWidths; + }; + + + // get a map of all nodes in this branch + let getBranchNodes = (source, map) => { + map[source.id] = true; + if (this.hierarchicalParents[source.id]) { + let children = this.hierarchicalParents[source.id].children; + if (children.length > 0) { + for (let i = 0; i < children.length; i++) { + getBranchNodes(this.body.nodes[children[i]], map); + } + } + } + }; + + // get a min max width as well as the maximum movement space it has on either sides + // we use min max terminology because width and height can interchange depending on the direction of the layout + let getBranchBoundary = (branchMap, maxLevel = 1e9) => { + let minSpace = 1e9; + let maxSpace = 1e9; + let min = 1e9; + let max = -1e9; + for (let branchNode in branchMap) { + if (branchMap.hasOwnProperty(branchNode)) { + let node = this.body.nodes[branchNode]; + let level = this.hierarchicalLevels[node.id]; + let position = this._getPositionForHierarchy(node); + + // get the space around the node. + let [minSpaceNode, maxSpaceNode] = this._getSpaceAroundNode(node,branchMap); + minSpace = Math.min(minSpaceNode, minSpace); + maxSpace = Math.min(maxSpaceNode, maxSpace); + + // the width is only relevant for the levels two nodes have in common. This is why we filter on this. + if (level <= maxLevel) { + min = Math.min(position, min); + max = Math.max(position, max); + } + } + } + + return [min, max, minSpace, maxSpace]; + }; + + // get the maximum level of a branch. + let getMaxLevel = (nodeId) => { + let level = this.hierarchicalLevels[nodeId]; + if (this.hierarchicalParents[nodeId]) { + let children = this.hierarchicalParents[nodeId].children; + if (children.length > 0) { + for (let i = 0; i < children.length; i++) { + level = Math.max(level,getMaxLevel(children[i])); + } + } + } + return level; + }; + + // check what the maximum level is these nodes have in common. + let getCollisionLevel = (node1, node2) => { + let maxLevel1 = getMaxLevel(node1.id); + let maxLevel2 = getMaxLevel(node2.id); + return Math.min(maxLevel1, maxLevel2); + }; + + // check if two nodes have the same parent(s) + let hasSameParent = (node1, node2) => { + let parents1 = this.hierarchicalChildren[node1.id]; + let parents2 = this.hierarchicalChildren[node2.id]; + if (parents1 === undefined || parents2 === undefined) { + return false; + } + parents1 = parents1.parents; + parents2 = parents2.parents; + for (let i = 0; i < parents1.length; i++) { + for (let j = 0; j < parents2.length; j++) { + if (parents1[i] == parents2[j]) { + return true; + } + } + } + return false; + }; + + // condense elements. These can be nodes or branches depending on the callback. + let shiftElementsCloser = (callback, levels, centerParents) => { + for (let i = 0; i < levels.length; i++) { + let level = levels[i]; + let levelNodes = this.distributionOrdering[level]; + if (levelNodes.length > 1) { + for (let j = 0; j < levelNodes.length - 1; j++) { + if (hasSameParent(levelNodes[j],levelNodes[j+1]) === true) { + if (this.hierarchicalTrees[levelNodes[j].id] === this.hierarchicalTrees[levelNodes[j+1].id]) { + callback(levelNodes[j],levelNodes[j+1], centerParents); + } + }} + } + } + }; + + // callback for shifting branches + let branchShiftCallback = (node1, node2, centerParent = false) => { + //window.CALLBACKS.push(() => { + let pos1 = this._getPositionForHierarchy(node1); + let pos2 = this._getPositionForHierarchy(node2); + 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; + + getBranchNodes(node1, branchNodes1); + getBranchNodes(node2, branchNodes2); + + // check the largest distance between the branches + let maxLevel = getCollisionLevel(node1, node2); + let [min1,max1, minSpace1, maxSpace1] = getBranchBoundary(branchNodes1, maxLevel); + let [min2,max2, minSpace2, maxSpace2] = getBranchBoundary(branchNodes2, maxLevel); + + //console.log(node1.id, getBranchBoundary(branchNodes1, maxLevel), node2.id, getBranchBoundary(branchNodes2, maxLevel), maxLevel); + let diffBranch = Math.abs(max1 - min2); + if (diffBranch > this.options.hierarchical.nodeSpacing) { + let offset = max1 - min2 + this.options.hierarchical.nodeSpacing; + if (offset < -minSpace2 + this.options.hierarchical.nodeSpacing) { + offset = -minSpace2 + this.options.hierarchical.nodeSpacing; + //console.log("RESETTING OFFSET", max1 - min2 + this.options.hierarchical.nodeSpacing, -minSpace2, offset); + } + if (offset < 0) { + //console.log("SHIFTING", node2.id, offset); + this._shiftBlock(node2.id, offset); + stillShifting = true; + + if (centerParent === true) + this._centerParent(node2); + } + } + + } + //this.body.emitter.emit("_redraw");}) + }; + + let minimizeEdgeLength = (iterations, node) => { + //window.CALLBACKS.push(() => { + // console.log("ts",node.id); + let nodeId = node.id; + let allEdges = node.edges; + let nodeLevel = this.hierarchicalLevels[node.id]; + + // gather constants + let C2 = this.options.hierarchical.levelSeparation * this.options.hierarchical.levelSeparation; + let referenceNodes = {}; + let aboveEdges = []; + for (let i = 0; i < allEdges.length; i++) { + let edge = allEdges[i]; + if (edge.toId != edge.fromId) { + let otherNode = edge.toId == nodeId ? edge.from : edge.to; + referenceNodes[allEdges[i].id] = otherNode; + if (this.hierarchicalLevels[otherNode.id] < nodeLevel) { + aboveEdges.push(edge); + } + } + } + + // differentiated sum of lengths based on only moving one node over one axis + let getFx = (point, edges) => { + let sum = 0; + for (let i = 0; i < edges.length; i++) { + if (referenceNodes[edges[i].id] !== undefined) { + let a = this._getPositionForHierarchy(referenceNodes[edges[i].id]) - point; + sum += a / Math.sqrt(a * a + C2); + } + } + return sum; + }; + + // doubly differentiated sum of lengths based on only moving one node over one axis + let getDFx = (point, edges) => { + let sum = 0; + for (let i = 0; i < edges.length; i++) { + if (referenceNodes[edges[i].id] !== undefined) { + let a = this._getPositionForHierarchy(referenceNodes[edges[i].id]) - point; + sum -= (C2 * Math.pow(a * a + C2, -1.5)); + } + } + return sum; + }; + + let getGuess = (iterations, edges) => { + let guess = this._getPositionForHierarchy(node); + // Newton's method for optimization + let guessMap = {}; + for (let i = 0; i < iterations; i++) { + let fx = getFx(guess, edges); + let dfx = getDFx(guess, edges); + + // we limit the movement to avoid instability. + let limit = 40; + let ratio = Math.max(-limit, Math.min(limit, Math.round(fx/dfx))); + guess = guess - ratio; + // reduce duplicates + if (guessMap[guess] !== undefined) { + break; + } + guessMap[guess] = i; + } + return guess; + }; + + let moveBranch = (guess) => { + // position node if there is space + let nodePosition = this._getPositionForHierarchy(node); + + // check movable area of the branch + if (branches[node.id] === undefined) { + let branchNodes = {}; + branchNodes[node.id] = true; + getBranchNodes(node, branchNodes); + branches[node.id] = branchNodes; + } + let [minBranch, maxBranch, minSpaceBranch, maxSpaceBranch] = getBranchBoundary(branches[node.id]); + + let diff = guess - nodePosition; + + // check if we are allowed to move the node: + let branchOffset = 0; + if (diff > 0) { + branchOffset = Math.min(diff, maxSpaceBranch - this.options.hierarchical.nodeSpacing); + } + else if (diff < 0) { + branchOffset = -Math.min(-diff, minSpaceBranch - this.options.hierarchical.nodeSpacing); + } + + if (branchOffset != 0) { + //console.log("moving branch:",branchOffset, maxSpaceBranch, minSpaceBranch) + this._shiftBlock(node.id, branchOffset); + //this.body.emitter.emit("_redraw"); + stillShifting = true; + } + }; + + let moveNode = (guess) => { + let nodePosition = this._getPositionForHierarchy(node); + + // position node if there is space + let [minSpace, maxSpace] = this._getSpaceAroundNode(node); + let diff = guess - nodePosition; + // check if we are allowed to move the node: + let newPosition = nodePosition; + if (diff > 0) { + newPosition = Math.min(nodePosition + (maxSpace - this.options.hierarchical.nodeSpacing), guess); + } + else if (diff < 0) { + newPosition = Math.max(nodePosition - (minSpace - this.options.hierarchical.nodeSpacing), guess); + } + + if (newPosition !== nodePosition) { + //console.log("moving Node:",diff, minSpace, maxSpace) + this._setPositionForHierarchy(node, newPosition, undefined, true); + //this.body.emitter.emit("_redraw"); + stillShifting = true; + } + }; + + let guess = getGuess(iterations, aboveEdges); + moveBranch(guess); + guess = getGuess(iterations, allEdges); + moveNode(guess); + //}) + }; + + // method to remove whitespace between branches. Because we do bottom up, we can center the parents. + let minimizeEdgeLengthBottomUp = (iterations) => { + let levels = Object.keys(this.distributionOrdering); + levels = levels.reverse(); + for (let i = 0; i < iterations; i++) { + stillShifting = false; + for (let j = 0; j < levels.length; j++) { + let level = levels[j]; + let levelNodes = this.distributionOrdering[level]; + for (let k = 0; k < levelNodes.length; k++) { + minimizeEdgeLength(1000, levelNodes[k]); + } + } + if (stillShifting !== true) { + //console.log("FINISHED minimizeEdgeLengthBottomUp IN " + i); + break; + } + } + }; + + //// method to remove whitespace between branches. Because we do bottom up, we can center the parents. + let shiftBranchesCloserBottomUp = (iterations) => { + let levels = Object.keys(this.distributionOrdering); + levels = levels.reverse(); + for (let i = 0; i < iterations; i++) { + stillShifting = false; + shiftElementsCloser(branchShiftCallback, levels, true); + if (stillShifting !== true) { + //console.log("FINISHED shiftBranchesCloserBottomUp IN " + (i+1)); + break; + } + } + }; + + // center all parents + let centerAllParents = () => { + for (let nodeId in this.body.nodes) { + if (this.body.nodes.hasOwnProperty(nodeId)) + this._centerParent(this.body.nodes[nodeId]); + } + }; + + // the actual work is done here. + if (this.options.hierarchical.blockShifting === true) { + shiftBranchesCloserBottomUp(5); + centerAllParents(); + } + + // minimize edge length + if (this.options.hierarchical.edgeMinimization === true) { + minimizeEdgeLengthBottomUp(20); + } + + shiftTrees(); + } + + /** + * This gives the space around the node. IF a map is supplied, it will only check against nodes NOT in the map. + * This is used to only get the distances to nodes outside of a branch. + * @param node + * @param map + * @returns {*[]} + * @private + */ + _getSpaceAroundNode(node, map) { + let useMap = true; + if (map === undefined) { + useMap = false; + } + let level = this.hierarchicalLevels[node.id]; + if (level !== undefined) { + let index = this.distributionIndex[node.id]; + let position = this._getPositionForHierarchy(node); + let minSpace = 1e9; + let maxSpace = 1e9; + if (index !== 0) { + let prevNode = this.distributionOrdering[level][index - 1]; + if ((useMap === true && map[prevNode.id] === undefined) || useMap === false) { + let prevPos = this._getPositionForHierarchy(prevNode); + minSpace = position - prevPos; + } + } + + if (index != this.distributionOrdering[level].length - 1) { + let nextNode = this.distributionOrdering[level][index + 1]; + if ((useMap === true && map[nextNode.id] === undefined) || useMap === false) { + let nextPos = this._getPositionForHierarchy(nextNode); + maxSpace = Math.min(maxSpace, nextPos - position); + } + } + + return [minSpace, maxSpace]; + } + else { + return [0, 0]; + } + } + + /** + * We use this method to center a parent node and check if it does not cross other nodes when it does. + * @param node + * @private + */ + _centerParent(node) { + if (this.hierarchicalChildren[node.id]) { + let parents = this.hierarchicalChildren[node.id].parents; + for (var i = 0; i < parents.length; i++) { + let parentId = parents[i]; + let parentNode = this.body.nodes[parentId]; + if (this.hierarchicalParents[parentId]) { + // get the range of the children + let minPos = 1e9; + let maxPos = -1e9; + let children = this.hierarchicalParents[parentId].children; + if (children.length > 0) { + for (let i = 0; i < children.length; i++) { + let childNode = this.body.nodes[children[i]]; + minPos = Math.min(minPos, this._getPositionForHierarchy(childNode)); + maxPos = Math.max(maxPos, this._getPositionForHierarchy(childNode)); + } + } + + let position = this._getPositionForHierarchy(parentNode); + let [minSpace, maxSpace] = this._getSpaceAroundNode(parentNode); + let newPosition = 0.5 * (minPos + maxPos); + let diff = position - newPosition; + if ((diff < 0 && Math.abs(diff) < maxSpace - this.options.hierarchical.nodeSpacing) || (diff > 0 && Math.abs(diff) < minSpace - this.options.hierarchical.nodeSpacing)) { + this._setPositionForHierarchy(parentNode, newPosition, undefined, true); + } + } + } + } + } + + + /** * This function places the nodes on the canvas based on the hierarchial distribution. * @@ -231,33 +833,39 @@ class LayoutEngine { * @private */ _placeNodesByHierarchy(distribution) { - let nodeId, node; this.positionedNodes = {}; // start placing all the level 0 nodes first. Then recursively position their branches. for (let level in distribution) { if (distribution.hasOwnProperty(level)) { - for (nodeId in distribution[level].nodes) { - if (distribution[level].nodes.hasOwnProperty(nodeId)) { + // sort nodes in level by position: + let nodeArray = Object.keys(distribution[level]); + nodeArray = this._indexArrayToNodes(nodeArray); + this._sortNodeArray(nodeArray); - node = distribution[level].nodes[nodeId]; - - if (this.options.hierarchical.direction === 'UD' || this.options.hierarchical.direction === 'DU') { - if (node.x === undefined) {node.x = distribution[level].distance;} - distribution[level].distance = node.x + this.nodeSpacing; - } - else { - if (node.y === undefined) {node.y = distribution[level].distance;} - distribution[level].distance = node.y + this.nodeSpacing; - } - - this.positionedNodes[nodeId] = true; - this._placeBranchNodes(node.edges,node.id,distribution,level); + for (let i = 0; i < nodeArray.length; i++) { + let node = nodeArray[i]; + if (this.positionedNodes[node.id] === undefined) { + this._setPositionForHierarchy(node, this.options.hierarchical.nodeSpacing * i, level); + this.positionedNodes[node.id] = true; + this._placeBranchNodes(node.id, level); } } } } } + /** + * Receives an array with node indices and returns an array with the actual node references. Used for sorting based on + * node properties. + * @param idArray + */ + _indexArrayToNodes(idArray) { + let array = []; + for (let i = 0; i < idArray.length; i++) { + array.push(this.body.nodes[idArray[i]]) + } + return array; + } /** * This function get the distribution of levels based on hubsize @@ -284,10 +892,9 @@ class LayoutEngine { node.options.fixed.x = true; } if (distribution[level] === undefined) { - distribution[level] = {amount: 0, nodes: {}, distance: 0}; + distribution[level] = {}; } - distribution[level].amount += 1; - distribution[level].nodes[nodeId] = node; + distribution[level][nodeId] = node; } } return distribution; @@ -321,54 +928,66 @@ class LayoutEngine { * @private */ _determineLevelsByHubsize() { - let nodeId, node; let hubSize = 1; + let levelDownstream = (nodeA, nodeB) => { + if (this.hierarchicalLevels[nodeB.id] === undefined) { + // set initial level + if (this.hierarchicalLevels[nodeA.id] === undefined) { + this.hierarchicalLevels[nodeA.id] = 0; + } + // set level + this.hierarchicalLevels[nodeB.id] = this.hierarchicalLevels[nodeA.id] + 1; + } + }; + while (hubSize > 0) { // determine hubs hubSize = this._getHubSize(); if (hubSize === 0) break; - for (nodeId in this.body.nodes) { + for (let nodeId in this.body.nodes) { if (this.body.nodes.hasOwnProperty(nodeId)) { - node = this.body.nodes[nodeId]; + let node = this.body.nodes[nodeId]; if (node.edges.length === hubSize) { - this._setLevelByHubsize(0, node); + this._crawlNetwork(levelDownstream,nodeId); } } } } } - /** - * this function is called recursively to enumerate the barnches of the largest hubs and give each node a level. - * - * @param level - * @param edges - * @param parentId + * TODO: release feature * @private */ - _setLevelByHubsize(level, node) { - if (this.hierarchicalLevels[node.id] !== undefined) - return; + _determineLevelsCustomCallback() { + let minLevel = 100000; - let childNode; - this.hierarchicalLevels[node.id] = level; - for (let i = 0; i < node.edges.length; i++) { - if (node.edges[i].toId === node.id) { - childNode = node.edges[i].from; - } - else { - childNode = node.edges[i].to; - } - this._setLevelByHubsize(level + 1, childNode); - } + // TODO: this should come from options. + let customCallback = function(nodeA, nodeB, edge) { + + }; + + let levelByDirection = (nodeA, nodeB, edge) => { + let levelA = this.hierarchicalLevels[nodeA.id]; + // set initial level + if (levelA === undefined) {this.hierarchicalLevels[nodeA.id] = minLevel;} + + let diff = customCallback( + NetworkUtil.cloneOptions(nodeA,'node'), + NetworkUtil.cloneOptions(nodeB,'node'), + NetworkUtil.cloneOptions(edge,'edge') + ); + + this.hierarchicalLevels[nodeB.id] = this.hierarchicalLevels[nodeA.id] + diff; + }; + + this._crawlNetwork(levelByDirection); + this._setMinLevelToZero(); } - - /** * this function allocates nodes in levels based on the direction of the edges * @@ -376,111 +995,340 @@ class LayoutEngine { * @private */ _determineLevelsDirected() { - let nodeId, node; let minLevel = 10000; - - // set first node to source - for (nodeId in this.body.nodes) { - if (this.body.nodes.hasOwnProperty(nodeId)) { - node = this.body.nodes[nodeId]; - this._setLevelDirected(minLevel,node); + let levelByDirection = (nodeA, nodeB, edge) => { + let levelA = this.hierarchicalLevels[nodeA.id]; + // set initial level + if (levelA === undefined) {this.hierarchicalLevels[nodeA.id] = minLevel;} + if (edge.toId == nodeB.id) { + this.hierarchicalLevels[nodeB.id] = this.hierarchicalLevels[nodeA.id] + 1; } - } + else { + this.hierarchicalLevels[nodeB.id] = this.hierarchicalLevels[nodeA.id] - 1; + } + }; + this._crawlNetwork(levelByDirection); + this._setMinLevelToZero(); + } + + /** + * Small util method to set the minimum levels of the nodes to zero. + * @private + */ + _setMinLevelToZero() { + let minLevel = 1e9; // get the minimum level - for (nodeId in this.body.nodes) { + for (let nodeId in this.body.nodes) { if (this.body.nodes.hasOwnProperty(nodeId)) { - minLevel = this.hierarchicalLevels[nodeId] < minLevel ? this.hierarchicalLevels[nodeId] : minLevel; + if (this.hierarchicalLevels[nodeId] !== undefined) { + minLevel = Math.min(this.hierarchicalLevels[nodeId], minLevel); + } } } // subtract the minimum from the set so we have a range starting from 0 - for (nodeId in this.body.nodes) { + for (let nodeId in this.body.nodes) { if (this.body.nodes.hasOwnProperty(nodeId)) { - this.hierarchicalLevels[nodeId] -= minLevel; + if (this.hierarchicalLevels[nodeId] !== undefined) { + this.hierarchicalLevels[nodeId] -= minLevel; + } } } } /** - * this function is called recursively to enumerate the branched of the first node and give each node a level based on edge direction - * - * @param level - * @param edges - * @param parentId + * Update the bookkeeping of parent and child. * @private */ - _setLevelDirected(level, node) { - if (this.hierarchicalLevels[node.id] !== undefined) - return; - - let childNode; - this.hierarchicalLevels[node.id] = level; - - for (let i = 0; i < node.edges.length; i++) { - if (node.edges[i].toId === node.id) { - childNode = node.edges[i].from; - this._setLevelDirected(level - 1, childNode); + _generateMap() { + let fillInRelations = (parentNode, childNode) => { + if (this.hierarchicalLevels[childNode.id] > this.hierarchicalLevels[parentNode.id]) { + let parentNodeId = parentNode.id; + let childNodeId = childNode.id; + if (this.hierarchicalParents[parentNodeId] === undefined) { + this.hierarchicalParents[parentNodeId] = {children: [], amount: 0}; + } + this.hierarchicalParents[parentNodeId].children.push(childNodeId); + if (this.hierarchicalChildren[childNodeId] === undefined) { + this.hierarchicalChildren[childNodeId] = {parents: [], amount: 0}; + } + this.hierarchicalChildren[childNodeId].parents.push(parentNodeId); } - else { - childNode = node.edges[i].to; - this._setLevelDirected(level + 1, childNode); - } - } + }; + + this._crawlNetwork(fillInRelations); } + /** + * Crawl over the entire network and use a callback on each node couple that is connected to each other. + * @param callback | will receive nodeA nodeB and the connecting edge. A and B are unique. + * @param startingNodeId + * @private + */ + _crawlNetwork(callback = function() {}, startingNodeId) { + let progress = {}; + let crawler = (node) => { + if (progress[node.id] === undefined) { + progress[node.id] = true; + let childNode; + for (let i = 0; i < node.edges.length; i++) { + if (node.edges[i].connected === true) { + if (node.edges[i].toId === node.id) { + childNode = node.edges[i].from; + } + else { + childNode = node.edges[i].to; + } + + if (node.id !== childNode.id) { + callback(node, childNode, node.edges[i]); + crawler(childNode); + } + } + } + } + }; + + + // we can crawl from a specific node or over all nodes. + if (startingNodeId === undefined) { + for (let i = 0; i < this.body.nodeIndices.length; i++) { + let node = this.body.nodes[this.body.nodeIndices[i]]; + crawler(node); + } + } + else { + let node = this.body.nodes[startingNodeId]; + if (node === undefined) { + console.error("Node not found:", startingNodeId); + return; + } + crawler(node); + } + } + /** * This is a recursively called function to enumerate the branches from the largest hubs and place the nodes * on a X position that ensures there will be no overlap. * - * @param edges * @param parentId - * @param distribution * @param parentLevel * @private */ - _placeBranchNodes(edges, parentId, distribution, parentLevel) { - for (let i = 0; i < edges.length; i++) { - let childNode = undefined; - let parentNode = undefined; - if (edges[i].toId === parentId) { - childNode = edges[i].from; - parentNode = edges[i].to; - } - else { - childNode = edges[i].to; - parentNode = edges[i].from; - } + _placeBranchNodes(parentId, parentLevel) { + // if this is not a parent, cancel the placing. This can happen with multiple parents to one child. + if (this.hierarchicalParents[parentId] === undefined) { + return; + } + + // get a list of childNodes + let childNodes = []; + for (let i = 0; i < this.hierarchicalParents[parentId].children.length; i++) { + childNodes.push(this.body.nodes[this.hierarchicalParents[parentId].children[i]]); + } + + // use the positions to order the nodes. + this._sortNodeArray(childNodes); + + // position the childNodes + for (let i = 0; i < childNodes.length; i++) { + let childNode = childNodes[i]; let childNodeLevel = this.hierarchicalLevels[childNode.id]; + // check if the child node is below the parent node and if it has already been positioned. + if (childNodeLevel > parentLevel && this.positionedNodes[childNode.id] === undefined) { + // get the amount of space required for this node. If parent the width is based on the amount of children. + let pos; - if (this.positionedNodes[childNode.id] === undefined) { - // if a node is conneceted to another node on the same level (or higher (means lower level))!, this is not handled here. - if (childNodeLevel > parentLevel) { - if (this.options.hierarchical.direction === 'UD' || this.options.hierarchical.direction === 'DU') { - if (childNode.x === undefined) { - childNode.x = Math.max(distribution[childNodeLevel].distance, parentNode.x); - } - distribution[childNodeLevel].distance = childNode.x + this.nodeSpacing; - this.positionedNodes[childNode.id] = true; - } - else { - if (childNode.y === undefined) { - childNode.y = Math.max(distribution[childNodeLevel].distance, parentNode.y) - } - distribution[childNodeLevel].distance = childNode.y + this.nodeSpacing; - } - this.positionedNodes[childNode.id] = true; + // we get the X or Y values we need and store them in pos and previousPos. The get and set make sure we get X or Y + if (i === 0) {pos = this._getPositionForHierarchy(this.body.nodes[parentId]);} + else {pos = this._getPositionForHierarchy(childNodes[i-1]) + this.options.hierarchical.nodeSpacing;} + this._setPositionForHierarchy(childNode, pos, childNodeLevel); - if (childNode.edges.length > 1) { - this._placeBranchNodes(childNode.edges, childNode.id, distribution, childNodeLevel); + // if overlap has been detected, we shift the branch + if (this.lastNodeOnLevel[childNodeLevel] !== undefined) { + let previousPos = this._getPositionForHierarchy(this.body.nodes[this.lastNodeOnLevel[childNodeLevel]]); + if (pos - previousPos < this.options.hierarchical.nodeSpacing) { + let diff = (previousPos + this.options.hierarchical.nodeSpacing) - pos; + let sharedParent = this._findCommonParent(this.lastNodeOnLevel[childNodeLevel], childNode.id); + this._shiftBlock(sharedParent.withChild, diff); } } + + // store change in position. + this.lastNodeOnLevel[childNodeLevel] = childNode.id; + + this.positionedNodes[childNode.id] = true; + + this._placeBranchNodes(childNode.id, childNodeLevel); + } + else { + return; + } + } + + // center the parent nodes. + let minPos = 1e9; + let maxPos = -1e9; + for (let i = 0; i < childNodes.length; i++) { + let childNodeId = childNodes[i].id; + minPos = Math.min(minPos, this._getPositionForHierarchy(this.body.nodes[childNodeId])); + maxPos = Math.max(maxPos, this._getPositionForHierarchy(this.body.nodes[childNodeId])); + } + this._setPositionForHierarchy(this.body.nodes[parentId], 0.5 * (minPos + maxPos), parentLevel); + } + + + /** + * Shift a branch a certain distance + * @param parentId + * @param diff + * @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.hierarchicalParents[parentId] !== undefined) { + for (let i = 0; i < this.hierarchicalParents[parentId].children.length; i++) { + this._shiftBlock(this.hierarchicalParents[parentId].children[i], diff); } } } + + + /** + * Find a common parent between branches. + * @param childA + * @param childB + * @returns {{foundParent, withChild}} + * @private + */ + _findCommonParent(childA,childB) { + let parents = {}; + let iterateParents = (parents,child) => { + if (this.hierarchicalChildren[child] !== undefined) { + for (let i = 0; i < this.hierarchicalChildren[child].parents.length; i++) { + let parent = this.hierarchicalChildren[child].parents[i]; + parents[parent] = true; + iterateParents(parents, parent) + } + } + }; + let findParent = (parents, child) => { + if (this.hierarchicalChildren[child] !== undefined) { + for (let i = 0; i < this.hierarchicalChildren[child].parents.length; i++) { + let parent = this.hierarchicalChildren[child].parents[i]; + if (parents[parent] !== undefined) { + return {foundParent:parent, withChild:child}; + } + let branch = findParent(parents, parent); + if (branch.foundParent !== null) { + return branch; + } + } + } + return {foundParent:null, withChild:child}; + }; + + iterateParents(parents, childA); + return findParent(parents, childB); + } + + /** + * Abstract the getting of the position so we won't have to repeat the check for direction all the time + * @param node + * @param position + * @param level + * @private + */ + _setPositionForHierarchy(node, position, level, doNotUpdate = false) { + if (doNotUpdate !== true) { + if (this.distributionOrdering[level] === undefined) { + this.distributionOrdering[level] = []; + this.distributionOrderingPresence[level] = {}; + } + + if (this.distributionOrderingPresence[level][node.id] === undefined) { + this.distributionOrdering[level].push(node); + this.distributionIndex[node.id] = this.distributionOrdering[level].length - 1; + } + this.distributionOrderingPresence[level][node.id] = true; + + if (this.hierarchicalTrees[node.id] === undefined) { + if (this.hierarchicalChildren[node.id] !== undefined) { + let tree = 1; + // get the lowest tree denominator. + for (let i = 0; i < this.hierarchicalChildren[node.id].parents.length; i++) { + let parentId = this.hierarchicalChildren[node.id].parents[i]; + if (this.hierarchicalTrees[parentId] !== undefined) { + //tree = Math.min(tree,this.hierarchicalTrees[parentId]); + tree = this.hierarchicalTrees[parentId]; + } + } + //for (let i = 0; i < this.hierarchicalChildren.parents.length; i++) { + // let parentId = this.hierarchicalChildren.parents[i]; + // this.hierarchicalTrees[parentId] = tree; + //} + this.hierarchicalTrees[node.id] = tree; + } + else { + this.hierarchicalTrees[node.id] = ++this.treeIndex; + } + } + } + + if (this.options.hierarchical.direction === 'UD' || this.options.hierarchical.direction === 'DU') { + node.x = position; + } + else { + node.y = position; + } + } + + /** + * Abstract the getting of the position of a node so we do not have to repeat the direction check all the time. + * @param node + * @returns {number|*} + * @private + */ + _getPositionForHierarchy(node) { + if (this.options.hierarchical.direction === 'UD' || this.options.hierarchical.direction === 'DU') { + return node.x; + } + else { + return node.y; + } + } + + /** + * Use the x or y value to sort the array, allowing users to specify order. + * @param nodeArray + * @private + */ + _sortNodeArray(nodeArray) { + if (nodeArray.length > 1) { + if (this.options.hierarchical.direction === 'UD' || this.options.hierarchical.direction === 'DU') { + nodeArray.sort(function (a, b) { + return a.x - b.x; + }) + } + else { + nodeArray.sort(function (a, b) { + return a.y - b.y; + }) + } + } + } + + + } export default LayoutEngine; \ No newline at end of file diff --git a/lib/vis/lib/network/modules/ManipulationSystem.js b/lib/vis/lib/network/modules/ManipulationSystem.js index f6a6a247e9..158f6a9a1d 100644 --- a/lib/vis/lib/network/modules/ManipulationSystem.js +++ b/lib/vis/lib/network/modules/ManipulationSystem.js @@ -110,6 +110,7 @@ class ManipulationSystem { } } + enableEditMode() { this.editMode = true; @@ -143,7 +144,7 @@ class ManipulationSystem { // restore the state of any bound functions or events, remove control nodes, restore physics this._clean(); - // reset global letiables + // reset global variables this.manipulationDOM = {}; // if the gui is enabled, draw all elements. @@ -192,7 +193,7 @@ class ManipulationSystem { // remove buttons if (selectedTotalCount !== 0) { - if (selectedNodeCount === 1 && this.options.deleteNode !== false) { + if (selectedNodeCount > 0 && this.options.deleteNode !== false) { if (needSeperator === true) { this._createSeperator(4); } @@ -221,8 +222,6 @@ class ManipulationSystem { /** * Create the toolbar for adding Nodes - * - * @private */ addNodeMode() { // when using the gui, enable edit mode if it wasnt already. @@ -250,8 +249,6 @@ class ManipulationSystem { /** * call the bound function to handle the editing of the node. The node has to be selected. - * - * @private */ editNode() { // when using the gui, enable edit mode if it wasnt already. @@ -298,8 +295,6 @@ class ManipulationSystem { /** * create the toolbar to connect nodes - * - * @private */ addEdgeMode() { // when using the gui, enable edit mode if it wasnt already. @@ -334,11 +329,9 @@ class ManipulationSystem { /** * create the toolbar to edit edges - * - * @private */ editEdgeMode() { - // when using the gui, enable edit mode if it wasnt already. + // when using the gui, enable edit mode if it wasn't already. if (this.editMode !== true) { this.enableEditMode(); } @@ -376,15 +369,12 @@ class ManipulationSystem { // temporarily overload UI functions, cleaned up automatically because of _temporaryBindUI this._temporaryBindUI('onTouch', this._controlNodeTouch.bind(this)); // used to get the position - this._temporaryBindUI('onTap', () => { - }); // disabled - this._temporaryBindUI('onHold', () => { - }); // disabled + this._temporaryBindUI('onTap', () => {}); // disabled + this._temporaryBindUI('onHold', () => {}); // disabled this._temporaryBindUI('onDragStart', this._controlNodeDragStart.bind(this));// used to select control node this._temporaryBindUI('onDrag', this._controlNodeDrag.bind(this)); // used to drag control node this._temporaryBindUI('onDragEnd', this._controlNodeDragEnd.bind(this)); // used to connect or revert control nodes - this._temporaryBindUI('onMouseMove', () => { - }); // disabled + this._temporaryBindUI('onMouseMove', () => {}); // disabled // create function to position control nodes correctly on movement // automatically cleaned up because we use the temporary bind @@ -409,8 +399,6 @@ class ManipulationSystem { /** * delete everything in the selection - * - * @private */ deleteSelected() { // when using the gui, enable edit mode if it wasnt already. @@ -560,7 +548,11 @@ class ManipulationSystem { controlNodeStyle.x = x; controlNodeStyle.y = y; - return this.body.functions.createNode(controlNodeStyle); + // we have to define the bounding box in order for the nodes to be drawn immediately + let node = this.body.functions.createNode(controlNodeStyle); + node.shape.boundingBox = {left: x, right:x, top:y, bottom:y}; + + return node; } @@ -650,7 +642,7 @@ class ManipulationSystem { // remove the manipulation divs if (this.manipulationDiv) {this.canvas.frame.removeChild(this.manipulationDiv);} if (this.editModeDiv) {this.canvas.frame.removeChild(this.editModeDiv);} - if (this.closeDiv) {this.canvas.frame.removeChild(this.manipulationDiv);} + if (this.closeDiv) {this.canvas.frame.removeChild(this.closeDiv);} // set the references to undefined this.manipulationDiv = undefined; @@ -893,6 +885,11 @@ class ManipulationSystem { let pointerObj = this.selectionHandler._pointerToPositionObject(pointer); let edge = this.body.edges[this.edgeBeingEditedId]; + // if the node that was dragged is not a control node, return + if (this.selectedControlNode === undefined) { + return; + } + let overlappingNodeIds = this.selectionHandler._getAllNodesOverlappingWith(pointerObj); let node = undefined; for (let i = overlappingNodeIds.length-1; i >= 0; i--) { diff --git a/lib/vis/lib/network/modules/NodesHandler.js b/lib/vis/lib/network/modules/NodesHandler.js index ce5def8d72..f7f6d6503d 100644 --- a/lib/vis/lib/network/modules/NodesHandler.js +++ b/lib/vis/lib/network/modules/NodesHandler.js @@ -87,13 +87,17 @@ class NodesHandler { }, shadow: { enabled: false, + color: 'rgba(0,0,0,0.5)', size: 10, x: 5, y: 5 }, shape: 'ellipse', shapeProperties: { - borderDashes: false + borderDashes: false, // only for borders + borderRadius: 6, // only for box shape + useImageSize: false, // only for image and circularImage shapes + useBorderWithImage: false // only for image shape }, size: 25, title: undefined, @@ -111,6 +115,10 @@ class NodesHandler { this.body.emitter.on('refreshNodes', this.refresh.bind(this)); this.body.emitter.on('refresh', this.refresh.bind(this)); this.body.emitter.on('destroy', () => { + util.forEach(this.nodesListeners, (callback, event) => { + if (this.body.data.nodes) + this.body.data.nodes.off(event, callback); + }); delete this.body.functions.createNode; delete this.nodesListeners.add; delete this.nodesListeners.update; @@ -132,7 +140,7 @@ class NodesHandler { } } - // update the shape size in all nodes + // update the font in all nodes if (options.font !== undefined) { Label.parseOptions(this.options.font, options); for (let nodeId in this.body.nodes) { @@ -290,7 +298,7 @@ class NodesHandler { } - refresh() { + refresh(clearPositions = false) { let nodes = this.body.nodes; for (let nodeId in nodes) { let node = undefined; @@ -299,7 +307,10 @@ class NodesHandler { } let data = this.body.data.nodes._data[nodeId]; if (node !== undefined && data !== undefined) { - node.setOptions({ fixed: false, x:null, y:null }); + if (clearPositions === true) { + node.setOptions({x:null, y:null}); + } + node.setOptions({ fixed: false }); node.setOptions(data); } } @@ -329,11 +340,9 @@ class NodesHandler { } } else { - for (let nodeId in this.body.nodes) { - if (this.body.nodes.hasOwnProperty(nodeId)) { - let node = this.body.nodes[nodeId]; - dataArray[nodeId] = { x: Math.round(node.x), y: Math.round(node.y) }; - } + for (let i = 0; i < this.body.nodeIndices.length; i++) { + let node = this.body.nodes[this.body.nodeIndices[i]]; + dataArray[this.body.nodeIndices[i]] = { x: Math.round(node.x), y: Math.round(node.y) }; } } return dataArray; @@ -352,7 +361,7 @@ class NodesHandler { if (dataset._data.hasOwnProperty(nodeId)) { let node = this.body.nodes[nodeId]; if (dataset._data[nodeId].x != Math.round(node.x) || dataset._data[nodeId].y != Math.round(node.y)) { - dataArray.push({ id: nodeId, x: Math.round(node.x), y: Math.round(node.y) }); + dataArray.push({ id: node.id, x: Math.round(node.x), y: Math.round(node.y) }); } } } @@ -383,13 +392,13 @@ class NodesHandler { let nodeObj = {}; // used to quickly check if node already exists for (let i = 0; i < node.edges.length; i++) { let edge = node.edges[i]; - if (edge.toId == nodeId) { // these are double equals since ids can be numeric or string + if (edge.toId == node.id) { // these are double equals since ids can be numeric or string if (nodeObj[edge.fromId] === undefined) { nodeList.push(edge.fromId); nodeObj[edge.fromId] = true; } } - else if (edge.fromId == nodeId) { // these are double equals since ids can be numeric or string + else if (edge.fromId == node.id) { // these are double equals since ids can be numeric or string if (nodeObj[edge.toId] === undefined) { nodeList.push(edge.toId); nodeObj[edge.toId] = true; @@ -414,11 +423,28 @@ class NodesHandler { } } else { - console.log("NodeId provided for getConnectedEdges does not exist. Provided: ", nodeId) + console.log("NodeId provided for getConnectedEdges does not exist. Provided: ", nodeId); } return edgeList; } + + /** + * Move a node. + * @param String nodeId + * @param Number x + * @param Number y + */ + moveNode(nodeId, x, y) { + if (this.body.nodes[nodeId] !== undefined) { + this.body.nodes[nodeId].x = Number(x); + this.body.nodes[nodeId].y = Number(y); + setTimeout(() => {this.body.emitter.emit("startSimulation")},0); + } + else { + console.log("Node id supplied to moveNode does not exist. Provided: ", nodeId); + } + } } export default NodesHandler; \ No newline at end of file diff --git a/lib/vis/lib/network/modules/PhysicsEngine.js b/lib/vis/lib/network/modules/PhysicsEngine.js index da86725e30..7d53890659 100644 --- a/lib/vis/lib/network/modules/PhysicsEngine.js +++ b/lib/vis/lib/network/modules/PhysicsEngine.js @@ -19,9 +19,15 @@ class PhysicsEngine { this.simulationInterval = 1000 / 60; this.requiresTimeout = true; this.previousStates = {}; + this.referenceState = {}; this.freezeCache = {}; this.renderTimer = undefined; - this.initialStabilizationEmitted = false; + + // parameters for the adaptive timestep + this.adaptiveTimestep = false; + this.adaptiveTimestepEnabled = false; + this.adaptiveCounter = 0; + this.adaptiveInterval = 3; this.stabilized = false; this.startedStabilization = false; @@ -66,7 +72,7 @@ class PhysicsEngine { damping: 0.09 }, maxVelocity: 50, - minVelocity: 0.1, // px/s + minVelocity: 0.75, // px/s solver: 'barnesHut', stabilization: { enabled: true, @@ -75,15 +81,19 @@ class PhysicsEngine { onlyDynamicEdges: false, fit: true }, - timestep: 0.5 + timestep: 0.5, + adaptiveTimestep: true }; util.extend(this.options, this.defaultOptions); + this.timestep = 0.5; + this.layoutFailed = false; this.bindEventListeners(); } bindEventListeners() { this.body.emitter.on('initPhysics', () => {this.initPhysics();}); + this.body.emitter.on('_layoutFailed', () => {this.layoutFailed = true;}); this.body.emitter.on('resetPhysics', () => {this.stopSimulation(); this.ready = false;}); this.body.emitter.on('disablePhysics', () => {this.physicsEnabled = false; this.stopSimulation();}); this.body.emitter.on('restorePhysics', () => { @@ -102,8 +112,21 @@ class PhysicsEngine { this.stopSimulation(false); this.body.emitter.off(); }); + // this event will trigger a rebuilding of the cache everything. Used when nodes or edges have been added or removed. + this.body.emitter.on("_dataChanged", () => { + // update shortcut lists + this.updatePhysicsData(); + }); + + // debug: show forces + // this.body.emitter.on("afterDrawing", (ctx) => {this._drawForces(ctx);}); } + + /** + * set the physics options + * @param options + */ setOptions(options) { if (options !== undefined) { if (options === false) { @@ -114,7 +137,7 @@ class PhysicsEngine { else { this.physicsEnabled = true; util.selectiveNotDeepExtend(['stabilization'], this.options, options); - util.mergeOptions(this.options, options, 'stabilization') + util.mergeOptions(this.options, options, 'stabilization'); if (options.enabled === undefined) { this.options.enabled = true; @@ -124,12 +147,18 @@ class PhysicsEngine { this.physicsEnabled = false; this.stopSimulation(); } + + // set the timestep + this.timestep = this.options.timestep; } } this.init(); } + /** + * configure the engine. + */ init() { var options; if (this.options.solver === 'forceAtlas2Based') { @@ -160,6 +189,10 @@ class PhysicsEngine { this.modelOptions = options; } + + /** + * initialize the engine + */ initPhysics() { if (this.physicsEnabled === true && this.options.enabled === true) { if (this.options.stabilization.enabled === true) { @@ -168,7 +201,7 @@ class PhysicsEngine { else { this.stabilized = false; this.ready = true; - this.body.emitter.emit('fit', {}, true); + this.body.emitter.emit('fit', {}, this.layoutFailed); // if the layout failed, we use the approximation for the zoom this.startSimulation(); } } @@ -185,6 +218,9 @@ class PhysicsEngine { if (this.physicsEnabled === true && this.options.enabled === true) { this.stabilized = false; + // when visible, adaptivity is disabled. + this.adaptiveTimestep = false; + // this sets the width of all nodes initially which could be required for the avoidOverlap this.body.emitter.emit("_resizeNodes"); if (this.viewFunction === undefined) { @@ -218,7 +254,7 @@ class PhysicsEngine { /** - * The viewFunction inserts this step into each renderloop. It calls the physics tick and handles the cleanup at stabilized. + * The viewFunction inserts this step into each render loop. It calls the physics tick and handles the cleanup at stabilized. * */ simulationStep() { @@ -236,23 +272,20 @@ class PhysicsEngine { } if (this.stabilized === true) { - if (this.stabilizationIterations > 1) { - // trigger the 'stabilized' event. - // The event is triggered on the next tick, to prevent the case that - // it is fired while initializing the Network, in which case you would not - // be able to catch it - this.startedStabilization = false; - //this._emitStabilized(); - } this.stopSimulation(); } } - _emitStabilized() { - if (this.stabilizationIterations > 1 || this.initialStabilizationEmitted === false) { - this.initialStabilizationEmitted = true; + + /** + * trigger the stabilized event. + * @private + */ + _emitStabilized(amountOfIterations = this.stabilizationIterations) { + if (this.stabilizationIterations > 1 || this.startedStabilization === true) { setTimeout(() => { - this.body.emitter.emit('stabilized', {iterations: this.stabilizationIterations}); + this.body.emitter.emit('stabilized', {iterations: amountOfIterations}); + this.startedStabilization = false; this.stabilizationIterations = 0; }, 0); } @@ -264,21 +297,74 @@ class PhysicsEngine { * @private */ physicsTick() { + // this is here to ensure that there is no start event when the network is already stable. + if (this.startedStabilization === false) { + this.body.emitter.emit('startStabilizing'); + this.startedStabilization = true; + } + if (this.stabilized === false) { - this.calculateForces(); - this.stabilized = this.moveNodes(); + // adaptivity means the timestep adapts to the situation, only applicable for stabilization + if (this.adaptiveTimestep === true && this.adaptiveTimestepEnabled === true) { + // this is the factor for increasing the timestep on success. + let factor = 1.2; + + // we assume the adaptive interval is + if (this.adaptiveCounter % this.adaptiveInterval === 0) { // we leave the timestep stable for "interval" iterations. + // first the big step and revert. Revert saves the reference state. + this.timestep = 2 * this.timestep; + this.calculateForces(); + this.moveNodes(); + this.revert(); + + // now the normal step. Since this is the last step, it is the more stable one and we will take this. + this.timestep = 0.5 * this.timestep; + + // since it's half the step, we do it twice. + this.calculateForces(); + this.moveNodes(); + this.calculateForces(); + this.moveNodes(); + + // we compare the two steps. if it is acceptable we double the step. + if (this._evaluateStepQuality() === true) { + this.timestep = factor * this.timestep; + } + else { + // if not, we decrease the step to a minimum of the options timestep. + // if the decreased timestep is smaller than the options step, we do not reset the counter + // we assume that the options timestep is stable enough. + if (this.timestep/factor < this.options.timestep) { + this.timestep = this.options.timestep; + } + else { + // if the timestep was larger than 2 times the option one we check the adaptivity again to ensure + // that large instabilities do not form. + this.adaptiveCounter = -1; // check again next iteration + this.timestep = Math.max(this.options.timestep, this.timestep/factor); + } + } + } + else { + // normal step, keeping timestep constant + this.calculateForces(); + this.moveNodes(); + } + + // increment the counter + this.adaptiveCounter += 1; + } + else { + // case for the static timestep, we reset it to the one in options and take a normal step. + this.timestep = this.options.timestep; + this.calculateForces(); + this.moveNodes(); + } // determine if the network has stabilzied if (this.stabilized === true) { this.revert(); } - else { - // this is here to ensure that there is no start event when the network is already stable. - if (this.startedStabilization === false) { - this.body.emitter.emit('startStabilizing'); - this.startedStabilization = true; - } - } this.stabilizationIterations++; } @@ -300,7 +386,7 @@ class PhysicsEngine { for (let nodeId in nodes) { if (nodes.hasOwnProperty(nodeId)) { if (nodes[nodeId].options.physics === true) { - this.physicsBody.physicsNodeIndices.push(nodeId); + this.physicsBody.physicsNodeIndices.push(nodes[nodeId].id); } } } @@ -309,7 +395,7 @@ class PhysicsEngine { for (let edgeId in edges) { if (edges.hasOwnProperty(edgeId)) { if (edges[edgeId].options.physics === true) { - this.physicsBody.physicsEdgeIndices.push(edgeId); + this.physicsBody.physicsEdgeIndices.push(edges[edgeId].id); } } } @@ -341,11 +427,15 @@ class PhysicsEngine { var nodeIds = Object.keys(this.previousStates); var nodes = this.body.nodes; var velocities = this.physicsBody.velocities; + this.referenceState = {}; for (let i = 0; i < nodeIds.length; i++) { let nodeId = nodeIds[i]; if (nodes[nodeId] !== undefined) { if (nodes[nodeId].options.physics === true) { + this.referenceState[nodeId] = { + positions: {x:nodes[nodeId].x, y:nodes[nodeId].y} + }; velocities[nodeId].x = this.previousStates[nodeId].vx; velocities[nodeId].y = this.previousStates[nodeId].vy; nodes[nodeId].x = this.previousStates[nodeId].x; @@ -359,34 +449,53 @@ class PhysicsEngine { } /** - * move the nodes one timestap and check if they are stabilized + * This compares the reference state to the current state + */ + _evaluateStepQuality() { + let dx, dy, dpos; + let nodes = this.body.nodes; + let reference = this.referenceState; + let posThreshold = 0.3; + + for (let nodeId in this.referenceState) { + if (this.referenceState.hasOwnProperty(nodeId) && nodes[nodeId] !== undefined) { + dx = nodes[nodeId].x - reference[nodeId].positions.x; + dy = nodes[nodeId].y - reference[nodeId].positions.y; + + dpos = Math.sqrt(Math.pow(dx,2) + Math.pow(dy,2)) + + if (dpos > posThreshold) { + return false; + } + } + } + return true; + } + + /** + * move the nodes one timestep and check if they are stabilized * @returns {boolean} */ moveNodes() { - var nodesPresent = false; var nodeIndices = this.physicsBody.physicsNodeIndices; var maxVelocity = this.options.maxVelocity ? this.options.maxVelocity : 1e9; - var stabilized = true; - var vminCorrected = this.options.minVelocity / Math.max(this.body.view.scale,0.05); + var maxNodeVelocity = 0; + var averageNodeVelocity = 0; + + // the velocity threshold (energy in the system) for the adaptivity toggle + var velocityAdaptiveThreshold = 5; for (let i = 0; i < nodeIndices.length; i++) { let nodeId = nodeIndices[i]; let nodeVelocity = this._performStep(nodeId, maxVelocity); // stabilized is true if stabilized is true and velocity is smaller than vmin --> all nodes must be stabilized - stabilized = nodeVelocity < vminCorrected && stabilized === true; - nodesPresent = true; + maxNodeVelocity = Math.max(maxNodeVelocity,nodeVelocity); + averageNodeVelocity += nodeVelocity; } - - if (nodesPresent === true) { - if (vminCorrected > 0.5*this.options.maxVelocity) { - return false; - } - else { - return stabilized; - } - } - return true; + // evaluating the stabilized and adaptiveTimestepEnabled conditions + this.adaptiveTimestepEnabled = (averageNodeVelocity/nodeIndices.length) < velocityAdaptiveThreshold; + this.stabilized = maxNodeVelocity < this.options.minVelocity; } @@ -399,10 +508,10 @@ class PhysicsEngine { * @private */ _performStep(nodeId,maxVelocity) { - var node = this.body.nodes[nodeId]; - var timestep = this.options.timestep; - var forces = this.physicsBody.forces; - var velocities = this.physicsBody.velocities; + let node = this.body.nodes[nodeId]; + let timestep = this.timestep; + let forces = this.physicsBody.forces; + let velocities = this.physicsBody.velocities; // store the state so we can revert this.previousStates[nodeId] = {x:node.x, y:node.y, vx:velocities[nodeId].x, vy:velocities[nodeId].y}; @@ -412,7 +521,7 @@ class PhysicsEngine { let ax = (forces[nodeId].x - dx) / node.options.mass; // acceleration velocities[nodeId].x += ax * timestep; // velocity velocities[nodeId].x = (Math.abs(velocities[nodeId].x) > maxVelocity) ? ((velocities[nodeId].x > 0) ? maxVelocity : -maxVelocity) : velocities[nodeId].x; - node.x += velocities[nodeId].x * timestep; // position + node.x += velocities[nodeId].x * timestep; // position } else { forces[nodeId].x = 0; @@ -424,14 +533,14 @@ class PhysicsEngine { let ay = (forces[nodeId].y - dy) / node.options.mass; // acceleration velocities[nodeId].y += ay * timestep; // velocity velocities[nodeId].y = (Math.abs(velocities[nodeId].y) > maxVelocity) ? ((velocities[nodeId].y > 0) ? maxVelocity : -maxVelocity) : velocities[nodeId].y; - node.y += velocities[nodeId].y * timestep; // position + node.y += velocities[nodeId].y * timestep; // position } else { forces[nodeId].y = 0; velocities[nodeId].y = 0; } - var totalVelocity = Math.sqrt(Math.pow(velocities[nodeId].x,2) + Math.pow(velocities[nodeId].y,2)); + let totalVelocity = Math.sqrt(Math.pow(velocities[nodeId].x,2) + Math.pow(velocities[nodeId].y,2)); return totalVelocity; } @@ -486,7 +595,6 @@ class PhysicsEngine { /** * Find a stable position for all nodes - * @private */ stabilize(iterations = this.options.stabilization.iterations) { if (typeof iterations !== 'number') { @@ -499,6 +607,8 @@ class PhysicsEngine { return; } + // enable adaptive timesteps + this.adaptiveTimestep = true && this.options.adaptiveTimestep; // this sets the width of all nodes initially which could be required for the avoidOverlap this.body.emitter.emit("_resizeNodes"); @@ -522,11 +632,21 @@ class PhysicsEngine { setTimeout(() => this._stabilizationBatch(),0); } + + /** + * One batch of stabilization + * @private + */ _stabilizationBatch() { + // this is here to ensure that there is at least one start event. + if (this.startedStabilization === false) { + this.body.emitter.emit('startStabilizing'); + this.startedStabilization = true; + } + var count = 0; while (this.stabilized === false && count < this.options.stabilization.updateInterval && this.stabilizationIterations < this.targetIterations) { this.physicsTick(); - this.stabilizationIterations++; count++; } @@ -539,6 +659,11 @@ class PhysicsEngine { } } + + /** + * Wrap up the stabilization, fit and emit the events. + * @private + */ _finalizeStabilization() { this.body.emitter.emit('_allowRedraw'); if (this.options.stabilization.fit === true) { @@ -548,7 +673,7 @@ class PhysicsEngine { if (this.options.stabilization.onlyDynamicEdges === true) { this._restoreFrozenNodes(); } - + this.body.emitter.emit('stabilizationIterationsDone'); this.body.emitter.emit('_requestRedraw'); @@ -561,6 +686,34 @@ class PhysicsEngine { this.ready = true; } + + + _drawForces(ctx) { + for (var i = 0; i < this.physicsBody.physicsNodeIndices.length; i++) { + let node = this.body.nodes[this.physicsBody.physicsNodeIndices[i]]; + let force = this.physicsBody.forces[this.physicsBody.physicsNodeIndices[i]]; + let factor = 20; + let colorFactor = 0.03; + let forceSize = Math.sqrt(Math.pow(force.x,2) + Math.pow(force.x,2)); + + let size = Math.min(Math.max(5,forceSize),15); + let arrowSize = 3*size; + + let color = util.HSVToHex((180 - Math.min(1,Math.max(0,colorFactor*forceSize))*180) / 360,1,1); + + ctx.lineWidth = size; + ctx.strokeStyle = color; + ctx.beginPath(); + ctx.moveTo(node.x,node.y); + ctx.lineTo(node.x+factor*force.x, node.y+factor*force.y); + ctx.stroke(); + + let angle = Math.atan2(force.y, force.x); + ctx.fillStyle = color; + ctx.arrow(node.x + factor*force.x + Math.cos(angle)*arrowSize, node.y + factor*force.y+Math.sin(angle)*arrowSize, angle, arrowSize); + ctx.fill(); + } + } } diff --git a/lib/vis/lib/network/modules/SelectionHandler.js b/lib/vis/lib/network/modules/SelectionHandler.js index 891ec7ebee..415b6ba801 100644 --- a/lib/vis/lib/network/modules/SelectionHandler.js +++ b/lib/vis/lib/network/modules/SelectionHandler.js @@ -159,7 +159,6 @@ class SelectionHandler { * * @param {{x: Number, y: Number}} pointer * @return {Node | undefined} node - * @private */ getNodeAt(pointer, returnNode = true) { // we first check if this is an navigation controls element @@ -217,7 +216,6 @@ class SelectionHandler { * * @param pointer * @returns {undefined} - * @private */ getEdgeAt(pointer, returnEdge = true) { let positionObject = this._pointerToPositionObject(pointer); @@ -277,6 +275,7 @@ class SelectionHandler { _removeFromSelection(obj) { if (obj instanceof Node) { delete this.selectionObj.nodes[obj.id]; + this._unselectConnectedEdges(obj); } else { delete this.selectionObj.edges[obj.id]; @@ -285,8 +284,6 @@ class SelectionHandler { /** * Unselect all. The selectionObj is useful for this. - * - * @private */ unselectAll() { for(let nodeId in this.selectionObj.nodes) { @@ -299,7 +296,7 @@ class SelectionHandler { this.selectionObj.edges[edgeId].unselect(); } } - + this.selectionObj = {nodes:{},edges:{}}; } @@ -575,7 +572,7 @@ class SelectionHandler { if (this.options.selectable === true) { for (let nodeId in this.selectionObj.nodes) { if (this.selectionObj.nodes.hasOwnProperty(nodeId)) { - idArray.push(nodeId); + idArray.push(this.selectionObj.nodes[nodeId].id); } } } @@ -593,13 +590,54 @@ class SelectionHandler { if (this.options.selectable === true) { for (let edgeId in this.selectionObj.edges) { if (this.selectionObj.edges.hasOwnProperty(edgeId)) { - idArray.push(edgeId); + idArray.push(this.selectionObj.edges[edgeId].id); } } } return idArray; } + /** + * Updates the current selection + * @param {{nodes: Array., edges: Array.}} Selection + * @param {Object} options Options + */ + setSelection(selection, options = {}) { + let i, id; + + if (!selection || (!selection.nodes && !selection.edges)) + throw 'Selection must be an object with nodes and/or edges properties'; + // first unselect any selected node, if option is true or undefined + if (options.unselectAll || options.unselectAll === undefined) { + this.unselectAll(); + } + if (selection.nodes) { + for (i = 0; i < selection.nodes.length; i++) { + id = selection.nodes[i]; + + let node = this.body.nodes[id]; + if (!node) { + throw new RangeError('Node with id "' + id + '" not found'); + } + // don't select edges with it + this.selectObject(node, options.highlightEdges); + } + } + + if (selection.edges) { + for (i = 0; i < selection.edges.length; i++) { + id = selection.edges[i]; + + let edge = this.body.edges[id]; + if (!edge) { + throw new RangeError('Edge with id "' + id + '" not found'); + } + this.selectObject(edge); + } + } + this.body.emitter.emit('_requestRedraw'); + } + /** * select zero or more nodes with the option to highlight edges @@ -608,24 +646,10 @@ class SelectionHandler { * @param {boolean} [highlightEdges] */ selectNodes(selection, highlightEdges = true) { - let i, id; - if (!selection || (selection.length === undefined)) throw 'Selection must be an array with ids'; - - // first unselect any selected node - this.unselectAll(); - - for (i = 0; i < selection.length; i++) { - id = selection[i]; - - let node = this.body.nodes[id]; - if (!node) { - throw new RangeError('Node with id "' + id + '" not found'); - } - this.selectObject(node,highlightEdges); - } - this.body.emitter.emit('_requestRedraw'); + + this.setSelection({nodes: selection}, {highlightEdges: highlightEdges}); } @@ -635,24 +659,10 @@ class SelectionHandler { * selected nodes. */ selectEdges(selection) { - let i, id; - if (!selection || (selection.length === undefined)) throw 'Selection must be an array with ids'; - - // first unselect any selected objects - this.unselectAll(); - - for (i = 0; i < selection.length; i++) { - id = selection[i]; - - let edge = this.body.edges[id]; - if (!edge) { - throw new RangeError('Edge with id "' + id + '" not found'); - } - this.selectObject(edge); - } - this.body.emitter.emit('_requestRedraw'); + + this.setSelection({edges: selection}); } /** diff --git a/lib/vis/lib/network/modules/View.js b/lib/vis/lib/network/modules/View.js index 586831156a..d1004c8053 100644 --- a/lib/vis/lib/network/modules/View.js +++ b/lib/vis/lib/network/modules/View.js @@ -1,4 +1,6 @@ -var util = require('../../util'); +let util = require('../../util'); + +import NetworkUtil from '../NetworkUtil'; class View { constructor(body, canvas) { @@ -29,80 +31,25 @@ class View { } - /** - * Find the center position of the network - * @private - */ - _getRange(specificNodes = []) { - var minY = 1e9, maxY = -1e9, minX = 1e9, maxX = -1e9, node; - if (specificNodes.length > 0) { - for (var i = 0; i < specificNodes.length; i++) { - node = this.body.nodes[specificNodes[i]]; - if (minX > (node.shape.boundingBox.left)) { - minX = node.shape.boundingBox.left; - } - if (maxX < (node.shape.boundingBox.right)) { - maxX = node.shape.boundingBox.right; - } - if (minY > (node.shape.boundingBox.top)) { - minY = node.shape.boundingBox.top; - } // top is negative, bottom is positive - if (maxY < (node.shape.boundingBox.bottom)) { - maxY = node.shape.boundingBox.bottom; - } // top is negative, bottom is positive - } - } - else { - for (var i = 0; i < this.body.nodeIndices.length; i++) { - node = this.body.nodes[this.body.nodeIndices[i]]; - if (minX > (node.shape.boundingBox.left)) { - minX = node.shape.boundingBox.left; - } - if (maxX < (node.shape.boundingBox.right)) { - maxX = node.shape.boundingBox.right; - } - if (minY > (node.shape.boundingBox.top)) { - minY = node.shape.boundingBox.top; - } // top is negative, bottom is positive - if (maxY < (node.shape.boundingBox.bottom)) { - maxY = node.shape.boundingBox.bottom; - } // top is negative, bottom is positive - } - } - - if (minX === 1e9 && maxX === -1e9 && minY === 1e9 && maxY === -1e9) { - minY = 0, maxY = 0, minX = 0, maxX = 0; - } - return {minX: minX, maxX: maxX, minY: minY, maxY: maxY}; - } - - - /** - * @param {object} range = {minX: minX, maxX: maxX, minY: minY, maxY: maxY}; - * @returns {{x: number, y: number}} - * @private - */ - _findCenter(range) { - return {x: (0.5 * (range.maxX + range.minX)), - y: (0.5 * (range.maxY + range.minY))}; - } - - /** * This function zooms out to fit all data on screen based on amount of nodes * @param {Object} Options * @param {Boolean} [initialZoom] | zoom based on fitted formula or range, true = fitted, default = false; */ fit(options = {nodes:[]}, initialZoom = false) { - var range; - var zoomLevel; + let range; + let zoomLevel; + if (options.nodes === undefined || options.nodes.length === 0) { + options.nodes = this.body.nodeIndices; + } + if (initialZoom === true) { // check if more than half of the nodes have a predefined position. If so, we use the range, not the approximation. - var positionDefined = 0; - for (var nodeId in this.body.nodes) { + let positionDefined = 0; + for (let nodeId in this.body.nodes) { if (this.body.nodes.hasOwnProperty(nodeId)) { - var node = this.body.nodes[nodeId]; + let node = this.body.nodes[nodeId]; if (node.predefinedPosition === true) { positionDefined += 1; } @@ -113,24 +60,24 @@ class View { return; } - range = this._getRange(options.nodes); + range = NetworkUtil.getRange(this.body.nodes, options.nodes); - var numberOfNodes = this.body.nodeIndices.length; + let numberOfNodes = this.body.nodeIndices.length; zoomLevel = 12.662 / (numberOfNodes + 7.4147) + 0.0964822; // this is obtained from fitting a dataset from 5 points with scale levels that looked good. // correct for larger canvasses. - var factor = Math.min(this.canvas.frame.canvas.clientWidth / 600, this.canvas.frame.canvas.clientHeight / 600); + let factor = Math.min(this.canvas.frame.canvas.clientWidth / 600, this.canvas.frame.canvas.clientHeight / 600); zoomLevel *= factor; } else { this.body.emitter.emit("_resizeNodes"); - range = this._getRange(options.nodes); + range = NetworkUtil.getRange(this.body.nodes, options.nodes); - var xDistance = Math.abs(range.maxX - range.minX) * 1.1; - var yDistance = Math.abs(range.maxY - range.minY) * 1.1; + let xDistance = Math.abs(range.maxX - range.minX) * 1.1; + let yDistance = Math.abs(range.maxY - range.minY) * 1.1; - var xZoomLevel = this.canvas.frame.canvas.clientWidth / xDistance; - var yZoomLevel = this.canvas.frame.canvas.clientHeight / yDistance; + let xZoomLevel = this.canvas.frame.canvas.clientWidth / xDistance; + let yZoomLevel = this.canvas.frame.canvas.clientHeight / yDistance; zoomLevel = (xZoomLevel <= yZoomLevel) ? xZoomLevel : yZoomLevel; } @@ -142,8 +89,8 @@ class View { zoomLevel = 1.0; } - var center = this._findCenter(range); - var animationOptions = {position: center, scale: zoomLevel, animation: options.animation}; + let center = NetworkUtil.findCenter(range); + let animationOptions = {position: center, scale: zoomLevel, animation: options.animation}; this.moveTo(animationOptions); } @@ -157,7 +104,7 @@ class View { */ focus(nodeId, options = {}) { if (this.body.nodes[nodeId] !== undefined) { - var nodePosition = {x: this.body.nodes[nodeId].x, y: this.body.nodes[nodeId].y}; + let nodePosition = {x: this.body.nodes[nodeId].x, y: this.body.nodes[nodeId].y}; options.position = nodePosition; options.lockedOnNode = nodeId; @@ -229,9 +176,9 @@ class View { // set the scale so the viewCenter is based on the correct zoom level. This is overridden in the transitionRedraw // but at least then we'll have the target transition this.body.view.scale = this.targetScale; - var viewCenter = this.canvas.DOMtoCanvas({x: 0.5 * this.canvas.frame.canvas.clientWidth, y: 0.5 * this.canvas.frame.canvas.clientHeight}); + let viewCenter = this.canvas.DOMtoCanvas({x: 0.5 * this.canvas.frame.canvas.clientWidth, y: 0.5 * this.canvas.frame.canvas.clientHeight}); - var distanceFromCenter = { // offset from view, distance view has to change by these x and y to center the node + let distanceFromCenter = { // offset from view, distance view has to change by these x and y to center the node x: viewCenter.x - options.position.x, y: viewCenter.y - options.position.y }; @@ -268,14 +215,14 @@ class View { * @private */ _lockedRedraw() { - var nodePosition = {x: this.body.nodes[this.lockedOnNodeId].x, y: this.body.nodes[this.lockedOnNodeId].y}; - var viewCenter = this.canvas.DOMtoCanvas({x: 0.5 * this.canvas.frame.canvas.clientWidth, y: 0.5 * this.canvas.frame.canvas.clientHeight}); - var distanceFromCenter = { // offset from view, distance view has to change by these x and y to center the node + let nodePosition = {x: this.body.nodes[this.lockedOnNodeId].x, y: this.body.nodes[this.lockedOnNodeId].y}; + let viewCenter = this.canvas.DOMtoCanvas({x: 0.5 * this.canvas.frame.canvas.clientWidth, y: 0.5 * this.canvas.frame.canvas.clientHeight}); + let distanceFromCenter = { // offset from view, distance view has to change by these x and y to center the node x: viewCenter.x - nodePosition.x, y: viewCenter.y - nodePosition.y }; - var sourceTranslation = this.body.view.translation; - var targetTranslation = { + let sourceTranslation = this.body.view.translation; + let targetTranslation = { x: sourceTranslation.x + distanceFromCenter.x * this.body.view.scale + this.lockedOnNodeOffset.x, y: sourceTranslation.y + distanceFromCenter.y * this.body.view.scale + this.lockedOnNodeOffset.y }; @@ -300,7 +247,7 @@ class View { this.easingTime += this.animationSpeed; this.easingTime = finished === true ? 1.0 : this.easingTime; - var progress = util.easingFunctions[this.animationEasingFunction](this.easingTime); + let progress = util.easingFunctions[this.animationEasingFunction](this.easingTime); this.body.view.scale = this.sourceScale + (this.targetScale - this.sourceScale) * progress; this.body.view.translation = { diff --git a/lib/vis/lib/network/modules/components/Edge.js b/lib/vis/lib/network/modules/components/Edge.js index ded3d0391e..01c84829de 100644 --- a/lib/vis/lib/network/modules/components/Edge.js +++ b/lib/vis/lib/network/modules/components/Edge.js @@ -1,6 +1,7 @@ var util = require('../../../util'); import Label from './shared/Label' +import CubicBezierEdge from './edges/CubicBezierEdge' import BezierEdgeDynamic from './edges/BezierEdgeDynamic' import BezierEdgeStatic from './edges/BezierEdgeStatic' import StraightEdge from './edges/StraightEdge' @@ -26,6 +27,7 @@ class Edge { throw "No body provided"; } this.options = util.bridgeObject(globalOptions); + this.globalOptions = globalOptions; this.body = body; // initialize variables @@ -64,7 +66,7 @@ class Edge { } this.colorDirty = true; - Edge.parseOptions(this.options, options, true); + Edge.parseOptions(this.options, options, true, this.globalOptions); if (options.id !== undefined) {this.id = options.id;} if (options.from !== undefined) {this.fromId = options.from;} @@ -91,8 +93,9 @@ class Edge { return dataChanged; } - static parseOptions(parentOptions, newOptions, allowDeletion = false) { + static parseOptions(parentOptions, newOptions, allowDeletion = false, globalOptions = {}) { var fields = [ + 'arrowStrikethrough', 'id', 'from', 'hidden', @@ -103,6 +106,7 @@ class Edge { 'line', 'opacity', 'physics', + 'scaling', 'selectionWidth', 'selfReferenceSize', 'to', @@ -114,29 +118,27 @@ class Edge { // only deep extend the items in the field array. These do not have shorthand. util.selectiveDeepExtend(fields, parentOptions, newOptions, allowDeletion); - util.mergeOptions(parentOptions, newOptions, 'smooth'); - util.mergeOptions(parentOptions, newOptions, 'shadow'); + util.mergeOptions(parentOptions, newOptions, 'smooth', allowDeletion, globalOptions); + util.mergeOptions(parentOptions, newOptions, 'shadow', allowDeletion, globalOptions); if (newOptions.dashes !== undefined && newOptions.dashes !== null) { parentOptions.dashes = newOptions.dashes; } else if (allowDeletion === true && newOptions.dashes === null) { - parentOptions.dashes = undefined; - delete parentOptions.dashes; + parentOptions.dashes = Object.create(globalOptions.dashes); // this sets the pointer of the option back to the global option. } // set the scaling newOptions if (newOptions.scaling !== undefined && newOptions.scaling !== null) { if (newOptions.scaling.min !== undefined) {parentOptions.scaling.min = newOptions.scaling.min;} if (newOptions.scaling.max !== undefined) {parentOptions.scaling.max = newOptions.scaling.max;} - util.mergeOptions(parentOptions.scaling, newOptions.scaling, 'label'); + util.mergeOptions(parentOptions.scaling, newOptions.scaling, 'label', allowDeletion, globalOptions.scaling); } else if (allowDeletion === true && newOptions.scaling === null) { - parentOptions.scaling = undefined; - delete parentOptions.scaling; + parentOptions.scaling = Object.create(globalOptions.scaling); // this sets the pointer of the option back to the global option. } - // hanlde multiple input cases for arrows + // handle multiple input cases for arrows if (newOptions.arrows !== undefined && newOptions.arrows !== null) { if (typeof newOptions.arrows === 'string') { let arrows = newOptions.arrows.toLowerCase(); @@ -145,21 +147,22 @@ class Edge { if (arrows.indexOf("from") != -1) {parentOptions.arrows.from.enabled = true;} } else if (typeof newOptions.arrows === 'object') { - util.mergeOptions(parentOptions.arrows, newOptions.arrows, 'to'); - util.mergeOptions(parentOptions.arrows, newOptions.arrows, 'middle'); - util.mergeOptions(parentOptions.arrows, newOptions.arrows, 'from'); + util.mergeOptions(parentOptions.arrows, newOptions.arrows, 'to', allowDeletion, globalOptions.arrows); + util.mergeOptions(parentOptions.arrows, newOptions.arrows, 'middle', allowDeletion, globalOptions.arrows); + util.mergeOptions(parentOptions.arrows, newOptions.arrows, 'from', allowDeletion, globalOptions.arrows); } else { throw new Error("The arrow newOptions can only be an object or a string. Refer to the documentation. You used:" + JSON.stringify(newOptions.arrows)); } } else if (allowDeletion === true && newOptions.arrows === null) { - parentOptions.arrows = undefined; - delete parentOptions.arrows; + parentOptions.arrows = Object.create(globalOptions.arrows); // this sets the pointer of the option back to the global option. } - // hanlde multiple input cases for color + // handle multiple input cases for color if (newOptions.color !== undefined && newOptions.color !== null) { + // make a copy of the parent object in case this is referring to the global one (due to object create once, then update) + parentOptions.color = util.deepExtend({}, parentOptions.color, true); if (util.isString(newOptions.color)) { parentOptions.color.color = newOptions.color; parentOptions.color.highlight = newOptions.color; @@ -180,14 +183,16 @@ class Edge { } } else if (allowDeletion === true && newOptions.color === null) { - parentOptions.color = undefined; - delete parentOptions.color; + parentOptions.color = util.bridgeObject(globalOptions.color); // set the object back to the global options } // handle the font settings - if (newOptions.font !== undefined) { + if (newOptions.font !== undefined && newOptions.font !== null) { Label.parseOptions(parentOptions.font, newOptions); } + else if (allowDeletion === true && newOptions.font === null) { + parentOptions.font = util.bridgeObject(globalOptions.font); // set the object back to the global options + } } @@ -208,13 +213,15 @@ class Edge { updateEdgeType() { let dataChanged = false; let changeInType = true; + let smooth = this.options.smooth; if (this.edgeType !== undefined) { - if (this.edgeType instanceof BezierEdgeDynamic && this.options.smooth.enabled === true && this.options.smooth.type === 'dynamic') {changeInType = false;} - if (this.edgeType instanceof BezierEdgeStatic && this.options.smooth.enabled === true && this.options.smooth.type !== 'dynamic') {changeInType = false;} - if (this.edgeType instanceof StraightEdge && this.options.smooth.enabled === false) {changeInType = false;} + if (this.edgeType instanceof BezierEdgeDynamic && smooth.enabled === true && smooth.type === 'dynamic') {changeInType = false;} + if (this.edgeType instanceof CubicBezierEdge && smooth.enabled === true && smooth.type === 'cubicBezier') {changeInType = false;} + if (this.edgeType instanceof BezierEdgeStatic && smooth.enabled === true && smooth.type !== 'dynamic' && smooth.type !== 'cubicBezier') {changeInType = false;} + if (this.edgeType instanceof StraightEdge && smooth.enabled === false) {changeInType = false;} if (changeInType === true) { - dataChanged = this.edgeType.cleanup(); + dataChanged = this.cleanup(); } } @@ -224,6 +231,9 @@ class Edge { dataChanged = true; this.edgeType = new BezierEdgeDynamic(this.options, this.body, this.labelModule); } + else if (this.options.smooth.type === 'cubicBezier') { + this.edgeType = new CubicBezierEdge(this.options, this.body, this.labelModule); + } else { this.edgeType = new BezierEdgeStatic(this.options, this.body, this.labelModule); } @@ -241,15 +251,6 @@ class Edge { } - /** - * Enable or disable the physics. - * @param status - */ - togglePhysics(status) { - this.options.physics = status; - this.edgeType.togglePhysics(status); - } - /** * Connect an edge to its nodes */ @@ -346,6 +347,7 @@ class Edge { } this._setInteractionWidths(); + this.updateLabelModule(); } _setInteractionWidths() { @@ -372,17 +374,45 @@ class Edge { * @param {CanvasRenderingContext2D} ctx */ draw(ctx) { - let via = this.edgeType.drawLine(ctx, this.selected, this.hover); - this.drawArrows(ctx, via); - this.drawLabel (ctx, via); + // get the via node from the edge type + let viaNode = this.edgeType.getViaNode(); + let arrowData = {}; + + // restore edge targets to defaults + this.edgeType.fromPoint = this.from; + this.edgeType.toPoint = this.to; + + // from and to arrows give a different end point for edges. we set them here + if (this.options.arrows.from.enabled === true) { + arrowData.from = this.edgeType.getArrowData(ctx,'from', viaNode, this.selected, this.hover); + if (this.options.arrowStrikethrough === false) + this.edgeType.fromPoint = arrowData.from.core; + } + if (this.options.arrows.to.enabled === true) { + arrowData.to = this.edgeType.getArrowData(ctx,'to', viaNode, this.selected, this.hover); + if (this.options.arrowStrikethrough === false) + this.edgeType.toPoint = arrowData.to.core; + } + + // the middle arrow depends on the line, which can depend on the to and from arrows so we do this one lastly. + if (this.options.arrows.middle.enabled === true) { + arrowData.middle = this.edgeType.getArrowData(ctx,'middle', viaNode, this.selected, this.hover); + } + + // draw everything + this.edgeType.drawLine(ctx, this.selected, this.hover, viaNode); + this.drawArrows(ctx, arrowData); + this.drawLabel (ctx, viaNode); } - drawArrows(ctx, viaNode) { - if (this.options.arrows.from.enabled === true) {this.edgeType.drawArrowHead(ctx,'from', viaNode, this.selected, this.hover);} - if (this.options.arrows.middle.enabled === true) {this.edgeType.drawArrowHead(ctx,'middle', viaNode, this.selected, this.hover);} - if (this.options.arrows.to.enabled === true) {this.edgeType.drawArrowHead(ctx,'to', viaNode, this.selected, this.hover);} + + drawArrows(ctx, arrowData) { + if (this.options.arrows.from.enabled === true) {this.edgeType.drawArrowHead(ctx, this.selected, this.hover, arrowData.from);} + if (this.options.arrows.middle.enabled === true) {this.edgeType.drawArrowHead(ctx, this.selected, this.hover, arrowData.middle);} + if (this.options.arrows.to.enabled === true) {this.edgeType.drawArrowHead(ctx, this.selected, this.hover, arrowData.to);} } + drawLabel(ctx, viaNode) { if (this.options.label !== undefined) { // set style @@ -495,6 +525,15 @@ class Edge { unselect() { this.selected = false; } + + + /** + * cleans all required things on delete + * @returns {*} + */ + cleanup() { + return this.edgeType.cleanup(); + } } export default Edge; \ No newline at end of file diff --git a/lib/vis/lib/network/modules/components/Node.js b/lib/vis/lib/network/modules/components/Node.js index d1567e67bc..79e32375cb 100644 --- a/lib/vis/lib/network/modules/components/Node.js +++ b/lib/vis/lib/network/modules/components/Node.js @@ -48,6 +48,7 @@ import {printStyle} from "../../../shared/Validator"; class Node { constructor(options, body, imagelist, grouplist, globalOptions) { this.options = util.bridgeObject(globalOptions); + this.globalOptions = globalOptions; this.body = body; this.edges = []; // all edges connected to this node @@ -93,14 +94,6 @@ class Node { } } - /** - * Enable or disable the physics. - * @param status - */ - togglePhysics(status) { - this.options.physics = status; - } - /** * Set or overwrite options for the node @@ -108,6 +101,7 @@ class Node { * @param {Object} constants and object with default, global options */ setOptions(options) { + let currentShape = this.options.shape; if (!options) { return; } @@ -132,7 +126,6 @@ class Node { if (options.size !== undefined) {this.baseSize = options.size;} if (options.value !== undefined) {options.value = parseFloat(options.value);} - // copy group options if (typeof options.group === 'number' || (typeof options.group === 'string' && options.group != '')) { var groupObj = this.grouplist.get(options.group); @@ -142,7 +135,7 @@ class Node { } // this transforms all shorthands into fully defined options - Node.parseOptions(this.options, options, true); + Node.parseOptions(this.options, options, true, this.globalOptions); // load the images if (this.options.image !== undefined) { @@ -154,11 +147,8 @@ class Node { } } - this.updateShape(); this.updateLabelModule(); - - // reset the size of the node, this can be changed - this._reset(); + this.updateShape(currentShape); if (options.hidden !== undefined || options.physics !== undefined) { return true; @@ -172,8 +162,10 @@ class Node { * Static so it can also be used by the handler. * @param parentOptions * @param newOptions + * @param allowDeletion + * @param globalOptions */ - static parseOptions(parentOptions, newOptions, allowDeletion = false) { + static parseOptions(parentOptions, newOptions, allowDeletion = false, globalOptions = {}) { var fields = [ 'color', 'font', @@ -183,7 +175,7 @@ class Node { util.selectiveNotDeepExtend(fields, parentOptions, newOptions, allowDeletion); // merge the shadow options into the parent. - util.mergeOptions(parentOptions, newOptions, 'shadow'); + util.mergeOptions(parentOptions, newOptions, 'shadow', allowDeletion, globalOptions); // individual shape newOptions if (newOptions.color !== undefined && newOptions.color !== null) { @@ -191,8 +183,7 @@ class Node { util.fillIfDefined(parentOptions.color, parsedColor); } else if (allowDeletion === true && newOptions.color === null) { - parentOptions.color = undefined; - delete parentOptions.color; + parentOptions.color = util.bridgeObject(globalOptions.color); // set the object back to the global options } // handle the fixed options @@ -212,13 +203,16 @@ class Node { } // handle the font options - if (newOptions.font !== undefined) { + if (newOptions.font !== undefined && newOptions.font !== null) { Label.parseOptions(parentOptions.font, newOptions); } + else if (allowDeletion === true && newOptions.font === null) { + parentOptions.font = util.bridgeObject(globalOptions.font); // set the object back to the global options + } // handle the scaling options, specifically the label part if (newOptions.scaling !== undefined) { - util.mergeOptions(parentOptions.scaling, newOptions.scaling, 'label'); + util.mergeOptions(parentOptions.scaling, newOptions.scaling, 'label', allowDeletion, globalOptions.scaling); } } @@ -232,54 +226,59 @@ class Node { } } - updateShape() { - // choose draw method depending on the shape - switch (this.options.shape) { - case 'box': - this.shape = new Box(this.options, this.body, this.labelModule); - break; - case 'circle': - this.shape = new Circle(this.options, this.body, this.labelModule); - break; - case 'circularImage': - this.shape = new CircularImage(this.options, this.body, this.labelModule, this.imageObj); - break; - case 'database': - this.shape = new Database(this.options, this.body, this.labelModule); - break; - case 'diamond': - this.shape = new Diamond(this.options, this.body, this.labelModule); - break; - case 'dot': - this.shape = new Dot(this.options, this.body, this.labelModule); - break; - case 'ellipse': - this.shape = new Ellipse(this.options, this.body, this.labelModule); - break; - case 'icon': - this.shape = new Icon(this.options, this.body, this.labelModule); - break; - case 'image': - this.shape = new Image(this.options, this.body, this.labelModule, this.imageObj); - break; - case 'square': - this.shape = new Square(this.options, this.body, this.labelModule); - break; - case 'star': - this.shape = new Star(this.options, this.body, this.labelModule); - break; - case 'text': - this.shape = new Text(this.options, this.body, this.labelModule); - break; - case 'triangle': - this.shape = new Triangle(this.options, this.body, this.labelModule); - break; - case 'triangleDown': - this.shape = new TriangleDown(this.options, this.body, this.labelModule); - break; - default: - this.shape = new Ellipse(this.options, this.body, this.labelModule); - break; + updateShape(currentShape) { + if (currentShape === this.options.shape && this.shape) { + this.shape.setOptions(this.options, this.imageObj); + } + else { + // choose draw method depending on the shape + switch (this.options.shape) { + case 'box': + this.shape = new Box(this.options, this.body, this.labelModule); + break; + case 'circle': + this.shape = new Circle(this.options, this.body, this.labelModule); + break; + case 'circularImage': + this.shape = new CircularImage(this.options, this.body, this.labelModule, this.imageObj); + break; + case 'database': + this.shape = new Database(this.options, this.body, this.labelModule); + break; + case 'diamond': + this.shape = new Diamond(this.options, this.body, this.labelModule); + break; + case 'dot': + this.shape = new Dot(this.options, this.body, this.labelModule); + break; + case 'ellipse': + this.shape = new Ellipse(this.options, this.body, this.labelModule); + break; + case 'icon': + this.shape = new Icon(this.options, this.body, this.labelModule); + break; + case 'image': + this.shape = new Image(this.options, this.body, this.labelModule, this.imageObj); + break; + case 'square': + this.shape = new Square(this.options, this.body, this.labelModule); + break; + case 'star': + this.shape = new Star(this.options, this.body, this.labelModule); + break; + case 'text': + this.shape = new Text(this.options, this.body, this.labelModule); + break; + case 'triangle': + this.shape = new Triangle(this.options, this.body, this.labelModule); + break; + case 'triangleDown': + this.shape = new TriangleDown(this.options, this.body, this.labelModule); + break; + default: + this.shape = new Ellipse(this.options, this.body, this.labelModule); + break; + } } this._reset(); } @@ -382,6 +381,8 @@ class Node { this.options.size = this.baseSize; this.options.font.size = this.baseFontSize; } + + this.updateLabelModule(); } @@ -433,14 +434,12 @@ class Node { */ isBoundingBoxOverlappingWith(obj) { return ( - this.shape.boundingBox.left < obj.right && - this.shape.boundingBox.right > obj.left && - this.shape.boundingBox.top < obj.bottom && - this.shape.boundingBox.bottom > obj.top + this.shape.boundingBox.left < obj.right && + this.shape.boundingBox.right > obj.left && + this.shape.boundingBox.top < obj.bottom && + this.shape.boundingBox.bottom > obj.top ); } - - } export default Node; diff --git a/lib/vis/lib/network/modules/components/algorithms/FloydWarshall.js b/lib/vis/lib/network/modules/components/algorithms/FloydWarshall.js new file mode 100644 index 0000000000..e0d3f92d40 --- /dev/null +++ b/lib/vis/lib/network/modules/components/algorithms/FloydWarshall.js @@ -0,0 +1,49 @@ +/** + * Created by Alex on 10-Aug-15. + */ + + +class FloydWarshall { + constructor(){} + + getDistances(body, nodesArray, edgesArray) { + let D_matrix = {}; + let edges = body.edges; + + // prepare matrix with large numbers + for (let i = 0; i < nodesArray.length; i++) { + D_matrix[nodesArray[i]] = {}; + D_matrix[nodesArray[i]] = {}; + for (let j = 0; j < nodesArray.length; j++) { + D_matrix[nodesArray[i]][nodesArray[j]] = (i == j ? 0 : 1e9); + D_matrix[nodesArray[i]][nodesArray[j]] = (i == j ? 0 : 1e9); + } + } + + // put the weights for the edges in. This assumes unidirectionality. + for (let i = 0; i < edgesArray.length; i++) { + let edge = edges[edgesArray[i]]; + // edge has to be connected if it counts to the distances. If it is connected to inner clusters it will crash so we also check if it is in the D_matrix + if (edge.connected === true && D_matrix[edge.fromId] !== undefined && D_matrix[edge.toId] !== undefined) { + D_matrix[edge.fromId][edge.toId] = 1; + D_matrix[edge.toId][edge.fromId] = 1; + } + } + + let nodeCount = nodesArray.length; + + // Adapted FloydWarshall based on unidirectionality to greatly reduce complexity. + for (let k = 0; k < nodeCount; k++) { + for (let i = 0; i < nodeCount-1; i++) { + for (let j = i+1; j < nodeCount; j++) { + D_matrix[nodesArray[i]][nodesArray[j]] = Math.min(D_matrix[nodesArray[i]][nodesArray[j]],D_matrix[nodesArray[i]][nodesArray[k]] + D_matrix[nodesArray[k]][nodesArray[j]]) + D_matrix[nodesArray[j]][nodesArray[i]] = D_matrix[nodesArray[i]][nodesArray[j]]; + } + } + } + + return D_matrix; + } +} + +export default FloydWarshall; \ No newline at end of file diff --git a/lib/vis/lib/network/modules/components/edges/BezierEdgeDynamic.js b/lib/vis/lib/network/modules/components/edges/BezierEdgeDynamic.js index 1e52a844f7..0108d50a36 100644 --- a/lib/vis/lib/network/modules/components/edges/BezierEdgeDynamic.js +++ b/lib/vis/lib/network/modules/components/edges/BezierEdgeDynamic.js @@ -4,13 +4,32 @@ class BezierEdgeDynamic extends BezierEdgeBase { constructor(options, body, labelModule) { //this.via = undefined; // Here for completeness but not allowed to defined before super() is invoked. super(options, body, labelModule); // --> this calls the setOptions below + this._boundFunction = () => {this.positionBezierNode();}; + this.body.emitter.on("_repositionBezierNodes", this._boundFunction); } setOptions(options) { + // check if the physics has changed. + let physicsChange = false; + if (this.options.physics !== options.physics) { + physicsChange = true; + } + + // set the options and the to and from nodes this.options = options; this.id = this.options.id; + this.from = this.body.nodes[this.options.from]; + this.to = this.body.nodes[this.options.to]; + + // setup the support node and connect this.setupSupportNode(); this.connect(); + + // when we change the physics state of the edge, we reposition the support node. + if (physicsChange === true) { + this.via.setOptions({physics: this.options.physics}) + this.positionBezierNode(); + } } connect() { @@ -20,7 +39,7 @@ class BezierEdgeDynamic extends BezierEdgeBase { this.via.setOptions({physics:false}) } else { - // fix weird behaviour where a selfreferencing node has physics enabled + // fix weird behaviour where a self referencing node has physics enabled if (this.from.id === this.to.id) { this.via.setOptions({physics: false}) } @@ -30,7 +49,12 @@ class BezierEdgeDynamic extends BezierEdgeBase { } } + /** + * remove the support nodes + * @returns {boolean} + */ cleanup() { + this.body.emitter.off("_repositionBezierNodes", this._boundFunction); if (this.via !== undefined) { delete this.body.nodes[this.via.id]; this.via = undefined; @@ -39,11 +63,6 @@ class BezierEdgeDynamic extends BezierEdgeBase { return false; } - togglePhysics(status) { - this.via.setOptions({physics:status}); - this.positionBezierNode(); - } - /** * Bezier curves require an anchor point to calculate the smooth flow. These points are nodes. These nodes are invisible but * are used for the force calculation. @@ -83,15 +102,24 @@ class BezierEdgeDynamic extends BezierEdgeBase { * @param {CanvasRenderingContext2D} ctx * @private */ - _line(ctx) { + _line(ctx, viaNode) { // draw a straight line ctx.beginPath(); - ctx.moveTo(this.from.x, this.from.y); - ctx.quadraticCurveTo(this.via.x, this.via.y, this.to.x, this.to.y); + ctx.moveTo(this.fromPoint.x, this.fromPoint.y); + // fallback to normal straight edges + if (viaNode.x === undefined) { + ctx.lineTo(this.toPoint.x, this.toPoint.y); + } + else { + ctx.quadraticCurveTo(viaNode.x, viaNode.y, this.toPoint.x, this.toPoint.y); + } // draw shadow if enabled this.enableShadow(ctx); ctx.stroke(); this.disableShadow(ctx); + } + + getViaNode() { return this.via; } @@ -99,14 +127,14 @@ class BezierEdgeDynamic extends BezierEdgeBase { /** * Combined function of pointOnLine and pointOnBezier. This gives the coordinates of a point on the line at a certain percentage of the way * @param percentage - * @param via + * @param viaNode * @returns {{x: number, y: number}} * @private */ - getPoint(percentage) { + getPoint(percentage, viaNode = this.via) { let t = percentage; - let x = Math.pow(1 - t, 2) * this.from.x + (2 * t * (1 - t)) * this.via.x + Math.pow(t, 2) * this.to.x; - let y = Math.pow(1 - t, 2) * this.from.y + (2 * t * (1 - t)) * this.via.y + Math.pow(t, 2) * this.to.y; + let x = Math.pow(1 - t, 2) * this.fromPoint.x + (2 * t * (1 - t)) * viaNode.x + Math.pow(t, 2) * this.toPoint.x; + let y = Math.pow(1 - t, 2) * this.fromPoint.y + (2 * t * (1 - t)) * viaNode.y + Math.pow(t, 2) * this.toPoint.y; return {x: x, y: y}; } diff --git a/lib/vis/lib/network/modules/components/edges/BezierEdgeStatic.js b/lib/vis/lib/network/modules/components/edges/BezierEdgeStatic.js index 9b3619b0af..d70ed7c0d2 100644 --- a/lib/vis/lib/network/modules/components/edges/BezierEdgeStatic.js +++ b/lib/vis/lib/network/modules/components/edges/BezierEdgeStatic.js @@ -10,28 +10,34 @@ class BezierEdgeStatic extends BezierEdgeBase { * @param {CanvasRenderingContext2D} ctx * @private */ - _line(ctx) { + _line(ctx, viaNode) { // draw a straight line ctx.beginPath(); - ctx.moveTo(this.from.x, this.from.y); - let via = this._getViaCoordinates(); - let returnValue = via; + ctx.moveTo(this.fromPoint.x, this.fromPoint.y); // fallback to normal straight edges - if (via.x === undefined) { - ctx.lineTo(this.to.x, this.to.y); - returnValue = undefined; + if (viaNode.x === undefined) { + ctx.lineTo(this.toPoint.x, this.toPoint.y); } else { - ctx.quadraticCurveTo(via.x, via.y, this.to.x, this.to.y); + ctx.quadraticCurveTo(viaNode.x, viaNode.y, this.toPoint.x, this.toPoint.y); } // draw shadow if enabled this.enableShadow(ctx); ctx.stroke(); this.disableShadow(ctx); - return returnValue; } + getViaNode() { + return this._getViaCoordinates(); + } + + + /** + * We do not use the to and fromPoints here to make the via nodes the same as edges without arrows. + * @returns {{x: undefined, y: undefined}} + * @private + */ _getViaCoordinates() { let xVia = undefined; let yVia = undefined; @@ -214,21 +220,21 @@ class BezierEdgeStatic extends BezierEdgeBase { return this._findBorderPositionBezier(nearNode, ctx, options.via); } - _getDistanceToEdge(x1, y1, x2, y2, x3, y3, via = this._getViaCoordinates()) { // x3,y3 is the point - return this._getDistanceToBezierEdge(x1, y1, x2, y2, x3, y3, via); + _getDistanceToEdge(x1, y1, x2, y2, x3, y3, viaNode = this._getViaCoordinates()) { // x3,y3 is the point + return this._getDistanceToBezierEdge(x1, y1, x2, y2, x3, y3, viaNode); } /** * Combined function of pointOnLine and pointOnBezier. This gives the coordinates of a point on the line at a certain percentage of the way * @param percentage - * @param via + * @param viaNode * @returns {{x: number, y: number}} * @private */ - getPoint(percentage, via = this._getViaCoordinates()) { + getPoint(percentage, viaNode = this._getViaCoordinates()) { var t = percentage; - var x = Math.pow(1 - t, 2) * this.from.x + (2 * t * (1 - t)) * via.x + Math.pow(t, 2) * this.to.x; - var y = Math.pow(1 - t, 2) * this.from.y + (2 * t * (1 - t)) * via.y + Math.pow(t, 2) * this.to.y; + var x = Math.pow(1 - t, 2) * this.fromPoint.x + (2 * t * (1 - t)) * viaNode.x + Math.pow(t, 2) * this.toPoint.x; + var y = Math.pow(1 - t, 2) * this.fromPoint.y + (2 * t * (1 - t)) * viaNode.y + Math.pow(t, 2) * this.toPoint.y; return {x: x, y: y}; } diff --git a/lib/vis/lib/network/modules/components/edges/CubicBezierEdge.js b/lib/vis/lib/network/modules/components/edges/CubicBezierEdge.js new file mode 100644 index 0000000000..e7b7669523 --- /dev/null +++ b/lib/vis/lib/network/modules/components/edges/CubicBezierEdge.js @@ -0,0 +1,93 @@ +import CubicBezierEdgeBase from './util/CubicBezierEdgeBase' + +class CubicBezierEdge extends CubicBezierEdgeBase { + constructor(options, body, labelModule) { + super(options, body, labelModule); + } + + /** + * Draw a line between two nodes + * @param {CanvasRenderingContext2D} ctx + * @private + */ + _line(ctx, viaNodes) { + // get the coordinates of the support points. + let via1 = viaNodes[0]; + let via2 = viaNodes[1]; + + // start drawing the line. + ctx.beginPath(); + ctx.moveTo(this.fromPoint.x, this.fromPoint.y); + + // fallback to normal straight edges + if (viaNodes === undefined || via1.x === undefined) { + ctx.lineTo(this.toPoint.x, this.toPoint.y); + } + else { + ctx.bezierCurveTo(via1.x, via1.y, via2.x, via2.y, this.toPoint.x, this.toPoint.y); + } + // draw shadow if enabled + this.enableShadow(ctx); + ctx.stroke(); + this.disableShadow(ctx); + } + + _getViaCoordinates() { + let dx = this.from.x - this.to.x; + let dy = this.from.y - this.to.y; + + let x1, y1, x2, y2; + let roundness = this.options.smooth.roundness; + + // horizontal if x > y or if direction is forced or if direction is horizontal + if ((Math.abs(dx) > Math.abs(dy) || this.options.smooth.forceDirection === true || this.options.smooth.forceDirection === 'horizontal') && this.options.smooth.forceDirection !== 'vertical') { + y1 = this.from.y; + y2 = this.to.y; + x1 = this.from.x - roundness * dx; + x2 = this.to.x + roundness * dx; + } + else { + y1 = this.from.y - roundness * dy; + y2 = this.to.y + roundness * dy; + x1 = this.from.x; + x2 = this.to.x; + } + + return [{x: x1, y: y1},{x: x2, y: y2}]; + } + + getViaNode() { + return this._getViaCoordinates(); + } + + _findBorderPosition(nearNode, ctx) { + return this._findBorderPositionBezier(nearNode, ctx); + } + + _getDistanceToEdge(x1, y1, x2, y2, x3, y3, [via1, via2] = this._getViaCoordinates()) { // x3,y3 is the point + return this._getDistanceToBezierEdge(x1, y1, x2, y2, x3, y3, via1, via2); + } + + /** + * Combined function of pointOnLine and pointOnBezier. This gives the coordinates of a point on the line at a certain percentage of the way + * @param percentage + * @param via + * @returns {{x: number, y: number}} + * @private + */ + getPoint(percentage, [via1, via2] = this._getViaCoordinates()) { + let t = percentage; + let vec = []; + vec[0] = Math.pow(1 - t, 3); + vec[1] = 3 * t * Math.pow(1 - t, 2); + vec[2] = 3 * Math.pow(t,2) * (1 - t); + vec[3] = Math.pow(t, 3); + let x = vec[0] * this.fromPoint.x + vec[1] * via1.x + vec[2] * via2.x + vec[3] * this.toPoint.x; + let y = vec[0] * this.fromPoint.y + vec[1] * via1.y + vec[2] * via2.y + vec[3] * this.toPoint.y; + + return {x: x, y: y}; + } +} + + +export default CubicBezierEdge; \ No newline at end of file diff --git a/lib/vis/lib/network/modules/components/edges/StraightEdge.js b/lib/vis/lib/network/modules/components/edges/StraightEdge.js index 0fc08a0fa9..6d7bf231dc 100644 --- a/lib/vis/lib/network/modules/components/edges/StraightEdge.js +++ b/lib/vis/lib/network/modules/components/edges/StraightEdge.js @@ -13,12 +13,15 @@ class StraightEdge extends EdgeBase { _line(ctx) { // draw a straight line ctx.beginPath(); - ctx.moveTo(this.from.x, this.from.y); - ctx.lineTo(this.to.x, this.to.y); + ctx.moveTo(this.fromPoint.x, this.fromPoint.y); + ctx.lineTo(this.toPoint.x, this.toPoint.y); // draw shadow if enabled this.enableShadow(ctx); ctx.stroke(); this.disableShadow(ctx); + } + + getViaNode() { return undefined; } @@ -31,8 +34,8 @@ class StraightEdge extends EdgeBase { */ getPoint(percentage) { return { - x: (1 - percentage) * this.from.x + percentage * this.to.x, - y: (1 - percentage) * this.from.y + percentage * this.to.y + x: (1 - percentage) * this.fromPoint.x + percentage * this.toPoint.x, + y: (1 - percentage) * this.fromPoint.y + percentage * this.toPoint.y } } diff --git a/lib/vis/lib/network/modules/components/edges/util/BezierEdgeBase.js b/lib/vis/lib/network/modules/components/edges/util/BezierEdgeBase.js index ea55651da1..48b663bf6c 100644 --- a/lib/vis/lib/network/modules/components/edges/util/BezierEdgeBase.js +++ b/lib/vis/lib/network/modules/components/edges/util/BezierEdgeBase.js @@ -73,18 +73,15 @@ class BezierEdgeBase extends EdgeBase { * Calculate the distance between a point (x3,y3) and a line segment from * (x1,y1) to (x2,y2). * http://stackoverflow.com/questions/849211/shortest-distancae-between-a-point-and-a-line-segment - * @param {number} x1 - * @param {number} y1 - * @param {number} x2 - * @param {number} y2 - * @param {number} x3 - * @param {number} y3 + * @param {number} x1 from x + * @param {number} y1 from y + * @param {number} x2 to x + * @param {number} y2 to y + * @param {number} x3 point to check x + * @param {number} y3 point to check y * @private */ _getDistanceToBezierEdge(x1, y1, x2, y2, x3, y3, via) { // x3,y3 is the point - let xVia, yVia; - xVia = via.x; - yVia = via.y; let minDistance = 1e9; let distance; let i, t, x, y; @@ -92,8 +89,8 @@ class BezierEdgeBase extends EdgeBase { let lastY = y1; for (i = 1; i < 10; i++) { t = 0.1 * i; - x = Math.pow(1 - t, 2) * x1 + (2 * t * (1 - t)) * xVia + Math.pow(t, 2) * x2; - y = Math.pow(1 - t, 2) * y1 + (2 * t * (1 - t)) * yVia + Math.pow(t, 2) * y2; + x = Math.pow(1 - t, 2) * x1 + (2 * t * (1 - t)) * via.x + Math.pow(t, 2) * x2; + y = Math.pow(1 - t, 2) * y1 + (2 * t * (1 - t)) * via.y + Math.pow(t, 2) * y2; if (i > 0) { distance = this._getDistanceToLine(lastX, lastY, x, y, x3, y3); minDistance = distance < minDistance ? distance : minDistance; diff --git a/lib/vis/lib/network/modules/components/edges/util/CubicBezierEdgeBase.js b/lib/vis/lib/network/modules/components/edges/util/CubicBezierEdgeBase.js new file mode 100644 index 0000000000..a454eb48bb --- /dev/null +++ b/lib/vis/lib/network/modules/components/edges/util/CubicBezierEdgeBase.js @@ -0,0 +1,48 @@ +import BezierEdgeBase from './BezierEdgeBase' + +class CubicBezierEdgeBase extends BezierEdgeBase { + constructor(options, body, labelModule) { + super(options, body, labelModule); + } + + /** + * Calculate the distance between a point (x3,y3) and a line segment from + * (x1,y1) to (x2,y2). + * http://stackoverflow.com/questions/849211/shortest-distancae-between-a-point-and-a-line-segment + * https://en.wikipedia.org/wiki/B%C3%A9zier_curve + * @param {number} x1 from x + * @param {number} y1 from y + * @param {number} x2 to x + * @param {number} y2 to y + * @param {number} x3 point to check x + * @param {number} y3 point to check y + * @private + */ + _getDistanceToBezierEdge(x1, y1, x2, y2, x3, y3, via1, via2) { // x3,y3 is the point + let minDistance = 1e9; + let distance; + let i, t, x, y; + let lastX = x1; + let lastY = y1; + let vec = [0,0,0,0] + for (i = 1; i < 10; i++) { + t = 0.1 * i; + vec[0] = Math.pow(1 - t, 3); + vec[1] = 3 * t * Math.pow(1 - t, 2); + vec[2] = 3 * Math.pow(t,2) * (1 - t); + vec[3] = Math.pow(t, 3); + x = vec[0] * x1 + vec[1] * via1.x + vec[2] * via2.x + vec[3] * x2; + y = vec[0] * y1 + vec[1] * via1.y + vec[2] * via2.y + vec[3] * y2; + if (i > 0) { + distance = this._getDistanceToLine(lastX, lastY, x, y, x3, y3); + minDistance = distance < minDistance ? distance : minDistance; + } + lastX = x; + lastY = y; + } + + return minDistance; + } +} + +export default CubicBezierEdgeBase; \ No newline at end of file diff --git a/lib/vis/lib/network/modules/components/edges/util/EdgeBase.js b/lib/vis/lib/network/modules/components/edges/util/EdgeBase.js index 447fef7df9..659313a1c6 100644 --- a/lib/vis/lib/network/modules/components/edges/util/EdgeBase.js +++ b/lib/vis/lib/network/modules/components/edges/util/EdgeBase.js @@ -4,11 +4,14 @@ class EdgeBase { constructor(options, body, labelModule) { this.body = body; this.labelModule = labelModule; + this.options = {}; this.setOptions(options); this.colorDirty = true; this.color = {}; this.selectionWidth = 2; this.hoverWidth = 1.5; + this.fromPoint = this.from; + this.toPoint = this.to; } connect() { @@ -24,12 +27,6 @@ class EdgeBase { this.id = this.options.id; } - /** - * overloadable if the shape has to toggle the via node to disabled - * @param status - */ - togglePhysics(status) {} - /** * Redraw a edge as a line * Draw this edge in the given canvas @@ -37,36 +34,32 @@ class EdgeBase { * @param {CanvasRenderingContext2D} ctx * @private */ - drawLine(ctx, selected, hover) { + drawLine(ctx, selected, hover, viaNode) { // set style ctx.strokeStyle = this.getColor(ctx, selected, hover); ctx.lineWidth = this.getLineWidth(selected, hover); - let via = undefined; + if (this.options.dashes !== false) { - via = this._drawDashedLine(ctx); + this._drawDashedLine(ctx, viaNode); } else { - via = this._drawLine(ctx); + this._drawLine(ctx, viaNode); } - return via; } - _drawLine(ctx) { - let via = undefined; + _drawLine(ctx, viaNode, fromPoint, toPoint) { if (this.from != this.to) { // draw line - via = this._line(ctx); + this._line(ctx, viaNode, fromPoint, toPoint); } else { let [x,y,radius] = this._getCircleData(ctx); this._circle(ctx, x, y, radius); } - return via; } - _drawDashedLine(ctx) { - let via = undefined; + _drawDashedLine(ctx, viaNode, fromPoint, toPoint) { ctx.lineCap = 'round'; let pattern = [5,5]; if (Array.isArray(this.options.dashes) === true) { @@ -84,7 +77,7 @@ class EdgeBase { // draw the line if (this.from != this.to) { // draw line - via = this._line(ctx); + this._line(ctx, viaNode); } else { let [x,y,radius] = this._getCircleData(ctx); @@ -97,8 +90,6 @@ class EdgeBase { ctx.restore(); } else { // unsupporting smooth lines - - if (this.from != this.to) { // draw line ctx.dashedLine(this.from.x, this.from.y, this.to.x, this.to.y, pattern); @@ -115,7 +106,6 @@ class EdgeBase { // disable shadows for other elements. this.disableShadow(ctx); } - return via; } @@ -407,26 +397,22 @@ class EdgeBase { return Math.sqrt(dx * dx + dy * dy); } + /** * * @param ctx * @param position * @param viaNode */ - drawArrowHead(ctx, position, viaNode, selected, hover) { - // set style - ctx.strokeStyle = this.getColor(ctx, selected, hover); - ctx.fillStyle = ctx.strokeStyle; - ctx.lineWidth = this.getLineWidth(selected, hover); - + getArrowData(ctx, position, viaNode, selected, hover) { // set lets let angle; - let length; - let arrowPos; + let arrowPoint; let node1; let node2; let guideOffset; let scaleFactor; + let lineWidth = this.getLineWidth(selected, hover); if (position === 'from') { node1 = this.from; @@ -451,67 +437,74 @@ class EdgeBase { if (position !== 'middle') { // draw arrow head if (this.options.smooth.enabled === true) { - arrowPos = this.findBorderPosition(node1, ctx, {via: viaNode}); - let guidePos = this.getPoint(Math.max(0.0, Math.min(1.0, arrowPos.t + guideOffset)), viaNode); - angle = Math.atan2((arrowPos.y - guidePos.y), (arrowPos.x - guidePos.x)); + arrowPoint = this.findBorderPosition(node1, ctx, {via: viaNode}); + let guidePos = this.getPoint(Math.max(0.0, Math.min(1.0, arrowPoint.t + guideOffset)), viaNode); + angle = Math.atan2((arrowPoint.y - guidePos.y), (arrowPoint.x - guidePos.x)); } else { angle = Math.atan2((node1.y - node2.y), (node1.x - node2.x)); - arrowPos = this.findBorderPosition(node1, ctx); + arrowPoint = this.findBorderPosition(node1, ctx); } } else { angle = Math.atan2((node1.y - node2.y), (node1.x - node2.x)); - arrowPos = this.getPoint(0.6, viaNode); // this is 0.6 to account for the size of the arrow. + arrowPoint = this.getPoint(0.5, viaNode); // this is 0.6 to account for the size of the arrow. } - // draw arrow at the end of the line - length = (10 + 5 * this.options.width) * scaleFactor; - ctx.arrow(arrowPos.x, arrowPos.y, angle, length); - - // draw shadow if enabled - this.enableShadow(ctx); - ctx.fill(); - - // disable shadows for other elements. - this.disableShadow(ctx); - ctx.stroke(); } else { // draw circle - let angle, point; let [x,y,radius] = this._getCircleData(ctx); if (position === 'from') { - point = this.findBorderPosition(this.from, ctx, {x, y, low:0.25, high:0.6, direction:-1}); - angle = point.t * -2 * Math.PI + 1.5 * Math.PI + 0.1 * Math.PI; + arrowPoint = this.findBorderPosition(this.from, ctx, {x, y, low:0.25, high:0.6, direction:-1}); + angle = arrowPoint.t * -2 * Math.PI + 1.5 * Math.PI + 0.1 * Math.PI; } else if (position === 'to') { - point = this.findBorderPosition(this.from, ctx, {x, y, low:0.6, high:1.0, direction:1}); - angle = point.t * -2 * Math.PI + 1.5 * Math.PI - 1.1 * Math.PI; + arrowPoint = this.findBorderPosition(this.from, ctx, {x, y, low:0.6, high:1.0, direction:1}); + angle = arrowPoint.t * -2 * Math.PI + 1.5 * Math.PI - 1.1 * Math.PI; } else { - point = this._pointOnCircle(x, y, radius, 0.175); + arrowPoint = this._pointOnCircle(x, y, radius, 0.175); angle = 3.9269908169872414; // === 0.175 * -2 * Math.PI + 1.5 * Math.PI + 0.1 * Math.PI; } - - // draw the arrowhead - let length = (10 + 5 * this.options.width) * scaleFactor; - ctx.arrow(point.x, point.y, angle, length); - - // draw shadow if enabled - this.enableShadow(ctx); - ctx.fill(); - - // disable shadows for other elements. - this.disableShadow(ctx); - ctx.stroke(); } + + let length = 15 * scaleFactor + 3 * lineWidth; // 3* lineWidth is the width of the edge. + + var xi = arrowPoint.x - length * 0.9 * Math.cos(angle); + var yi = arrowPoint.y - length * 0.9 * Math.sin(angle); + let arrowCore = {x: xi, y: yi}; + + return {point: arrowPoint, core: arrowCore, angle: angle, length: length}; + } + + /** + * + * @param ctx + * @param selected + * @param hover + * @param arrowData + */ + drawArrowHead(ctx, selected, hover, arrowData) { + // set style + ctx.strokeStyle = this.getColor(ctx, selected, hover); + ctx.fillStyle = ctx.strokeStyle; + ctx.lineWidth = this.getLineWidth(selected, hover); + + // draw arrow at the end of the line + ctx.arrow(arrowData.point.x, arrowData.point.y, arrowData.angle, arrowData.length); + + // draw shadow if enabled + this.enableShadow(ctx); + ctx.fill(); + // disable shadows for other elements. + this.disableShadow(ctx); } enableShadow(ctx) { if (this.options.shadow.enabled === true) { - ctx.shadowColor = 'rgba(0,0,0,0.5)'; + ctx.shadowColor = this.options.shadow.color; ctx.shadowBlur = this.options.shadow.size; ctx.shadowOffsetX = this.options.shadow.x; ctx.shadowOffsetY = this.options.shadow.y; diff --git a/lib/vis/lib/network/modules/components/nodes/shapes/Box.js b/lib/vis/lib/network/modules/components/nodes/shapes/Box.js index fe9810f31f..d2d157408f 100644 --- a/lib/vis/lib/network/modules/components/nodes/shapes/Box.js +++ b/lib/vis/lib/network/modules/components/nodes/shapes/Box.js @@ -32,43 +32,51 @@ class Box extends NodeBase { ctx.fillStyle = selected ? this.options.color.highlight.background : hover ? this.options.color.hover.background : this.options.color.background; - let borderRadius = 6; + let borderRadius = this.options.shapeProperties.borderRadius; // only effective for box ctx.roundRect(this.left, this.top, this.width, this.height, borderRadius); - //draw dashed border if enabled - this.enableBorderDashes(ctx); // draw shadow if enabled this.enableShadow(ctx); + // draw the background ctx.fill(); - - //disable dashed border for other elements - this.disableBorderDashes(ctx); // disable shadows for other elements. this.disableShadow(ctx); - ctx.stroke(); + //draw dashed border if enabled, save and restore is required for firefox not to crash on unix. + ctx.save(); + // if borders are zero width, they will be drawn with width 1 by default. This prevents that + if (borderWidth > 0) { + this.enableBorderDashes(ctx); + //draw the border + ctx.stroke(); + //disable dashed border for other elements + this.disableBorderDashes(ctx); + } + ctx.restore(); - this.updateBoundingBox(x,y); + this.updateBoundingBox(x,y,ctx,selected); this.labelModule.draw(ctx, x, y, selected); } - updateBoundingBox(x,y) { + updateBoundingBox(x,y, ctx, selected) { + this.resize(ctx, selected); this.left = x - this.width * 0.5; this.top = y - this.height * 0.5; - this.boundingBox.left = this.left; - this.boundingBox.top = this.top; - this.boundingBox.bottom = this.top + this.height; - this.boundingBox.right = this.left + this.width; + let borderRadius = this.options.shapeProperties.borderRadius; // only effective for box + this.boundingBox.left = this.left - borderRadius; + this.boundingBox.top = this.top - borderRadius; + this.boundingBox.bottom = this.top + this.height + borderRadius; + this.boundingBox.right = this.left + this.width + borderRadius; } distanceToBorder(ctx, angle) { this.resize(ctx); - let a = this.width / 2; - let b = this.height / 2; - let w = (Math.sin(angle) * a); - let h = (Math.cos(angle) * b); - return a * b / Math.sqrt(w * w + h * h); + let borderWidth = this.options.borderWidth; + + return Math.min( + Math.abs((this.width) / 2 / Math.cos(angle)), + Math.abs((this.height) / 2 / Math.sin(angle))) + borderWidth; } } diff --git a/lib/vis/lib/network/modules/components/nodes/shapes/Circle.js b/lib/vis/lib/network/modules/components/nodes/shapes/Circle.js index 3bfb828f5a..221e92df3a 100644 --- a/lib/vis/lib/network/modules/components/nodes/shapes/Circle.js +++ b/lib/vis/lib/network/modules/components/nodes/shapes/Circle.js @@ -45,11 +45,7 @@ class Circle extends CircleImageBase { distanceToBorder(ctx, angle) { this.resize(ctx); - var a = this.width / 2; - var b = this.height / 2; - var w = (Math.sin(angle) * a); - var h = (Math.cos(angle) * b); - return a * b / Math.sqrt(w * w + h * h); + return this.width * 0.5; } } diff --git a/lib/vis/lib/network/modules/components/nodes/shapes/CircularImage.js b/lib/vis/lib/network/modules/components/nodes/shapes/CircularImage.js index 82fb7c8f0a..7d04b3f56f 100644 --- a/lib/vis/lib/network/modules/components/nodes/shapes/CircularImage.js +++ b/lib/vis/lib/network/modules/components/nodes/shapes/CircularImage.js @@ -38,15 +38,16 @@ class CircularImage extends CircleImageBase { let size = Math.min(0.5*this.height, 0.5*this.width); + // draw the background circle. IMPORTANT: the stroke in this method is used by the clip method below. this._drawRawCircle(ctx, x, y, selected, hover, size); + // now we draw in the circle, we save so we can revert the clip operation after drawing. ctx.save(); - ctx.circle(x, y, size); - ctx.stroke(); + // clip is used to use the stroke in drawRawCircle as an area that we can draw in. ctx.clip(); - + // draw the image this._drawImageAtPosition(ctx); - + // restore so we can again draw on the full canvas ctx.restore(); this._drawImageLabel(ctx, x, y, selected); @@ -67,7 +68,7 @@ class CircularImage extends CircleImageBase { distanceToBorder(ctx, angle) { this.resize(ctx); - return this._distanceToBorder(angle); + return this.width * 0.5; } } diff --git a/lib/vis/lib/network/modules/components/nodes/shapes/Database.js b/lib/vis/lib/network/modules/components/nodes/shapes/Database.js index 11e3552c61..dabc02fff0 100644 --- a/lib/vis/lib/network/modules/components/nodes/shapes/Database.js +++ b/lib/vis/lib/network/modules/components/nodes/shapes/Database.js @@ -23,32 +23,36 @@ class Database extends NodeBase { this.left = x - this.width / 2; this.top = y - this.height / 2; - var borderWidth = this.options.borderWidth; + var neutralborderWidth = this.options.borderWidth; var selectionLineWidth = this.options.borderWidthSelected || 2 * this.options.borderWidth; + var borderWidth = (selected ? selectionLineWidth : neutralborderWidth) / this.body.view.scale; + ctx.lineWidth = Math.min(this.width, borderWidth); ctx.strokeStyle = selected ? this.options.color.highlight.border : hover ? this.options.color.hover.border : this.options.color.border; - ctx.lineWidth = (this.selected ? selectionLineWidth : borderWidth); - ctx.lineWidth *= this.networkScaleInv; - ctx.lineWidth = Math.min(this.width, ctx.lineWidth); ctx.fillStyle = selected ? this.options.color.highlight.background : hover ? this.options.color.hover.background : this.options.color.background; ctx.database(x - this.width / 2, y - this.height * 0.5, this.width, this.height); - //draw dashed border if enabled - this.enableBorderDashes(ctx); // draw shadow if enabled this.enableShadow(ctx); + // draw the background ctx.fill(); - - //disable dashed border for other elements - this.disableBorderDashes(ctx); // disable shadows for other elements. this.disableShadow(ctx); - ctx.stroke(); + //draw dashed border if enabled, save and restore is required for firefox not to crash on unix. + ctx.save(); + // if borders are zero width, they will be drawn with width 1 by default. This prevents that + if (borderWidth > 0) { + this.enableBorderDashes(ctx); + //draw the border + ctx.stroke(); + //disable dashed border for other elements + this.disableBorderDashes(ctx); + } + ctx.restore(); this.updateBoundingBox(x,y,ctx,selected); - this.labelModule.draw(ctx, x, y, selected); } @@ -65,12 +69,7 @@ class Database extends NodeBase { } distanceToBorder(ctx, angle) { - this.resize(ctx); - var a = this.width / 2; - var b = this.height / 2; - var w = (Math.sin(angle) * a); - var h = (Math.cos(angle) * b); - return a * b / Math.sqrt(w * w + h * h); + return this._distanceToBorder(ctx,angle); } } diff --git a/lib/vis/lib/network/modules/components/nodes/shapes/Diamond.js b/lib/vis/lib/network/modules/components/nodes/shapes/Diamond.js index 15d348bf40..9a72caaa00 100644 --- a/lib/vis/lib/network/modules/components/nodes/shapes/Diamond.js +++ b/lib/vis/lib/network/modules/components/nodes/shapes/Diamond.js @@ -16,7 +16,7 @@ class Diamond extends ShapeBase { } distanceToBorder(ctx, angle) { - return this._distanceToBorder(angle); + return this._distanceToBorder(ctx,angle); } } diff --git a/lib/vis/lib/network/modules/components/nodes/shapes/Dot.js b/lib/vis/lib/network/modules/components/nodes/shapes/Dot.js index 28fb920cb7..6840913931 100644 --- a/lib/vis/lib/network/modules/components/nodes/shapes/Dot.js +++ b/lib/vis/lib/network/modules/components/nodes/shapes/Dot.js @@ -16,7 +16,8 @@ class Dot extends ShapeBase { } distanceToBorder(ctx, angle) { - return this.options.size + this.options.borderWidth; + this.resize(ctx); + return this.options.size; } } diff --git a/lib/vis/lib/network/modules/components/nodes/shapes/Ellipse.js b/lib/vis/lib/network/modules/components/nodes/shapes/Ellipse.js index 2d486e6eaf..b4d0a28a6b 100644 --- a/lib/vis/lib/network/modules/components/nodes/shapes/Ellipse.js +++ b/lib/vis/lib/network/modules/components/nodes/shapes/Ellipse.js @@ -25,30 +25,36 @@ class Ellipse extends NodeBase { this.left = x - this.width * 0.5; this.top = y - this.height * 0.5; - var borderWidth = this.options.borderWidth; + var neutralborderWidth = this.options.borderWidth; var selectionLineWidth = this.options.borderWidthSelected || 2 * this.options.borderWidth; + var borderWidth = (selected ? selectionLineWidth : neutralborderWidth) / this.body.view.scale; + ctx.lineWidth = Math.min(this.width, borderWidth); ctx.strokeStyle = selected ? this.options.color.highlight.border : hover ? this.options.color.hover.border : this.options.color.border; - ctx.lineWidth = (selected ? selectionLineWidth : borderWidth); - ctx.lineWidth /= this.body.view.scale; - ctx.lineWidth = Math.min(this.width, ctx.lineWidth); - ctx.fillStyle = selected ? this.options.color.highlight.background : hover ? this.options.color.hover.background : this.options.color.background; ctx.ellipse(this.left, this.top, this.width, this.height); - //draw dashed border if enabled - this.enableBorderDashes(ctx); // draw shadow if enabled this.enableShadow(ctx); + // draw the background ctx.fill(); - - //disable dashed border for other elements - this.disableBorderDashes(ctx); // disable shadows for other elements. this.disableShadow(ctx); - ctx.stroke(); + //draw dashed border if enabled, save and restore is required for firefox not to crash on unix. + ctx.save(); + + // if borders are zero width, they will be drawn with width 1 by default. This prevents that + if (borderWidth > 0) { + this.enableBorderDashes(ctx); + //draw the border + ctx.stroke(); + //disable dashed border for other elements + this.disableBorderDashes(ctx); + } + + ctx.restore(); this.updateBoundingBox(x, y, ctx, selected); this.labelModule.draw(ctx, x, y, selected); diff --git a/lib/vis/lib/network/modules/components/nodes/shapes/Icon.js b/lib/vis/lib/network/modules/components/nodes/shapes/Icon.js index 193044f80c..c01df0527a 100644 --- a/lib/vis/lib/network/modules/components/nodes/shapes/Icon.js +++ b/lib/vis/lib/network/modules/components/nodes/shapes/Icon.js @@ -61,7 +61,6 @@ class Icon extends NodeBase { ctx.textAlign = "center"; ctx.textBaseline = "middle"; - // draw shadow if enabled this.enableShadow(ctx); ctx.fillText(this.options.icon.code, x, y); @@ -76,8 +75,7 @@ class Icon extends NodeBase { } distanceToBorder(ctx, angle) { - this.resize(ctx); - return this._distanceToBorder(angle); + return this._distanceToBorder(ctx,angle); } } diff --git a/lib/vis/lib/network/modules/components/nodes/shapes/Image.js b/lib/vis/lib/network/modules/components/nodes/shapes/Image.js index 78aef4b4eb..1a0e8aecf6 100644 --- a/lib/vis/lib/network/modules/components/nodes/shapes/Image.js +++ b/lib/vis/lib/network/modules/components/nodes/shapes/Image.js @@ -17,6 +17,42 @@ class Image extends CircleImageBase { this.left = x - this.width / 2; this.top = y - this.height / 2; + if (this.options.shapeProperties.useBorderWithImage === true) { + var neutralborderWidth = this.options.borderWidth; + var selectionLineWidth = this.options.borderWidthSelected || 2 * this.options.borderWidth; + var borderWidth = (selected ? selectionLineWidth : neutralborderWidth) / this.body.view.scale; + ctx.lineWidth = Math.min(this.width, borderWidth); + + ctx.beginPath(); + + // setup the line properties. + ctx.strokeStyle = selected ? this.options.color.highlight.border : hover ? this.options.color.hover.border : this.options.color.border; + + // set a fillstyle + ctx.fillStyle = selected ? this.options.color.highlight.background : hover ? this.options.color.hover.background : this.options.color.background; + + // draw a rectangle to form the border around. This rectangle is filled so the opacity of a picture (in future vis releases?) can be used to tint the image + ctx.rect(this.left - 0.5 * ctx.lineWidth, + this.top - 0.5 * ctx.lineWidth, + this.width + ctx.lineWidth, + this.height + ctx.lineWidth); + ctx.fill(); + + //draw dashed border if enabled, save and restore is required for firefox not to crash on unix. + ctx.save(); + // if borders are zero width, they will be drawn with width 1 by default. This prevents that + if (borderWidth > 0) { + this.enableBorderDashes(ctx); + //draw the border + ctx.stroke(); + //disable dashed border for other elements + this.disableBorderDashes(ctx); + } + ctx.restore(); + + ctx.closePath(); + } + this._drawImageAtPosition(ctx); this._drawImageLabel(ctx, x, y, selected || hover); @@ -42,12 +78,7 @@ class Image extends CircleImageBase { } distanceToBorder(ctx, angle) { - this.resize(ctx); - var a = this.width / 2; - var b = this.height / 2; - var w = (Math.sin(angle) * a); - var h = (Math.cos(angle) * b); - return a * b / Math.sqrt(w * w + h * h); + return this._distanceToBorder(ctx,angle); } } diff --git a/lib/vis/lib/network/modules/components/nodes/shapes/Square.js b/lib/vis/lib/network/modules/components/nodes/shapes/Square.js index 80024615d5..e2fc6ebba6 100644 --- a/lib/vis/lib/network/modules/components/nodes/shapes/Square.js +++ b/lib/vis/lib/network/modules/components/nodes/shapes/Square.js @@ -16,8 +16,7 @@ class Square extends ShapeBase { } distanceToBorder(ctx, angle) { - this.resize(); - return this._distanceToBorder(angle); + return this._distanceToBorder(ctx,angle); } } diff --git a/lib/vis/lib/network/modules/components/nodes/shapes/Star.js b/lib/vis/lib/network/modules/components/nodes/shapes/Star.js index df23b45873..4aae4fae1f 100644 --- a/lib/vis/lib/network/modules/components/nodes/shapes/Star.js +++ b/lib/vis/lib/network/modules/components/nodes/shapes/Star.js @@ -16,7 +16,7 @@ class Star extends ShapeBase { } distanceToBorder(ctx, angle) { - return this._distanceToBorder(angle); + return this._distanceToBorder(ctx,angle); } } diff --git a/lib/vis/lib/network/modules/components/nodes/shapes/Text.js b/lib/vis/lib/network/modules/components/nodes/shapes/Text.js index 4f0fb81a9f..ac22dc5ce4 100644 --- a/lib/vis/lib/network/modules/components/nodes/shapes/Text.js +++ b/lib/vis/lib/network/modules/components/nodes/shapes/Text.js @@ -45,8 +45,7 @@ class Text extends NodeBase { } distanceToBorder(ctx, angle) { - this.resize(ctx); - return this._distanceToBorder(angle); + return this._distanceToBorder(ctx,angle); } } diff --git a/lib/vis/lib/network/modules/components/nodes/shapes/Triangle.js b/lib/vis/lib/network/modules/components/nodes/shapes/Triangle.js index c8aac1d7fd..6c58a4f122 100644 --- a/lib/vis/lib/network/modules/components/nodes/shapes/Triangle.js +++ b/lib/vis/lib/network/modules/components/nodes/shapes/Triangle.js @@ -16,7 +16,7 @@ class Triangle extends ShapeBase { } distanceToBorder(ctx, angle) { - return this._distanceToBorder(angle); + return this._distanceToBorder(ctx,angle); } } diff --git a/lib/vis/lib/network/modules/components/nodes/shapes/TriangleDown.js b/lib/vis/lib/network/modules/components/nodes/shapes/TriangleDown.js index 6b64f5956f..044fd7c519 100644 --- a/lib/vis/lib/network/modules/components/nodes/shapes/TriangleDown.js +++ b/lib/vis/lib/network/modules/components/nodes/shapes/TriangleDown.js @@ -16,7 +16,7 @@ class TriangleDown extends ShapeBase { } distanceToBorder(ctx, angle) { - return this._distanceToBorder(angle); + return this._distanceToBorder(ctx,angle); } } diff --git a/lib/vis/lib/network/modules/components/nodes/util/CircleImageBase.js b/lib/vis/lib/network/modules/components/nodes/util/CircleImageBase.js index 4d941388ab..ab0cf97f3b 100644 --- a/lib/vis/lib/network/modules/components/nodes/util/CircleImageBase.js +++ b/lib/vis/lib/network/modules/components/nodes/util/CircleImageBase.js @@ -7,6 +7,13 @@ class CircleImageBase extends NodeBase { this.imageLoaded = false; } + setOptions(options, imageObj) { + this.options = options; + if (imageObj) { + this.imageObj = imageObj; + } + } + /** * This function resizes the image by the options size when the image has not yet loaded. If the image has loaded, we * force the update of the size again. @@ -29,20 +36,27 @@ class CircleImageBase extends NodeBase { width = 0; height = 0; } - if (this.imageObj.width > this.imageObj.height) { - ratio = this.imageObj.width / this.imageObj.height; - width = this.options.size * 2 * ratio || this.imageObj.width; - height = this.options.size * 2 || this.imageObj.height; - } - else { - if (this.imageObj.width && this.imageObj.height) { // not undefined or 0 - ratio = this.imageObj.height / this.imageObj.width; + if (this.options.shapeProperties.useImageSize === false) { + if (this.imageObj.width > this.imageObj.height) { + ratio = this.imageObj.width / this.imageObj.height; + width = this.options.size * 2 * ratio || this.imageObj.width; + height = this.options.size * 2 || this.imageObj.height; } else { - ratio = 1; + if (this.imageObj.width && this.imageObj.height) { // not undefined or 0 + ratio = this.imageObj.height / this.imageObj.width; + } + else { + ratio = 1; + } + width = this.options.size * 2; + height = this.options.size * 2 * ratio; } - width = this.options.size * 2 || this.imageObj.width; - height = this.options.size * 2 * ratio || this.imageObj.height; + } + else { + // when not using the size property, we use the image size + width = this.imageObj.width; + height = this.imageObj.height; } this.width = width; this.height = height; @@ -52,29 +66,33 @@ class CircleImageBase extends NodeBase { } _drawRawCircle(ctx, x, y, selected, hover, size) { - var borderWidth = this.options.borderWidth; + var neutralborderWidth = this.options.borderWidth; var selectionLineWidth = this.options.borderWidthSelected || 2 * this.options.borderWidth; + var borderWidth = (selected ? selectionLineWidth : neutralborderWidth) / this.body.view.scale; + ctx.lineWidth = Math.min(this.width, borderWidth); ctx.strokeStyle = selected ? this.options.color.highlight.border : hover ? this.options.color.hover.border : this.options.color.border; - - ctx.lineWidth = (selected ? selectionLineWidth : borderWidth); - ctx.lineWidth *= this.networkScaleInv; - ctx.lineWidth = Math.min(this.width, ctx.lineWidth); ctx.fillStyle = selected ? this.options.color.highlight.background : hover ? this.options.color.hover.background : this.options.color.background; ctx.circle(x, y, size); - //draw dashed border if enabled - this.enableBorderDashes(ctx); // draw shadow if enabled this.enableShadow(ctx); + // draw the background ctx.fill(); - - //disable dashed border for other elements - this.disableBorderDashes(ctx); // disable shadows for other elements. this.disableShadow(ctx); - ctx.stroke(); + //draw dashed border if enabled, save and restore is required for firefox not to crash on unix. + ctx.save(); + // if borders are zero width, they will be drawn with width 1 by default. This prevents that + if (borderWidth > 0) { + this.enableBorderDashes(ctx); + //draw the border + ctx.stroke(); + //disable dashed border for other elements + this.disableBorderDashes(ctx); + } + ctx.restore(); } _drawImageAtPosition(ctx) { @@ -84,6 +102,8 @@ class CircleImageBase extends NodeBase { // draw shadow if enabled this.enableShadow(ctx); + + // draw image ctx.drawImage(this.imageObj, this.left, this.top, this.width, this.height); // disable shadows for other elements. diff --git a/lib/vis/lib/network/modules/components/nodes/util/NodeBase.js b/lib/vis/lib/network/modules/components/nodes/util/NodeBase.js index 78a2d9e47b..1cf6bf5336 100644 --- a/lib/vis/lib/network/modules/components/nodes/util/NodeBase.js +++ b/lib/vis/lib/network/modules/components/nodes/util/NodeBase.js @@ -15,8 +15,9 @@ class NodeBase { this.options = options; } - _distanceToBorder(angle) { - var borderWidth = 1; + _distanceToBorder(ctx,angle) { + var borderWidth = this.options.borderWidth; + this.resize(ctx); return Math.min( Math.abs(this.width / 2 / Math.cos(angle)), Math.abs(this.height / 2 / Math.sin(angle))) + borderWidth; @@ -24,7 +25,7 @@ class NodeBase { enableShadow(ctx) { if (this.options.shadow.enabled === true) { - ctx.shadowColor = 'rgba(0,0,0,0.5)'; + ctx.shadowColor = this.options.shadow.color; ctx.shadowBlur = this.options.shadow.size; ctx.shadowOffsetX = this.options.shadow.x; ctx.shadowOffsetY = this.options.shadow.y; @@ -42,13 +43,29 @@ class NodeBase { enableBorderDashes(ctx) { if (this.options.shapeProperties.borderDashes !== false) { - ctx.setLineDash(this.options.shapeProperties.borderDashes); + if (ctx.setLineDash !== undefined) { + let dashes = this.options.shapeProperties.borderDashes; + if (dashes === true) { + dashes = [5,15] + } + ctx.setLineDash(dashes); + } + else { + console.warn("setLineDash is not supported in this browser. The dashed borders cannot be used."); + this.options.shapeProperties.borderDashes = false; + } } } disableBorderDashes(ctx) { - if (this.options.shapeProperties.borderDashes == false) { - ctx.setLineDash([0]); + if (this.options.shapeProperties.borderDashes !== false) { + if (ctx.setLineDash !== undefined) { + ctx.setLineDash([0]); + } + else { + console.warn("setLineDash is not supported in this browser. The dashed borders cannot be used."); + this.options.shapeProperties.borderDashes = false; + } } } } diff --git a/lib/vis/lib/network/modules/components/nodes/util/ShapeBase.js b/lib/vis/lib/network/modules/components/nodes/util/ShapeBase.js index dc99032c37..d9e2cce24d 100644 --- a/lib/vis/lib/network/modules/components/nodes/util/ShapeBase.js +++ b/lib/vis/lib/network/modules/components/nodes/util/ShapeBase.js @@ -20,29 +20,33 @@ class ShapeBase extends NodeBase { this.left = x - this.width / 2; this.top = y - this.height / 2; - var borderWidth = this.options.borderWidth; + var neutralborderWidth = this.options.borderWidth; var selectionLineWidth = this.options.borderWidthSelected || 2 * this.options.borderWidth; + var borderWidth = (selected ? selectionLineWidth : neutralborderWidth) / this.body.view.scale; + ctx.lineWidth = Math.min(this.width, borderWidth); ctx.strokeStyle = selected ? this.options.color.highlight.border : hover ? this.options.color.hover.border : this.options.color.border; - ctx.lineWidth = (selected ? selectionLineWidth : borderWidth); - ctx.lineWidth /= this.body.view.scale; - ctx.lineWidth = Math.min(this.width, ctx.lineWidth); ctx.fillStyle = selected ? this.options.color.highlight.background : hover ? this.options.color.hover.background : this.options.color.background; ctx[shape](x, y, this.options.size); - //draw dashed border if enabled - this.enableBorderDashes(ctx); // draw shadow if enabled this.enableShadow(ctx); + // draw the background ctx.fill(); - - //disable dashed border for other elements - this.disableBorderDashes(ctx); // disable shadows for other elements. this.disableShadow(ctx); - ctx.stroke(); - + //draw dashed border if enabled, save and restore is required for firefox not to crash on unix. + ctx.save(); + // if borders are zero width, they will be drawn with width 1 by default. This prevents that + if (borderWidth > 0) { + this.enableBorderDashes(ctx); + //draw the border + ctx.stroke(); + //disable dashed border for other elements + this.disableBorderDashes(ctx); + } + ctx.restore(); if (this.options.label !== undefined) { let yLabel = y + 0.5 * this.height + 3; // the + 3 is to offset it a bit below the node. diff --git a/lib/vis/lib/network/modules/components/physics/BarnesHutSolver.js b/lib/vis/lib/network/modules/components/physics/BarnesHutSolver.js index b2da2d60fe..2c514e2075 100644 --- a/lib/vis/lib/network/modules/components/physics/BarnesHutSolver.js +++ b/lib/vis/lib/network/modules/components/physics/BarnesHutSolver.js @@ -6,6 +6,9 @@ class BarnesHutSolver { this.barnesHutTree; this.setOptions(options); this.randomSeed = 5; + + // debug: show grid + //this.body.emitter.on("afterDrawing", (ctx) => {this._debug(ctx,'#ff0000')}) } setOptions(options) { @@ -21,7 +24,7 @@ class BarnesHutSolver { /** - * This function calculates the forces the nodes apply on eachother based on a gravitational model. + * This function calculates the forces the nodes apply on each other based on a gravitational model. * The Barnes Hut method is used to speed up this N-body simulation. * * @private @@ -285,7 +288,7 @@ class BarnesHutSolver { break; case 1: // convert into children // if there are two nodes exactly overlapping (on init, on opening of cluster etc.) - // we move one node a pixel and we do not put it in the tree. + // we move one node a little bit and we do not put it in the tree. if (parentBranch.children[region].children.data.x === node.x && parentBranch.children[region].children.data.y === node.y) { node.x += this.seededRandom(); diff --git a/lib/vis/lib/network/modules/components/shared/Label.js b/lib/vis/lib/network/modules/components/shared/Label.js index 0141bc3634..64c0c3748d 100644 --- a/lib/vis/lib/network/modules/components/shared/Label.js +++ b/lib/vis/lib/network/modules/components/shared/Label.js @@ -6,21 +6,26 @@ class Label { this.pointToSelf = false; this.baseSize = undefined; + this.fontOptions = {}; this.setOptions(options); this.size = {top: 0, left: 0, width: 0, height: 0, yLine: 0}; // could be cached } setOptions(options, allowDeletion = false) { - this.options = options; + this.nodeOptions = options; + + // We want to keep the font options seperated from the node options. + // The node options have to mirror the globals when they are not overruled. + this.fontOptions = util.deepExtend({},options.font, true); if (options.label !== undefined) { this.labelDirty = true; } if (options.font !== undefined) { - Label.parseOptions(this.options.font, options, allowDeletion); + Label.parseOptions(this.fontOptions, options, allowDeletion); if (typeof options.font === 'string') { - this.baseSize = this.options.font.size; + this.baseSize = this.fontOptions.size; } else if (typeof options.font === 'object') { if (options.font.size !== undefined) { @@ -54,12 +59,12 @@ class Label { */ draw(ctx, x, y, selected, baseline = 'middle') { // if no label, return - if (this.options.label === undefined) + if (this.nodeOptions.label === undefined) return; // check if we have to render the label - let viewFontSize = this.options.font.size * this.body.view.scale; - if (this.options.label && viewFontSize < this.options.scaling.label.drawThreshold - 1) + let viewFontSize = this.fontOptions.size * this.body.view.scale; + if (this.nodeOptions.label && viewFontSize < this.nodeOptions.scaling.label.drawThreshold - 1) return; // update the size cache if required @@ -77,12 +82,12 @@ class Label { * @private */ _drawBackground(ctx) { - if (this.options.font.background !== undefined && this.options.font.background !== "none") { - ctx.fillStyle = this.options.font.background; + if (this.fontOptions.background !== undefined && this.fontOptions.background !== "none") { + ctx.fillStyle = this.fontOptions.background; let lineMargin = 2; - switch (this.options.font.align) { + switch (this.fontOptions.align) { case 'middle': ctx.fillRect(-this.size.width * 0.5, -this.size.height * 0.5, this.size.width, this.size.height); break; @@ -108,11 +113,11 @@ class Label { * @private */ _drawText(ctx, selected, x, y, baseline = 'middle') { - let fontSize = this.options.font.size; + let fontSize = this.fontOptions.size; let viewFontSize = fontSize * this.body.view.scale; // this ensures that there will not be HUGE letters on screen by setting an upper limit on the visible text size (regardless of zoomLevel) - if (viewFontSize >= this.options.scaling.label.maxVisible) { - fontSize = Number(this.options.scaling.label.maxVisible) / this.body.view.scale; + if (viewFontSize >= this.nodeOptions.scaling.label.maxVisible) { + fontSize = Number(this.nodeOptions.scaling.label.maxVisible) / this.body.view.scale; } let yLine = this.size.yLine; @@ -120,20 +125,20 @@ class Label { [x, yLine] = this._setAlignment(ctx, x, yLine, baseline); // configure context for drawing the text - ctx.font = (selected && this.options.labelHighlightBold ? 'bold ' : '') + fontSize + "px " + this.options.font.face; + ctx.font = (selected && this.nodeOptions.labelHighlightBold ? 'bold ' : '') + fontSize + "px " + this.fontOptions.face; ctx.fillStyle = fontColor; ctx.textAlign = 'center'; // set the strokeWidth - if (this.options.font.strokeWidth > 0) { - ctx.lineWidth = this.options.font.strokeWidth; + if (this.fontOptions.strokeWidth > 0) { + ctx.lineWidth = this.fontOptions.strokeWidth; ctx.strokeStyle = strokeColor; ctx.lineJoin = 'round'; } // draw the text for (let i = 0; i < this.lineCount; i++) { - if (this.options.font.strokeWidth > 0) { + if (this.fontOptions.strokeWidth > 0) { ctx.strokeText(this.lines[i], x, yLine); } ctx.fillText(this.lines[i], x, yLine); @@ -144,16 +149,16 @@ class Label { _setAlignment(ctx, x, yLine, baseline) { // check for label alignment (for edges) // TODO: make alignment for nodes - if (this.options.font.align !== 'horizontal' && this.pointToSelf === false) { + if (this.fontOptions.align !== 'horizontal' && this.pointToSelf === false) { x = 0; yLine = 0; let lineMargin = 2; - if (this.options.font.align === 'top') { + if (this.fontOptions.align === 'top') { ctx.textBaseline = 'alphabetic'; yLine -= 2 * lineMargin; // distance from edge, required because we use alphabetic. Alphabetic has less difference between browsers } - else if (this.options.font.align === 'bottom') { + else if (this.fontOptions.align === 'bottom') { ctx.textBaseline = 'hanging'; yLine += 2 * lineMargin;// distance from edge, required because we use hanging. Hanging has less difference between browsers } @@ -177,10 +182,10 @@ class Label { * @private */ _getColor(viewFontSize) { - let fontColor = this.options.font.color || '#000000'; - let strokeColor = this.options.font.strokeColor || '#ffffff'; - if (viewFontSize <= this.options.scaling.label.drawThreshold) { - let opacity = Math.max(0, Math.min(1, 1 - (this.options.scaling.label.drawThreshold - viewFontSize))); + let fontColor = this.fontOptions.color || '#000000'; + let strokeColor = this.fontOptions.strokeColor || '#ffffff'; + if (viewFontSize <= this.nodeOptions.scaling.label.drawThreshold) { + let opacity = Math.max(0, Math.min(1, 1 - (this.nodeOptions.scaling.label.drawThreshold - viewFontSize))); fontColor = util.overrideOpacity(fontColor, opacity); strokeColor = util.overrideOpacity(strokeColor, opacity); } @@ -197,7 +202,7 @@ class Label { getTextSize(ctx, selected = false) { let size = { width: this._processLabel(ctx,selected), - height: this.options.font.size * this.lineCount, + height: this.fontOptions.size * this.lineCount, lineCount: this.lineCount }; return size; @@ -216,12 +221,12 @@ class Label { if (this.labelDirty === true) { this.size.width = this._processLabel(ctx,selected); } - this.size.height = this.options.font.size * this.lineCount; + this.size.height = this.fontOptions.size * this.lineCount; this.size.left = x - this.size.width * 0.5; this.size.top = y - this.size.height * 0.5; - this.size.yLine = y + (1 - this.lineCount) * 0.5 * this.options.font.size; + this.size.yLine = y + (1 - this.lineCount) * 0.5 * this.fontOptions.size; if (baseline === "hanging") { - this.size.top += 0.5 * this.options.font.size; + this.size.top += 0.5 * this.fontOptions.size; this.size.top += 4; // distance from node, required because we use hanging. Hanging has less difference between browsers this.size.yLine += 4; // distance from node } @@ -241,10 +246,10 @@ class Label { let width = 0; let lines = ['']; let lineCount = 0; - if (this.options.label !== undefined) { - lines = String(this.options.label).split('\n'); + if (this.nodeOptions.label !== undefined) { + lines = String(this.nodeOptions.label).split('\n'); lineCount = lines.length; - ctx.font = (selected && this.options.labelHighlightBold ? 'bold ' : '') + this.options.font.size + "px " + this.options.font.face; + ctx.font = (selected && this.nodeOptions.labelHighlightBold ? 'bold ' : '') + this.fontOptions.size + "px " + this.fontOptions.face; width = ctx.measureText(lines[0]).width; for (let i = 1; i < lineCount; i++) { let lineWidth = ctx.measureText(lines[i]).width; diff --git a/lib/vis/lib/network/options.js b/lib/vis/lib/network/options.js index 3421f49267..599041630e 100644 --- a/lib/vis/lib/network/options.js +++ b/lib/vis/lib/network/options.js @@ -29,6 +29,7 @@ let allOptions = { from: { enabled: { boolean }, scaleFactor: { number }, __type__: { object, boolean } }, __type__: { string: ['from', 'to', 'middle'], object } }, + arrowStrikethrough: { boolean }, color: { color: { string }, highlight: { string }, @@ -72,6 +73,7 @@ let allOptions = { selfReferenceSize: { number }, shadow: { enabled: { boolean }, + color: { string }, size: { number }, x: { number }, y: { number }, @@ -79,8 +81,9 @@ let allOptions = { }, smooth: { enabled: { boolean }, - type: { string: ['dynamic', 'continuous', 'discrete', 'diagonalCross', 'straightCross', 'horizontal', 'vertical', 'curvedCW', 'curvedCCW'] }, + type: { string: ['dynamic', 'continuous', 'discrete', 'diagonalCross', 'straightCross', 'horizontal', 'vertical', 'curvedCW', 'curvedCCW', 'cubicBezier'] }, roundness: { number }, + forceDirection: { string: ['horizontal', 'vertical', 'none'], boolean }, __type__: { object, boolean } }, title: { string, 'undefined': 'undefined' }, @@ -116,9 +119,14 @@ let allOptions = { }, layout: { randomSeed: { 'undefined': 'undefined', number }, + improvedLayout: { boolean }, hierarchical: { enabled: { boolean }, levelSeparation: { number }, + nodeSpacing: { number }, + treeSpacing: { number }, + blockShifting: { boolean }, + edgeMinimization: { boolean }, direction: { string: ['UD', 'DU', 'LR', 'RL'] }, // UD, DU, LR, RL sortMethod: { string: ['hubsize', 'directed'] }, // hubsize, directed __type__: { object, boolean } @@ -202,6 +210,7 @@ let allOptions = { }, shadow: { enabled: { boolean }, + color: { string }, size: { number }, x: { number }, y: { number }, @@ -210,6 +219,9 @@ let allOptions = { shape: { string: ['ellipse', 'circle', 'database', 'box', 'text', 'image', 'circularImage', 'diamond', 'dot', 'star', 'triangle', 'triangleDown', 'square', 'icon'] }, shapeProperties: { borderDashes: { boolean, array }, + borderRadius: { number }, + useImageSize: { boolean }, + useBorderWithImage: { boolean }, __type__: { object } }, size: { number }, @@ -267,6 +279,7 @@ let allOptions = { __type__: { object, boolean } }, timestep: { number }, + adaptiveTimestep: { boolean }, __type__: { object, boolean } }, @@ -339,13 +352,16 @@ let configureOptions = { }, shadow: { enabled: false, + color: 'rgba(0,0,0,0.5)', size: [10, 0, 20, 1], x: [5, -30, 30, 1], y: [5, -30, 30, 1] }, shape: ['ellipse', 'box', 'circle', 'database', 'diamond', 'dot', 'square', 'star', 'text', 'triangle', 'triangleDown'], shapeProperties: { - borderDashes: false + borderDashes: false, + borderRadius: [6, 0, 20, 1], + useImageSize: false }, size: [25, 0, 200, 1] }, @@ -355,6 +371,7 @@ let configureOptions = { middle: { enabled: false, scaleFactor: [1, 0, 3, 0.05] }, from: { enabled: false, scaleFactor: [1, 0, 3, 0.05] } }, + arrowStrikethrough: true, color: { color: ['color', '#848484'], highlight: ['color', '#848484'], @@ -391,22 +408,29 @@ let configureOptions = { selfReferenceSize: [20, 0, 200, 1], shadow: { enabled: false, + color: 'rgba(0,0,0,0.5)', size: [10, 0, 20, 1], x: [5, -30, 30, 1], y: [5, -30, 30, 1] }, smooth: { enabled: true, - type: ['dynamic', 'continuous', 'discrete', 'diagonalCross', 'straightCross', 'horizontal', 'vertical', 'curvedCW', 'curvedCCW'], + type: ['dynamic', 'continuous', 'discrete', 'diagonalCross', 'straightCross', 'horizontal', 'vertical', 'curvedCW', 'curvedCCW', 'cubicBezier'], + forceDirection: ['horizontal', 'vertical', 'none'], roundness: [0.5, 0, 1, 0.05] }, width: [1, 0, 30, 1] }, layout: { //randomSeed: [0, 0, 500, 1], + //improvedLayout: true, hierarchical: { enabled: false, levelSeparation: [150, 20, 500, 5], + nodeSpacing: [100, 20, 500, 5], + treeSpacing: [200, 20, 500, 5], + blockShifting: true, + edgeMinimization: true, direction: ['UD', 'DU', 'LR', 'RL'], // UD, DU, LR, RL sortMethod: ['hubsize', 'directed'] // hubsize, directed } @@ -471,7 +495,8 @@ let configureOptions = { maxVelocity: [50, 0, 150, 1], minVelocity: [0.1, 0.01, 0.5, 0.01], solver: ['barnesHut', 'forceAtlas2Based', 'repulsion', 'hierarchicalRepulsion'], - timestep: [0.5, 0.01, 1, 0.01] + timestep: [0.5, 0.01, 1, 0.01], + //adaptiveTimestep: true }, global: { locale: ['en', 'nl'] diff --git a/lib/vis/lib/shared/ColorPicker.js b/lib/vis/lib/shared/ColorPicker.js index a0d81b1221..adbfe10beb 100644 --- a/lib/vis/lib/shared/ColorPicker.js +++ b/lib/vis/lib/shared/ColorPicker.js @@ -16,6 +16,7 @@ class ColorPicker { // bound by this.updateCallback = () => {}; + this.closeCallback = () => {}; // create all DOM elements this._create(); @@ -42,12 +43,25 @@ class ColorPicker { * the callback is executed on apply and save. Bind it to the application * @param callback */ - setCallback(callback) { + setUpdateCallback(callback) { if (typeof callback === 'function') { this.updateCallback = callback; } else { - throw new Error("Function attempted to set as colorPicker callback is not a function."); + throw new Error("Function attempted to set as colorPicker update callback is not a function."); + } + } + + /** + * the callback is executed on apply and save. Bind it to the application + * @param callback + */ + setCloseCallback(callback) { + if (typeof callback === 'function') { + this.closeCallback = callback; + } + else { + throw new Error("Function attempted to set as colorPicker closing callback is not a function."); } } @@ -119,19 +133,20 @@ class ColorPicker { /** - * this shows the color picker at a location. The hue circle is constructed once and stored. - * @param x - * @param y + * this shows the color picker. + * The hue circle is constructed once and stored. */ - show(x,y) { + show() { + if (this.closeCallback !== undefined) { + this.closeCallback(); + this.closeCallback = undefined; + } + this.applied = false; this.frame.style.display = 'block'; - this.frame.style.top = y + 'px'; - this.frame.style.left = x + 'px'; this._generateHueCircle(); } - // ------------------------------------------ PRIVATE ----------------------------- // /** @@ -151,6 +166,15 @@ class ColorPicker { } this.frame.style.display = 'none'; + + // call the closing callback, restoring the onclick method. + // this is in a setTimeout because it will trigger the show again before the click is done. + setTimeout(() => { + if (this.closeCallback !== undefined) { + this.closeCallback(); + this.closeCallback = undefined; + } + },0); } @@ -244,7 +268,7 @@ class ColorPicker { /** - * update the colorpicker. A black circle overlays the hue circle to mimic the brightness decreasing. + * update the color picker. A black circle overlays the hue circle to mimic the brightness decreasing. * @param rgba * @private */ diff --git a/lib/vis/lib/shared/Configurator.js b/lib/vis/lib/shared/Configurator.js index e1d7f2bbaf..e564bc2d50 100644 --- a/lib/vis/lib/shared/Configurator.js +++ b/lib/vis/lib/shared/Configurator.js @@ -24,6 +24,8 @@ class Configurator { this.allowCreation = false; this.options = {}; + this.initialized = false; + this.popupCounter = 0; this.defaultOptions = { enabled: false, filter: true, @@ -35,6 +37,9 @@ class Configurator { this.configureOptions = configureOptions; this.moduleOptions = {}; this.domElements = []; + this.popupDiv = {}; + this.popupLimit = 5; + this.popupHistory = {}; this.colorPicker = new ColorPicker(pixelRatio); this.wrapper = undefined; } @@ -48,6 +53,10 @@ class Configurator { */ setOptions(options) { if (options !== undefined) { + // reset the popup history because the indices may have been changed. + this.popupHistory = {}; + this._removePopup(); + let enabled = true; if (typeof options === 'string') { this.options.filter = options; @@ -131,7 +140,7 @@ class Configurator { // a header for the category this._makeHeader(option); - // get the suboptions + // get the sub options this._handleObject(this.configureOptions[option], [option]); } counter++; @@ -140,21 +149,21 @@ class Configurator { if (this.options.showButton === true) { let generateButton = document.createElement('div'); - generateButton.className = 'vis-network-configuration button'; + generateButton.className = 'vis-configuration vis-config-button'; generateButton.innerHTML = 'generate options'; generateButton.onclick = () => {this._printOptions();}; - generateButton.onmouseover = () => {generateButton.className = 'vis-network-configuration button hover';}; - generateButton.onmouseout = () => {generateButton.className = 'vis-network-configuration button';}; + generateButton.onmouseover = () => {generateButton.className = 'vis-configuration vis-config-button hover';}; + generateButton.onmouseout = () => {generateButton.className = 'vis-configuration vis-config-button';}; this.optionsContainer = document.createElement('div'); - this.optionsContainer.className = 'vis-network-configuration vis-option-container'; + this.optionsContainer.className = 'vis-configuration vis-config-option-container'; this.domElements.push(this.optionsContainer); this.domElements.push(generateButton); } this._push(); - this.colorPicker.insertTo(this.container); + //~ this.colorPicker.insertTo(this.container); } @@ -164,11 +173,13 @@ class Configurator { */ _push() { this.wrapper = document.createElement('div'); - this.wrapper.className = 'vis-network-configuration-wrapper'; + this.wrapper.className = 'vis-configuration-wrapper'; this.container.appendChild(this.wrapper); for (var i = 0; i < this.domElements.length; i++) { this.wrapper.appendChild(this.domElements[i]); } + + this._showPopupIfNeeded() } @@ -186,6 +197,8 @@ class Configurator { this.wrapper = undefined; } this.domElements = []; + + this._removePopup(); } @@ -219,12 +232,14 @@ class Configurator { _makeItem(path, ...domElements) { if (this.allowCreation === true) { let item = document.createElement('div'); - item.className = 'vis-network-configuration item s' + path.length; + item.className = 'vis-configuration vis-config-item vis-config-s' + path.length; domElements.forEach((element) => { item.appendChild(element); }); this.domElements.push(item); + return this.domElements.length; } + return 0; } @@ -235,7 +250,7 @@ class Configurator { */ _makeHeader(name) { let div = document.createElement('div'); - div.className = 'vis-network-configuration header'; + div.className = 'vis-configuration vis-config-header'; div.innerHTML = name; this._makeItem([],div); } @@ -251,7 +266,7 @@ class Configurator { */ _makeLabel(name, path, objectLabel = false) { let div = document.createElement('div'); - div.className = 'vis-network-configuration label s' + path.length; + div.className = 'vis-configuration vis-config-label vis-config-s' + path.length; if (objectLabel === true) { div.innerHTML = '' + name + ':'; } @@ -271,7 +286,7 @@ class Configurator { */ _makeDropdown(arr, value, path) { let select = document.createElement('select'); - select.className = 'vis-network-configuration select'; + select.className = 'vis-configuration vis-config-select'; let selectedValue = 0; if (value !== undefined) { if (arr.indexOf(value) !== -1) { @@ -310,7 +325,7 @@ class Configurator { let max = arr[2]; let step = arr[3]; let range = document.createElement('input'); - range.className = 'vis-network-configuration range'; + range.className = 'vis-configuration vis-config-range'; try { range.type = 'range'; // not supported on IE9 range.min = min; @@ -319,15 +334,26 @@ class Configurator { catch (err) {} range.step = step; + // set up the popup settings in case they are needed. + let popupString = ''; + let popupValue = 0; + if (value !== undefined) { - if (value < 0 && value * 2 < min) { - range.min = value*2; + let factor = 1.20; + if (value < 0 && value * factor < min) { + range.min = Math.ceil(value * factor); + popupValue = range.min; + popupString = 'range increased'; } - else if (value * 0.1 < min) { - range.min = value / 10; + else if (value / factor < min) { + range.min = Math.ceil(value / factor); + popupValue = range.min; + popupString = 'range increased'; } - if (value * 2 > max && max !== 1) { - range.max = value * 2; + if (value * factor > max && max !== 1) { + range.max = Math.ceil(value * factor); + popupValue = range.max; + popupString = 'range increased'; } range.value = value; } @@ -336,7 +362,7 @@ class Configurator { } let input = document.createElement('input'); - input.className = 'vis-network-configuration rangeinput'; + input.className = 'vis-configuration vis-config-rangeinput'; input.value = range.value; var me = this; @@ -344,10 +370,70 @@ class Configurator { range.oninput = function () {input.value = this.value; }; let label = this._makeLabel(path[path.length-1], path); - this._makeItem(path, label, range, input); + let itemIndex = this._makeItem(path, label, range, input); + + // if a popup is needed AND it has not been shown for this value, show it. + if (popupString !== '' && this.popupHistory[itemIndex] !== popupValue) { + this.popupHistory[itemIndex] = popupValue; + this._setupPopup(popupString, itemIndex); + } + } + /** + * prepare the popup + * @param string + * @param index + * @private + */ + _setupPopup(string, index) { + if (this.initialized === true && this.allowCreation === true && this.popupCounter < this.popupLimit) { + let div = document.createElement("div"); + div.id = "vis-configuration-popup"; + div.className = "vis-configuration-popup"; + div.innerHTML = string; + div.onclick = () => {this._removePopup()}; + this.popupCounter += 1; + this.popupDiv = {html:div, index:index}; + } + } + + + /** + * remove the popup from the dom + * @private + */ + _removePopup() { + if (this.popupDiv.html !== undefined) { + this.popupDiv.html.parentNode.removeChild(this.popupDiv.html); + clearTimeout(this.popupDiv.hideTimeout); + clearTimeout(this.popupDiv.deleteTimeout); + this.popupDiv = {}; + } + } + + + /** + * Show the popup if it is needed. + * @private + */ + _showPopupIfNeeded() { + if (this.popupDiv.html !== undefined) { + let correspondingElement = this.domElements[this.popupDiv.index]; + let rect = correspondingElement.getBoundingClientRect(); + this.popupDiv.html.style.left = rect.left + "px"; + this.popupDiv.html.style.top = rect.top - 30 + "px"; // 30 is the height; + document.body.appendChild(this.popupDiv.html) + this.popupDiv.hideTimeout = setTimeout(() => { + this.popupDiv.html.style.opacity = 0; + },1500); + this.popupDiv.deleteTimeout = setTimeout(() => { + this._removePopup(); + },1800) + } + } + /** * make a checkbox for boolean options. * @param defaultValue @@ -358,7 +444,7 @@ class Configurator { _makeCheckbox(defaultValue, value, path) { var checkbox = document.createElement('input'); checkbox.type = 'checkbox'; - checkbox.className = 'vis-network-configuration checkbox'; + checkbox.className = 'vis-configuration vis-config-checkbox'; checkbox.checked = defaultValue; if (value !== undefined) { checkbox.checked = value; @@ -391,7 +477,7 @@ class Configurator { _makeTextInput(defaultValue, value, path) { var checkbox = document.createElement('input'); checkbox.type = 'text'; - checkbox.className = 'vis-network-configuration text'; + checkbox.className = 'vis-configuration vis-config-text'; checkbox.value = value; if (value !== defaultValue) { this.changedOptions.push({path:path, value:value}); @@ -418,11 +504,11 @@ class Configurator { value = value === undefined ? defaultColor : value; if (value !== 'none') { - div.className = 'vis-network-configuration colorBlock'; + div.className = 'vis-configuration vis-config-colorBlock'; div.style.backgroundColor = value; } else { - div.className = 'vis-network-configuration colorBlock none'; + div.className = 'vis-configuration vis-config-colorBlock none'; } value = value === undefined ? defaultColor : value; @@ -444,17 +530,25 @@ class Configurator { * @private */ _showColorPicker(value, div, path) { - let rect = div.getBoundingClientRect(); - let bodyRect = document.body.getBoundingClientRect(); - let pickerX = rect.left + rect.width + 5; - let pickerY = rect.top - bodyRect.top + rect.height*0.5; - this.colorPicker.show(pickerX,pickerY); + // clear the callback from this div + div.onclick = function() {}; + + this.colorPicker.insertTo(div); + this.colorPicker.show(); + this.colorPicker.setColor(value); - this.colorPicker.setCallback((color) => { + this.colorPicker.setUpdateCallback((color) => { let colorString = 'rgba(' + color.r + ',' + color.g + ',' + color.b + ',' + color.a + ')'; div.style.backgroundColor = colorString; this._update(colorString,path); - }) + }); + + // on close of the colorpicker, restore the callback. + this.colorPicker.setCloseCallback(() => { + div.onclick = () => { + this._showColorPicker(value,div,path); + }; + }); } @@ -576,7 +670,7 @@ class Configurator { if (this.parent.body && this.parent.body.emitter && this.parent.body.emitter.emit) { this.parent.body.emitter.emit("configChange", options); } - + this.initialized = true; this.parent.setOptions(options); } diff --git a/lib/vis/lib/network/css/network-configuration.css b/lib/vis/lib/shared/configuration.css similarity index 69% rename from lib/vis/lib/network/css/network-configuration.css rename to lib/vis/lib/shared/configuration.css index 4d7daecaf3..1913c98851 100644 --- a/lib/vis/lib/network/css/network-configuration.css +++ b/lib/vis/lib/shared/configuration.css @@ -1,17 +1,22 @@ -div.vis-network-configuration { +div.vis-configuration { position:relative; display:block; float:left; font-size:12px; } -div.vis-network-configuration-wrapper { +div.vis-configuration-wrapper { display:block; width:700px; } +div.vis-configuration-wrapper::after { + clear: both; + content: ""; + display: block; +} -div.vis-network-configuration.vis-option-container{ +div.vis-configuration.vis-config-option-container{ display:block; width:495px; background-color: #ffffff; @@ -22,7 +27,7 @@ div.vis-network-configuration.vis-option-container{ padding-left:5px; } -div.vis-network-configuration.button{ +div.vis-configuration.vis-config-button{ display:block; width:495px; height:25px; @@ -38,13 +43,13 @@ div.vis-network-configuration.button{ margin-bottom:30px; } -div.vis-network-configuration.button.hover{ +div.vis-configuration.vis-config-button.hover{ background-color: #4588e6; border:2px solid #214373; color:#ffffff; } -div.vis-network-configuration.item{ +div.vis-configuration.vis-config-item{ display:block; float:left; width:495px; @@ -54,44 +59,44 @@ div.vis-network-configuration.item{ } -div.vis-network-configuration.item.s2{ +div.vis-configuration.vis-config-item.vis-config-s2{ left:10px; background-color: #f7f8fa; padding-left:5px; border-radius:3px; } -div.vis-network-configuration.item.s3{ +div.vis-configuration.vis-config-item.vis-config-s3{ left:20px; background-color: #e4e9f0; padding-left:5px; border-radius:3px; } -div.vis-network-configuration.item.s4{ +div.vis-configuration.vis-config-item.vis-config-s4{ left:30px; background-color: #cfd8e6; padding-left:5px; border-radius:3px; } -div.vis-network-configuration.header{ +div.vis-configuration.vis-config-header{ font-size:18px; font-weight: bold; } -div.vis-network-configuration.label{ +div.vis-configuration.vis-config-label{ width:120px; height:25px; line-height: 25px; } -div.vis-network-configuration.label.s3{ +div.vis-configuration.vis-config-label.vis-config-s3{ width:110px; } -div.vis-network-configuration.label.s4{ +div.vis-configuration.vis-config-label.vis-config-s4{ width:100px; } -div.vis-network-configuration.colorBlock{ +div.vis-configuration.vis-config-colorBlock{ top:1px; width:30px; height:19px; @@ -102,22 +107,22 @@ div.vis-network-configuration.colorBlock{ cursor:pointer; } -input.vis-network-configuration.checkbox { +input.vis-configuration.vis-config-checkbox { left:-5px; } -input.vis-network-configuration.rangeinput{ +input.vis-configuration.vis-config-rangeinput{ position:relative; top:-5px; width:60px; - height:13px; + /*height:13px;*/ padding:1px; margin:0; pointer-events:none; } -input.vis-network-configuration.range{ +input.vis-configuration.vis-config-range{ /*removes default webkit styles*/ -webkit-appearance: none; @@ -129,7 +134,7 @@ input.vis-network-configuration.range{ width: 300px; height:20px; } -input.vis-network-configuration.range::-webkit-slider-runnable-track { +input.vis-configuration.vis-config-range::-webkit-slider-runnable-track { width: 300px; height: 5px; background: #dedede; /* Old browsers */ @@ -145,7 +150,7 @@ input.vis-network-configuration.range::-webkit-slider-runnable-track { box-shadow: #aaaaaa 0px 0px 3px 0px; border-radius: 3px; } -input.vis-network-configuration.range::-webkit-slider-thumb { +input.vis-configuration.vis-config-range::-webkit-slider-thumb { -webkit-appearance: none; border: 1px solid #14334b; height: 17px; @@ -162,10 +167,10 @@ input.vis-network-configuration.range::-webkit-slider-thumb { box-shadow: #111927 0px 0px 1px 0px; margin-top: -7px; } -input.vis-network-configuration.range:focus { +input.vis-configuration.vis-config-range:focus { outline: none; } -input.vis-network-configuration.range:focus::-webkit-slider-runnable-track { +input.vis-configuration.vis-config-range:focus::-webkit-slider-runnable-track { background: #9d9d9d; /* Old browsers */ background: -moz-linear-gradient(top, #9d9d9d 0%, #c8c8c8 99%); /* FF3.6+ */ background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#9d9d9d), color-stop(99%,#c8c8c8)); /* Chrome,Safari4+ */ @@ -176,7 +181,7 @@ input.vis-network-configuration.range:focus::-webkit-slider-runnable-track { filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#9d9d9d', endColorstr='#c8c8c8',GradientType=0 ); /* IE6-9 */ } -input.vis-network-configuration.range::-moz-range-track { +input.vis-configuration.vis-config-range::-moz-range-track { width: 300px; height: 10px; background: #dedede; /* Old browsers */ @@ -192,7 +197,7 @@ input.vis-network-configuration.range::-moz-range-track { box-shadow: #aaaaaa 0px 0px 3px 0px; border-radius: 3px; } -input.vis-network-configuration.range::-moz-range-thumb { +input.vis-configuration.vis-config-range::-moz-range-thumb { border: none; height: 16px; width: 16px; @@ -202,12 +207,12 @@ input.vis-network-configuration.range::-moz-range-thumb { } /*hide the outline behind the border*/ -input.vis-network-configuration.range:-moz-focusring{ +input.vis-configuration.vis-config-range:-moz-focusring{ outline: 1px solid white; outline-offset: -1px; } -input.vis-network-configuration.range::-ms-track { +input.vis-configuration.vis-config-range::-ms-track { width: 300px; height: 5px; @@ -221,24 +226,63 @@ input.vis-network-configuration.range::-ms-track { /*remove default tick marks*/ color: transparent; } -input.vis-network-configuration.range::-ms-fill-lower { +input.vis-configuration.vis-config-range::-ms-fill-lower { background: #777; border-radius: 10px; } -input.vis-network-configuration.range::-ms-fill-upper { +input.vis-configuration.vis-config-range::-ms-fill-upper { background: #ddd; border-radius: 10px; } -input.vis-network-configuration.range::-ms-thumb { +input.vis-configuration.vis-config-range::-ms-thumb { border: none; height: 16px; width: 16px; border-radius: 50%; background: #385380; } -input.vis-network-configuration.range:focus::-ms-fill-lower { +input.vis-configuration.vis-config-range:focus::-ms-fill-lower { background: #888; } -input.vis-network-configuration.range:focus::-ms-fill-upper { +input.vis-configuration.vis-config-range:focus::-ms-fill-upper { background: #ccc; +} + +.vis-configuration-popup { + position: absolute; + background: rgba(57, 76, 89, 0.85); + border: 2px solid #f2faff; + line-height:30px; + height:30px; + width:150px; + text-align:center; + color: #ffffff; + font-size:14px; + border-radius:4px; + -webkit-transition: opacity 0.3s ease-in-out; + -moz-transition: opacity 0.3s ease-in-out; + transition: opacity 0.3s ease-in-out; +} +.vis-configuration-popup:after, .vis-configuration-popup:before { + left: 100%; + top: 50%; + border: solid transparent; + content: " "; + height: 0; + width: 0; + position: absolute; + pointer-events: none; +} + +.vis-configuration-popup:after { + border-color: rgba(136, 183, 213, 0); + border-left-color: rgba(57, 76, 89, 0.85); + border-width: 8px; + margin-top: -8px; +} +.vis-configuration-popup:before { + border-color: rgba(194, 225, 245, 0); + border-left-color: #f2faff; + border-width: 12px; + margin-top: -12px; } \ No newline at end of file diff --git a/lib/vis/lib/timeline/Core.js b/lib/vis/lib/timeline/Core.js index 060dffce3c..86350197ac 100644 --- a/lib/vis/lib/timeline/Core.js +++ b/lib/vis/lib/timeline/Core.js @@ -90,12 +90,16 @@ Core.prototype._create = function (container) { this.dom.rightContainer.appendChild(this.dom.shadowTopRight); this.dom.rightContainer.appendChild(this.dom.shadowBottomRight); - this.on('rangechange', this.redraw.bind(this)); + this.on('rangechange', function () { + if (this.initialDrawDone === true) { + this._redraw(); // this allows overriding the _redraw method + } + }.bind(this)); this.on('touch', this._onTouch.bind(this)); this.on('pan', this._onDrag.bind(this)); var me = this; - this.on('change', function (properties) { + this.on('_change', function (properties) { if (properties && properties.queue == true) { // redraw once on next tick if (!me._redrawTimer) { @@ -179,6 +183,7 @@ Core.prototype._create = function (container) { this.touch = {}; this.redrawCount = 0; + this.initialDrawDone = false; // attach the root panel to the provided container if (!container) throw new Error('No container provided'); @@ -213,9 +218,15 @@ Core.prototype._create = function (container) { Core.prototype.setOptions = function (options) { if (options) { // copy the known options - var fields = ['width', 'height', 'minHeight', 'maxHeight', 'autoResize', 'start', 'end', 'clickToUse', 'dataAttributes', 'hiddenDates']; + var fields = [ + 'width', 'height', 'minHeight', 'maxHeight', 'autoResize', + 'start', 'end', 'clickToUse', 'dataAttributes', 'hiddenDates', + 'locale', 'locales', 'moment', + 'throttleRedraw' + ]; util.selectiveExtend(fields, this.options, options); + this.options.orientation = {item:undefined,axis:undefined}; if ('orientation' in options) { if (typeof options.orientation === 'string') { this.options.orientation = { @@ -261,9 +272,9 @@ Core.prototype.setOptions = function (options) { onRender: options.drawPoints }; } - + if ('hiddenDates' in this.options) { - DateUtil.convertHiddenOptions(this.body, this.options.hiddenDates); + DateUtil.convertHiddenOptions(this.options.moment, this.body, this.options.hiddenDates); } if ('clickToUse' in options) { @@ -307,8 +318,15 @@ Core.prototype.setOptions = function (options) { this.configurator.setModuleOptions({global: appliedOptions}); } - // redraw everything - this._redraw(); + // override redraw with a throttled version + if (!this._origRedraw) { + this._origRedraw = this._redraw.bind(this); + this._redraw = util.throttle(this._origRedraw, this.options.throttleRedraw); + } else { + // Not the initial run: redraw everything + this._redraw(); + } + }; /** @@ -396,6 +414,24 @@ Core.prototype.getCustomTime = function(id) { return customTimes[0].getCustomTime(); }; +/** + * Set a custom title for the custom time bar. + * @param {String} [title] Custom title + * @param {number} [id=undefined] Id of the custom time bar. + */ +Core.prototype.setCustomTimeTitle = function(title, id) { + var customTimes = this.customTimes.filter(function (component) { + return component.options.id === id; + }); + + if (customTimes.length === 0) { + throw new Error('No custom time bar found with id ' + JSON.stringify(id)) + } + if (customTimes.length > 0) { + return customTimes[0].setCustomTitle(title); + } +}; + /** * Retrieve meta information from an event. * Should be overridden by classes extending Core @@ -428,14 +464,14 @@ Core.prototype.addCustomTime = function (time, id) { throw new Error('A custom time with id ' + JSON.stringify(id) + ' already exists'); } - var customTime = new CustomTime(this.body, { + var customTime = new CustomTime(this.body, util.extend({}, this.options, { time : timestamp, id : id - }); + })); this.customTimes.push(customTime); this.components.push(customTime); - this.redraw(); + this._redraw(); return id; }; @@ -577,6 +613,8 @@ Core.prototype.getWindow = function() { /** * Force a redraw. Can be overridden by implementations of Core + * + * Note: this function will be overridden on construction with a trottled version */ Core.prototype.redraw = function() { this._redraw(); @@ -588,14 +626,15 @@ Core.prototype.redraw = function() { * @protected */ Core.prototype._redraw = function() { + this.redrawCount++; var resized = false; var options = this.options; var props = this.props; var dom = this.dom; - if (!dom) return; // when destroyed + if (!dom|| !dom.container || dom.container.clientWidth == 0 ) return;// when destroyed, or invisible - DateUtil.updateHiddenDates(this.body, this.options.hiddenDates); + DateUtil.updateHiddenDates(this.options.moment, this.body, this.options.hiddenDates); // update class names if (options.orientation == 'top') { @@ -733,18 +772,22 @@ Core.prototype._redraw = function() { this.components.forEach(function (component) { resized = component.redraw() || resized; }); + var MAX_REDRAW = 5; if (resized) { - // keep repainting until all sizes are settled - var MAX_REDRAWS = 3; // maximum number of consecutive redraws - if (this.redrawCount < MAX_REDRAWS) { - this.redrawCount++; - this._redraw(); + if (this.redrawCount < MAX_REDRAW) { + this.body.emitter.emit('_change'); + return; } else { console.log('WARNING: infinite loop in redraw?'); } + } else { this.redrawCount = 0; } + this.initialDrawDone = true; + + //Emit public 'changed' event for UI updates, see issue #1592 + this.body.emitter.emit("changed"); }; // TODO: deprecated since version 1.1.0, remove some day @@ -874,7 +917,7 @@ Core.prototype._startAutoResize = function () { me.props.lastWidth = me.dom.root.offsetWidth; me.props.lastHeight = me.dom.root.offsetHeight; - me.emit('change'); + me.body.emitter.emit('_change'); } } }; @@ -882,6 +925,12 @@ Core.prototype._startAutoResize = function () { // add event listener to window resize util.addEventListener(window, 'resize', this._onResize); + //Prevent initial unnecessary redraw + if (me.dom.root) { + me.props.lastWidth = me.dom.root.offsetWidth; + me.props.lastHeight = me.dom.root.offsetHeight; + } + this.watchTimer = setInterval(this._onResize, 1000); }; @@ -896,8 +945,10 @@ Core.prototype._stopAutoResize = function () { } // remove event listener on window.resize - util.removeEventListener(window, 'resize', this._onResize); - this._onResize = null; + if (this._onResize) { + util.removeEventListener(window, 'resize', this._onResize); + this._onResize = null; + } }; /** @@ -936,7 +987,6 @@ Core.prototype._onDrag = function (event) { if (newScrollTop != oldScrollTop) { - this._redraw(); // TODO: this causes two redraws when dragging, the other is triggered by rangechange already this.emit("verticalDrag"); } }; diff --git a/lib/vis/lib/timeline/DataStep.js b/lib/vis/lib/timeline/DataStep.js deleted file mode 100644 index 9bc67fecf4..0000000000 --- a/lib/vis/lib/timeline/DataStep.js +++ /dev/null @@ -1,233 +0,0 @@ -/** - * @constructor DataStep - * The class DataStep is an iterator for data for the lineGraph. You provide a start data point and an - * end data point. The class itself determines the best scale (step size) based on the - * provided start Date, end Date, and minimumStep. - * - * If minimumStep is provided, the step size is chosen as close as possible - * to the minimumStep but larger than minimumStep. If minimumStep is not - * provided, the scale is set to 1 DAY. - * The minimumStep should correspond with the onscreen size of about 6 characters - * - * Alternatively, you can set a scale by hand. - * After creation, you can initialize the class by executing first(). Then you - * can iterate from the start date to the end date via next(). You can check if - * the end date is reached with the function hasNext(). After each step, you can - * retrieve the current date via getCurrent(). - * The DataStep has scales ranging from milliseconds, seconds, minutes, hours, - * days, to years. - * - * Version: 1.2 - * - * @param {Date} [start] The start date, for example new Date(2010, 9, 21) - * or new Date(2010, 9, 21, 23, 45, 00) - * @param {Date} [end] The end date - * @param {Number} [minimumStep] Optional. Minimum step size in milliseconds - */ -function DataStep(start, end, minimumStep, containerHeight, customRange, formattingFunction, alignZeros) { - // variables - this.current = 0; - - this.autoScale = true; - this.stepIndex = 0; - this.step = 1; - this.scale = 1; - this.formattingFunction = formattingFunction; - - this.marginStart; - this.marginEnd; - this.deadSpace = 0; - - this.majorSteps = [1, 2, 5, 10]; - this.minorSteps = [0.25, 0.5, 1, 2]; - - this.alignZeros = alignZeros; - - this.setRange(start, end, minimumStep, containerHeight, customRange); -} - - - -/** - * Set a new range - * If minimumStep is provided, the step size is chosen as close as possible - * to the minimumStep but larger than minimumStep. If minimumStep is not - * provided, the scale is set to 1 DAY. - * The minimumStep should correspond with the onscreen size of about 6 characters - * @param {Number} [start] The start date and time. - * @param {Number} [end] The end date and time. - * @param {Number} [minimumStep] Optional. Minimum step size in milliseconds - */ -DataStep.prototype.setRange = function(start, end, minimumStep, containerHeight, customRange) { - this._start = customRange.min === undefined ? start : customRange.min; - this._end = customRange.max === undefined ? end : customRange.max; - if (this._start === this._end) { - this._start = customRange.min === undefined ? this._start - 0.75 : this._start; - this._end = customRange.max === undefined ? this._end + 1 : this._end;; - } - - if (this.autoScale === true) { - this.setMinimumStep(minimumStep, containerHeight); - } - - this.setFirst(customRange); -}; - -/** - * Automatically determine the scale that bests fits the provided minimum step - * @param {Number} [minimumStep] The minimum step size in pixels - */ -DataStep.prototype.setMinimumStep = function(minimumStep, containerHeight) { - // round to floor - var range = this._end - this._start; - var safeRange = range * 1.2; - var minimumStepValue = minimumStep * (safeRange / containerHeight); - var orderOfMagnitude = Math.round(Math.log(safeRange)/Math.LN10); - - var minorStepIdx = -1; - var magnitudefactor = Math.pow(10,orderOfMagnitude); - - var start = 0; - if (orderOfMagnitude < 0) { - start = orderOfMagnitude; - } - - var solutionFound = false; - for (var i = start; Math.abs(i) <= Math.abs(orderOfMagnitude); i++) { - magnitudefactor = Math.pow(10,i); - for (var j = 0; j < this.minorSteps.length; j++) { - var stepSize = magnitudefactor * this.minorSteps[j]; - if (stepSize >= minimumStepValue) { - solutionFound = true; - minorStepIdx = j; - break; - } - } - if (solutionFound === true) { - break; - } - } - this.stepIndex = minorStepIdx; - this.scale = magnitudefactor; - this.step = magnitudefactor * this.minorSteps[minorStepIdx]; -}; - - - -/** - * Round the current date to the first minor date value - * This must be executed once when the current date is set to start Date - */ -DataStep.prototype.setFirst = function(customRange) { - if (customRange === undefined) { - customRange = {}; - } - - var niceStart = customRange.min === undefined ? this._start - (this.scale * 2 * this.minorSteps[this.stepIndex]) : customRange.min; - var niceEnd = customRange.max === undefined ? this._end + (this.scale * this.minorSteps[this.stepIndex]) : customRange.max; - - this.marginEnd = customRange.max === undefined ? this.roundToMinor(niceEnd) : customRange.max; - this.marginStart = customRange.min === undefined ? this.roundToMinor(niceStart) : customRange.min; - - // if we need to align the zero's we need to make sure that there is a zero to use. - if (this.alignZeros === true && (this.marginEnd - this.marginStart) % this.step != 0) { - this.marginEnd += this.marginEnd % this.step; - } - - this.deadSpace = this.roundToMinor(niceEnd) - niceEnd + this.roundToMinor(niceStart) - niceStart; - this.marginRange = this.marginEnd - this.marginStart; - - this.current = this.marginEnd; -}; - -DataStep.prototype.roundToMinor = function(value) { - var rounded = value - (value % (this.scale * this.minorSteps[this.stepIndex])); - if (value % (this.scale * this.minorSteps[this.stepIndex]) > 0.5 * (this.scale * this.minorSteps[this.stepIndex])) { - return rounded + (this.scale * this.minorSteps[this.stepIndex]); - } - else { - return rounded; - } -} - - -/** - * Check if the there is a next step - * @return {boolean} true if the current date has not passed the end date - */ -DataStep.prototype.hasNext = function () { - return (this.current >= this.marginStart); -}; - -/** - * Do the next step - */ -DataStep.prototype.next = function() { - var prev = this.current; - this.current -= this.step; - - // safety mechanism: if current time is still unchanged, move to the end - if (this.current === prev) { - this.current = this._end; - } -}; - -/** - * Do the next step - */ -DataStep.prototype.previous = function() { - this.current += this.step; - this.marginEnd += this.step; - this.marginRange = this.marginEnd - this.marginStart; -}; - - - -/** - * Get the current datetime - * @return {String} current The current date - */ -DataStep.prototype.getCurrent = function() { - // prevent round-off errors when close to zero - var current = (Math.abs(this.current) < this.step / 2) ? 0 : this.current; - var returnValue = current.toPrecision(5); - if (typeof this.formattingFunction === 'function') { - returnValue = this.formattingFunction(current); - } - - if (typeof returnValue === 'number') { - return '' + returnValue; - } - else if (typeof returnValue === 'string') { - return returnValue; - } - else { - return current.toPrecision(5); - } - -}; - -/** - * Check if the current value is a major value (for example when the step - * is DAY, a major value is each first day of the MONTH) - * @return {boolean} true if current date is major, else false. - */ -DataStep.prototype.isMajor = function() { - return (this.current % (this.scale * this.majorSteps[this.stepIndex]) === 0); -}; - - -DataStep.prototype.shift = function(steps) { - if (steps < 0) { - for (let i = 0; i < -steps; i++) { - this.previous(); - } - } - else if (steps > 0) { - for (let i = 0; i < steps; i++) { - this.next(); - } - } -} - -module.exports = DataStep; diff --git a/lib/vis/lib/timeline/DateUtil.js b/lib/vis/lib/timeline/DateUtil.js index 767408176b..1a8a90761d 100644 --- a/lib/vis/lib/timeline/DateUtil.js +++ b/lib/vis/lib/timeline/DateUtil.js @@ -1,12 +1,16 @@ -var moment = require('../module/moment'); - /** * used in Core to convert the options into a volatile variable * - * @param Core + * @param {function} moment + * @param {Object} body + * @param {Array | Object} hiddenDates */ -exports.convertHiddenOptions = function(body, hiddenDates) { +exports.convertHiddenOptions = function(moment, body, hiddenDates) { + if (hiddenDates && !Array.isArray(hiddenDates)) { + return exports.convertHiddenOptions(moment, body, [hiddenDates]) + } + body.hiddenDates = []; if (hiddenDates) { if (Array.isArray(hiddenDates) == true) { @@ -28,12 +32,17 @@ exports.convertHiddenOptions = function(body, hiddenDates) { /** * create new entrees for the repeating hidden dates - * @param body - * @param hiddenDates + * @param {function} moment + * @param {Object} body + * @param {Array | Object} hiddenDates */ -exports.updateHiddenDates = function (body, hiddenDates) { +exports.updateHiddenDates = function (moment, body, hiddenDates) { + if (hiddenDates && !Array.isArray(hiddenDates)) { + return exports.updateHiddenDates(moment, body, [hiddenDates]) + } + if (hiddenDates && body.domProps.centerContainer.width !== undefined) { - exports.convertHiddenOptions(body, hiddenDates); + exports.convertHiddenOptions(moment, body, hiddenDates); var start = moment(body.range.start); var end = moment(body.range.end); @@ -134,7 +143,7 @@ exports.updateHiddenDates = function (body, hiddenDates) { case "weekly": startDate.add(1, 'weeks'); endDate.add(1, 'weeks'); - break + break; case "monthly": startDate.add(1, 'months'); endDate.add(1, 'months'); @@ -208,20 +217,21 @@ exports.removeDuplicates = function(body) { body.hiddenDates.sort(function (a, b) { return a.start - b.start; }); // sort by start time -} +}; exports.printDates = function(dates) { for (var i =0; i < dates.length; i++) { console.log(i, new Date(dates[i].start),new Date(dates[i].end), dates[i].start, dates[i].end, dates[i].remove); } -} +}; /** * Used in TimeStep to avoid the hidden times. - * @param timeStep + * @param {function} moment + * @param {TimeStep} timeStep * @param previousTime */ -exports.stepOverHiddenDates = function(timeStep, previousTime) { +exports.stepOverHiddenDates = function(moment, timeStep, previousTime) { var stepInHidden = false; var currentValue = timeStep.current.valueOf(); for (var i = 0; i < timeStep.hiddenDates.length; i++) { @@ -241,7 +251,7 @@ exports.stepOverHiddenDates = function(timeStep, previousTime) { else if (prevValue.month() != newValue.month()) {timeStep.switchedMonth = true;} else if (prevValue.dayOfYear() != newValue.dayOfYear()) {timeStep.switchedDay = true;} - timeStep.current = newValue.toDate(); + timeStep.current = newValue; } }; @@ -282,13 +292,13 @@ exports.toScreen = function(Core, time, width) { return (time.valueOf() - conversion.offset) * conversion.scale; } else { - var hidden = exports.isHidden(time, Core.body.hiddenDates) + var hidden = exports.isHidden(time, Core.body.hiddenDates); if (hidden.hidden == true) { time = hidden.startDate; } var duration = exports.getHiddenDurationBetween(Core.body.hiddenDates, Core.range.start, Core.range.end); - time = exports.correctTimeForHidden(Core.body.hiddenDates, Core.range, time); + time = exports.correctTimeForHidden(Core.options.moment, Core.body.hiddenDates, Core.range, time); var conversion = Core.range.conversion(width, duration); return (time.valueOf() - conversion.offset) * conversion.scale; @@ -344,18 +354,19 @@ exports.getHiddenDurationBetween = function(hiddenDates, start, end) { /** * Support function + * @param moment * @param hiddenDates * @param range * @param time * @returns {{duration: number, time: *, offset: number}} */ -exports.correctTimeForHidden = function(hiddenDates, range, time) { +exports.correctTimeForHidden = function(moment, hiddenDates, range, time) { time = moment(time).toDate().valueOf(); - time -= exports.getHiddenDurationBefore(hiddenDates,range,time); + time -= exports.getHiddenDurationBefore(moment, hiddenDates,range,time); return time; }; -exports.getHiddenDurationBefore = function(hiddenDates, range, time) { +exports.getHiddenDurationBefore = function(moment, hiddenDates, range, time) { var timeOffset = 0; time = moment(time).toDate().valueOf(); diff --git a/lib/vis/lib/timeline/Graph2d.js b/lib/vis/lib/timeline/Graph2d.js index 2526193b07..a5498eb5e5 100644 --- a/lib/vis/lib/timeline/Graph2d.js +++ b/lib/vis/lib/timeline/Graph2d.js @@ -1,5 +1,6 @@ var Emitter = require('emitter-component'); var Hammer = require('../module/hammer'); +var moment = require('../module/moment'); var util = require('../util'); var DataSet = require('../DataSet'); var DataView = require('../DataView'); @@ -26,7 +27,7 @@ var configureOptions = require('./optionsGraph2d').configureOptions; */ function Graph2d (container, items, groups, options) { // if the third element is options, the forth is groups (optionally); - if (!(Array.isArray(groups) || groups instanceof DataSet) && groups instanceof Object) { + if (!(Array.isArray(groups) || groups instanceof DataSet || groups instanceof DataView) && groups instanceof Object) { var forthArgument = options; options = groups; groups = forthArgument; @@ -44,6 +45,8 @@ function Graph2d (container, items, groups, options) { item: 'bottom' // not relevant for Graph2d }, + moment: moment, + width: null, height: null, maxHeight: null, @@ -90,11 +93,13 @@ function Graph2d (container, items, groups, options) { // item set this.linegraph = new LineGraph(this.body); + this.components.push(this.linegraph); this.itemsData = null; // DataSet this.groupsData = null; // DataSet + this.on('tap', function (event) { me.emit('click', me.getEventProperties(event)) }); @@ -119,9 +124,9 @@ function Graph2d (container, items, groups, options) { if (items) { this.setItems(items); } - else { - this._redraw(); - } + + // draw for the first time + this._redraw(); } // Extend the functionality from Core @@ -170,7 +175,6 @@ Graph2d.prototype.setItems = function(items) { if (this.options.start != undefined || this.options.end != undefined) { var start = this.options.start != undefined ? this.options.start : null; var end = this.options.end != undefined ? this.options.end : null; - this.setWindow(start, end, {animation: false}); } else { @@ -214,7 +218,7 @@ Graph2d.prototype.getLegend = function(groupId, width, height) { return this.linegraph.groups[groupId].getLegend(width,height); } else { - return "cannot find group:" + groupId; + return "cannot find group:'" + groupId + "'"; } }; diff --git a/lib/vis/lib/timeline/Range.js b/lib/vis/lib/timeline/Range.js index 5bf5d403ca..97e690e2ff 100644 --- a/lib/vis/lib/timeline/Range.js +++ b/lib/vis/lib/timeline/Range.js @@ -27,6 +27,7 @@ function Range(body, options) { this.defaultOptions = { start: null, end: null, + moment: moment, direction: 'horizontal', // 'horizontal' or 'vertical' moveable: true, zoomable: true, @@ -78,7 +79,10 @@ Range.prototype = new Component(); Range.prototype.setOptions = function (options) { if (options) { // copy the options that we know - var fields = ['direction', 'min', 'max', 'zoomMin', 'zoomMax', 'moveable', 'zoomable', 'activate', 'hiddenDates', 'zoomKey']; + var fields = [ + 'direction', 'min', 'max', 'zoomMin', 'zoomMax', 'moveable', 'zoomable', + 'moment', 'activate', 'hiddenDates', 'zoomKey' + ]; util.selectiveExtend(fields, this.options, options); if ('start' in options || 'end' in options) { @@ -145,7 +149,7 @@ Range.prototype.setRange = function(start, end, animation, byUser) { var e = (done || finalEnd === null) ? finalEnd : initEnd + (finalEnd - initEnd) * ease; changed = me._applyRange(s, e); - DateUtil.updateHiddenDates(me.body, me.options.hiddenDates); + DateUtil.updateHiddenDates(me.options.moment, me.body, me.options.hiddenDates); anyChanged = anyChanged || changed; if (changed) { me.body.emitter.emit('rangechange', {start: new Date(me.start), end: new Date(me.end), byUser:byUser}); @@ -168,7 +172,7 @@ Range.prototype.setRange = function(start, end, animation, byUser) { } else { var changed = this._applyRange(finalStart, finalEnd); - DateUtil.updateHiddenDates(this.body, this.options.hiddenDates); + DateUtil.updateHiddenDates(this.options.moment, this.body, this.options.hiddenDates); if (changed) { var params = {start: new Date(this.start), end: new Date(this.end), byUser:byUser}; this.body.emitter.emit('rangechange', params); @@ -425,10 +429,14 @@ Range.prototype._onDrag = function (event) { this.previousDelta = delta; this._applyRange(newStart, newEnd); + + var startDate = new Date(this.start); + var endDate = new Date(this.end); + // fire a rangechange event this.body.emitter.emit('rangechange', { - start: new Date(this.start), - end: new Date(this.end), + start: startDate, + end: endDate, byUser: true }); }; @@ -548,7 +556,7 @@ Range.prototype._onPinch = function (event) { var centerDate = this._pointerToDate(this.props.touch.center); var hiddenDuration = DateUtil.getHiddenDurationBetween(this.body.hiddenDates, this.start, this.end); - var hiddenDurationBefore = DateUtil.getHiddenDurationBefore(this.body.hiddenDates, this, centerDate); + var hiddenDurationBefore = DateUtil.getHiddenDurationBefore(this.options.moment, this.body.hiddenDates, this, centerDate); var hiddenDurationAfter = hiddenDuration - hiddenDurationBefore; // calculate new start and end @@ -645,7 +653,7 @@ Range.prototype.zoom = function(scale, center, delta) { } var hiddenDuration = DateUtil.getHiddenDurationBetween(this.body.hiddenDates, this.start, this.end); - var hiddenDurationBefore = DateUtil.getHiddenDurationBefore(this.body.hiddenDates, this, center); + var hiddenDurationBefore = DateUtil.getHiddenDurationBefore(this.options.moment, this.body.hiddenDates, this, center); var hiddenDurationAfter = hiddenDuration - hiddenDurationBefore; // calculate new start and end diff --git a/lib/vis/lib/timeline/TimeStep.js b/lib/vis/lib/timeline/TimeStep.js index 8ba9070d16..e7cb1888f8 100644 --- a/lib/vis/lib/timeline/TimeStep.js +++ b/lib/vis/lib/timeline/TimeStep.js @@ -29,10 +29,12 @@ var util = require('../util'); * @param {Number} [minimumStep] Optional. Minimum step size in milliseconds */ function TimeStep(start, end, minimumStep, hiddenDates) { + this.moment = moment; + // variables - this.current = new Date(); - this._start = new Date(); - this._end = new Date(); + this.current = this.moment(); + this._start = this.moment(); + this._end = this.moment(); this.autoScale = true; this.scale = 'day'; @@ -45,8 +47,13 @@ function TimeStep(start, end, minimumStep, hiddenDates) { this.switchedDay = false; this.switchedMonth = false; this.switchedYear = false; - this.hiddenDates = hiddenDates; - if (hiddenDates === undefined) { + if (Array.isArray(hiddenDates)) { + this.hiddenDates = hiddenDates; + } + else if (hiddenDates != undefined) { + this.hiddenDates = [hiddenDates]; + } + else { this.hiddenDates = []; } @@ -77,6 +84,20 @@ TimeStep.FORMAT = { } }; +/** + * Set custom constructor function for moment. Can be used to set dates + * to UTC or to set a utcOffset. + * @param {function} moment + */ +TimeStep.prototype.setMoment = function (moment) { + this.moment = moment; + + // update the date properties, can have a new utcOffset + this.current = this.moment(this.current); + this._start = this.moment(this._start); + this._end = this.moment(this._end); +}; + /** * Set custom formatting for the minor an major labels of the TimeStep. * Both `minorLabels` and `majorLabels` are an Object with properties: @@ -103,8 +124,8 @@ TimeStep.prototype.setRange = function(start, end, minimumStep) { throw "No legal start or end date in method setRange"; } - this._start = (start != undefined) ? new Date(start.valueOf()) : new Date(); - this._end = (end != undefined) ? new Date(end.valueOf()) : new Date(); + this._start = (start != undefined) ? this.moment(start.valueOf()) : new Date(); + this._end = (end != undefined) ? this.moment(end.valueOf()) : new Date(); if (this.autoScale) { this.setMinimumStep(minimumStep); @@ -114,8 +135,8 @@ TimeStep.prototype.setRange = function(start, end, minimumStep) { /** * Set the range iterator to the start date. */ -TimeStep.prototype.first = function() { - this.current = new Date(this._start.valueOf()); +TimeStep.prototype.start = function() { + this.current = this._start.clone(); this.roundToMinor(); }; @@ -129,28 +150,28 @@ TimeStep.prototype.roundToMinor = function() { // noinspection FallThroughInSwitchStatementJS switch (this.scale) { case 'year': - this.current.setFullYear(this.step * Math.floor(this.current.getFullYear() / this.step)); - this.current.setMonth(0); - case 'month': this.current.setDate(1); + this.current.year(this.step * Math.floor(this.current.year() / this.step)); + this.current.month(0); + case 'month': this.current.date(1); case 'day': // intentional fall through - case 'weekday': this.current.setHours(0); - case 'hour': this.current.setMinutes(0); - case 'minute': this.current.setSeconds(0); - case 'second': this.current.setMilliseconds(0); + case 'weekday': this.current.hours(0); + case 'hour': this.current.minutes(0); + case 'minute': this.current.seconds(0); + case 'second': this.current.milliseconds(0); //case 'millisecond': // nothing to do for milliseconds } if (this.step != 1) { // round down to the first minor value that is a multiple of the current step size switch (this.scale) { - case 'millisecond': this.current.setMilliseconds(this.current.getMilliseconds() - this.current.getMilliseconds() % this.step); break; - case 'second': this.current.setSeconds(this.current.getSeconds() - this.current.getSeconds() % this.step); break; - case 'minute': this.current.setMinutes(this.current.getMinutes() - this.current.getMinutes() % this.step); break; - case 'hour': this.current.setHours(this.current.getHours() - this.current.getHours() % this.step); break; + case 'millisecond': this.current.subtract(this.current.milliseconds() % this.step, 'milliseconds'); break; + case 'second': this.current.subtract(this.current.seconds() % this.step, 'seconds'); break; + case 'minute': this.current.subtract(this.current.minutes() % this.step, 'minutes'); break; + case 'hour': this.current.subtract(this.current.hours() % this.step, 'hours'); break; case 'weekday': // intentional fall through - case 'day': this.current.setDate((this.current.getDate()-1) - (this.current.getDate()-1) % this.step + 1); break; - case 'month': this.current.setMonth(this.current.getMonth() - this.current.getMonth() % this.step); break; - case 'year': this.current.setFullYear(this.current.getFullYear() - this.current.getFullYear() % this.step); break; + case 'day': this.current.subtract((this.current.date() - 1) % this.step, 'day'); break; + case 'month': this.current.subtract(this.current.month() % this.step, 'month'); break; + case 'year': this.current.subtract(this.current.year() % this.step, 'year'); break; default: break; } } @@ -172,67 +193,65 @@ TimeStep.prototype.next = function() { // Two cases, needed to prevent issues with switching daylight savings // (end of March and end of October) - if (this.current.getMonth() < 6) { + if (this.current.month() < 6) { switch (this.scale) { - case 'millisecond': - - this.current = new Date(this.current.valueOf() + this.step); break; - case 'second': this.current = new Date(this.current.valueOf() + this.step * 1000); break; - case 'minute': this.current = new Date(this.current.valueOf() + this.step * 1000 * 60); break; + 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 = new Date(this.current.valueOf() + this.step * 1000 * 60 * 60); + 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 ...) - var h = this.current.getHours(); - this.current.setHours(h - (h % this.step)); + // 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.setDate(this.current.getDate() + this.step); break; - case 'month': this.current.setMonth(this.current.getMonth() + this.step); break; - case 'year': this.current.setFullYear(this.current.getFullYear() + this.step); break; - default: break; + 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 = new Date(this.current.valueOf() + this.step); break; - case 'second': this.current.setSeconds(this.current.getSeconds() + this.step); break; - case 'minute': this.current.setMinutes(this.current.getMinutes() + this.step); break; - case 'hour': this.current.setHours(this.current.getHours() + this.step); break; + 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'); break; case 'weekday': // intentional fall through - case 'day': this.current.setDate(this.current.getDate() + this.step); break; - case 'month': this.current.setMonth(this.current.getMonth() + this.step); break; - case 'year': this.current.setFullYear(this.current.getFullYear() + this.step); break; - default: break; + 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) { // round down to the correct major value switch (this.scale) { - case 'millisecond': if(this.current.getMilliseconds() < this.step) this.current.setMilliseconds(0); break; - case 'second': if(this.current.getSeconds() < this.step) this.current.setSeconds(0); break; - case 'minute': if(this.current.getMinutes() < this.step) this.current.setMinutes(0); break; - case 'hour': if(this.current.getHours() < this.step) this.current.setHours(0); break; + case 'millisecond': if(this.current.milliseconds() < this.step) this.current.milliseconds(0); break; + case 'second': if(this.current.seconds() < this.step) this.current.seconds(0); break; + case 'minute': if(this.current.minutes() < this.step) this.current.minutes(0); break; + case 'hour': if(this.current.hours() < this.step) this.current.hours(0); break; case 'weekday': // intentional fall through - case 'day': if(this.current.getDate() < this.step+1) this.current.setDate(1); break; - case 'month': if(this.current.getMonth() < this.step) this.current.setMonth(0); break; + case 'day': if(this.current.date() < this.step+1) this.current.date(1); break; + case 'month': if(this.current.month() < this.step) this.current.month(0); break; case 'year': break; // nothing to do for year - default: break; + default: break; } } // safety mechanism: if current time is still unchanged, move to the end if (this.current.valueOf() == prev) { - this.current = new Date(this._end.valueOf()); + this.current = this._end.clone(); } - DateUtil.stepOverHiddenDates(this, prev); + DateUtil.stepOverHiddenDates(this.moment, this, prev); }; /** * Get the current datetime - * @return {Date} current The current date + * @return {Moment} current The current date */ TimeStep.prototype.getCurrent = function() { return this.current; @@ -329,100 +348,100 @@ TimeStep.prototype.setMinimumStep = function(minimumStep) { * @return {Date} snappedDate */ TimeStep.snap = function(date, scale, step) { - var clone = new Date(date.valueOf()); + var clone = moment(date); if (scale == 'year') { - var year = clone.getFullYear() + Math.round(clone.getMonth() / 12); - clone.setFullYear(Math.round(year / step) * step); - clone.setMonth(0); - clone.setDate(0); - clone.setHours(0); - clone.setMinutes(0); - clone.setSeconds(0); - clone.setMilliseconds(0); + var year = clone.year() + Math.round(clone.month() / 12); + clone.year(Math.round(year / step) * step); + clone.month(0); + clone.date(0); + clone.hours(0); + clone.minutes(0); + clone.seconds(0); + clone.milliseconds(0); } else if (scale == 'month') { - if (clone.getDate() > 15) { - clone.setDate(1); - clone.setMonth(clone.getMonth() + 1); + if (clone.date() > 15) { + clone.date(1); + clone.add(1, 'month'); // important: first set Date to 1, after that change the month. } else { - clone.setDate(1); + clone.date(1); } - clone.setHours(0); - clone.setMinutes(0); - clone.setSeconds(0); - clone.setMilliseconds(0); + clone.hours(0); + clone.minutes(0); + clone.seconds(0); + clone.milliseconds(0); } else if (scale == 'day') { //noinspection FallthroughInSwitchStatementJS switch (step) { case 5: case 2: - clone.setHours(Math.round(clone.getHours() / 24) * 24); break; + clone.hours(Math.round(clone.hours() / 24) * 24); break; default: - clone.setHours(Math.round(clone.getHours() / 12) * 12); break; + clone.hours(Math.round(clone.hours() / 12) * 12); break; } - clone.setMinutes(0); - clone.setSeconds(0); - clone.setMilliseconds(0); + clone.minutes(0); + clone.seconds(0); + clone.milliseconds(0); } else if (scale == 'weekday') { //noinspection FallthroughInSwitchStatementJS switch (step) { case 5: case 2: - clone.setHours(Math.round(clone.getHours() / 12) * 12); break; + clone.hours(Math.round(clone.hours() / 12) * 12); break; default: - clone.setHours(Math.round(clone.getHours() / 6) * 6); break; + clone.hours(Math.round(clone.hours() / 6) * 6); break; } - clone.setMinutes(0); - clone.setSeconds(0); - clone.setMilliseconds(0); + clone.minutes(0); + clone.seconds(0); + clone.milliseconds(0); } else if (scale == 'hour') { switch (step) { case 4: - clone.setMinutes(Math.round(clone.getMinutes() / 60) * 60); break; + clone.minutes(Math.round(clone.minutes() / 60) * 60); break; default: - clone.setMinutes(Math.round(clone.getMinutes() / 30) * 30); break; + clone.minutes(Math.round(clone.minutes() / 30) * 30); break; } - clone.setSeconds(0); - clone.setMilliseconds(0); + clone.seconds(0); + clone.milliseconds(0); } else if (scale == 'minute') { //noinspection FallthroughInSwitchStatementJS switch (step) { case 15: case 10: - clone.setMinutes(Math.round(clone.getMinutes() / 5) * 5); - clone.setSeconds(0); + clone.minutes(Math.round(clone.minutes() / 5) * 5); + clone.seconds(0); break; case 5: - clone.setSeconds(Math.round(clone.getSeconds() / 60) * 60); break; + clone.seconds(Math.round(clone.seconds() / 60) * 60); break; default: - clone.setSeconds(Math.round(clone.getSeconds() / 30) * 30); break; + clone.seconds(Math.round(clone.seconds() / 30) * 30); break; } - clone.setMilliseconds(0); + clone.milliseconds(0); } else if (scale == 'second') { //noinspection FallthroughInSwitchStatementJS switch (step) { case 15: case 10: - clone.setSeconds(Math.round(clone.getSeconds() / 5) * 5); - clone.setMilliseconds(0); + clone.seconds(Math.round(clone.seconds() / 5) * 5); + clone.milliseconds(0); break; case 5: - clone.setMilliseconds(Math.round(clone.getMilliseconds() / 1000) * 1000); break; + clone.milliseconds(Math.round(clone.milliseconds() / 1000) * 1000); break; default: - clone.setMilliseconds(Math.round(clone.getMilliseconds() / 500) * 500); break; + clone.milliseconds(Math.round(clone.milliseconds() / 500) * 500); break; } } else if (scale == 'millisecond') { var _step = step > 5 ? step / 2 : 1; - clone.setMilliseconds(Math.round(clone.getMilliseconds() / _step) * _step); + clone.milliseconds(Math.round(clone.milliseconds() / _step) * _step); } return clone; @@ -477,20 +496,21 @@ TimeStep.prototype.isMajor = function() { } } + var date = this.moment(this.current); switch (this.scale) { case 'millisecond': - return (this.current.getMilliseconds() == 0); + return (date.milliseconds() == 0); case 'second': - return (this.current.getSeconds() == 0); + return (date.seconds() == 0); case 'minute': - return (this.current.getHours() == 0) && (this.current.getMinutes() == 0); + return (date.hours() == 0) && (date.minutes() == 0); case 'hour': - return (this.current.getHours() == 0); + return (date.hours() == 0); case 'weekday': // intentional fall through case 'day': - return (this.current.getDate() == 1); + return (date.date() == 1); case 'month': - return (this.current.getMonth() == 0); + return (date.month() == 0); case 'year': return false; default: @@ -511,7 +531,7 @@ TimeStep.prototype.getLabelMinor = function(date) { } var format = this.format.minorLabels[this.scale]; - return (format && format.length > 0) ? moment(date).format(format) : ''; + return (format && format.length > 0) ? this.moment(date).format(format) : ''; }; /** @@ -526,12 +546,13 @@ TimeStep.prototype.getLabelMajor = function(date) { } var format = this.format.majorLabels[this.scale]; - return (format && format.length > 0) ? moment(date).format(format) : ''; + return (format && format.length > 0) ? this.moment(date).format(format) : ''; }; TimeStep.prototype.getClassName = function() { - var m = moment(this.current); - var date = m.locale ? m.locale('en') : m.lang('en'); // old versions of moment have .lang() function + var _moment = this.moment; + var m = this.moment(this.current); + var current = m.locale ? m.locale('en') : m.lang('en'); // old versions of moment have .lang() function var step = this.step; function even(value) { @@ -542,10 +563,10 @@ TimeStep.prototype.getClassName = function() { if (date.isSame(new Date(), 'day')) { return ' vis-today'; } - if (date.isSame(moment().add(1, 'day'), 'day')) { + if (date.isSame(_moment().add(1, 'day'), 'day')) { return ' vis-tomorrow'; } - if (date.isSame(moment().add(-1, 'day'), 'day')) { + if (date.isSame(_moment().add(-1, 'day'), 'day')) { return ' vis-yesterday'; } return ''; @@ -565,37 +586,37 @@ TimeStep.prototype.getClassName = function() { switch (this.scale) { case 'millisecond': - return even(date.milliseconds()).trim(); + return even(current.milliseconds()).trim(); case 'second': - return even(date.seconds()).trim(); + return even(current.seconds()).trim(); case 'minute': - return even(date.minutes()).trim(); + return even(current.minutes()).trim(); case 'hour': - var hours = date.hours(); + var hours = current.hours(); if (this.step == 4) { hours = hours + '-h' + (hours + 4); } - return 'vis-h' + hours + today(date) + even(date.hours()); + return 'vis-h' + hours + today(current) + even(current.hours()); case 'weekday': - return 'vis-' + date.format('dddd').toLowerCase() + - today(date) + currentWeek(date) + even(date.date()); + return 'vis-' + current.format('dddd').toLowerCase() + + today(current) + currentWeek(current) + even(current.date()); case 'day': - var day = date.date(); - var month = date.format('MMMM').toLowerCase(); - return 'vis-day' + day + ' vis-' + month + currentMonth(date) + even(day - 1); + var day = current.date(); + var month = current.format('MMMM').toLowerCase(); + return 'vis-day' + day + ' vis-' + month + currentMonth(current) + even(day - 1); case 'month': - return 'vis-' + date.format('MMMM').toLowerCase() + - currentMonth(date) + even(date.month()); + return 'vis-' + current.format('MMMM').toLowerCase() + + currentMonth(current) + even(current.month()); case 'year': - var year = date.year(); - return 'vis-year' + year + currentYear(date)+ even(year); + var year = current.year(); + return 'vis-year' + year + currentYear(current)+ even(year); default: return ''; diff --git a/lib/vis/lib/timeline/Timeline.js b/lib/vis/lib/timeline/Timeline.js index ad06adb4ae..e2bfd55515 100644 --- a/lib/vis/lib/timeline/Timeline.js +++ b/lib/vis/lib/timeline/Timeline.js @@ -1,5 +1,6 @@ var Emitter = require('emitter-component'); var Hammer = require('../module/hammer'); +var moment = require('../module/moment'); var util = require('../util'); var DataSet = require('../DataSet'); var DataView = require('../DataView'); @@ -43,12 +44,15 @@ function Timeline (container, items, groups, options) { end: null, autoResize: true, + throttleRedraw: 0, // ms orientation: { axis: 'bottom', // axis orientation: 'bottom', 'top', or 'both' item: 'bottom' // not relevant }, + moment: moment, + width: null, height: null, maxHeight: null, @@ -117,6 +121,28 @@ function Timeline (container, items, groups, options) { me.emit('contextmenu', me.getEventProperties(event)) }; + //Single time autoscale/fit + this.fitDone = false; + this.on('changed', function (){ + if (this.itemsData == null) return; + if (!me.fitDone) { + me.fitDone = true; + if (me.options.start != undefined || me.options.end != undefined) { + if (me.options.start == undefined || me.options.end == undefined) { + var range = me.getItemRange(); + } + + var start = me.options.start != undefined ? me.options.start : range.min; + var end = me.options.end != undefined ? me.options.end : range.max; + + me.setWindow(start, end, {animation: false}); + } + else { + me.fit({animation: false}); + } + } + }); + // apply options if (options) { this.setOptions(options); @@ -131,9 +157,9 @@ function Timeline (container, items, groups, options) { if (items) { this.setItems(items); } - else { - this._redraw(); - } + + // draw for the first time + this._redraw(); } // Extend the functionality from Core @@ -152,6 +178,8 @@ Timeline.prototype._createConfigurator = function () { * Force a redraw. The size of all items will be recalculated. * Can be useful to manually redraw when option autoResize=false and the window * has been resized, or when the items CSS has been changed. + * + * Note: this function will be overridden on construction with a trottled version */ Timeline.prototype.redraw = function() { this.itemSet && this.itemSet.markDirty({refreshItems: true}); @@ -188,8 +216,6 @@ Timeline.prototype.setOptions = function (options) { * @param {vis.DataSet | Array | null} items */ Timeline.prototype.setItems = function(items) { - var initialLoad = (this.itemsData == null); - // convert to type DataSet when needed var newDataSet; if (!items) { @@ -211,22 +237,6 @@ Timeline.prototype.setItems = function(items) { // set items this.itemsData = newDataSet; this.itemSet && this.itemSet.setItems(newDataSet); - - if (initialLoad) { - if (this.options.start != undefined || this.options.end != undefined) { - if (this.options.start == undefined || this.options.end == undefined) { - var range = this.getItemRange(); - } - - var start = this.options.start != undefined ? this.options.start : range.min; - var end = this.options.end != undefined ? this.options.end : range.max; - - this.setWindow(start, end, {animation: false}); - } - else { - this.fit({animation: false}); - } - } }; /** @@ -373,8 +383,8 @@ Timeline.prototype.fit = function (options) { Timeline.prototype.getItemRange = function () { // get a rough approximation for the range based on the items start and end dates var range = this.getDataRange(); - var min = range.min; - var max = range.max; + var min = range.min !== null ? range.min.valueOf() : null; + var max = range.max !== null ? range.max.valueOf() : null; var minItem = null; var maxItem = null; @@ -397,12 +407,13 @@ Timeline.prototype.getItemRange = function () { // calculate the date of the left side and right side of the items given util.forEach(this.itemSet.items, function (item) { item.show(); + item.repositionX(); var start = getStart(item); var end = getEnd(item); - var left = new Date(start - (item.getWidthLeft() + 10) * factor); - var right = new Date(end + (item.getWidthRight() + 10) * factor); + var left = start - (item.getWidthLeft() + 10) * factor; + var right = end + (item.getWidthRight() + 10) * factor; if (left < min) { min = left; @@ -449,7 +460,7 @@ Timeline.prototype.getDataRange = function() { min = start; } if (max === null || end > max) { - max = start; + max = end; } }); } diff --git a/lib/vis/lib/timeline/component/CurrentTime.js b/lib/vis/lib/timeline/component/CurrentTime.js index e075146272..d23ba377df 100644 --- a/lib/vis/lib/timeline/component/CurrentTime.js +++ b/lib/vis/lib/timeline/component/CurrentTime.js @@ -18,6 +18,7 @@ function CurrentTime (body, options) { this.defaultOptions = { showCurrentTime: true, + moment: moment, locales: locales, locale: 'en' }; @@ -63,7 +64,7 @@ CurrentTime.prototype.destroy = function () { CurrentTime.prototype.setOptions = function(options) { if (options) { // copy all options that we know - util.selectiveExtend(['showCurrentTime', 'locale', 'locales'], this.options, options); + util.selectiveExtend(['showCurrentTime', 'moment', 'locale', 'locales'], this.options, options); } }; @@ -84,18 +85,18 @@ CurrentTime.prototype.redraw = function() { this.start(); } - var now = new Date(new Date().valueOf() + this.offset); + var now = this.options.moment(new Date().valueOf() + this.offset); var x = this.body.util.toScreen(now); var locale = this.options.locales[this.options.locale]; if (!locale) { if (!this.warned) { - console.log('WARNING: options.locales[\'' + this.options.locale + '\'] not found. See http://visjs.org/docs/timeline.html#Localization'); + console.log('WARNING: options.locales[\'' + this.options.locale + '\'] not found. See http://visjs.org/docs/timeline/#Localization'); this.warned = true; } locale = this.options.locales['en']; // fall back on english when not available } - var title = locale.current + ' ' + locale.time + ': ' + moment(now).format('dddd, MMMM Do YYYY, H:mm:ss'); + var title = locale.current + ' ' + locale.time + ': ' + now.format('dddd, MMMM Do YYYY, H:mm:ss'); title = title.charAt(0).toUpperCase() + title.substring(1); this.bar.style.left = x + 'px'; diff --git a/lib/vis/lib/timeline/component/CustomTime.js b/lib/vis/lib/timeline/component/CustomTime.js index 1bd3634db1..72ee0000ed 100644 --- a/lib/vis/lib/timeline/component/CustomTime.js +++ b/lib/vis/lib/timeline/component/CustomTime.js @@ -20,18 +20,20 @@ function CustomTime (body, options) { // default options this.defaultOptions = { + moment: moment, locales: locales, locale: 'en', - id: undefined + id: undefined, + title: undefined }; this.options = util.extend({}, this.defaultOptions); if (options && options.time) { this.customTime = options.time; } else { - this.customTime = new Date(); + this.customTime = new Date(); } - + this.eventParams = {}; // stores state parameters while dragging the bar this.setOptions(options); @@ -52,7 +54,7 @@ CustomTime.prototype = new Component(); CustomTime.prototype.setOptions = function(options) { if (options) { // copy all options that we know - util.selectiveExtend(['locale', 'locales', 'id'], this.options, options); + util.selectiveExtend(['moment', 'locale', 'locales', 'id'], this.options, options); } }; @@ -83,10 +85,6 @@ CustomTime.prototype._create = function() { this.hammer.on('panmove', this._onDrag.bind(this)); this.hammer.on('panend', this._onDragEnd.bind(this)); this.hammer.get('pan').set({threshold:5, direction:30}); // 30 is ALL_DIRECTIONS in hammer. - // TODO: cleanup - //this.hammer.on('pan', function (event) { - // event.preventDefault(); - //}); }; /** @@ -125,8 +123,13 @@ CustomTime.prototype.redraw = function () { } locale = this.options.locales['en']; // fall back on english when not available } - var title = locale.time + ': ' + moment(this.customTime).format('dddd, MMMM Do YYYY, H:mm:ss'); - title = title.charAt(0).toUpperCase() + title.substring(1); + + var title = this.options.title; + // To hide the title completely use empty string ''. + if (title === undefined) { + title = locale.time + ': ' + this.options.moment(this.customTime).format('dddd, MMMM Do YYYY, H:mm:ss'); + title = title.charAt(0).toUpperCase() + title.substring(1); + } this.bar.style.left = x + 'px'; this.bar.title = title; @@ -161,6 +164,14 @@ CustomTime.prototype.getCustomTime = function() { return new Date(this.customTime.valueOf()); }; +/** + * Set custom title. + * @param {Date | number | string} title + */ +CustomTime.prototype.setCustomTitle = function(title) { + this.options.title = title; +}; + /** * Start moving horizontally * @param {Event} event diff --git a/lib/vis/lib/timeline/component/DataAxis.js b/lib/vis/lib/timeline/component/DataAxis.js index 8e67320769..0f3ec598bc 100644 --- a/lib/vis/lib/timeline/component/DataAxis.js +++ b/lib/vis/lib/timeline/component/DataAxis.js @@ -1,8 +1,7 @@ var util = require('../../util'); var DOMutil = require('../../DOMutil'); var Component = require('./Component'); -var DataStep = require('../DataStep'); - +var DataScale = require('./DataScale'); /** * A horizontal time axis * @param {Object} [options] See DataAxis.setOptions for the available @@ -19,7 +18,7 @@ function DataAxis (body, options, svg, linegraphOptions) { orientation: 'left', // supported: 'left', 'right' showMinorLabels: true, showMajorLabels: true, - icons: true, + icons: false, majorLinesOffset: 7, minorLinesOffset: 4, labelOffsetX: 10, @@ -30,12 +29,12 @@ function DataAxis (body, options, svg, linegraphOptions) { alignZeros: true, left:{ range: {min:undefined,max:undefined}, - format: function (value) {return value;}, + format: function (value) {return ''+Number.parseFloat(value.toPrecision(3));}, title: {text:undefined,style:undefined} }, right:{ range: {min:undefined,max:undefined}, - format: function (value) {return value;}, + format: function (value) {return ''+Number.parseFloat(value.toPrecision(3));}, title: {text:undefined,style:undefined} } }; @@ -50,7 +49,7 @@ function DataAxis (body, options, svg, linegraphOptions) { }; this.dom = {}; - + this.scale= undefined; this.range = {start:0, end:0}; this.options = util.extend({}, this.defaultOptions); @@ -59,7 +58,7 @@ function DataAxis (body, options, svg, linegraphOptions) { this.setOptions(options); this.width = Number(('' + this.options.width).replace("px","")); this.minWidth = this.width; - this.height = this.linegraphSVG.offsetHeight; + this.height = this.linegraphSVG.getBoundingClientRect().height; this.hidden = false; this.stepPixels = 25; @@ -68,15 +67,16 @@ function DataAxis (body, options, svg, linegraphOptions) { this.lineOffset = 0; this.master = true; + this.masterAxis = null; this.svgElements = {}; this.iconsRemoved = false; - this.groups = {}; this.amountOfGroups = 0; // create the HTML DOM this._create(); + this.framework = {svg: this.svg, svgElements: this.svgElements, options: this.options, groups: this.groups}; var me = this; this.body.emitter.on("verticalDrag", function() { @@ -95,6 +95,9 @@ DataAxis.prototype.addGroup = function(label, graphOptions) { }; DataAxis.prototype.updateGroup = function(label, graphOptions) { + if (!this.groups.hasOwnProperty(label)) { + this.amountOfGroups += 1; + } this.groups[label] = graphOptions; }; @@ -128,10 +131,9 @@ DataAxis.prototype.setOptions = function (options) { 'right', 'alignZeros' ]; - util.selectiveExtend(fields, this.options, options); + util.selectiveDeepExtend(fields, this.options, options); this.minWidth = Number(('' + this.options.width).replace("px","")); - if (redraw === true && this.dom.frame) { this.hide(); this.show(); @@ -187,7 +189,7 @@ DataAxis.prototype._redrawGroupIcons = function () { for (var i = 0; i < groupArray.length; i++) { var groupId = groupArray[i]; if (this.groups[groupId].visible === true && (this.linegraphOptions.visibility[groupId] === undefined || this.linegraphOptions.visibility[groupId] === true)) { - this.groups[groupId].drawIcon(x, y, this.svgElements, this.svg, iconWidth, iconHeight); + this.groups[groupId].getLegend(iconWidth, iconHeight, this.framework, x, y); y += iconHeight + iconOffset; } } @@ -244,11 +246,6 @@ DataAxis.prototype.hide = function() { * @param end */ DataAxis.prototype.setRange = function (start, end) { - if (this.master === false && this.options.alignZeros === true && this.zeroCrossing != -1) { - if (start > 0) { - start = 0; - } - } this.range.start = start; this.range.end = end; }; @@ -260,7 +257,7 @@ DataAxis.prototype.setRange = function (start, end) { DataAxis.prototype.redraw = function () { var resized = false; var activeGroups = 0; - + // Make sure the line container adheres to the vertical scrolling. this.dom.lineContainer.style.top = this.body.domProps.scrollTop + 'px'; @@ -348,105 +345,60 @@ DataAxis.prototype._redrawLabels = function () { DOMutil.prepareElements(this.DOMelements.lines); DOMutil.prepareElements(this.DOMelements.labels); var orientation = this.options['orientation']; + var customRange = this.options[orientation].range != undefined? this.options[orientation].range:{}; - // get the range for the slaved axis - var step; - if (this.master === false) { - var stepSize, rangeStart, rangeEnd, minimumStep; - if (this.zeroCrossing !== -1 && this.options.alignZeros === true) { - if (this.range.end > 0) { - stepSize = this.range.end / this.zeroCrossing; // size of one step - rangeStart = this.range.end - this.amountOfSteps * stepSize; - rangeEnd = this.range.end; - } - else { - // all of the range (including start) has to be done before the zero crossing. - stepSize = -1 * this.range.start / (this.amountOfSteps - this.zeroCrossing); // absolute size of a step - rangeStart = this.range.start; - rangeEnd = this.range.start + stepSize * this.amountOfSteps; - } - } - else { - rangeStart = this.range.start; - rangeEnd = this.range.end; - } - minimumStep = this.stepPixels; + //Override range with manual options: + var autoScaleEnd = true; + if (customRange.max != undefined){ + this.range.end = customRange.max; + autoScaleEnd = false; } - else { - // calculate range and step (step such that we have space for 7 characters per label) - minimumStep = this.props.majorCharHeight; - rangeStart = this.range.start; - rangeEnd = this.range.end; + var autoScaleStart = true; + if (customRange.min != undefined){ + this.range.start = customRange.min; + autoScaleStart = false; } - this.step = step = new DataStep( - rangeStart, - rangeEnd, - minimumStep, + this.scale = new DataScale( + this.range.start, + this.range.end, + autoScaleStart, + autoScaleEnd, this.dom.frame.offsetHeight, - this.options[this.options.orientation].range, - this.options[this.options.orientation].format, - this.master === false && this.options.alignZeros // does the step have to align zeros? only if not master and the options is on + this.props.majorCharHeight, + this.options.alignZeros, + this.options[orientation].format ); - // the slave axis needs to use the same horizontal lines as the master axis. - if (this.master === true) { - this.stepPixels = ((this.dom.frame.offsetHeight) / step.marginRange) * step.step; - this.amountOfSteps = Math.ceil(this.dom.frame.offsetHeight / this.stepPixels); - } - else { - // align with zero - if (this.options.alignZeros === true && this.zeroCrossing !== -1) { - // distance is the amount of steps away from the zero crossing we are. - let distance = (step.current - this.zeroCrossing * step.step) / step.step; - this.step.shift(distance); - } + if (this.master === false && this.masterAxis != undefined){ + this.scale.followScale(this.masterAxis.scale); } - // value at the bottom of the SVG - this.valueAtBottom = step.marginEnd; - - + //Is updated in side-effect of _redrawLabel(): this.maxLabelSize = 0; - var y = 0; // init value - var stepIndex = 0; // init value - var isMajor = false; // init value - while (stepIndex < this.amountOfSteps) { - y = Math.round(stepIndex * this.stepPixels); - isMajor = step.isMajor(); - if (stepIndex > 0 && stepIndex !== this.amountOfSteps) { - if (this.options['showMinorLabels'] && isMajor === false || this.master === false && this.options['showMinorLabels'] === true) { - this._redrawLabel(y - 2, step.getCurrent(), orientation, 'vis-y-axis vis-minor', this.props.minorCharHeight); + var lines = this.scale.getLines(); + lines.forEach( + line=> { + var y = line.y; + var isMajor = line.major; + if (this.options['showMinorLabels'] && isMajor === false) { + this._redrawLabel(y - 2, line.val, orientation, 'vis-y-axis vis-minor', this.props.minorCharHeight); } - - if (isMajor && this.options['showMajorLabels'] && this.master === true || - this.options['showMinorLabels'] === false && this.master === false && isMajor === true) { + if (isMajor) { if (y >= 0) { - this._redrawLabel(y - 2, step.getCurrent(), orientation, 'vis-y-axis vis-major', this.props.majorCharHeight); + this._redrawLabel(y - 2, line.val, orientation, 'vis-y-axis vis-major', this.props.majorCharHeight); } - this._redrawLine(y, orientation, 'vis-grid vis-horizontal vis-major', this.options.majorLinesOffset, this.props.majorLineWidth); } - else { - this._redrawLine(y, orientation, 'vis-grid vis-horizontal vis-minor', this.options.minorLinesOffset, this.props.minorLineWidth); + if (this.master === true) { + if (isMajor) { + this._redrawLine(y, orientation, 'vis-grid vis-horizontal vis-major', this.options.majorLinesOffset, this.props.majorLineWidth); + } + else { + this._redrawLine(y, orientation, 'vis-grid vis-horizontal vis-minor', this.options.minorLinesOffset, this.props.minorLineWidth); + } } - } - - // get zero crossing - if (this.master === true && step.current === 0) { - this.zeroCrossing = stepIndex; - } - - step.next(); - stepIndex += 1; - } - - // get zero crossing if it's the last step - if (this.master === true && step.current === 0) { - this.zeroCrossing = stepIndex; - } - - this.conversionFactor = this.stepPixels / step.step; + }); // Note that title is rotated, so we're using the height, not width! var titleWidth = 0; @@ -483,13 +435,11 @@ DataAxis.prototype._redrawLabels = function () { }; DataAxis.prototype.convertValue = function (value) { - var invertedValue = this.valueAtBottom - value; - var convertedValue = invertedValue * this.conversionFactor; - return convertedValue; + return this.scale.convertValue(value); }; DataAxis.prototype.screenToValue = function (x) { - return this.valueAtBottom - (x / this.conversionFactor); + return this.scale.screenToValue(x); }; /** diff --git a/lib/vis/lib/timeline/component/DataScale.js b/lib/vis/lib/timeline/component/DataScale.js new file mode 100644 index 0000000000..5065f0e317 --- /dev/null +++ b/lib/vis/lib/timeline/component/DataScale.js @@ -0,0 +1,235 @@ +/** + * Created by ludo on 25-1-16. + */ + +function DataScale(start, end, autoScaleStart, autoScaleEnd, containerHeight, majorCharHeight, zeroAlign = false, formattingFunction=false) { + this.majorSteps = [1, 2, 5, 10]; + this.minorSteps = [0.25, 0.5, 1, 2]; + this.customLines = null; + + this.containerHeight = containerHeight; + this.majorCharHeight = majorCharHeight; + this._start = start; + this._end = end; + + this.scale = 1; + this.minorStepIdx = -1; + this.magnitudefactor = 1; + this.determineScale(); + + this.zeroAlign = zeroAlign; + this.autoScaleStart = autoScaleStart; + this.autoScaleEnd = autoScaleEnd; + + this.formattingFunction = formattingFunction; + + if (autoScaleStart || autoScaleEnd) { + var me = this; + var roundToMinor = function (value) { + var rounded = value - (value % (me.magnitudefactor * me.minorSteps[me.minorStepIdx])); + if (value % (me.magnitudefactor * me.minorSteps[me.minorStepIdx]) > 0.5 * (me.magnitudefactor * me.minorSteps[me.minorStepIdx])) { + return rounded + (me.magnitudefactor * me.minorSteps[me.minorStepIdx]); + } + else { + return rounded; + } + }; + if (autoScaleStart) { + this._start -= this.magnitudefactor * 2 * this.minorSteps[this.minorStepIdx]; + this._start = roundToMinor(this._start); + } + + if (autoScaleEnd) { + this._end += this.magnitudefactor * this.minorSteps[this.minorStepIdx]; + this._end = roundToMinor(this._end); + } + this.determineScale(); + } +} + +DataScale.prototype.setCharHeight = function (majorCharHeight) { + this.majorCharHeight = majorCharHeight; +}; + +DataScale.prototype.setHeight = function (containerHeight) { + this.containerHeight = containerHeight; +}; + +DataScale.prototype.determineScale = function () { + var range = this._end - this._start; + this.scale = this.containerHeight / range; + var minimumStepValue = this.majorCharHeight / this.scale; + var orderOfMagnitude = Math.round(Math.log(range) / Math.LN10); + + this.minorStepIdx = -1; + this.magnitudefactor = Math.pow(10, orderOfMagnitude); + + var start = 0; + if (orderOfMagnitude < 0) { + start = orderOfMagnitude; + } + + var solutionFound = false; + for (var l = start; Math.abs(l) <= Math.abs(orderOfMagnitude); l++) { + this.magnitudefactor = Math.pow(10, l); + for (var j = 0; j < this.minorSteps.length; j++) { + var stepSize = this.magnitudefactor * this.minorSteps[j]; + if (stepSize >= minimumStepValue) { + solutionFound = true; + this.minorStepIdx = j; + break; + } + } + if (solutionFound === true) { + break; + } + } +}; + +DataScale.prototype.is_major = function (value) { + return (value % (this.magnitudefactor * this.majorSteps[this.minorStepIdx]) === 0); +}; + +DataScale.prototype.getStep = function(){ + return this.magnitudefactor * this.minorSteps[this.minorStepIdx]; +}; + +DataScale.prototype.getFirstMajor = function(){ + var majorStep = this.magnitudefactor * this.majorSteps[this.minorStepIdx]; + return this.convertValue(this._start + ((majorStep - (this._start % majorStep)) % majorStep)); +}; + +DataScale.prototype.formatValue = function(current) { + var returnValue = current.toPrecision(5); + if (typeof this.formattingFunction === 'function') { + returnValue = this.formattingFunction(current); + } + + if (typeof returnValue === 'number') { + return '' + returnValue; + } + else if (typeof returnValue === 'string') { + return returnValue; + } + else { + return current.toPrecision(5); + } + +}; + +DataScale.prototype.getLines = function () { + var lines = []; + var step = this.getStep(); + var bottomOffset = (step - (this._start % step)) % step; + for (var i = (this._start + bottomOffset); this._end-i > 0.00001; i += step) { + if (i != this._start) { //Skip the bottom line + lines.push({major: this.is_major(i), y: this.convertValue(i), val: this.formatValue(i)}); + } + } + return lines; +}; + +DataScale.prototype.followScale = function (other) { + var oldStepIdx = this.minorStepIdx; + var oldStart = this._start; + var oldEnd = this._end; + + var me = this; + var increaseMagnitude = function () { + me.magnitudefactor *= 2; + }; + var decreaseMagnitude = function () { + me.magnitudefactor /= 2; + }; + + if ((other.minorStepIdx <= 1 && this.minorStepIdx <= 1) || (other.minorStepIdx > 1 && this.minorStepIdx > 1)) { + //easy, no need to change stepIdx nor multiplication factor + } else if (other.minorStepIdx < this.minorStepIdx) { + //I'm 5, they are 4 per major. + this.minorStepIdx = 1; + if (oldStepIdx == 2) { + increaseMagnitude(); + } else { + increaseMagnitude(); + increaseMagnitude(); + } + } else { + //I'm 4, they are 5 per major + this.minorStepIdx = 2; + if (oldStepIdx == 1) { + decreaseMagnitude(); + } else { + decreaseMagnitude(); + decreaseMagnitude(); + } + } + + //Get masters stats: + var lines = other.getLines(); + var otherZero = other.convertValue(0); + var otherStep = other.getStep() * other.scale; + + var done = false; + var count = 0; + //Loop until magnitude is correct for given constrains. + while (!done && count++ <5) { + + //Get my stats: + this.scale = otherStep / (this.minorSteps[this.minorStepIdx] * this.magnitudefactor); + var newRange = this.containerHeight / this.scale; + + //For the case the magnitudefactor has changed: + this._start = oldStart; + this._end = this._start + newRange; + + var myOriginalZero = this._end * this.scale; + var majorStep = this.magnitudefactor * this.majorSteps[this.minorStepIdx]; + var majorOffset = this.getFirstMajor() - other.getFirstMajor(); + + if (this.zeroAlign) { + var zeroOffset = otherZero - myOriginalZero; + this._end += (zeroOffset / this.scale); + this._start = this._end - newRange; + } else { + if (!this.autoScaleStart) { + this._start += majorStep - (majorOffset / this.scale); + this._end = this._start + newRange; + } else { + this._start -= majorOffset / this.scale; + this._end = this._start + newRange; + } + } + if (!this.autoScaleEnd && this._end > oldEnd+0.00001) { + //Need to decrease magnitude to prevent scale overshoot! (end) + decreaseMagnitude(); + done = false; + continue; + } + if (!this.autoScaleStart && this._start < oldStart-0.00001) { + if (this.zeroAlign && oldStart >= 0) { + console.warn("Can't adhere to given 'min' range, due to zeroalign"); + } else { + //Need to decrease magnitude to prevent scale overshoot! (start) + decreaseMagnitude(); + done = false; + continue; + } + } + if (this.autoScaleStart && this.autoScaleEnd && newRange < (oldEnd-oldStart)){ + increaseMagnitude(); + done = false; + continue; + } + done = true; + } +}; + +DataScale.prototype.convertValue = function (value) { + return this.containerHeight - ((value - this._start) * this.scale); +}; + +DataScale.prototype.screenToValue = function (pixels) { + return ((this.containerHeight - pixels) / this.scale) + this._start; +}; + +module.exports = DataScale; \ No newline at end of file diff --git a/lib/vis/lib/timeline/component/GraphGroup.js b/lib/vis/lib/timeline/component/GraphGroup.js index 0aac3316c3..20f52e9f06 100644 --- a/lib/vis/lib/timeline/component/GraphGroup.js +++ b/lib/vis/lib/timeline/component/GraphGroup.js @@ -1,7 +1,7 @@ var util = require('../../util'); var DOMutil = require('../../DOMutil'); -var Line = require('./graph2d_types/line'); -var Bar = require('./graph2d_types/bar'); +var Bars = require('./graph2d_types/bar'); +var Lines = require('./graph2d_types/line'); var Points = require('./graph2d_types/points'); /** @@ -14,10 +14,10 @@ var Points = require('./graph2d_types/points'); * It enumerates through the default styles * @constructor */ -function GraphGroup (group, groupId, options, groupsUsingDefaultStyles) { +function GraphGroup(group, groupId, options, groupsUsingDefaultStyles) { this.id = groupId; - var fields = ['sampling','style','sort','yAxisOrientation','barChart','drawPoints','shaded','interpolation'] - this.options = util.selectiveBridgeObject(fields,options); + var fields = ['sampling', 'style', 'sort', 'yAxisOrientation', 'barChart', 'drawPoints', 'shaded', 'interpolation', 'zIndex','excludeFromStacking', 'excludeFromLegend']; + this.options = util.selectiveBridgeObject(fields, options); this.usingDefaultStyle = group.className === undefined; this.groupsUsingDefaultStyles = groupsUsingDefaultStyles; this.zeroPosition = 0; @@ -29,20 +29,17 @@ function GraphGroup (group, groupId, options, groupsUsingDefaultStyles) { this.visible = group.visible === undefined ? true : group.visible; } - /** * this loads a reference to all items in this group into this group. * @param {array} items */ -GraphGroup.prototype.setItems = function(items) { +GraphGroup.prototype.setItems = function (items) { if (items != null) { this.itemsData = items; if (this.options.sort == true) { - this.itemsData.sort(function (a,b) {return a.x - b.x;}) - } - // typecast all items to numbers. Takes around 10ms for 500.000 items - for (var i = 0; i < this.itemsData.length; i++) { - this.itemsData[i].y = Number(this.itemsData[i].y); + util.insertSort(this.itemsData,function (a, b) { + return a.x > b.x ? 1 : -1; + }); } } else { @@ -50,35 +47,37 @@ GraphGroup.prototype.setItems = function(items) { } }; +GraphGroup.prototype.getItems = function () { + return this.itemsData; +} /** - * this is used for plotting barcharts, this way, we only have to calculate it once. + * this is used for barcharts and shading, this way, we only have to calculate it once. * @param pos */ -GraphGroup.prototype.setZeroPosition = function(pos) { +GraphGroup.prototype.setZeroPosition = function (pos) { this.zeroPosition = pos; }; - /** * set the options of the graph group over the default options. * @param options */ -GraphGroup.prototype.setOptions = function(options) { +GraphGroup.prototype.setOptions = function (options) { if (options !== undefined) { - var fields = ['sampling','style','sort','yAxisOrientation','barChart']; + var fields = ['sampling', 'style', 'sort', 'yAxisOrientation', 'barChart', 'zIndex','excludeFromStacking', 'excludeFromLegend']; util.selectiveDeepExtend(fields, this.options, options); // if the group's drawPoints is a function delegate the callback to the onRender property if (typeof options.drawPoints == 'function') { - options.drawPoints = { - onRender: options.drawPoints - } + options.drawPoints = { + onRender: options.drawPoints + } } - - util.mergeOptions(this.options, options,'interpolation'); - util.mergeOptions(this.options, options,'drawPoints'); - util.mergeOptions(this.options, options,'shaded'); + + util.mergeOptions(this.options, options, 'interpolation'); + util.mergeOptions(this.options, options, 'drawPoints'); + util.mergeOptions(this.options, options, 'shaded'); if (options.interpolation) { if (typeof options.interpolation == 'object') { @@ -97,16 +96,6 @@ GraphGroup.prototype.setOptions = function(options) { } } } - - if (this.options.style == 'line') { - this.type = new Line(this.id, this.options); - } - else if (this.options.style == 'bar') { - this.type = new Bar(this.id, this.options); - } - else if (this.options.style == 'points') { - this.type = new Points(this.id, this.options); - } }; @@ -114,7 +103,7 @@ GraphGroup.prototype.setOptions = function(options) { * this updates the current group class with the latest group dataset entree, used in _updateGroup in linegraph * @param group */ -GraphGroup.prototype.update = function(group) { +GraphGroup.prototype.update = function (group) { this.group = group; this.content = group.content || 'graph'; this.className = group.className || this.className || 'vis-graph-group' + this.groupsUsingDefaultStyles[0] % 10; @@ -123,73 +112,6 @@ GraphGroup.prototype.update = function(group) { this.setOptions(group.options); }; - -/** - * draw the icon for the legend. - * - * @param x - * @param y - * @param JSONcontainer - * @param SVGcontainer - * @param iconWidth - * @param iconHeight - */ -GraphGroup.prototype.drawIcon = function(x, y, JSONcontainer, SVGcontainer, iconWidth, iconHeight) { - var fillHeight = iconHeight * 0.5; - var path, fillPath; - - var outline = DOMutil.getSVGElement("rect", JSONcontainer, SVGcontainer); - outline.setAttributeNS(null, "x", x); - outline.setAttributeNS(null, "y", y - fillHeight); - outline.setAttributeNS(null, "width", iconWidth); - outline.setAttributeNS(null, "height", 2*fillHeight); - outline.setAttributeNS(null, "class", "vis-outline"); - - if (this.options.style == 'line') { - path = DOMutil.getSVGElement("path", JSONcontainer, SVGcontainer); - path.setAttributeNS(null, "class", this.className); - if(this.style !== undefined) { - path.setAttributeNS(null, "style", this.style); - } - - path.setAttributeNS(null, "d", "M" + x + ","+y+" L" + (x + iconWidth) + ","+y+""); - if (this.options.shaded.enabled == true) { - fillPath = DOMutil.getSVGElement("path", JSONcontainer, SVGcontainer); - if (this.options.shaded.orientation == 'top') { - fillPath.setAttributeNS(null, "d", "M"+x+", " + (y - fillHeight) + - "L"+x+","+y+" L"+ (x + iconWidth) + ","+y+" L"+ (x + iconWidth) + "," + (y - fillHeight)); - } - else { - fillPath.setAttributeNS(null, "d", "M"+x+","+y+" " + - "L"+x+"," + (y + fillHeight) + " " + - "L"+ (x + iconWidth) + "," + (y + fillHeight) + - "L"+ (x + iconWidth) + ","+y); - } - fillPath.setAttributeNS(null, "class", this.className + " vis-icon-fill"); - } - - if (this.options.drawPoints.enabled == true) { - var groupTemplate = { - style: this.options.drawPoints.style, - size:this.options.drawPoints.size, - className: this.className - }; - DOMutil.drawPoint(x + 0.5 * iconWidth, y, groupTemplate, JSONcontainer, SVGcontainer); - } - } - else { - var barWidth = Math.round(0.3 * iconWidth); - var bar1Height = Math.round(0.4 * iconHeight); - var bar2Height = Math.round(0.75 * iconHeight); - - var offset = Math.round((iconWidth - (2 * barWidth))/3); - - DOMutil.drawBar(x + 0.5*barWidth + offset , y + fillHeight - bar1Height - 1, barWidth, bar1Height, this.className + ' vis-bar', JSONcontainer, SVGcontainer, this.style); - DOMutil.drawBar(x + 1.5*barWidth + offset + 2, y + fillHeight - bar2Height - 1, barWidth, bar2Height, this.className + ' vis-bar', JSONcontainer, SVGcontainer, this.style); - } -}; - - /** * return the legend entree for this group. * @@ -197,23 +119,40 @@ GraphGroup.prototype.drawIcon = function(x, y, JSONcontainer, SVGcontainer, icon * @param iconHeight * @returns {{icon: HTMLElement, label: (group.content|*|string), orientation: (.options.yAxisOrientation|*)}} */ -GraphGroup.prototype.getLegend = function(iconWidth, iconHeight) { - var svg = document.createElementNS('http://www.w3.org/2000/svg',"svg"); - this.drawIcon(0,0.5*iconHeight,[],svg,iconWidth,iconHeight); - return {icon: svg, label: this.content, orientation:this.options.yAxisOrientation}; +GraphGroup.prototype.getLegend = function (iconWidth, iconHeight, framework, x, y) { + if (framework == undefined || framework == null) { + var svg = document.createElementNS('http://www.w3.org/2000/svg', "svg"); + framework = {svg: svg, svgElements:{}, options: this.options, groups: [this]} + } + if (x == undefined || x == null){ + x = 0; + } + if (y == undefined || y == null){ + y = 0.5 * iconHeight; + } + switch (this.options.style){ + case "line": + Lines.drawIcon(this, x, y, iconWidth, iconHeight, framework); + break; + case "points": //explicit no break + case "point": + Points.drawIcon(this, x, y, iconWidth, iconHeight, framework); + break; + case "bar": + Bars.drawIcon(this, x, y, iconWidth, iconHeight, framework); + break; + } + return {icon: framework.svg, label: this.content, orientation: this.options.yAxisOrientation}; }; -GraphGroup.prototype.getYRange = function(groupData) { - return this.type.getYRange(groupData); +GraphGroup.prototype.getYRange = function (groupData) { + var yMin = groupData[0].y; + var yMax = groupData[0].y; + for (var j = 0; j < groupData.length; j++) { + yMin = yMin > groupData[j].y ? groupData[j].y : yMin; + yMax = yMax < groupData[j].y ? groupData[j].y : yMax; + } + return {min: yMin, max: yMax, yAxisOrientation: this.options.yAxisOrientation}; }; -GraphGroup.prototype.getData = function(groupData) { - return this.type.getData(groupData); -}; - -GraphGroup.prototype.draw = function(dataset, group, framework) { - this.type.draw(dataset, group, framework); -}; - - module.exports = GraphGroup; diff --git a/lib/vis/lib/timeline/component/Group.js b/lib/vis/lib/timeline/component/Group.js index ae60270a94..8a09e4aec8 100644 --- a/lib/vis/lib/timeline/component/Group.js +++ b/lib/vis/lib/timeline/component/Group.js @@ -47,7 +47,11 @@ function Group (groupId, data, itemSet) { */ Group.prototype._create = function() { var label = document.createElement('div'); - label.className = 'vis-label'; + if (this.itemSet.options.groupEditable.order) { + label.className = 'vis-label draggable'; + } else { + label.className = 'vis-label'; + } this.dom.label = label; var inner = document.createElement('div'); @@ -173,6 +177,9 @@ Group.prototype.redraw = function(range, margin, restack) { restack = true; } + // recalculate the height of the subgroups + this._calculateSubGroupHeights(); + // reposition visible items vertically if (typeof this.itemSet.options.order === 'function') { // a custom order function @@ -240,6 +247,25 @@ Group.prototype.redraw = function(range, margin, restack) { return resized; }; +/** + * recalculate the height of the subgroups + * @private + */ +Group.prototype._calculateSubGroupHeights = function () { + if (Object.keys(this.subgroups).length > 0) { + var me = this; + + this.resetSubgroups(); + + util.forEach(this.visibleItems, function (item) { + if (item.data.subgroup !== undefined) { + me.subgroups[item.data.subgroup].height = Math.max(me.subgroups[item.data.subgroup].height, item.height); + me.subgroups[item.data.subgroup].visible = true; + } + }); + } +}; + /** * recalculate the height of the group * @param {{item: {horizontal: number, vertical: number}, axis: number}} margin @@ -250,20 +276,12 @@ Group.prototype._calculateHeight = function (margin) { // recalculate the height of the group var height; var visibleItems = this.visibleItems; - //var visibleSubgroups = []; - //this.visibleSubgroups = 0; - this.resetSubgroups(); - var me = this; if (visibleItems.length > 0) { var min = visibleItems[0].top; var max = visibleItems[0].top + visibleItems[0].height; util.forEach(visibleItems, function (item) { min = Math.min(min, item.top); max = Math.max(max, (item.top + item.height)); - if (item.data.subgroup !== undefined) { - me.subgroups[item.data.subgroup].height = Math.max(me.subgroups[item.data.subgroup].height,item.height); - me.subgroups[item.data.subgroup].visible = true; - } }); if (min > margin.axis) { // there is an empty gap between the lowest item and the axis diff --git a/lib/vis/lib/timeline/component/ItemSet.js b/lib/vis/lib/timeline/component/ItemSet.js index b6ac97abda..d66c77e468 100644 --- a/lib/vis/lib/timeline/component/ItemSet.js +++ b/lib/vis/lib/timeline/component/ItemSet.js @@ -34,10 +34,16 @@ function ItemSet(body, options) { }, align: 'auto', // alignment of box items stack: true, - groupOrder: null, + groupOrderSwap: function(fromGroup, toGroup, groups) { + var targetOrder = toGroup.order; + toGroup.order = fromGroup.order; + fromGroup.order = targetOrder; + }, + groupOrder: 'order', selectable: true, multiselect: false, + itemsAlwaysDraggable: false, editable: { updateTime: false, @@ -46,6 +52,12 @@ function ItemSet(body, options) { remove: false }, + groupEditable: { + order: false, + add: false, + remove: false + }, + snap: TimeStep.snap, onAdd: function (item, callback) { @@ -63,6 +75,15 @@ function ItemSet(body, options) { onMoving: function (item, callback) { callback(item); }, + onAddGroup: function (item, callback) { + callback(item); + }, + onMoveGroup: function (item, callback) { + callback(item); + }, + onRemoveGroup: function (item, callback) { + callback(item); + }, margin: { item: { @@ -127,6 +148,7 @@ function ItemSet(body, options) { this.stackDirty = true; // if true, all items will be restacked on next redraw this.touchParams = {}; // stores properties while dragging + this.groupTouchParams = {}; // create the HTML DOM this._create(); @@ -209,6 +231,12 @@ ItemSet.prototype._create = function(){ // add item on doubletap this.hammer.on('doubletap', this._onAddItem.bind(this)); + this.groupHammer = new Hammer(this.body.dom.leftContainer); + this.groupHammer.on('panstart', this._onGroupDragStart.bind(this)); + this.groupHammer.on('panmove', this._onGroupDrag.bind(this)); + this.groupHammer.on('panend', this._onGroupDragEnd.bind(this)); + this.groupHammer.get('pan').set({threshold:5, direction:30}); + // attach to the DOM this.show(); }; @@ -280,7 +308,7 @@ ItemSet.prototype._create = function(){ ItemSet.prototype.setOptions = function(options) { if (options) { // copy all options that we know - var fields = ['type', 'align', 'order', 'stack', 'selectable', 'multiselect', 'groupOrder', 'dataAttributes', 'template','groupTemplate','hide', 'snap']; + var fields = ['type', 'align', 'order', 'stack', 'selectable', 'multiselect', 'itemsAlwaysDraggable', 'multiselectPerGroup', 'groupOrder', 'dataAttributes', 'template', 'groupTemplate', 'hide', 'snap', 'groupOrderSwap']; util.selectiveExtend(fields, this.options, options); if ('orientation' in options) { @@ -323,6 +351,17 @@ ItemSet.prototype.setOptions = function(options) { util.selectiveExtend(['updateTime', 'updateGroup', 'add', 'remove'], this.options.editable, options.editable); } } + + if ('groupEditable' in options) { + if (typeof options.groupEditable === 'boolean') { + this.options.groupEditable.order = options.groupEditable; + this.options.groupEditable.add = options.groupEditable; + this.options.groupEditable.remove = options.groupEditable; + } + else if (typeof options.groupEditable === 'object') { + util.selectiveExtend(['order', 'add', 'remove'], this.options.groupEditable, options.groupEditable); + } + } // callback functions var addCallback = (function (name) { @@ -334,7 +373,7 @@ ItemSet.prototype.setOptions = function(options) { this.options[name] = fn; } }).bind(this); - ['onAdd', 'onUpdate', 'onRemove', 'onMove', 'onMoving'].forEach(addCallback); + ['onAdd', 'onUpdate', 'onRemove', 'onMove', 'onMoving', 'onAddGroup', 'onMoveGroup', 'onRemoveGroup'].forEach(addCallback); // force the itemSet to refresh: options like orientation and margins may be changed this.markDirty(); @@ -687,6 +726,8 @@ ItemSet.prototype.setItems = function(items) { // update the group holding all ungrouped items this._updateUngrouped(); } + + this.body.emitter.emit('_change', {queue: true}); }; /** @@ -746,7 +787,7 @@ ItemSet.prototype.setGroups = function(groups) { // update the order of all items in each group this._order(); - this.body.emitter.emit('change', {queue: true}); + this.body.emitter.emit('_change', {queue: true}); }; /** @@ -857,7 +898,7 @@ ItemSet.prototype._onUpdate = function(ids) { this._order(); this.stackDirty = true; // force re-stacking of all items next redraw - this.body.emitter.emit('change', {queue: true}); + this.body.emitter.emit('_change', {queue: true}); }; /** @@ -887,7 +928,7 @@ ItemSet.prototype._onRemove = function(ids) { // update order this._order(); this.stackDirty = true; // force re-stacking of all items next redraw - this.body.emitter.emit('change', {queue: true}); + this.body.emitter.emit('_change', {queue: true}); } }; @@ -957,7 +998,7 @@ ItemSet.prototype._onAddGroups = function(ids) { } }); - this.body.emitter.emit('change', {queue: true}); + this.body.emitter.emit('_change', {queue: true}); }; /** @@ -978,7 +1019,7 @@ ItemSet.prototype._onRemoveGroups = function(ids) { this.markDirty(); - this.body.emitter.emit('change', {queue: true}); + this.body.emitter.emit('_change', {queue: true}); }; /** @@ -1110,6 +1151,20 @@ ItemSet.prototype._onTouch = function (event) { this.touchParams.itemProps = null; }; + +/** + * Given an group id, returns the index it has. + * + * @param {Number} groupID + * @private + */ +ItemSet.prototype._getGroupIndex = function(groupId) { + for (var i = 0; i < this.groupIds.length; i++) { + if (groupId == this.groupIds[i]) + return i; + } +}; + /** * Start dragging the selected events * @param {Event} event @@ -1120,10 +1175,10 @@ ItemSet.prototype._onDragStart = function (event) { var me = this; var props; - if (item && item.selected) { + if (item && (item.selected || this.options.itemsAlwaysDraggable)) { - if (!this.options.editable.updateTime && - !this.options.editable.updateGroup && + if (!this.options.editable.updateTime && + !this.options.editable.updateGroup && !item.editable) { return; } @@ -1141,7 +1196,7 @@ ItemSet.prototype._onDragStart = function (event) { item: dragLeftItem, initialX: event.center.x, dragLeft: true, - data: util.extend({}, item.data) // clone the items data + data: this._cloneItemData(item.data) }; this.touchParams.itemProps = [props]; @@ -1151,22 +1206,28 @@ ItemSet.prototype._onDragStart = function (event) { item: dragRightItem, initialX: event.center.x, dragRight: true, - data: util.extend({}, item.data) // clone the items data + data: this._cloneItemData(item.data) }; this.touchParams.itemProps = [props]; } else { - this.touchParams.itemProps = this.getSelection().map(function (id) { + this.touchParams.selectedItem = item; + + var baseGroupIndex = this._getGroupIndex(item.data.group); + + var itemsToDrag = (this.options.itemsAlwaysDraggable && !item.selected) ? [item.id] : this.getSelection(); + + this.touchParams.itemProps = itemsToDrag.map(function (id) { var item = me.items[id]; - var props = { + var groupIndex = me._getGroupIndex(item.data.group); + return { item: item, initialX: event.center.x, - data: util.extend({}, item.data) // clone the items data + groupOffset: baseGroupIndex-groupIndex, + data: this._cloneItemData(item.data) }; - - return props; - }); + }.bind(this)); } event.stopPropagation(); @@ -1189,7 +1250,7 @@ ItemSet.prototype._onDragStartAddItem = function (event) { var time = this.body.util.toTime(x); var scale = this.body.util.getScale(); var step = this.body.util.getStep(); - var start = snap ? snap(time, scale, step) : start; + var start = snap ? snap(time, scale, step) : time; var end = start; var itemData = { @@ -1209,14 +1270,14 @@ ItemSet.prototype._onDragStartAddItem = function (event) { var newItem = new RangeItem(itemData, this.conversion, this.options); newItem.id = id; // TODO: not so nice setting id afterwards - newItem.data = itemData; + newItem.data = this._cloneItemData(itemData); this._addItem(newItem); var props = { item: newItem, dragRight: true, initialX: event.center.x, - data: util.extend({}, itemData) + data: newItem.data }; this.touchParams.itemProps = [props]; @@ -1238,21 +1299,35 @@ ItemSet.prototype._onDrag = function (event) { var scale = this.body.util.getScale(); var step = this.body.util.getStep(); + //only calculate the new group for the item that's actually dragged + var selectedItem = this.touchParams.selectedItem; + var updateGroupAllowed = me.options.editable.updateGroup; + var newGroupBase = null; + if (updateGroupAllowed && selectedItem) { + if (selectedItem.data.group != undefined) { + // drag from one group to another + var group = me.groupFromTarget(event); + if (group) { + //we know the offset for all items, so the new group for all items + //will be relative to this one. + newGroupBase = this._getGroupIndex(group.groupId); + } + } + } + // move this.touchParams.itemProps.forEach(function (props) { - var newProps = {}; var current = me.body.util.toTime(event.center.x - xOffset); var initial = me.body.util.toTime(props.initialX - xOffset); - var offset = current - initial; - - var itemData = util.extend({}, props.item.data); // clone the data + var offset = current - initial; // ms + var itemData = this._cloneItemData(props.item.data); // clone the data if (props.item.editable === false) { return; } - var updateTimeAllowed = me.options.editable.updateTime || - props.item.editable === true; + var updateTimeAllowed = me.options.editable.updateTime || + props.item.editable === true; if (updateTimeAllowed) { if (props.dragLeft) { @@ -1260,6 +1335,7 @@ ItemSet.prototype._onDrag = function (event) { if (itemData.start != undefined) { var initialStart = util.convert(props.data.start, 'Date'); var start = new Date(initialStart.valueOf() + offset); + // TODO: pass a Moment instead of a Date to snap(). (Breaking change) itemData.start = snap ? snap(start, scale, step) : start; } } @@ -1268,6 +1344,7 @@ ItemSet.prototype._onDrag = function (event) { if (itemData.end != undefined) { var initialEnd = util.convert(props.data.end, 'Date'); var end = new Date(initialEnd.valueOf() + offset); + // TODO: pass a Moment instead of a Date to snap(). (Breaking change) itemData.end = snap ? snap(end, scale, step) : end; } } @@ -1281,39 +1358,44 @@ ItemSet.prototype._onDrag = function (event) { var initialEnd = util.convert(props.data.end, 'Date'); var duration = initialEnd.valueOf() - initialStart.valueOf(); + // TODO: pass a Moment instead of a Date to snap(). (Breaking change) itemData.start = snap ? snap(start, scale, step) : start; itemData.end = new Date(itemData.start.valueOf() + duration); } else { + // TODO: pass a Moment instead of a Date to snap(). (Breaking change) itemData.start = snap ? snap(start, scale, step) : start; } } } } - var updateGroupAllowed = me.options.editable.updateGroup || - props.item.editable === true; + var updateGroupAllowed = me.options.editable.updateGroup || + props.item.editable === true; - if (updateGroupAllowed && (!props.dragLeft && !props.dragRight)) { + if (updateGroupAllowed && (!props.dragLeft && !props.dragRight) && newGroupBase!=null) { if (itemData.group != undefined) { - // drag from one group to another - var group = me.groupFromTarget(event); - if (group) { - itemData.group = group.groupId; - } + var newOffset = newGroupBase - props.groupOffset; + + //make sure we stay in bounds + newOffset = Math.max(0, newOffset); + newOffset = Math.min(me.groupIds.length-1, newOffset); + + itemData.group = me.groupIds[newOffset]; } } // confirm moving the item + itemData = this._cloneItemData(itemData); // convert start and end to the correct type me.options.onMoving(itemData, function (itemData) { if (itemData) { - props.item.setData(itemData); + props.item.setData(this._cloneItemData(itemData, 'Date')); } - }); - }); + }.bind(this)); + }.bind(this)); this.stackDirty = true; // force re-stacking of all items next redraw - this.body.emitter.emit('change'); + this.body.emitter.emit('_change'); } }; @@ -1364,12 +1446,12 @@ ItemSet.prototype._onDragEnd = function (event) { // force re-stacking of all items next redraw me.stackDirty = true; - me.body.emitter.emit('change'); + me.body.emitter.emit('_change'); }); } else { // update existing item - var itemData = util.extend({}, props.item.data); // clone the data + var itemData = this._cloneItemData(props.item.data); // convert start and end to the correct type me.options.onMove(itemData, function (itemData) { if (itemData) { // apply changes @@ -1381,14 +1463,190 @@ ItemSet.prototype._onDragEnd = function (event) { props.item.setData(props.data); me.stackDirty = true; // force re-stacking of all items next redraw - me.body.emitter.emit('change'); + me.body.emitter.emit('_change'); } }); } - }); + }.bind(this)); } }; +ItemSet.prototype._onGroupDragStart = function (event) { + if (this.options.groupEditable.order) { + this.groupTouchParams.group = this.groupFromTarget(event); + + if (this.groupTouchParams.group) { + event.stopPropagation(); + + this.groupTouchParams.originalOrder = this.groupsData.getIds({ + order: this.options.groupOrder + }); + } + } +} + +ItemSet.prototype._onGroupDrag = function (event) { + if (this.options.groupEditable.order && this.groupTouchParams.group) { + event.stopPropagation(); + + // drag from one group to another + var group = this.groupFromTarget(event); + + // try to avoid toggling when groups differ in height + if (group && group.height != this.groupTouchParams.group.height) { + var movingUp = (group.top < this.groupTouchParams.group.top); + var clientY = event.center ? event.center.y : event.clientY; + var targetGroupTop = util.getAbsoluteTop(group.dom.foreground); + var draggedGroupHeight = this.groupTouchParams.group.height; + if (movingUp) { + // skip swapping the groups when the dragged group is not below clientY afterwards + if (targetGroupTop + draggedGroupHeight < clientY) { + return; + } + } else { + var targetGroupHeight = group.height; + // skip swapping the groups when the dragged group is not below clientY afterwards + if (targetGroupTop + targetGroupHeight - draggedGroupHeight > clientY) { + return; + } + } + } + + if (group && group != this.groupTouchParams.group) { + var groupsData = this.groupsData; + var targetGroup = groupsData.get(group.groupId); + var draggedGroup = groupsData.get(this.groupTouchParams.group.groupId); + + // switch groups + if (draggedGroup && targetGroup) { + this.options.groupOrderSwap(draggedGroup, targetGroup, this.groupsData); + this.groupsData.update(draggedGroup); + this.groupsData.update(targetGroup); + } + + // fetch current order of groups + var newOrder = this.groupsData.getIds({ + order: this.options.groupOrder + }); + + // in case of changes since _onGroupDragStart + if (!util.equalArray(newOrder, this.groupTouchParams.originalOrder)) { + var groupsData = this.groupsData; + var origOrder = this.groupTouchParams.originalOrder; + var draggedId = this.groupTouchParams.group.groupId; + var numGroups = Math.min(origOrder.length, newOrder.length); + var curPos = 0; + var newOffset = 0; + var orgOffset = 0; + while (curPos < numGroups) { + // as long as the groups are where they should be step down along the groups order + while ((curPos+newOffset) < numGroups + && (curPos+orgOffset) < numGroups + && newOrder[curPos+newOffset] == origOrder[curPos+orgOffset]) { + curPos++; + } + + // all ok + if (curPos+newOffset >= numGroups) { + break; + } + + // not all ok + // if dragged group was move upwards everything below should have an offset + if (newOrder[curPos+newOffset] == draggedId) { + newOffset = 1; + continue; + } + // if dragged group was move downwards everything above should have an offset + else if (origOrder[curPos+orgOffset] == draggedId) { + orgOffset = 1; + continue; + } + // found a group (apart from dragged group) that has the wrong position -> switch with the + // group at the position where other one should be, fix index arrays and continue + else { + var slippedPosition = newOrder.indexOf(origOrder[curPos+orgOffset]) + var switchGroup = groupsData.get(newOrder[curPos+newOffset]); + var shouldBeGroup = groupsData.get(origOrder[curPos+orgOffset]); + this.options.groupOrderSwap(switchGroup, shouldBeGroup, groupsData); + groupsData.update(switchGroup); + groupsData.update(shouldBeGroup); + + var switchGroupId = newOrder[curPos+newOffset]; + newOrder[curPos+newOffset] = origOrder[curPos+orgOffset]; + newOrder[slippedPosition] = switchGroupId; + + curPos++; + } + } + } + + } + } +} + +ItemSet.prototype._onGroupDragEnd = function (event) { + if (this.options.groupEditable.order && this.groupTouchParams.group) { + event.stopPropagation(); + + // update existing group + var me = this; + var id = me.groupTouchParams.group.groupId; + var dataset = me.groupsData.getDataSet(); + var groupData = util.extend({}, dataset.get(id)); // clone the data + me.options.onMoveGroup(groupData, function (groupData) { + if (groupData) { + // apply changes + groupData[dataset._fieldId] = id; // ensure the group contains its id (can be undefined) + dataset.update(groupData); + } + else { + + // fetch current order of groups + var newOrder = dataset.getIds({ + order: me.options.groupOrder + }); + + // restore original order + if (!util.equalArray(newOrder, me.groupTouchParams.originalOrder)) { + var origOrder = me.groupTouchParams.originalOrder; + var numGroups = Math.min(origOrder.length, newOrder.length); + var curPos = 0; + while (curPos < numGroups) { + // as long as the groups are where they should be step down along the groups order + while (curPos < numGroups && newOrder[curPos] == origOrder[curPos]) { + curPos++; + } + + // all ok + if (curPos >= numGroups) { + break; + } + + // found a group that has the wrong position -> switch with the + // group at the position where other one should be, fix index arrays and continue + var slippedPosition = newOrder.indexOf(origOrder[curPos]) + var switchGroup = dataset.get(newOrder[curPos]); + var shouldBeGroup = dataset.get(origOrder[curPos]); + me.options.groupOrderSwap(switchGroup, shouldBeGroup, dataset); + groupsData.update(switchGroup); + groupsData.update(shouldBeGroup); + + var switchGroupId = newOrder[curPos]; + newOrder[curPos] = origOrder[curPos]; + newOrder[slippedPosition] = switchGroupId; + + curPos++; + } + } + + } + }); + + me.body.emitter.emit('groupDragged', { groupId: id }); + } +} + /** * Handle selecting/deselecting an item when tapping it * @param {Event} event @@ -1435,8 +1693,6 @@ ItemSet.prototype._onAddItem = function (event) { var snap = this.options.snap || null; var item = this.itemFromTarget(event); - event.stopPropagation(); - if (item) { // update item @@ -1456,7 +1712,7 @@ ItemSet.prototype._onAddItem = function (event) { var scale = this.body.util.getScale(); var step = this.body.util.getStep(); - var newItem = { + var newItemData = { start: snap ? snap(start, scale, step) : start, content: 'new item' }; @@ -1464,18 +1720,19 @@ ItemSet.prototype._onAddItem = function (event) { // when default type is a range, add a default end date to the new item if (this.options.type === 'range') { var end = this.body.util.toTime(x + this.props.width / 5); - newItem.end = snap ? snap(end, scale, step) : end; + newItemData.end = snap ? snap(end, scale, step) : end; } - newItem[this.itemsData._fieldId] = util.randomUUID(); + newItemData[this.itemsData._fieldId] = util.randomUUID(); var group = this.groupFromTarget(event); if (group) { - newItem.group = group.groupId; + newItemData.group = group.groupId; } // execute async handler to customize (or cancel) adding an item - this.options.onAdd(newItem, function (item) { + newItemData = this._cloneItemData(newItemData); // convert start and end to the correct type + this.options.onAdd(newItemData, function (item) { if (item) { me.itemsData.getDataSet().add(item); // TODO: need to trigger a redraw? @@ -1505,23 +1762,37 @@ ItemSet.prototype._onMultiSelectItem = function (event) { if (shiftKey && this.options.multiselect) { // select all items between the old selection and the tapped item - + var itemGroup = this.itemsData.get(item.id).group; + + // when filtering get the group of the last selected item + var lastSelectedGroup = undefined; + if (this.options.multiselectPerGroup) { + if (selection.length > 0) { + lastSelectedGroup = this.itemsData.get(selection[0]).group; + } + } + // determine the selection range - selection.push(item.id); + if (!this.options.multiselectPerGroup || lastSelectedGroup == undefined || lastSelectedGroup == itemGroup) { + selection.push(item.id); + } var range = ItemSet._getItemRange(this.itemsData.get(selection, this.itemOptions)); + + if (!this.options.multiselectPerGroup || lastSelectedGroup == itemGroup) { + // select all items within the selection range + selection = []; + for (var id in this.items) { + if (this.items.hasOwnProperty(id)) { + var _item = this.items[id]; + var start = _item.data.start; + var end = (_item.data.end !== undefined) ? _item.data.end : start; - // select all items within the selection range - selection = []; - for (var id in this.items) { - if (this.items.hasOwnProperty(id)) { - var _item = this.items[id]; - var start = _item.data.start; - var end = (_item.data.end !== undefined) ? _item.data.end : start; - - if (start >= range.min && - end <= range.max && - !(_item instanceof BackgroundItem)) { - selection.push(_item.id); // do not use id but item.id, id itself is stringified + if (start >= range.min && + end <= range.max && + (!this.options.multiselectPerGroup || lastSelectedGroup == this.itemsData.get(_item.id).group) && + !(_item instanceof BackgroundItem)) { + selection.push(_item.id); // do not use id but item.id, id itself is stringified + } } } } @@ -1649,4 +1920,31 @@ ItemSet.itemSetFromTarget = function(event) { return null; }; +/** + * Clone the data of an item, and "normalize" it: convert the start and end date + * to the type (Date, Moment, ...) configured in the DataSet. If not configured, + * start and end are converted to Date. + * @param {Object} itemData, typically `item.data` + * @param {string} [type] Optional Date type. If not provided, the type from the DataSet is taken + * @return {Object} The cloned object + * @private + */ +ItemSet.prototype._cloneItemData = function (itemData, type) { + var clone = util.extend({}, itemData); + + if (!type) { + // convert start and end date to the type (Date, Moment, ...) configured in the DataSet + type = this.itemsData.getDataSet()._options.type; + } + + if (clone.start != undefined) { + clone.start = util.convert(clone.start, type && type.start || 'Date'); + } + if (clone.end != undefined) { + clone.end = util.convert(clone.end , type && type.end || 'Date'); + } + + return clone; +}; + module.exports = ItemSet; diff --git a/lib/vis/lib/timeline/component/Legend.js b/lib/vis/lib/timeline/component/Legend.js index e34e9d9514..90b9725950 100644 --- a/lib/vis/lib/timeline/component/Legend.js +++ b/lib/vis/lib/timeline/component/Legend.js @@ -8,7 +8,7 @@ var Component = require('./Component'); function Legend(body, options, side, linegraphOptions) { this.body = body; this.defaultOptions = { - enabled: true, + enabled: false, icons: true, iconSize: 20, iconSpacing: 6, @@ -18,9 +18,10 @@ function Legend(body, options, side, linegraphOptions) { }, right: { visible: true, - position: 'top-left' // top/bottom - left,center,right + position: 'top-right' // top/bottom - left,center,right } } + this.side = side; this.options = util.extend({},this.defaultOptions); this.linegraphOptions = linegraphOptions; @@ -30,6 +31,7 @@ function Legend(body, options, side, linegraphOptions) { this.groups = {}; this.amountOfGroups = 0; this._create(); + this.framework = {svg: this.svg, svgElements: this.svgElements, options: this.options, groups: this.groups}; this.setOptions(options); } @@ -43,10 +45,13 @@ Legend.prototype.clear = function() { Legend.prototype.addGroup = function(label, graphOptions) { - if (!this.groups.hasOwnProperty(label)) { - this.groups[label] = graphOptions; + // Include a group only if the group option 'excludeFromLegend: false' is not set. + if (graphOptions.options.excludeFromLegend != true) { + if (!this.groups.hasOwnProperty(label)) { + this.groups[label] = graphOptions; + } + this.amountOfGroups += 1; } - this.amountOfGroups += 1; }; Legend.prototype.updateGroup = function(label, graphOptions) { @@ -184,9 +189,11 @@ Legend.prototype.drawLegendIcons = function() { var groupArray = Object.keys(this.groups); groupArray.sort(function (a,b) { return (a < b ? -1 : 1); - }) + }); + + // this resets the elements so the order is maintained + DOMutil.resetElements(this.svgElements); - DOMutil.prepareElements(this.svgElements); var padding = window.getComputedStyle(this.dom.frame).paddingTop; var iconOffset = Number(padding.replace('px','')); var x = iconOffset; @@ -199,12 +206,10 @@ Legend.prototype.drawLegendIcons = function() { for (var i = 0; i < groupArray.length; i++) { var groupId = groupArray[i]; if (this.groups[groupId].visible == true && (this.linegraphOptions.visibility[groupId] === undefined || this.linegraphOptions.visibility[groupId] == true)) { - this.groups[groupId].drawIcon(x, y, this.svgElements, this.svg, iconWidth, iconHeight); + this.groups[groupId].getLegend(iconWidth, iconHeight, this.framework, x, y); y += iconHeight + this.options.iconSpacing; } } - - DOMutil.cleanupElements(this.svgElements); } }; diff --git a/lib/vis/lib/timeline/component/LineGraph.js b/lib/vis/lib/timeline/component/LineGraph.js index f612ff5279..961a293dc5 100644 --- a/lib/vis/lib/timeline/component/LineGraph.js +++ b/lib/vis/lib/timeline/component/LineGraph.js @@ -6,8 +6,9 @@ var Component = require('./Component'); var DataAxis = require('./DataAxis'); var GraphGroup = require('./GraphGroup'); var Legend = require('./Legend'); -var BarFunctions = require('./graph2d_types/bar'); -var LineFunctions = require('./graph2d_types/line'); +var Bars = require('./graph2d_types/bar'); +var Lines = require('./graph2d_types/line'); +var Points = require('./graph2d_types/points'); var UNGROUPED = '__ungrouped__'; // reserved group id for ungrouped items @@ -27,11 +28,11 @@ function LineGraph(body, options) { defaultGroup: 'default', sort: true, sampling: true, - stack:false, + stack: false, graphHeight: '400px', shaded: { enabled: false, - orientation: 'bottom' // top, bottom + orientation: 'bottom' // top, bottom, zero }, style: 'line', // line, bar barChart: { @@ -49,42 +50,14 @@ function LineGraph(body, options) { size: 6, style: 'square' // square, circle }, - dataAxis: { - showMinorLabels: true, - showMajorLabels: true, - icons: false, - width: '40px', - visible: true, - alignZeros: true, - left:{ - range: {min:undefined,max:undefined}, - format: function (value) {return value;}, - title: {text:undefined,style:undefined} - }, - right:{ - range: {min:undefined,max:undefined}, - format: function (value) {return value;}, - title: {text:undefined,style:undefined} - } - }, - legend: { - enabled: false, - icons: true, - left: { - visible: true, - position: 'top-left' // top/bottom - left,right - }, - right: { - visible: true, - position: 'top-right' // top/bottom - left,right - } - }, + dataAxis: {}, //Defaults are done on DataAxis level + legend: {}, //Defaults are done on Legend level groups: { visibility: {} } }; - // options is shared by this ItemSet and all its items + // options is shared by this lineGraph and all its items this.options = util.extend({}, this.defaultOptions); this.dom = {}; this.props = {}; @@ -93,6 +66,7 @@ function LineGraph(body, options) { this.abortedGraphUpdate = false; this.updateSVGheight = false; this.updateSVGheightOnResize = false; + this.forceGraphUpdate = true; var me = this; this.itemsData = null; // DataSet @@ -132,18 +106,18 @@ function LineGraph(body, options) { this.svgElements = {}; this.setOptions(options); this.groupsUsingDefaultStyles = [0]; - this.COUNTER = 0; - this.body.emitter.on('rangechanged', function() { + this.body.emitter.on('rangechanged', function () { me.lastStart = me.body.range.start; me.svg.style.left = util.option.asSize(-me.props.width); - me.redraw.call(me,true); + + me.forceGraphUpdate = true; + //Is this local redraw necessary? (Core also does a change event!) + me.redraw.call(me); }); // create the HTML DOM this._create(); this.framework = {svg: this.svg, svgElements: this.svgElements, options: this.options, groups: this.groups}; - this.body.emitter.emit('change'); - } LineGraph.prototype = new Component(); @@ -151,15 +125,15 @@ LineGraph.prototype = new Component(); /** * Create the HTML DOM for the ItemSet */ -LineGraph.prototype._create = function(){ +LineGraph.prototype._create = function () { var frame = document.createElement('div'); frame.className = 'vis-line-graph'; this.dom.frame = frame; // create svg element for graph drawing. - this.svg = document.createElementNS('http://www.w3.org/2000/svg','svg'); + this.svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg'); this.svg.style.position = 'relative'; - this.svg.style.height = ('' + this.options.graphHeight).replace('px','') + 'px'; + this.svg.style.height = ('' + this.options.graphHeight).replace('px', '') + 'px'; this.svg.style.display = 'block'; frame.appendChild(this.svg); @@ -182,23 +156,23 @@ LineGraph.prototype._create = function(){ * set the options of the LineGraph. the mergeOptions is used for subObjects that have an enabled element. * @param {object} options */ -LineGraph.prototype.setOptions = function(options) { +LineGraph.prototype.setOptions = function (options) { if (options) { - var fields = ['sampling','defaultGroup','stack','height','graphHeight','yAxisOrientation','style','barChart','dataAxis','sort','groups']; - if (options.graphHeight === undefined && options.height !== undefined && this.body.domProps.centerContainer.height !== undefined) { + var fields = ['sampling', 'defaultGroup', 'stack', 'height', 'graphHeight', 'yAxisOrientation', 'style', 'barChart', 'dataAxis', 'sort', 'groups']; + if (options.graphHeight === undefined && options.height !== undefined) { this.updateSVGheight = true; this.updateSVGheightOnResize = true; } else if (this.body.domProps.centerContainer.height !== undefined && options.graphHeight !== undefined) { - if (parseInt((options.graphHeight + '').replace("px",'')) < this.body.domProps.centerContainer.height) { + if (parseInt((options.graphHeight + '').replace("px", '')) < this.body.domProps.centerContainer.height) { this.updateSVGheight = true; } } util.selectiveDeepExtend(fields, this.options, options); - util.mergeOptions(this.options, options,'interpolation'); - util.mergeOptions(this.options, options,'drawPoints'); - util.mergeOptions(this.options, options,'shaded'); - util.mergeOptions(this.options, options,'legend'); + util.mergeOptions(this.options, options, 'interpolation'); + util.mergeOptions(this.options, options, 'drawPoints'); + util.mergeOptions(this.options, options, 'shaded'); + util.mergeOptions(this.options, options, 'legend'); if (options.interpolation) { if (typeof options.interpolation == 'object') { @@ -237,15 +211,16 @@ LineGraph.prototype.setOptions = function(options) { } // this is used to redraw the graph if the visibility of the groups is changed. - if (this.dom.frame) { - this.redraw(true); + if (this.dom.frame) { //not on initial run? + this.forceGraphUpdate=true; + this.body.emitter.emit("_change",{queue: true}); } }; /** * Hide the component from the DOM */ -LineGraph.prototype.hide = function() { +LineGraph.prototype.hide = function () { // remove the frame containing the items if (this.dom.frame.parentNode) { this.dom.frame.parentNode.removeChild(this.dom.frame); @@ -257,7 +232,7 @@ LineGraph.prototype.hide = function() { * Show the component in the DOM (when not already visible). * @return {Boolean} changed */ -LineGraph.prototype.show = function() { +LineGraph.prototype.show = function () { // show frame containing the items if (!this.dom.frame.parentNode) { this.body.dom.center.appendChild(this.dom.frame); @@ -269,7 +244,7 @@ LineGraph.prototype.show = function() { * Set items * @param {vis.DataSet | null} items */ -LineGraph.prototype.setItems = function(items) { +LineGraph.prototype.setItems = function (items) { var me = this, ids, oldItemsData = this.itemsData; @@ -307,9 +282,6 @@ LineGraph.prototype.setItems = function(items) { ids = this.itemsData.getIds(); this._onAdd(ids); } - this._updateUngrouped(); - //this._updateGraph(); - this.redraw(true); }; @@ -317,7 +289,7 @@ LineGraph.prototype.setItems = function(items) { * Set groups * @param {vis.DataSet} groups */ -LineGraph.prototype.setGroups = function(groups) { +LineGraph.prototype.setGroups = function (groups) { var me = this; var ids; @@ -330,7 +302,9 @@ LineGraph.prototype.setGroups = function(groups) { // remove all drawn groups ids = this.groupsData.getIds(); this.groupsData = null; - this._onRemoveGroups(ids); // note: this will cause a redraw + for (var i = 0; i < ids.length; i++) { + this._removeGroup(ids[i]); + } } // replace the dataset @@ -355,34 +329,23 @@ LineGraph.prototype.setGroups = function(groups) { ids = this.groupsData.getIds(); this._onAddGroups(ids); } - this._onUpdate(); }; - -/** - * Update the data - * @param [ids] - * @private - */ -LineGraph.prototype._onUpdate = function(ids) { - this._updateUngrouped(); +LineGraph.prototype._onUpdate = function (ids) { this._updateAllGroupData(); - //this._updateGraph(); - this.redraw(true); }; -LineGraph.prototype._onAdd = function (ids) {this._onUpdate(ids);}; -LineGraph.prototype._onRemove = function (ids) {this._onUpdate(ids);}; -LineGraph.prototype._onUpdateGroups = function (groupIds) { - for (var i = 0; i < groupIds.length; i++) { - var group = this.groupsData.get(groupIds[i]); - this._updateGroup(group, groupIds[i]); - } - - //this._updateGraph(); - this.redraw(true); +LineGraph.prototype._onAdd = function (ids) { + this._onUpdate(ids); +}; +LineGraph.prototype._onRemove = function (ids) { + this._onUpdate(ids); +}; +LineGraph.prototype._onUpdateGroups = function (groupIds) { + this._updateAllGroupData(); +}; +LineGraph.prototype._onAddGroups = function (groupIds) { + this._onUpdateGroups(groupIds); }; -LineGraph.prototype._onAddGroups = function (groupIds) {this._onUpdateGroups(groupIds);}; - /** * this cleans the group out off the legends and the dataaxis, updates the ungrouped and updates the graph @@ -391,25 +354,32 @@ LineGraph.prototype._onAddGroups = function (groupIds) {this._onUpdateGroups(gro */ LineGraph.prototype._onRemoveGroups = function (groupIds) { for (var i = 0; i < groupIds.length; i++) { - if (this.groups.hasOwnProperty(groupIds[i])) { - if (this.groups[groupIds[i]].options.yAxisOrientation == 'right') { - this.yAxisRight.removeGroup(groupIds[i]); - this.legendRight.removeGroup(groupIds[i]); - this.legendRight.redraw(); - } - else { - this.yAxisLeft.removeGroup(groupIds[i]); - this.legendLeft.removeGroup(groupIds[i]); - this.legendLeft.redraw(); - } - delete this.groups[groupIds[i]]; - } + this._removeGroup(groupIds[i]); } - this._updateUngrouped(); - //this._updateGraph(); - this.redraw(true); + this.forceGraphUpdate = true; + this.body.emitter.emit("_change",{queue: true}); }; +/** + * this cleans the group out off the legends and the dataaxis + * @param groupId + * @private + */ +LineGraph.prototype._removeGroup = function (groupId) { + if (this.groups.hasOwnProperty(groupId)) { + if (this.groups[groupId].options.yAxisOrientation == 'right') { + this.yAxisRight.removeGroup(groupId); + this.legendRight.removeGroup(groupId); + this.legendRight.redraw(); + } + else { + this.yAxisLeft.removeGroup(groupId); + this.legendLeft.removeGroup(groupId); + this.legendLeft.redraw(); + } + delete this.groups[groupId]; + } +} /** * update a group object with the group dataset entree @@ -435,10 +405,16 @@ LineGraph.prototype._updateGroup = function (group, groupId) { if (this.groups[groupId].options.yAxisOrientation == 'right') { this.yAxisRight.updateGroup(groupId, this.groups[groupId]); this.legendRight.updateGroup(groupId, this.groups[groupId]); + //If yAxisOrientation changed, clean out the group from the other axis. + this.yAxisLeft.removeGroup(groupId); + this.legendLeft.removeGroup(groupId); } else { this.yAxisLeft.updateGroup(groupId, this.groups[groupId]); this.legendLeft.updateGroup(groupId, this.groups[groupId]); + //If yAxisOrientation changed, clean out the group from the other axis. + this.yAxisRight.removeGroup(groupId); + this.legendRight.removeGroup(groupId); } } this.legendLeft.redraw(); @@ -454,98 +430,83 @@ LineGraph.prototype._updateGroup = function (group, groupId) { LineGraph.prototype._updateAllGroupData = function () { if (this.itemsData != null) { var groupsContent = {}; - var groupId; - for (groupId in this.groups) { - if (this.groups.hasOwnProperty(groupId)) { - groupsContent[groupId] = []; + var items = this.itemsData.get(); + //pre-Determine array sizes, for more efficient memory claim + var groupCounts = {}; + for (var i = 0; i < items.length; i++) { + var item = items[i]; + var groupId = item.group; + if (groupId === null || groupId === undefined) { + groupId = UNGROUPED; } + groupCounts.hasOwnProperty(groupId) ? groupCounts[groupId]++ : groupCounts[groupId] = 1; } - for (var itemId in this.itemsData._data) { - if (this.itemsData._data.hasOwnProperty(itemId)) { - var item = this.itemsData._data[itemId]; - if (groupsContent[item.group] === undefined) { - throw new Error('Cannot find referenced group ' + item.group + '. Possible reason: items added before groups? Groups need to be added before items, as items refer to groups.') - } - item.x = util.convert(item.x,'Date'); - groupsContent[item.group].push(item); + //Now insert data into the arrays. + for (var i = 0; i < items.length; i++) { + var item = items[i]; + var groupId = item.group; + if (groupId === null || groupId === undefined) { + groupId = UNGROUPED; } - } - for (groupId in this.groups) { - if (this.groups.hasOwnProperty(groupId)) { - this.groups[groupId].setItems(groupsContent[groupId]); + if (!groupsContent.hasOwnProperty(groupId)) { + groupsContent[groupId] = new Array(groupCounts[groupId]); } - } - } -}; + //Copy data (because of unmodifiable DataView input. + var extended = util.bridgeObject(item); + extended.x = util.convert(item.x, 'Date'); + extended.orginalY = item.y; //real Y + extended.y = Number(item.y); + var index= groupsContent[groupId].length - groupCounts[groupId]--; + groupsContent[groupId][index] = extended; + } -/** - * Create or delete the group holding all ungrouped items. This group is used when - * there are no groups specified. This anonymous group is called 'graph'. - * @protected - */ -LineGraph.prototype._updateUngrouped = function() { - if (this.itemsData && this.itemsData != null) { - var ungroupedCounter = 0; - for (var itemId in this.itemsData._data) { - if (this.itemsData._data.hasOwnProperty(itemId)) { - var item = this.itemsData._data[itemId]; - if (item != undefined) { - if (item.hasOwnProperty('group')) { - if (item.group === undefined) { - item.group = UNGROUPED; - } - } - else { - item.group = UNGROUPED; - } - ungroupedCounter = item.group == UNGROUPED ? ungroupedCounter + 1 : ungroupedCounter; + //Make sure all groups are present, to allow removal of old groups + for (var groupId in this.groups){ + if (this.groups.hasOwnProperty(groupId)){ + if (!groupsContent.hasOwnProperty(groupId)) { + groupsContent[groupId] = new Array(0); } } } - if (ungroupedCounter == 0) { - delete this.groups[UNGROUPED]; - this.legendLeft.removeGroup(UNGROUPED); - this.legendRight.removeGroup(UNGROUPED); - this.yAxisLeft.removeGroup(UNGROUPED); - this.yAxisRight.removeGroup(UNGROUPED); - } - else { - var group = {id: UNGROUPED, content: this.options.defaultGroup}; - this._updateGroup(group, UNGROUPED); + //Update legendas, style and axis + for (var groupId in groupsContent) { + if (groupsContent.hasOwnProperty(groupId)) { + if (groupsContent[groupId].length == 0) { + if (this.groups.hasOwnProperty(groupId)) { + this._removeGroup(groupId); + } + } else { + var group = undefined; + if (this.groupsData != undefined) { + group = this.groupsData.get(groupId); + } + if (group == undefined) { + group = {id: groupId, content: this.options.defaultGroup + groupId}; + } + this._updateGroup(group, groupId); + this.groups[groupId].setItems(groupsContent[groupId]); + } + } } + this.forceGraphUpdate = true; + this.body.emitter.emit("_change",{queue: true}); } - else { - delete this.groups[UNGROUPED]; - this.legendLeft.removeGroup(UNGROUPED); - this.legendRight.removeGroup(UNGROUPED); - this.yAxisLeft.removeGroup(UNGROUPED); - this.yAxisRight.removeGroup(UNGROUPED); - } - - this.legendLeft.redraw(); - this.legendRight.redraw(); }; - /** * Redraw the component, mandatory function * @return {boolean} Returns true if the component is resized */ -LineGraph.prototype.redraw = function(forceGraphUpdate) { +LineGraph.prototype.redraw = function () { var resized = false; // calculate actual size and position this.props.width = this.dom.frame.offsetWidth; this.props.height = this.body.domProps.centerContainer.height - - this.body.domProps.border.top - - this.body.domProps.border.bottom; - - // update the graph if there is no lastWidth or with, used for the initial draw - if (this.lastWidth === undefined && this.props.width) { - forceGraphUpdate = true; - } + - this.body.domProps.border.top + - this.body.domProps.border.bottom; // check if this component is resized resized = this._isResized() || resized; @@ -559,7 +520,7 @@ LineGraph.prototype.redraw = function(forceGraphUpdate) { // the svg element is three times as big as the width, this allows for fully dragging left and right // without reloading the graph. the controls for this are bound to events in the constructor if (resized == true) { - this.svg.style.width = util.option.asSize(3*this.props.width); + this.svg.style.width = util.option.asSize(3 * this.props.width); this.svg.style.left = util.option.asSize(-this.props.width); // if the height of the graph is set as proportional, change the height of the svg @@ -577,12 +538,13 @@ LineGraph.prototype.redraw = function(forceGraphUpdate) { this.updateSVGheight = false; } else { - this.svg.style.height = ('' + this.options.graphHeight).replace('px','') + 'px'; + this.svg.style.height = ('' + this.options.graphHeight).replace('px', '') + 'px'; } // zoomed is here to ensure that animations are shown correctly. - if (resized == true || zoomed == true || this.abortedGraphUpdate == true || forceGraphUpdate == true) { + if (resized == true || zoomed == true || this.abortedGraphUpdate == true || this.forceGraphUpdate == true) { resized = this._updateGraph() || resized; + this.forceGraphUpdate = false; } else { // move the whole svg while dragging @@ -590,19 +552,43 @@ LineGraph.prototype.redraw = function(forceGraphUpdate) { var offset = this.body.range.start - this.lastStart; var range = this.body.range.end - this.body.range.start; if (this.props.width != 0) { - var rangePerPixelInv = this.props.width/range; + var rangePerPixelInv = this.props.width / range; var xOffset = offset * rangePerPixelInv; this.svg.style.left = (-this.props.width - xOffset) + 'px'; } } } - this.legendLeft.redraw(); this.legendRight.redraw(); return resized; }; +LineGraph.prototype._getSortedGroupIds = function(){ + // getting group Ids + var grouplist = []; + for (var groupId in this.groups) { + if (this.groups.hasOwnProperty(groupId)) { + var group = this.groups[groupId]; + if (group.visible == true && (this.options.groups.visibility[groupId] === undefined || this.options.groups.visibility[groupId] == true)) { + grouplist.push({id:groupId,zIndex:group.options.zIndex}); + } + } + } + util.insertSort(grouplist,function(a,b){ + var az = a.zIndex; + var bz = b.zIndex; + if (az === undefined) az=0; + if (bz === undefined) bz=0; + return az==bz? 0: (az 0) { - // this is the range of the SVG canvas - var minDate = this.body.util.toGlobalTime(-this.body.domProps.root.width); - var maxDate = this.body.util.toGlobalTime(2 * this.body.domProps.root.width); var groupsData = {}; + // fill groups data, this only loads the data we require based on the timewindow this._getRelevantData(groupIds, groupsData, minDate, maxDate); @@ -640,44 +617,104 @@ LineGraph.prototype._updateGraph = function () { // we transform the X coordinates to detect collisions for (i = 0; i < groupIds.length; i++) { - preprocessedGroupData[groupIds[i]] = this._convertXcoordinates(groupsData[groupIds[i]]); + this._convertXcoordinates(groupsData[groupIds[i]]); } // now all needed data has been collected we start the processing. - this._getYRanges(groupIds, preprocessedGroupData, groupRanges); + this._getYRanges(groupIds, groupsData, groupRanges); // update the Y axis first, we use this data to draw at the correct Y points - // changeCalled is required to clean the SVG on a change emit. changeCalled = this._updateYAxis(groupIds, groupRanges); - var MAX_CYCLES = 5; - if (changeCalled == true && this.COUNTER < MAX_CYCLES) { + + // at changeCalled, abort this update cycle as the graph needs another update with new Width input from the Redraw container. + // Cleanup SVG elements on abort. + if (changeCalled == true) { DOMutil.cleanupElements(this.svgElements); this.abortedGraphUpdate = true; - this.COUNTER++; - this.body.emitter.emit('change'); return true; } - else { - if (this.COUNTER > MAX_CYCLES) { - console.log("WARNING: there may be an infinite loop in the _updateGraph emitter cycle."); - } - this.COUNTER = 0; - this.abortedGraphUpdate = false; + this.abortedGraphUpdate = false; - // With the yAxis scaled correctly, use this to get the Y values of the points. - for (i = 0; i < groupIds.length; i++) { - group = this.groups[groupIds[i]]; - processedGroupData[groupIds[i]] = this._convertYcoordinates(groupsData[groupIds[i]], group); - } - - // draw the groups - for (i = 0; i < groupIds.length; i++) { - group = this.groups[groupIds[i]]; - if (group.options.style != 'bar') { // bar needs to be drawn enmasse - group.draw(processedGroupData[groupIds[i]], group, this.framework); + // With the yAxis scaled correctly, use this to get the Y values of the points. + var below = undefined; + for (i = 0; i < groupIds.length; i++) { + group = this.groups[groupIds[i]]; + if (this.options.stack === true && this.options.style === 'line') { + if (group.options.excludeFromStacking == undefined || !group.options.excludeFromStacking) { + if (below != undefined) { + this._stack(groupsData[group.id], groupsData[below.id]); + if (group.options.shaded.enabled == true && group.options.shaded.orientation !== "group"){ + if (group.options.shaded.orientation == "top" && below.options.shaded.orientation !== "group"){ + below.options.shaded.orientation="group"; + below.options.shaded.groupId=group.id; + } else { + group.options.shaded.orientation="group"; + group.options.shaded.groupId=below.id; + } + } + } + below = group; } } - BarFunctions.draw(groupIds, processedGroupData, this.framework); + this._convertYcoordinates(groupsData[groupIds[i]], group); + } + + //Precalculate paths and draw shading if appropriate. This will make sure the shading is always behind any lines. + var paths = {}; + for (i = 0; i < groupIds.length; i++) { + group = this.groups[groupIds[i]]; + if (group.options.style === 'line' && group.options.shaded.enabled == true) { + var dataset = groupsData[groupIds[i]]; + if (dataset == null || dataset.length == 0) { + continue; + } + if (!paths.hasOwnProperty(groupIds[i])) { + paths[groupIds[i]] = Lines.calcPath(dataset, group); + } + if (group.options.shaded.orientation === "group") { + var subGroupId = group.options.shaded.groupId; + if (groupIds.indexOf(subGroupId) === -1) { + console.log(group.id + ": Unknown shading group target given:" + subGroupId); + continue; + } + if (!paths.hasOwnProperty(subGroupId)) { + paths[subGroupId] = Lines.calcPath(groupsData[subGroupId], this.groups[subGroupId]); + } + Lines.drawShading(paths[groupIds[i]], group, paths[subGroupId], this.framework); + } + else { + Lines.drawShading(paths[groupIds[i]], group, undefined, this.framework); + } + } + } + + // draw the groups, calculating paths if still necessary. + Bars.draw(groupIds, groupsData, this.framework); + for (i = 0; i < groupIds.length; i++) { + group = this.groups[groupIds[i]]; + if (groupsData[groupIds[i]].length > 0) { + switch (group.options.style) { + case "line": + if (!paths.hasOwnProperty(groupIds[i])) { + paths[groupIds[i]] = Lines.calcPath(groupsData[groupIds[i]], group); + } + Lines.draw(paths[groupIds[i]], group, this.framework); + //explicit no break; + case "point": + //explicit no break; + case "points": + if (group.options.style == "point" || group.options.style == "points" || group.options.drawPoints.enabled == true) { + Points.draw(groupsData[groupIds[i]], group, this.framework); + } + break; + case "bar": + // bar needs to be drawn enmasse + //explicit no break + default: + //do nothing... + } + } + } } } @@ -687,6 +724,51 @@ LineGraph.prototype._updateGraph = function () { return false; }; +LineGraph.prototype._stack = function (data, subData) { + var index, dx, dy, subPrevPoint, subNextPoint; + index = 0; + // for each data point we look for a matching on in the set below + for (var j = 0; j < data.length; j++) { + subPrevPoint = undefined; + subNextPoint = undefined; + // we look for time matches or a before-after point + for (var k = index; k < subData.length; k++) { + // if times match exactly + if (subData[k].x === data[j].x) { + subPrevPoint = subData[k]; + subNextPoint = subData[k]; + index = k; + break; + } + else if (subData[k].x > data[j].x) { // overshoot + subNextPoint = subData[k]; + if (k == 0) { + subPrevPoint = subNextPoint; + } + else { + subPrevPoint = subData[k - 1]; + } + index = k; + break; + } + } + // in case the last data point has been used, we assume it stays like this. + if (subNextPoint === undefined) { + subPrevPoint = subData[subData.length - 1]; + subNextPoint = subData[subData.length - 1]; + } + // linear interpolation + dx = subNextPoint.x - subPrevPoint.x; + dy = subNextPoint.y - subPrevPoint.y; + if (dx == 0) { + data[j].y = data[j].orginalY + subNextPoint.y; + } + else { + data[j].y = data[j].orginalY + (dy / dx) * (data[j].x - subPrevPoint.x) + subPrevPoint.y; // ax + b where b is data[j].y + } + } +} + /** * first select and preprocess the data from the datasets. @@ -706,33 +788,27 @@ LineGraph.prototype._getRelevantData = function (groupIds, groupsData, minDate, if (groupIds.length > 0) { for (i = 0; i < groupIds.length; i++) { group = this.groups[groupIds[i]]; - groupsData[groupIds[i]] = []; - var dataContainer = groupsData[groupIds[i]]; + var itemsData = group.getItems(); // optimization for sorted data if (group.options.sort == true) { - var guess = Math.max(0, util.binarySearchValue(group.itemsData, minDate, 'x', 'before')); - for (j = guess; j < group.itemsData.length; j++) { - item = group.itemsData[j]; - if (item !== undefined) { - if (item.x > maxDate) { - dataContainer.push(item); - break; - } - else { - dataContainer.push(item); - } - } + var dateComparator = function (a, b) { + return a.getTime() == b.getTime() ? 0 : a < b ? -1 : 1 + }; + var first = Math.max(0, util.binarySearchValue(itemsData, minDate, 'x', 'before', dateComparator)); + var last = Math.min(itemsData.length, util.binarySearchValue(itemsData, maxDate, 'x', 'after', dateComparator) + 1); + if (last <= 0) { + last = itemsData.length; } + var dataContainer = new Array(last-first); + for (j = first; j < last; j++) { + item = group.itemsData[j]; + dataContainer[j-first] = item; + } + groupsData[groupIds[i]] = dataContainer; } else { - for (j = 0; j < group.itemsData.length; j++) { - item = group.itemsData[j]; - if (item !== undefined) { - if (item.x > minDate && item.x < maxDate) { - dataContainer.push(item); - } - } - } + // If unsorted data, all data is relevant, just returning entire structure + groupsData[groupIds[i]] = group.itemsData; } } } @@ -762,12 +838,12 @@ LineGraph.prototype._applySampling = function (groupIds, groupsData) { var pointsPerPixel = amountOfPoints / xDistance; increment = Math.min(Math.ceil(0.2 * amountOfPoints), Math.max(1, Math.round(pointsPerPixel))); - var sampledData = []; + var sampledData = new Array(amountOfPoints); for (var j = 0; j < amountOfPoints; j += increment) { - sampledData.push(dataContainer[j]); - + var idx = Math.round(j/increment); + sampledData[idx]=dataContainer[j]; } - groupsData[groupIds[i]] = sampledData; + groupsData[groupIds[i]] = sampledData.splice(0,Math.round(amountOfPoints/increment)); } } } @@ -796,22 +872,22 @@ LineGraph.prototype._getYRanges = function (groupIds, groupsData, groupRanges) { group = this.groups[groupIds[i]]; // 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.getData(groupData));} - else {combinedDataRight = combinedDataRight.concat(group.getData(groupData));} + if (options.yAxisOrientation === 'left') { + combinedDataLeft = combinedDataLeft.concat(group.getItems()); + } + else { + combinedDataRight = combinedDataRight.concat(group.getItems()); + } } else { - groupRanges[groupIds[i]] = group.getYRange(groupData,groupIds[i]); + groupRanges[groupIds[i]] = group.getYRange(groupData, groupIds[i]); } } } // if bar graphs are stacked, their range need to be handled differently and accumulated over all groups. - BarFunctions.getStackedYRange(combinedDataLeft , groupRanges, groupIds, '__barStackLeft' , 'left' ); - BarFunctions.getStackedYRange(combinedDataRight, groupRanges, groupIds, '__barStackRight', 'right'); - // if line graphs are stacked, their range need to be handled differently and accumulated over all groups. - //LineFunctions.getStackedYRange(combinedDataLeft , groupRanges, groupIds, '__lineStackLeft' , 'left' ); - //LineFunctions.getStackedYRange(combinedDataRight, groupRanges, groupIds, '__lineStackRight', 'right'); - + Bars.getStackedYRange(combinedDataLeft, groupRanges, groupIds, '__barStackLeft', 'left'); + Bars.getStackedYRange(combinedDataRight, groupRanges, groupIds, '__barStackRight', 'right'); } }; @@ -872,7 +948,7 @@ LineGraph.prototype._updateYAxis = function (groupIds, groupRanges) { this.yAxisRight.setRange(minRight, maxRight); } } - resized = this._toggleAxisVisiblity(yAxisLeftUsed , this.yAxisLeft) || resized; + resized = this._toggleAxisVisiblity(yAxisLeftUsed, this.yAxisLeft) || resized; resized = this._toggleAxisVisiblity(yAxisRightUsed, this.yAxisRight) || resized; if (yAxisRightUsed == true && yAxisLeftUsed == true) { @@ -884,14 +960,17 @@ LineGraph.prototype._updateYAxis = function (groupIds, groupRanges) { this.yAxisRight.drawIcons = false; } this.yAxisRight.master = !yAxisLeftUsed; + this.yAxisRight.masterAxis = this.yAxisLeft; + if (this.yAxisRight.master == false) { - if (yAxisRightUsed == true) {this.yAxisLeft.lineOffset = this.yAxisRight.width;} - else {this.yAxisLeft.lineOffset = 0;} + if (yAxisRightUsed == true) { + this.yAxisLeft.lineOffset = this.yAxisRight.width; + } + else { + this.yAxisLeft.lineOffset = 0; + } resized = this.yAxisLeft.redraw() || resized; - this.yAxisRight.stepPixels = this.yAxisLeft.stepPixels; - this.yAxisRight.zeroCrossing = this.yAxisLeft.zeroCrossing; - this.yAxisRight.amountOfSteps = this.yAxisLeft.amountOfSteps; resized = this.yAxisRight.redraw() || resized; } else { @@ -899,9 +978,11 @@ LineGraph.prototype._updateYAxis = function (groupIds, groupRanges) { } // clean the accumulated lists - var tempGroups = ['__barStackLeft','__barStackRight','__lineStackLeft','__lineStackRight']; + var tempGroups = ['__barStackLeft', '__barStackRight', '__lineStackLeft', '__lineStackRight']; for (var i = 0; i < tempGroups.length; i++) { - if (groupIds.indexOf(tempGroups[i]) != -1) {groupIds.splice(groupIds.indexOf(tempGroups[i]),1);} + if (groupIds.indexOf(tempGroups[i]) != -1) { + groupIds.splice(groupIds.indexOf(tempGroups[i]), 1); + } } return resized; @@ -920,7 +1001,7 @@ LineGraph.prototype._toggleAxisVisiblity = function (axisUsed, axis) { var changed = false; if (axisUsed == false) { if (axis.dom.frame.parentNode && axis.hidden == false) { - axis.hide() + axis.hide(); changed = true; } } @@ -944,17 +1025,11 @@ LineGraph.prototype._toggleAxisVisiblity = function (axisUsed, axis) { * @private */ LineGraph.prototype._convertXcoordinates = function (datapoints) { - var extractedData = []; - var xValue, yValue; var toScreen = this.body.util.toScreen; - for (var i = 0; i < datapoints.length; i++) { - xValue = toScreen(datapoints[i].x) + this.props.width; - yValue = datapoints[i].y; - extractedData.push({x: xValue, y: yValue}); + datapoints[i].screen_x = toScreen(datapoints[i].x) + this.props.width; + datapoints[i].screen_y = datapoints[i].y; //starting point for range calculations } - - return extractedData; }; @@ -969,25 +1044,15 @@ LineGraph.prototype._convertXcoordinates = function (datapoints) { * @private */ LineGraph.prototype._convertYcoordinates = function (datapoints, group) { - var extractedData = []; - var xValue, yValue; - var toScreen = this.body.util.toScreen; var axis = this.yAxisLeft; - var svgHeight = Number(this.svg.style.height.replace('px','')); + var svgHeight = Number(this.svg.style.height.replace('px', '')); if (group.options.yAxisOrientation == 'right') { axis = this.yAxisRight; } - for (var i = 0; i < datapoints.length; i++) { - var labelValue = datapoints[i].label ? datapoints[i].label : null; - xValue = toScreen(datapoints[i].x) + this.props.width; - yValue = Math.round(axis.convertValue(datapoints[i].y)); - extractedData.push({x: xValue, y: yValue, label:labelValue}); + datapoints[i].screen_y = Math.round(axis.convertValue(datapoints[i].y)); } - group.setZeroPosition(Math.min(svgHeight, axis.convertValue(0))); - - return extractedData; }; diff --git a/lib/vis/lib/timeline/component/TimeAxis.js b/lib/vis/lib/timeline/component/TimeAxis.js index d1e262715c..136179b415 100644 --- a/lib/vis/lib/timeline/component/TimeAxis.js +++ b/lib/vis/lib/timeline/component/TimeAxis.js @@ -39,7 +39,9 @@ function TimeAxis (body, options) { }, // axis orientation: 'top' or 'bottom' showMinorLabels: true, showMajorLabels: true, + maxMinorChars: 7, format: TimeStep.FORMAT, + moment: moment, timeAxis: null }; this.options = util.extend({}, this.defaultOptions); @@ -68,8 +70,10 @@ TimeAxis.prototype.setOptions = function(options) { util.selectiveExtend([ 'showMinorLabels', 'showMajorLabels', + 'maxMinorChars', 'hiddenDates', - 'timeAxis' + 'timeAxis', + 'moment' ], this.options, options); // deep copy the format options @@ -193,11 +197,12 @@ TimeAxis.prototype._repaintLabels = function () { // calculate range and step (step such that we have space for 7 characters per label) var start = util.convert(this.body.range.start, 'Number'); var end = util.convert(this.body.range.end, 'Number'); - var timeLabelsize = this.body.util.toTime((this.props.minorCharWidth || 10) * 7).valueOf(); - var minimumStep = timeLabelsize - DateUtil.getHiddenDurationBefore(this.body.hiddenDates, this.body.range, timeLabelsize); + var timeLabelsize = this.body.util.toTime((this.props.minorCharWidth || 10) * this.options.maxMinorChars).valueOf(); + var minimumStep = timeLabelsize - DateUtil.getHiddenDurationBefore(this.options.moment, this.body.hiddenDates, this.body.range, timeLabelsize); minimumStep -= this.body.util.toTime(0).valueOf(); var step = new TimeStep(new Date(start), new Date(end), minimumStep, this.body.hiddenDates); + step.setMoment(this.options.moment); if (this.options.format) { step.setFormat(this.options.format); } @@ -221,19 +226,20 @@ TimeAxis.prototype._repaintLabels = function () { var next; var x; var xNext; - var isMajor; - var width; + var isMajor, nextIsMajor; + var width = 0, prevWidth; var line; var labelMinor; var xFirstMajorLabel = undefined; - var max = 0; + var count = 0; + const MAX = 1000; var className; - step.first(); + step.start(); next = step.getCurrent(); xNext = this.body.util.toScreen(next); - while (step.hasNext() && max < 1000) { - max++; + while (step.hasNext() && count < MAX) { + count++; isMajor = step.isMajor(); className = step.getClassName(); @@ -244,13 +250,16 @@ TimeAxis.prototype._repaintLabels = function () { step.next(); next = step.getCurrent(); + nextIsMajor = step.isMajor(); xNext = this.body.util.toScreen(next); + prevWidth = width; width = xNext - x; - var labelFits = labelMinor.length * this.props.minorCharWidth < width; + var showMinorGrid = (width >= prevWidth * 0.4); // prevent displaying of the 31th of the month on a scale of 5 days - if (this.options.showMinorLabels && labelFits) { - this._repaintMinorText(x, labelMinor, orientation, className); + if (this.options.showMinorLabels && showMinorGrid) { + var label = this._repaintMinorText(x, labelMinor, orientation, className); + label.style.width = width + 'px'; // set width to prevent overflow } if (isMajor && this.options.showMajorLabels) { @@ -258,22 +267,28 @@ TimeAxis.prototype._repaintLabels = function () { if (xFirstMajorLabel == undefined) { xFirstMajorLabel = x; } - this._repaintMajorText(x, step.getLabelMajor(), orientation, className); + label = this._repaintMajorText(x, step.getLabelMajor(), orientation, className); } line = this._repaintMajorLine(x, width, orientation, className); } - else { - if (labelFits) { + else { // minor line + if (showMinorGrid) { line = this._repaintMinorLine(x, width, orientation, className); } else { if (line) { - line.style.width = (parseInt (line.style.width) + width) + 'px' + // adjust the width of the previous grid + line.style.width = (parseInt (line.style.width) + width) + 'px'; } } } } + if (count === MAX && !warnedForOverflow) { + console.warn(`Something is wrong with the Timeline scale. Limited drawing of grid lines to ${MAX} lines.`); + warnedForOverflow = true; + } + // create a major label on the left when needed if (this.options.showMajorLabels) { var leftTime = this.body.util.toTime(0), @@ -464,4 +479,7 @@ TimeAxis.prototype._calculateCharSize = function () { this.props.majorCharWidth = this.dom.measureCharMajor.clientWidth; }; + +var warnedForOverflow = false; + module.exports = TimeAxis; diff --git a/lib/vis/lib/timeline/component/css/item.css b/lib/vis/lib/timeline/component/css/item.css index e843e1e0a5..4e04888511 100644 --- a/lib/vis/lib/timeline/component/css/item.css +++ b/lib/vis/lib/timeline/component/css/item.css @@ -123,3 +123,8 @@ cursor: e-resize; } + +.vis-range.vis-item.vis-readonly .vis-drag-left, +.vis-range.vis-item.vis-readonly .vis-drag-right { + cursor: auto; +} diff --git a/lib/vis/lib/timeline/component/css/labelset.css b/lib/vis/lib/timeline/component/css/labelset.css index c2690e9712..3aeabd102b 100644 --- a/lib/vis/lib/timeline/component/css/labelset.css +++ b/lib/vis/lib/timeline/component/css/labelset.css @@ -21,6 +21,10 @@ border-bottom: 1px solid #bfbfbf; } +.vis-labelset .vis-label.draggable { + cursor: pointer; +} + .vis-labelset .vis-label:last-child { border-bottom: none; } diff --git a/lib/vis/lib/timeline/component/graph2d_types/bar.js b/lib/vis/lib/timeline/component/graph2d_types/bar.js index c5474b9469..32b3d36e77 100644 --- a/lib/vis/lib/timeline/component/graph2d_types/bar.js +++ b/lib/vis/lib/timeline/component/graph2d_types/bar.js @@ -2,35 +2,43 @@ var DOMutil = require('../../../DOMutil'); var Points = require('./points'); function Bargraph(groupId, options) { - this.groupId = groupId; - this.options = options; } -Bargraph.prototype.getYRange = function(groupData) { - var yMin = groupData[0].y; - var yMax = groupData[0].y; - for (var j = 0; j < groupData.length; j++) { - yMin = yMin > groupData[j].y ? groupData[j].y : yMin; - yMax = yMax < groupData[j].y ? groupData[j].y : yMax; - } - return {min: yMin, max: yMax, yAxisOrientation: this.options.yAxisOrientation}; -}; +Bargraph.drawIcon = function (group, x, y, iconWidth, iconHeight, framework) { + var fillHeight = iconHeight * 0.5; + var path, fillPath; + var outline = DOMutil.getSVGElement("rect", framework.svgElements, framework.svg); + outline.setAttributeNS(null, "x", x); + outline.setAttributeNS(null, "y", y - fillHeight); + outline.setAttributeNS(null, "width", iconWidth); + outline.setAttributeNS(null, "height", 2 * fillHeight); + outline.setAttributeNS(null, "class", "vis-outline"); -Bargraph.prototype.getData = function(groupData) { - var combinedData = []; - for (var j = 0; j < groupData.length; j++) { - combinedData.push({ - x: groupData[j].x, - y: groupData[j].y, - groupId: this.groupId - }); + var barWidth = Math.round(0.3 * iconWidth); + var originalWidth = group.options.barChart.width; + var scale = originalWidth / barWidth; + var bar1Height = Math.round(0.4 * iconHeight); + var bar2Height = Math.round(0.75 * iconHeight); + + var offset = Math.round((iconWidth - (2 * barWidth)) / 3); + + DOMutil.drawBar(x + 0.5 * barWidth + offset, y + fillHeight - bar1Height - 1, barWidth, bar1Height, group.className + ' vis-bar', framework.svgElements, framework.svg, group.style); + DOMutil.drawBar(x + 1.5 * barWidth + offset + 2, y + fillHeight - bar2Height - 1, barWidth, bar2Height, group.className + ' vis-bar', framework.svgElements, framework.svg, group.style); + + if (group.options.drawPoints.enabled == true) { + var groupTemplate = { + style: group.options.drawPoints.style, + styles: group.options.drawPoints.styles, + size: (group.options.drawPoints.size / scale), + className: group.className + }; + DOMutil.drawPoint(x + 0.5 * barWidth + offset, y + fillHeight - bar1Height - 1, groupTemplate, framework.svgElements, framework.svg); + DOMutil.drawPoint(x + 1.5 * barWidth + offset + 2, y + fillHeight - bar2Height - 1, groupTemplate, framework.svgElements, framework.svg); } - return combinedData; + } - - /** * draw a bar graph * @@ -43,7 +51,7 @@ Bargraph.draw = function (groupIds, processedGroupData, framework) { var coreDistance; var key, drawData; var group; - var i,j; + var i, j; var barPoints = 0; // combine all barchart data @@ -53,6 +61,8 @@ Bargraph.draw = function (groupIds, processedGroupData, framework) { if (group.visible === true && (framework.options.groups.visibility[groupIds[i]] === undefined || framework.options.groups.visibility[groupIds[i]] === true)) { for (j = 0; j < processedGroupData[groupIds[i]].length; j++) { combinedData.push({ + screen_x: processedGroupData[groupIds[i]][j].screen_x, + screen_y: processedGroupData[groupIds[i]][j].screen_y, x: processedGroupData[groupIds[i]][j].x, y: processedGroupData[groupIds[i]][j].y, groupId: groupIds[i], @@ -64,15 +74,17 @@ Bargraph.draw = function (groupIds, processedGroupData, framework) { } } - if (barPoints === 0) {return;} + if (barPoints === 0) { + return; + } // sort by time and by group combinedData.sort(function (a, b) { - if (a.x === b.x) { + if (a.screen_x === b.screen_x) { return a.groupId < b.groupId ? -1 : 1; } else { - return a.x - b.x; + return a.screen_x - b.screen_x; } }); @@ -82,44 +94,52 @@ Bargraph.draw = function (groupIds, processedGroupData, framework) { // plot barchart for (i = 0; i < combinedData.length; i++) { group = framework.groups[combinedData[i].groupId]; - var minWidth = 0.1 * group.options.barChart.width; + var minWidth = group.options.barChart.minWidth != undefined ? group.options.barChart.minWidth : 0.1 * group.options.barChart.width; - key = combinedData[i].x; + key = combinedData[i].screen_x; var heightOffset = 0; if (intersections[key] === undefined) { - if (i+1 < combinedData.length) {coreDistance = Math.abs(combinedData[i+1].x - key);} - if (i > 0) {coreDistance = Math.min(coreDistance,Math.abs(combinedData[i-1].x - key));} + if (i + 1 < combinedData.length) { + coreDistance = Math.abs(combinedData[i + 1].screen_x - key); + } drawData = Bargraph._getSafeDrawData(coreDistance, group, minWidth); } else { var nextKey = i + (intersections[key].amount - intersections[key].resolved); var prevKey = i - (intersections[key].resolved + 1); - if (nextKey < combinedData.length) {coreDistance = Math.abs(combinedData[nextKey].x - key);} - if (prevKey > 0) {coreDistance = Math.min(coreDistance,Math.abs(combinedData[prevKey].x - key));} + if (nextKey < combinedData.length) { + coreDistance = Math.abs(combinedData[nextKey].screen_x - key); + } drawData = Bargraph._getSafeDrawData(coreDistance, group, minWidth); intersections[key].resolved += 1; - if (group.options.stack === true) { - if (combinedData[i].y < group.zeroPosition) { + if (group.options.stack === true && group.options.excludeFromStacking !== true) { + if (combinedData[i].screen_y < group.zeroPosition) { heightOffset = intersections[key].accumulatedNegative; - intersections[key].accumulatedNegative += group.zeroPosition - combinedData[i].y; + intersections[key].accumulatedNegative += group.zeroPosition - combinedData[i].screen_y; } else { heightOffset = intersections[key].accumulatedPositive; - intersections[key].accumulatedPositive += group.zeroPosition - combinedData[i].y; + intersections[key].accumulatedPositive += group.zeroPosition - combinedData[i].screen_y; } } else if (group.options.barChart.sideBySide === true) { drawData.width = drawData.width / intersections[key].amount; - drawData.offset += (intersections[key].resolved) * drawData.width - (0.5*drawData.width * (intersections[key].amount+1)); - if (group.options.barChart.align === 'left') {drawData.offset -= 0.5*drawData.width;} - else if (group.options.barChart.align === 'right') {drawData.offset += 0.5*drawData.width;} + drawData.offset += (intersections[key].resolved) * drawData.width - (0.5 * drawData.width * (intersections[key].amount + 1)); } } - DOMutil.drawBar(combinedData[i].x + drawData.offset, combinedData[i].y - heightOffset, drawData.width, group.zeroPosition - combinedData[i].y, group.className + ' vis-bar', framework.svgElements, framework.svg, group.style); + 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); // draw points if (group.options.drawPoints.enabled === true) { - Points.draw([combinedData[i]], group, framework, drawData.offset); + let pointData = { + screen_x: combinedData[i].screen_x, + screen_y: combinedData[i].screen_y - heightOffset, + x: combinedData[i].x, + y: combinedData[i].y, + groupId: combinedData[i].groupId, + label: combinedData[i].label + }; + Points.draw([pointData], group, framework, drawData.offset); //DOMutil.drawPoint(combinedData[i].x + drawData.offset, combinedData[i].y, group, framework.svgElements, framework.svg); } } @@ -137,16 +157,21 @@ Bargraph._getDataIntersections = function (intersections, combinedData) { var coreDistance; for (var i = 0; i < combinedData.length; i++) { if (i + 1 < combinedData.length) { - coreDistance = Math.abs(combinedData[i + 1].x - combinedData[i].x); + coreDistance = Math.abs(combinedData[i + 1].screen_x - combinedData[i].screen_x); } if (i > 0) { - coreDistance = Math.min(coreDistance, Math.abs(combinedData[i - 1].x - combinedData[i].x)); + coreDistance = Math.min(coreDistance, Math.abs(combinedData[i - 1].screen_x - combinedData[i].screen_x)); } if (coreDistance === 0) { - if (intersections[combinedData[i].x] === undefined) { - intersections[combinedData[i].x] = {amount: 0, resolved: 0, accumulatedPositive: 0, accumulatedNegative: 0}; + if (intersections[combinedData[i].screen_x] === undefined) { + intersections[combinedData[i].screen_x] = { + amount: 0, + resolved: 0, + accumulatedPositive: 0, + accumulatedNegative: 0 + }; } - intersections[combinedData[i].x].amount += 1; + intersections[combinedData[i].screen_x].amount += 1; } } }; @@ -164,7 +189,7 @@ Bargraph._getDataIntersections = function (intersections, combinedData) { Bargraph._getSafeDrawData = function (coreDistance, group, minWidth) { var width, offset; if (coreDistance < group.options.barChart.width && coreDistance > 0) { - width = coreDistance < minWidth ? minWidth : coreDistance; + width = coreDistance < minWidth ? minWidth : coreDistance offset = 0; // recalculate offset with the new width; if (group.options.barChart.align === 'left') { @@ -189,15 +214,15 @@ Bargraph._getSafeDrawData = function (coreDistance, group, minWidth) { return {width: width, offset: offset}; }; -Bargraph.getStackedYRange = function(combinedData, groupRanges, groupIds, groupLabel, orientation) { +Bargraph.getStackedYRange = function (combinedData, groupRanges, groupIds, groupLabel, orientation) { if (combinedData.length > 0) { // sort by time and by group combinedData.sort(function (a, b) { - if (a.x === b.x) { + if (a.screen_x === b.screen_x) { return a.groupId < b.groupId ? -1 : 1; - } + } else { - return a.x - b.x; + return a.screen_x - b.screen_x; } }); var intersections = {}; @@ -211,20 +236,20 @@ Bargraph.getStackedYRange = function(combinedData, groupRanges, groupIds, groupL Bargraph._getStackedYRange = function (intersections, combinedData) { var key; - var yMin = combinedData[0].y; - var yMax = combinedData[0].y; + var yMin = combinedData[0].screen_y; + var yMax = combinedData[0].screen_y; for (var i = 0; i < combinedData.length; i++) { - key = combinedData[i].x; + key = combinedData[i].screen_x; if (intersections[key] === undefined) { - yMin = yMin > combinedData[i].y ? combinedData[i].y : yMin; - yMax = yMax < combinedData[i].y ? combinedData[i].y : yMax; + yMin = yMin > combinedData[i].screen_y ? combinedData[i].screen_y : yMin; + yMax = yMax < combinedData[i].screen_y ? combinedData[i].screen_y : yMax; } else { - if (combinedData[i].y < 0) { - intersections[key].accumulatedNegative += combinedData[i].y; + if (combinedData[i].screen_y < 0) { + intersections[key].accumulatedNegative += combinedData[i].screen_y; } else { - intersections[key].accumulatedPositive += combinedData[i].y; + intersections[key].accumulatedPositive += combinedData[i].screen_y; } } } diff --git a/lib/vis/lib/timeline/component/graph2d_types/line.js b/lib/vis/lib/timeline/component/graph2d_types/line.js index 7d70e8d313..18b9877b45 100644 --- a/lib/vis/lib/timeline/component/graph2d_types/line.js +++ b/lib/vis/lib/timeline/component/graph2d_types/line.js @@ -1,109 +1,112 @@ var DOMutil = require('../../../DOMutil'); -var Points = require('./points'); function Line(groupId, options) { - this.groupId = groupId; - this.options = options; } -Line.prototype.getData = function(groupData) { - var combinedData = []; - for (var j = 0; j < groupData.length; j++) { - combinedData.push({ - x: groupData[j].x, - y: groupData[j].y, - groupId: this.groupId - }); - } - return combinedData; +Line.calcPath = function (dataset, group) { + if (dataset != null) { + if (dataset.length > 0) { + var d = []; + + // construct path from dataset + if (group.options.interpolation.enabled == true) { + d = Line._catmullRom(dataset, group); + } + else { + d = Line._linear(dataset); + } + return d; + } + } } -Line.prototype.getYRange = function(groupData) { - var yMin = groupData[0].y; - var yMax = groupData[0].y; - for (var j = 0; j < groupData.length; j++) { - yMin = yMin > groupData[j].y ? groupData[j].y : yMin; - yMax = yMax < groupData[j].y ? groupData[j].y : yMax; - } - return {min: yMin, max: yMax, yAxisOrientation: this.options.yAxisOrientation}; -}; +Line.drawIcon = function (group, x, y, iconWidth, iconHeight, framework) { + var fillHeight = iconHeight * 0.5; + var path, fillPath; -Line.getStackedYRange = function(combinedData, groupRanges, groupIds, groupLabel, orientation) { - if (combinedData.length > 0) { - // sort by time and by group - combinedData.sort(function (a, b) { - if (a.x === b.x) { - return a.groupId < b.groupId ? -1 : 1; - } - else { - return a.x - b.x; - } - }); - var intersections = {}; + var outline = DOMutil.getSVGElement("rect", framework.svgElements, framework.svg); + outline.setAttributeNS(null, "x", x); + outline.setAttributeNS(null, "y", y - fillHeight); + outline.setAttributeNS(null, "width", iconWidth); + outline.setAttributeNS(null, "height", 2 * fillHeight); + outline.setAttributeNS(null, "class", "vis-outline"); - Line._getDataIntersections(intersections, combinedData); - groupRanges[groupLabel] = Line._getStackedYRange(intersections, combinedData); - groupRanges[groupLabel].yAxisOrientation = orientation; - groupIds.push(groupLabel); - } + path = DOMutil.getSVGElement("path", framework.svgElements, framework.svg); + path.setAttributeNS(null, "class", group.className); + if (group.style !== undefined) { + path.setAttributeNS(null, "style", group.style); + } + + path.setAttributeNS(null, "d", "M" + x + "," + y + " L" + (x + iconWidth) + "," + y + ""); + if (group.options.shaded.enabled == true) { + fillPath = DOMutil.getSVGElement("path", framework.svgElements, framework.svg); + if (group.options.shaded.orientation == 'top') { + fillPath.setAttributeNS(null, "d", "M" + x + ", " + (y - fillHeight) + + "L" + x + "," + y + " L" + (x + iconWidth) + "," + y + " L" + (x + iconWidth) + "," + (y - fillHeight)); + } + else { + fillPath.setAttributeNS(null, "d", "M" + x + "," + y + " " + + "L" + x + "," + (y + fillHeight) + " " + + "L" + (x + iconWidth) + "," + (y + fillHeight) + + "L" + (x + iconWidth) + "," + y); + } + fillPath.setAttributeNS(null, "class", group.className + " vis-icon-fill"); + if (group.options.shaded.style !== undefined && group.options.shaded.style !== "") { + fillPath.setAttributeNS(null, "style", group.options.shaded.style); + } + } + + if (group.options.drawPoints.enabled == true) { + var groupTemplate = { + style: group.options.drawPoints.style, + styles: group.options.drawPoints.styles, + size: group.options.drawPoints.size, + className: group.className + }; + DOMutil.drawPoint(x + 0.5 * iconWidth, y, groupTemplate, framework.svgElements, framework.svg); + } } -Line._getStackedYRange = function (intersections, combinedData) { - var key; - var yMin = combinedData[0].y; - var yMax = combinedData[0].y; - for (var i = 0; i < combinedData.length; i++) { - key = combinedData[i].x; - if (intersections[key] === undefined) { - yMin = yMin > combinedData[i].y ? combinedData[i].y : yMin; - yMax = yMax < combinedData[i].y ? combinedData[i].y : yMax; - } - else { - if (combinedData[i].y < 0) { - intersections[key].accumulatedNegative += combinedData[i].y; - } - else { - intersections[key].accumulatedPositive += combinedData[i].y; - } - } - } - for (var xpos in intersections) { - if (intersections.hasOwnProperty(xpos)) { - yMin = yMin > intersections[xpos].accumulatedNegative ? intersections[xpos].accumulatedNegative : yMin; - yMin = yMin > intersections[xpos].accumulatedPositive ? intersections[xpos].accumulatedPositive : yMin; - yMax = yMax < intersections[xpos].accumulatedNegative ? intersections[xpos].accumulatedNegative : yMax; - yMax = yMax < intersections[xpos].accumulatedPositive ? intersections[xpos].accumulatedPositive : yMax; - } - } +Line.drawShading = function (pathArray, group, subPathArray, framework) { + // append shading to the path + if (group.options.shaded.enabled == true) { + var svgHeight = Number(framework.svg.style.height.replace('px','')); + var fillPath = DOMutil.getSVGElement('path', framework.svgElements, framework.svg); + var type = "L"; + if (group.options.interpolation.enabled == true){ + type = "C"; + } + var dFill; + var zero = 0; + if (group.options.shaded.orientation == 'top') { + zero = 0; + } + else if (group.options.shaded.orientation == 'bottom') { + zero = svgHeight; + } + else { + zero = Math.min(Math.max(0, group.zeroPosition), svgHeight); + } + if (group.options.shaded.orientation == 'group' && (subPathArray != null && subPathArray != undefined)) { + dFill = 'M' + pathArray[0][0]+ ","+pathArray[0][1] + " " + + this.serializePath(pathArray,type,false) + + ' L'+ subPathArray[subPathArray.length-1][0]+ "," + subPathArray[subPathArray.length-1][1] + " " + + this.serializePath(subPathArray,type,true) + + subPathArray[0][0]+ ","+subPathArray[0][1] + " Z"; + } + else { + dFill = 'M' + pathArray[0][0]+ ","+pathArray[0][1] + " " + + this.serializePath(pathArray,type,false) + + ' V' + zero + ' H'+ pathArray[0][0] + " Z"; + } - return {min: yMin, max: yMax}; -}; - -/** - * Fill the intersections object with counters of how many datapoints share the same x coordinates - * @param intersections - * @param combinedData - * @private - */ -Line._getDataIntersections = function (intersections, combinedData) { - // get intersections - var coreDistance; - for (var i = 0; i < combinedData.length; i++) { - if (i + 1 < combinedData.length) { - coreDistance = Math.abs(combinedData[i + 1].x - combinedData[i].x); + fillPath.setAttributeNS(null, 'class', group.className + ' vis-fill'); + if (group.options.shaded.style !== undefined) { + fillPath.setAttributeNS(null, 'style', group.options.shaded.style); + } + fillPath.setAttributeNS(null, 'd', dFill); } - if (i > 0) { - coreDistance = Math.min(coreDistance, Math.abs(combinedData[i - 1].x - combinedData[i].x)); - } - if (coreDistance === 0) { - if (intersections[combinedData[i].x] === undefined) { - intersections[combinedData[i].x] = {amount: 0, resolved: 0, accumulatedPositive: 0, accumulatedNegative: 0}; - } - intersections[combinedData[i].x].amount += 1; - } - } -}; - +} /** * draw a line graph @@ -111,53 +114,41 @@ Line._getDataIntersections = function (intersections, combinedData) { * @param dataset * @param group */ -Line.prototype.draw = function (dataset, group, framework) { - if (dataset != null) { - if (dataset.length > 0) { - var path, d; - var svgHeight = Number(framework.svg.style.height.replace('px','')); - path = DOMutil.getSVGElement('path', framework.svgElements, framework.svg); - path.setAttributeNS(null, "class", group.className); - if(group.style !== undefined) { - path.setAttributeNS(null, "style", group.style); - } - - // construct path from dataset - if (group.options.interpolation.enabled == true) { - d = Line._catmullRom(dataset, group); - } - else { - d = Line._linear(dataset); - } - - // append with points for fill and finalize the path - if (group.options.shaded.enabled == true) { - var fillPath = DOMutil.getSVGElement('path', framework.svgElements, framework.svg); - var dFill; - if (group.options.shaded.orientation == 'top') { - dFill = 'M' + dataset[0].x + ',' + 0 + ' ' + d + 'L' + dataset[dataset.length - 1].x + ',' + 0; +Line.draw = function (pathArray, group, framework) { + if (pathArray != null && pathArray != undefined) { + var path = DOMutil.getSVGElement('path', framework.svgElements, framework.svg); + path.setAttributeNS(null, "class", group.className); + if (group.style !== undefined) { + path.setAttributeNS(null, "style", group.style); } - else { - dFill = 'M' + dataset[0].x + ',' + svgHeight + ' ' + d + 'L' + dataset[dataset.length - 1].x + ',' + svgHeight; - } - fillPath.setAttributeNS(null, 'class', group.className + ' vis-fill'); - if(group.options.shaded.style !== undefined) { - fillPath.setAttributeNS(null, 'style', group.options.shaded.style); - } - fillPath.setAttributeNS(null, 'd', dFill); - } - // copy properties to path for drawing. - path.setAttributeNS(null, 'd', 'M' + d); - // draw points - if (group.options.drawPoints.enabled == true) { - Points.draw(dataset, group, framework); - } + var type = "L"; + if (group.options.interpolation.enabled == true){ + type = "C"; + } + // copy properties to path for drawing. + path.setAttributeNS(null, 'd', 'M' + pathArray[0][0]+ ","+pathArray[0][1] + " " + this.serializePath(pathArray,type,false)); } - } }; - +Line.serializePath = function(pathArray,type,inverse){ + if (pathArray.length < 2){ + //Too little data to create a path. + return ""; + } + var d = type; + if (inverse){ + for (var i = pathArray.length-2; i > 0; i--){ + d += pathArray[i][0] + "," + pathArray[i][1] + " "; + } + } + else { + for (var i = 1; i < pathArray.length; i++){ + d += pathArray[i][0] + "," + pathArray[i][1] + " "; + } + } + return d; +} /** * This uses an uniform parametrization of the interpolation algorithm: @@ -166,41 +157,44 @@ Line.prototype.draw = function (dataset, group, framework) { * @returns {string} * @private */ -Line._catmullRomUniform = function(data) { - // catmull rom - var p0, p1, p2, p3, bp1, bp2; - var d = Math.round(data[0].x) + ',' + Math.round(data[0].y) + ' '; - var normalization = 1/6; - var length = data.length; - for (var i = 0; i < length - 1; i++) { +Line._catmullRomUniform = function (data) { + // catmull rom + var p0, p1, p2, p3, bp1, bp2; + var d = []; + d.push( [ Math.round(data[0].screen_x) , Math.round(data[0].screen_y) ]); + var normalization = 1 / 6; + var length = data.length; + for (var i = 0; i < length - 1; i++) { - p0 = (i == 0) ? data[0] : data[i-1]; - p1 = data[i]; - p2 = data[i+1]; - p3 = (i + 2 < length) ? data[i+2] : p2; + p0 = (i == 0) ? data[0] : data[i - 1]; + p1 = data[i]; + p2 = data[i + 1]; + p3 = (i + 2 < length) ? data[i + 2] : p2; - // Catmull-Rom to Cubic Bezier conversion matrix - // 0 1 0 0 - // -1/6 1 1/6 0 - // 0 1/6 1 -1/6 - // 0 0 1 0 + // Catmull-Rom to Cubic Bezier conversion matrix + // 0 1 0 0 + // -1/6 1 1/6 0 + // 0 1/6 1 -1/6 + // 0 0 1 0 - // bp0 = { x: p1.x, y: p1.y }; - bp1 = { x: ((-p0.x + 6*p1.x + p2.x) *normalization), y: ((-p0.y + 6*p1.y + p2.y) *normalization)}; - bp2 = { x: (( p1.x + 6*p2.x - p3.x) *normalization), y: (( p1.y + 6*p2.y - p3.y) *normalization)}; - // bp0 = { x: p2.x, y: p2.y }; + // bp0 = { x: p1.x, y: p1.y }; + bp1 = { + screen_x: ((-p0.screen_x + 6 * p1.screen_x + p2.screen_x) * normalization), + screen_y: ((-p0.screen_y + 6 * p1.screen_y + p2.screen_y) * normalization) + }; + bp2 = { + screen_x: (( p1.screen_x + 6 * p2.screen_x - p3.screen_x) * normalization), + screen_y: (( p1.screen_y + 6 * p2.screen_y - p3.screen_y) * normalization) + }; + // bp0 = { x: p2.x, y: p2.y }; - d += 'C' + - bp1.x + ',' + - bp1.y + ' ' + - bp2.x + ',' + - bp2.y + ' ' + - p2.x + ',' + - p2.y + ' '; - } + d.push( [ bp1.screen_x , bp1.screen_y ]); + d.push( [ bp2.screen_x , bp2.screen_y ]); + d.push( [ p2.screen_x , p2.screen_y ]); + } - return d; + return d; }; /** @@ -214,70 +208,79 @@ Line._catmullRomUniform = function(data) { * @returns {string} * @private */ -Line._catmullRom = function(data, group) { - var alpha = group.options.interpolation.alpha; - if (alpha == 0 || alpha === undefined) { - return this._catmullRomUniform(data); - } - else { - var p0, p1, p2, p3, bp1, bp2, d1,d2,d3, A, B, N, M; - var d3powA, d2powA, d3pow2A, d2pow2A, d1pow2A, d1powA; - var d = Math.round(data[0].x) + ',' + Math.round(data[0].y) + ' '; - var length = data.length; - for (var i = 0; i < length - 1; i++) { - - p0 = (i == 0) ? data[0] : data[i-1]; - p1 = data[i]; - p2 = data[i+1]; - p3 = (i + 2 < length) ? data[i+2] : p2; - - d1 = Math.sqrt(Math.pow(p0.x - p1.x,2) + Math.pow(p0.y - p1.y,2)); - d2 = Math.sqrt(Math.pow(p1.x - p2.x,2) + Math.pow(p1.y - p2.y,2)); - d3 = Math.sqrt(Math.pow(p2.x - p3.x,2) + Math.pow(p2.y - p3.y,2)); - - // Catmull-Rom to Cubic Bezier conversion matrix - - // A = 2d1^2a + 3d1^a * d2^a + d3^2a - // B = 2d3^2a + 3d3^a * d2^a + d2^2a - - // [ 0 1 0 0 ] - // [ -d2^2a /N A/N d1^2a /N 0 ] - // [ 0 d3^2a /M B/M -d2^2a /M ] - // [ 0 0 1 0 ] - - d3powA = Math.pow(d3, alpha); - d3pow2A = Math.pow(d3,2*alpha); - d2powA = Math.pow(d2, alpha); - d2pow2A = Math.pow(d2,2*alpha); - d1powA = Math.pow(d1, alpha); - d1pow2A = Math.pow(d1,2*alpha); - - A = 2*d1pow2A + 3*d1powA * d2powA + d2pow2A; - B = 2*d3pow2A + 3*d3powA * d2powA + d2pow2A; - N = 3*d1powA * (d1powA + d2powA); - if (N > 0) {N = 1 / N;} - M = 3*d3powA * (d3powA + d2powA); - if (M > 0) {M = 1 / M;} - - bp1 = { x: ((-d2pow2A * p0.x + A*p1.x + d1pow2A * p2.x) * N), - y: ((-d2pow2A * p0.y + A*p1.y + d1pow2A * p2.y) * N)}; - - bp2 = { x: (( d3pow2A * p1.x + B*p2.x - d2pow2A * p3.x) * M), - y: (( d3pow2A * p1.y + B*p2.y - d2pow2A * p3.y) * M)}; - - if (bp1.x == 0 && bp1.y == 0) {bp1 = p1;} - if (bp2.x == 0 && bp2.y == 0) {bp2 = p2;} - d += 'C' + - bp1.x + ',' + - bp1.y + ' ' + - bp2.x + ',' + - bp2.y + ' ' + - p2.x + ',' + - p2.y + ' '; +Line._catmullRom = function (data, group) { + var alpha = group.options.interpolation.alpha; + if (alpha == 0 || alpha === undefined) { + return this._catmullRomUniform(data); } + else { + var p0, p1, p2, p3, bp1, bp2, d1, d2, d3, A, B, N, M; + var d3powA, d2powA, d3pow2A, d2pow2A, d1pow2A, d1powA; + var d = []; + d.push( [ Math.round(data[0].screen_x) , Math.round(data[0].screen_y) ]); + var length = data.length; + for (var i = 0; i < length - 1; i++) { - return d; - } + p0 = (i == 0) ? data[0] : data[i - 1]; + p1 = data[i]; + p2 = data[i + 1]; + p3 = (i + 2 < length) ? data[i + 2] : p2; + + d1 = Math.sqrt(Math.pow(p0.screen_x - p1.screen_x, 2) + Math.pow(p0.screen_y - p1.screen_y, 2)); + d2 = Math.sqrt(Math.pow(p1.screen_x - p2.screen_x, 2) + Math.pow(p1.screen_y - p2.screen_y, 2)); + d3 = Math.sqrt(Math.pow(p2.screen_x - p3.screen_x, 2) + Math.pow(p2.screen_y - p3.screen_y, 2)); + + // Catmull-Rom to Cubic Bezier conversion matrix + + // A = 2d1^2a + 3d1^a * d2^a + d3^2a + // B = 2d3^2a + 3d3^a * d2^a + d2^2a + + // [ 0 1 0 0 ] + // [ -d2^2a /N A/N d1^2a /N 0 ] + // [ 0 d3^2a /M B/M -d2^2a /M ] + // [ 0 0 1 0 ] + + d3powA = Math.pow(d3, alpha); + d3pow2A = Math.pow(d3, 2 * alpha); + d2powA = Math.pow(d2, alpha); + d2pow2A = Math.pow(d2, 2 * alpha); + d1powA = Math.pow(d1, alpha); + d1pow2A = Math.pow(d1, 2 * alpha); + + A = 2 * d1pow2A + 3 * d1powA * d2powA + d2pow2A; + B = 2 * d3pow2A + 3 * d3powA * d2powA + d2pow2A; + N = 3 * d1powA * (d1powA + d2powA); + if (N > 0) { + N = 1 / N; + } + M = 3 * d3powA * (d3powA + d2powA); + if (M > 0) { + M = 1 / M; + } + + bp1 = { + screen_x: ((-d2pow2A * p0.screen_x + A * p1.screen_x + d1pow2A * p2.screen_x) * N), + screen_y: ((-d2pow2A * p0.screen_y + A * p1.screen_y + d1pow2A * p2.screen_y) * N) + }; + + bp2 = { + screen_x: (( d3pow2A * p1.screen_x + B * p2.screen_x - d2pow2A * p3.screen_x) * M), + screen_y: (( d3pow2A * p1.screen_y + B * p2.screen_y - d2pow2A * p3.screen_y) * M) + }; + + if (bp1.screen_x == 0 && bp1.screen_y == 0) { + bp1 = p1; + } + if (bp2.screen_x == 0 && bp2.screen_y == 0) { + bp2 = p2; + } + d.push( [ bp1.screen_x , bp1.screen_y ]); + d.push( [ bp2.screen_x , bp2.screen_y ]); + d.push( [ p2.screen_x , p2.screen_y ]); + } + + return d; + } }; /** @@ -286,18 +289,13 @@ Line._catmullRom = function(data, group) { * @returns {string} * @private */ -Line._linear = function(data) { - // linear - var d = ''; - for (var i = 0; i < data.length; i++) { - if (i == 0) { - d += data[i].x + ',' + data[i].y; +Line._linear = function (data) { + // linear + var d = []; + for (var i = 0; i < data.length; i++) { + d.push([ data[i].screen_x , data[i].screen_y ]); } - else { - d += ' ' + data[i].x + ',' + data[i].y; - } - } - return d; + return d; }; module.exports = Line; diff --git a/lib/vis/lib/timeline/component/graph2d_types/points.js b/lib/vis/lib/timeline/component/graph2d_types/points.js index f407fddc50..c6a05a9255 100644 --- a/lib/vis/lib/timeline/component/graph2d_types/points.js +++ b/lib/vis/lib/timeline/component/graph2d_types/points.js @@ -1,25 +1,8 @@ var DOMutil = require('../../../DOMutil'); function Points(groupId, options) { - this.groupId = groupId; - this.options = options; } - -Points.prototype.getYRange = function(groupData) { - var yMin = groupData[0].y; - var yMax = groupData[0].y; - for (var j = 0; j < groupData.length; j++) { - yMin = yMin > groupData[j].y ? groupData[j].y : yMin; - yMax = yMax < groupData[j].y ? groupData[j].y : yMax; - } - return {min: yMin, max: yMax, yAxisOrientation: this.options.yAxisOrientation}; -}; - -Points.prototype.draw = function(dataset, group, framework, offset) { - Points.draw(dataset, group, framework, offset); -}; - /** * draw the data points * @@ -31,45 +14,60 @@ Points.prototype.draw = function(dataset, group, framework, offset) { */ Points.draw = function (dataset, group, framework, offset) { offset = offset || 0; - var callback = getCallback(); + var callback = getCallback(framework, group); for (var i = 0; i < dataset.length; i++) { if (!callback) { - // draw the point the simple way. - DOMutil.drawPoint(dataset[i].x + offset, dataset[i].y, getGroupTemplate(), framework.svgElements, framework.svg, dataset[i].label); - } else { - var callbackResult = callback(dataset[i], group, framework); // result might be true, false or an object - if (callbackResult === true || typeof callbackResult === 'object') { - DOMutil.drawPoint(dataset[i].x + offset, dataset[i].y, getGroupTemplate(callbackResult), framework.svgElements, framework.svg, dataset[i].label); - } + // draw the point the simple way. + DOMutil.drawPoint(dataset[i].screen_x + offset, dataset[i].screen_y, getGroupTemplate(group), framework.svgElements, framework.svg, dataset[i].label); } - } - - function getGroupTemplate(callbackResult) { - callbackResult = (typeof callbackResult === 'undefined') ? {} : callbackResult; - return { - style: callbackResult.style || group.options.drawPoints.style, - size: callbackResult.size || group.options.drawPoints.size, - className: callbackResult.className || group.className - }; - } - - function getCallback() { - var callback = undefined; - // check for the graph2d onRender - if (framework.options.drawPoints.onRender && typeof framework.options.drawPoints.onRender == 'function') { - callback = framework.options.drawPoints.onRender; + else { + var callbackResult = callback(dataset[i], group); // result might be true, false or an object + if (callbackResult === true || typeof callbackResult === 'object') { + DOMutil.drawPoint(dataset[i].screen_x + offset, dataset[i].screen_y, getGroupTemplate(group, callbackResult), framework.svgElements, framework.svg, dataset[i].label); } - - // override it with the group onRender if defined - if (group.group.options && group.group.options.drawPoints && group.group.options.drawPoints.onRender && typeof group.group.options.drawPoints.onRender == 'function') { - callback = group.group.options.drawPoints.onRender; - } - - return callback; + } } }; +Points.drawIcon = function (group, x, y, iconWidth, iconHeight, framework) { + var fillHeight = iconHeight * 0.5; + var path, fillPath; + + var outline = DOMutil.getSVGElement("rect", framework.svgElements, framework.svg); + outline.setAttributeNS(null, "x", x); + outline.setAttributeNS(null, "y", y - fillHeight); + outline.setAttributeNS(null, "width", iconWidth); + outline.setAttributeNS(null, "height", 2 * fillHeight); + outline.setAttributeNS(null, "class", "vis-outline"); + + //Don't call callback on icon + DOMutil.drawPoint(x + 0.5 * iconWidth, y, getGroupTemplate(group), framework.svgElements, framework.svg); +}; + +function getGroupTemplate(group, callbackResult) { + callbackResult = (typeof callbackResult === 'undefined') ? {} : callbackResult; + return { + style: callbackResult.style || group.options.drawPoints.style, + styles: callbackResult.styles || group.options.drawPoints.styles, + size: callbackResult.size || group.options.drawPoints.size, + className: callbackResult.className || group.className + }; +} + +function getCallback(framework, group) { + var callback = undefined; + // check for the graph2d onRender + if (framework.options && framework.options.drawPoints && framework.options.drawPoints.onRender && typeof framework.options.drawPoints.onRender == 'function') { + callback = framework.options.drawPoints.onRender; + } + + // override it with the group onRender if defined + if (group.group.options && group.group.options.drawPoints && group.group.options.drawPoints.onRender && typeof group.group.options.drawPoints.onRender == 'function') { + callback = group.group.options.drawPoints.onRender; + } + return callback; +} module.exports = Points; \ No newline at end of file diff --git a/lib/vis/lib/timeline/component/item/PointItem.js b/lib/vis/lib/timeline/component/item/PointItem.js index 8f22ad993b..6238e09ef2 100644 --- a/lib/vis/lib/timeline/component/item/PointItem.js +++ b/lib/vis/lib/timeline/component/item/PointItem.js @@ -120,13 +120,14 @@ PointItem.prototype.redraw = function() { dom.content.style.marginLeft = 2 * this.props.dot.width + 'px'; //dom.content.style.marginRight = ... + 'px'; // TODO: margin right - dom.dot.style.top = ((this.height - this.props.dot.height) / 2) + 'px'; - dom.dot.style.left = (this.props.dot.width / 2) + 'px'; - // recalculate size this.width = dom.point.offsetWidth; this.height = dom.point.offsetHeight; + // reposition the dot + dom.dot.style.top = ((this.height - this.props.dot.height) / 2) + 'px'; + dom.dot.style.left = (this.props.dot.width / 2) + 'px'; + this.dirty = false; } diff --git a/lib/vis/lib/timeline/optionsGraph2d.js b/lib/vis/lib/timeline/optionsGraph2d.js index c6dc0ddb65..fb8e04557f 100644 --- a/lib/vis/lib/timeline/optionsGraph2d.js +++ b/lib/vis/lib/timeline/optionsGraph2d.js @@ -33,12 +33,14 @@ let allOptions = { graphHeight: {string, number}, shaded: { enabled: {boolean}, - orientation: {string:['bottom','top']}, // top, bottom + orientation: {string:['bottom','top','zero','group']}, // top, bottom, zero, group + groupId: {object}, __type__: {boolean,object} }, style: {string:['line','bar','points']}, // line, bar barChart: { width: {number}, + minWidth: {number}, sideBySide: {boolean}, align: {string:['left','center','right']}, __type__: {object} @@ -98,6 +100,7 @@ let allOptions = { }, autoResize: {boolean}, + throttleRedraw: {number}, clickToUse: {boolean}, end: {number, date, string, moment}, format: { @@ -125,8 +128,14 @@ let allOptions = { }, __type__: {object} }, + moment: {'function': 'function'}, height: {string, number}, - hiddenDates: {object, array}, + hiddenDates: { + start: {date, number, string, moment}, + end: {date, number, string, moment}, + repeat: {string}, + __type__: {object, array} + }, locale:{string}, locales:{ __any__: {any}, @@ -134,6 +143,7 @@ let allOptions = { }, max: {date, number, string, moment}, maxHeight: {number, string}, + maxMinorChars: {number}, min: {date, number, string, moment}, minHeight: {number, string}, moveable: {boolean}, @@ -153,6 +163,7 @@ let allOptions = { zoomKey: {string: ['ctrlKey', 'altKey', 'metaKey', '']}, zoomMax: {number}, zoomMin: {number}, + zIndex: {number}, __type__: {object} }; @@ -164,11 +175,12 @@ let configureOptions = { stack:false, shaded: { enabled: false, - orientation: ['top','bottom'] // top, bottom + orientation: ['zero','top','bottom','group'] // zero, top, bottom }, style: ['line','bar','points'], // line, bar barChart: { width: [50,5,100,5], + minWidth: [50,5,100,5], sideBySide: false, align: ['left','center','right'] // left, center, right }, @@ -213,6 +225,7 @@ let configureOptions = { }, autoResize: true, + throttleRedraw: [10, 0, 1000, 10], clickToUse: false, end: '', format: { @@ -242,6 +255,7 @@ let configureOptions = { locale: '', max: '', maxHeight: '', + maxMinorChars: [7, 0, 20, 1], min: '', minHeight: '', moveable:true, @@ -254,8 +268,9 @@ let configureOptions = { zoomable: true, zoomKey: ['ctrlKey', 'altKey', 'metaKey', ''], zoomMax: [315360000000000, 10, 315360000000000, 1], - zoomMin: [10, 10, 315360000000000, 1] + zoomMin: [10, 10, 315360000000000, 1], + zIndex: 0 } }; -export {allOptions, configureOptions}; \ No newline at end of file +export {allOptions, configureOptions}; diff --git a/lib/vis/lib/timeline/optionsTimeline.js b/lib/vis/lib/timeline/optionsTimeline.js index da4c480375..acf93a17e4 100644 --- a/lib/vis/lib/timeline/optionsTimeline.js +++ b/lib/vis/lib/timeline/optionsTimeline.js @@ -27,6 +27,7 @@ let allOptions = { //globals : align: {string}, autoResize: {boolean}, + throttleRedraw: {number}, clickToUse: {boolean}, dataAttributes: {string, array}, editable: { @@ -62,9 +63,23 @@ let allOptions = { }, __type__: {object} }, + moment: {'function': 'function'}, groupOrder: {string, 'function': 'function'}, + groupEditable: { + add: {boolean, 'undefined': 'undefined'}, + remove: {boolean, 'undefined': 'undefined'}, + order: {boolean, 'undefined': 'undefined'}, + __type__: {boolean, object} + }, + groupOrderSwap: {'function': 'function'}, height: {string, number}, - hiddenDates: {object, array}, + hiddenDates: { + start: {date, number, string, moment}, + end: {date, number, string, moment}, + repeat: {string}, + __type__: {object, array} + }, + itemsAlwaysDraggable: { boolean: boolean }, locale:{string}, locales:{ __any__: {any}, @@ -81,15 +96,20 @@ let allOptions = { }, max: {date, number, string, moment}, maxHeight: {number, string}, + maxMinorChars: {number}, min: {date, number, string, moment}, minHeight: {number, string}, moveable: {boolean}, multiselect: {boolean}, + multiselectPerGroup: {boolean}, onAdd: {'function': 'function'}, onUpdate: {'function': 'function'}, onMove: {'function': 'function'}, onMoving: {'function': 'function'}, onRemove: {'function': 'function'}, + onAddGroup: {'function': 'function'}, + onMoveGroup: {'function': 'function'}, + onRemoveGroup: {'function': 'function'}, order: {'function': 'function'}, orientation: { axis: {string,'undefined': 'undefined'}, @@ -124,6 +144,7 @@ let configureOptions = { global: { align: ['center', 'left', 'right'], autoResize: true, + throttleRedraw: [10, 0, 1000, 10], clickToUse: false, // dataAttributes: ['all'], // FIXME: can be 'all' or string[] editable: { @@ -157,6 +178,7 @@ let configureOptions = { }, //groupOrder: {string, 'function': 'function'}, + groupsDraggable: false, height: '', //hiddenDates: {object, array}, locale: '', @@ -169,10 +191,12 @@ let configureOptions = { }, max: '', maxHeight: '', + maxMinorChars: [7, 0, 20, 1], min: '', minHeight: '', moveable: false, multiselect: false, + multiselectPerGroup: false, //onAdd: {'function': 'function'}, //onUpdate: {'function': 'function'}, //onMove: {'function': 'function'}, diff --git a/lib/vis/lib/util.js b/lib/vis/lib/util.js index 47960085e5..a433075ad8 100644 --- a/lib/vis/lib/util.js +++ b/lib/vis/lib/util.js @@ -232,7 +232,12 @@ exports.selectiveDeepExtend = function (props, a, b, allowDeletion = false) { } else if (Array.isArray(b[prop])) { throw new TypeError('Arrays are not supported by deepExtend'); } else { - a[prop] = b[prop]; + if ((b[prop] === null) && a[prop] !== undefined && allowDeletion === true) { + delete a[prop]; + } + else { + a[prop] = b[prop]; + } } } @@ -278,7 +283,12 @@ exports.selectiveNotDeepExtend = function (props, a, b, allowDeletion = false) { a[prop].push(b[prop][i]); } } else { - a[prop] = b[prop]; + if ((b[prop] === null) && a[prop] !== undefined && allowDeletion === true) { + delete a[prop]; + } + else { + a[prop] = b[prop]; + } } } } @@ -319,7 +329,12 @@ exports.deepExtend = function (a, b, protoExtend, allowDeletion) { a[prop].push(b[prop][i]); } } else { - a[prop] = b[prop]; + if ((b[prop] === null) && a[prop] !== undefined && allowDeletion === true) { + delete a[prop]; + } + else { + a[prop] = b[prop]; + } } } } @@ -663,7 +678,7 @@ exports.toArray = function (object) { } return array; -} +}; /** * Update a property in an object @@ -682,6 +697,34 @@ exports.updateProperty = function (object, key, value) { } }; +/** + * Throttle the given function to be only executed once every `wait` milliseconds + * @param {function} fn + * @param {number} wait Time in milliseconds + * @returns {function} Returns the throttled function + */ +exports.throttle = function (fn, wait) { + var timeout = null; + var needExecution = false; + + return function throttled () { + if (!timeout) { + needExecution = false; + fn(); + + timeout = setTimeout(function() { + timeout = null; + if (needExecution) { + throttled(); + } + }, wait) + } + else { + needExecution = true; + } + } +}; + /** * Add and event listener. Works for all browsers * @param {Element} element An html element @@ -1210,6 +1253,23 @@ exports.bridgeObject = function (referenceObject) { } }; +/** + * This method provides a stable sort implementation, very fast for presorted data + * + * @param a the array + * @param a order comparator + * @returns {the array} + */ +exports.insertSort = function (a,compare) { + for (var i = 0; i < a.length; i++) { + var k = a[i]; + for (var j = i; j > 0 && compare(k,a[j - 1])<0; j--) { + a[j] = a[j - 1]; + } + a[j] = k; + } + return a; +} /** * this is used to set the options of subobjects in the options object. A requirement of these subobjects @@ -1218,12 +1278,10 @@ exports.bridgeObject = function (referenceObject) { * @param [object] mergeTarget | this is either this.options or the options used for the groups. * @param [object] options | options * @param [String] option | this is the option key in the options argument - * @private */ -exports.mergeOptions = function (mergeTarget, options, option, allowDeletion = false) { +exports.mergeOptions = function (mergeTarget, options, option, allowDeletion = false, globalOptions = {}) { if (options[option] === null) { - mergeTarget[option] = undefined; - delete mergeTarget[option]; + mergeTarget[option] = Object.create(globalOptions[option]); } else { if (options[option] !== undefined) { @@ -1250,13 +1308,13 @@ exports.mergeOptions = function (mergeTarget, options, option, allowDeletion = f * this function will then iterate in both directions over this sorted list to find all visible items. * * @param {Item[]} orderedItems | Items ordered by start - * @param {function} searchFunction | -1 is lower, 0 is found, 1 is higher + * @param {function} comparator | -1 is lower, 0 is equal, 1 is higher * @param {String} field * @param {String} field2 * @returns {number} * @private */ -exports.binarySearchCustom = function (orderedItems, searchFunction, field, field2) { +exports.binarySearchCustom = function (orderedItems, comparator, field, field2) { var maxIterations = 10000; var iteration = 0; var low = 0; @@ -1268,7 +1326,7 @@ exports.binarySearchCustom = function (orderedItems, searchFunction, field, fiel var item = orderedItems[middle]; var value = (field2 === undefined) ? item[field] : item[field][field2]; - var searchResult = searchFunction(value); + var searchResult = comparator(value); if (searchResult == 0) { // jihaa, found a visible item! return middle; } @@ -1294,16 +1352,21 @@ exports.binarySearchCustom = function (orderedItems, searchFunction, field, fiel * @param {{start: number, end: number}} target * @param {String} field * @param {String} sidePreference 'before' or 'after' + * @param {function} comparator an optional comparator, returning -1,0,1 for <,==,>. * @returns {number} * @private */ -exports.binarySearchValue = function (orderedItems, target, field, sidePreference) { +exports.binarySearchValue = function (orderedItems, target, field, sidePreference, comparator) { var maxIterations = 10000; var iteration = 0; var low = 0; var high = orderedItems.length - 1; var prevValue, value, nextValue, middle; + var comparator = comparator != undefined ? comparator : function (a, b) { + return a == b ? 0 : a < b ? -1 : 1 + }; + while (low <= high && iteration < maxIterations) { // get a new guess middle = Math.floor(0.5 * (high + low)); @@ -1311,17 +1374,17 @@ exports.binarySearchValue = function (orderedItems, target, field, sidePreferenc value = orderedItems[middle][field]; nextValue = orderedItems[Math.min(orderedItems.length - 1, middle + 1)][field]; - if (value == target) { // we found the target + if (comparator(value, target) == 0) { // we found the target return middle; } - else if (prevValue < target && value > target) { // target is in between of the previous and the current + else if (comparator(prevValue, target) < 0 && comparator(value, target) > 0) { // target is in between of the previous and the current return sidePreference == 'before' ? Math.max(0, middle - 1) : middle; } - else if (value < target && nextValue > target) { // target is in between of the current and the next + else if (comparator(value, target) < 0 && comparator(nextValue, target) > 0) { // target is in between of the current and the next return sidePreference == 'before' ? middle : Math.min(orderedItems.length - 1, middle + 1); } else { // didnt find the target, we need to change our boundaries. - if (value < target) { // it is too small --> increase low + if (comparator(value, target) < 0) { // it is too small --> increase low low = middle + 1; } else { // it is too big --> decrease high diff --git a/lib/vis/misc/how_to_publish.md b/lib/vis/misc/how_to_publish.md index 676556ae63..38492d76cf 100644 --- a/lib/vis/misc/how_to_publish.md +++ b/lib/vis/misc/how_to_publish.md @@ -5,7 +5,7 @@ This document describes how to publish vis.js. ## Build -- Change the version number of the library in both `package.json` and `bower.json`. +- Change the version number of the library in `package.json`. - Open `HISTORY.md`, write down the changes, version number, and release date. - Build the library by running: @@ -76,6 +76,8 @@ This generates the vis.js library in the folder `./dist`. - Update the library version number in the index.html page. +- Update the CDN links at the download section of index.html AND the CDN link at the top. (replace all) + - Commit the changes in the `gh-pages` branch. diff --git a/lib/vis/package.json b/lib/vis/package.json index 52c761822b..c33714425c 100644 --- a/lib/vis/package.json +++ b/lib/vis/package.json @@ -1,6 +1,6 @@ { "name": "vis", - "version": "4.5.0", + "version": "4.14.0", "description": "A dynamic, browser-based visualization library.", "homepage": "http://visjs.org/", "license": "(Apache-2.0 OR MIT)", @@ -21,22 +21,21 @@ "network", "browser" ], - "main": "./index", + "main": "./dist/vis.js", "scripts": { "test": "mocha", "build": "gulp", "watch": "gulp watch", "watch-dev": "gulp watch --bundle" }, - "dependencies": { - "emitter-component": "^1.1.1", - "hammerjs": "^2.0.4", - "keycharm": "^0.2.0", - "uuid": "^2.0.1", - "moment": "^2.10.2", - "propagating-hammerjs": "^1.4.3" - }, + "dependencies": {}, "devDependencies": { + "emitter-component": "^1.1.1", + "hammerjs": "^2.0.6", + "keycharm": "^0.2.0", + "moment": "^2.10.2", + "propagating-hammerjs": "^1.4.5", + "uuid": "^2.0.1", "babel": "^5.1.11", "babel-loader": "^5.0.0", "babelify": "^6.0.2", @@ -52,8 +51,5 @@ "uglify-js": "^2.4.20", "webpack": "^1.8.5", "yargs": "^3.7.2" - }, - "browserify": { - "transform": ["babelify"] } } diff --git a/lib/vis/test/DataView.test.js b/lib/vis/test/DataView.test.js index 8a26752860..4d3c5f97ee 100644 --- a/lib/vis/test/DataView.test.js +++ b/lib/vis/test/DataView.test.js @@ -177,15 +177,27 @@ describe('DataView', function () { // make a change not affecting the DataView data.update({id: 1, title: 'Item 1 (changed)'}); assert.deepEqual(dataUpdates, [ - ['update', {items: [1], data: [{id: 1, title: 'Item 1 (changed)'}]}] + ['update', { + items: [1], + data: [{id: 1, title: 'Item 1 (changed)'}], + oldData: [{"group": 1, "id": 1, "title": "Item 1"}] + }] ]); assert.deepEqual(viewUpdates, []); // make a change affecting the DataView data.update({id: 2, title: 'Item 2 (changed)'}); assert.deepEqual(dataUpdates, [ - ['update', {items: [1], data: [{id: 1, title: 'Item 1 (changed)'}]}], - ['update', {items: [2], data: [{id: 2, title: 'Item 2 (changed)'}]}] + ['update', { + items: [1], + data: [{id: 1, title: 'Item 1 (changed)'}], + oldData: [{"group": 1, "id": 1, "title": "Item 1"}] + }], + ['update', { + items: [2], + data: [{id: 2, title: 'Item 2 (changed)'}], + oldData: [{"group": 2, "id": 2, "title": "Item 2"}] + }] ]); assert.deepEqual(viewUpdates, [ ['update', {items: [2], data: [{id: 2, title: 'Item 2 (changed)'}]}] diff --git a/lib/vis/test/networkTest.html b/lib/vis/test/networkTest.html index 7a948c12b5..a7ec8161ed 100644 --- a/lib/vis/test/networkTest.html +++ b/lib/vis/test/networkTest.html @@ -1,148 +1,68 @@ - + - Network | Hierarchical layout - + + JS Bin + + - - - - - + +

Network Test

+
+ -
- -
- -

- + \ No newline at end of file diff --git a/lib/vis/test/network_unittests.html b/lib/vis/test/network_unittests.html index a6a45bf357..2d3e2eaab3 100644 --- a/lib/vis/test/network_unittests.html +++ b/lib/vis/test/network_unittests.html @@ -176,36 +176,51 @@ - var amountOfOptionChecks = 200; - var optionCheckTime = 150; + var amountOfOptionChecks = 50; var optionsThreshold = 0.8; - function checkOptions(i) { -// console.log('checking Options iteration:',i) - var allOptions = vis.network.allOptions.allOptions; - var testOptions = {}; - constructOptions(allOptions, testOptions); - var failed = setTimeout(function() {console.error("FAILED",JSON.stringify(testOptions,null,4))}, 0.9*optionCheckTime); - var counter = 0; - drawQuick(); - network.on("afterDrawing", function() { - counter++; - if (counter > 2) { - counter = 0; - network.off('afterDrawing'); + var optionGlobalCount = 0; + function checkOptions() { + optionGlobalCount++; + if (optionGlobalCount == amountOfOptionChecks) { + checkMethods(); + } + else { + var allOptions = vis.network.allOptions.allOptions; + var testOptions = {}; + constructOptions(allOptions, testOptions); + if (testOptions.physics === undefined) {testOptions.physics = {};} + if (testOptions.layout === undefined) {testOptions.layout = {};} + testOptions.physics.enabled = true; + testOptions.layout.improvedLayout = false; + var failed = setTimeout(function () { + console.error("FAILED", JSON.stringify(testOptions, null, 4)) + }, 500); + var counter = 0; + drawQuick(); + network.on("afterDrawing", function () { + counter++; + if (counter > 2) { + counter = 0; + network.off('afterDrawing'); + clearTimeout(failed); + network.destroy(); + } + }) + network.on("stabilized", function () { clearTimeout(failed); - } - }) - network.on("stabilized", function() { - clearTimeout(failed); - }); - network.on("destroy", function() { - clearTimeout(failed); - }) - network.setOptions(testOptions); + network.destroy(); + }); + network.once("destroy", function () { + clearTimeout(failed); + setTimeout(checkOptions, 100); + }) + console.log("now testing:",testOptions) + + network.setOptions(testOptions); + } } function constructOptions(allOptions, testOptions) { - for (var option in allOptions) { if (Math.random() < optionsThreshold) { if (option !== "__type__" && option !== '__any__' && option !== 'locales' && option !== 'image' && option !== 'id') { @@ -254,10 +269,11 @@ } - for (var i = 0; i < amountOfOptionChecks; i++) { - setTimeout(checkOptions.bind(this,i), i*optionCheckTime); - } - setTimeout(checkMethods, amountOfOptionChecks*optionCheckTime); + checkOptions(); +// for (var i = 0; i < amountOfOptionChecks; i++) { +// setTimeout(checkOptions.bind(this,i), i*optionCheckTime); +// } +// setTimeout(checkMethods, amountOfOptionChecks*optionCheckTime); \ No newline at end of file diff --git a/lib/vis/test/timeline.html b/lib/vis/test/timeline.html index 27e5ed25b1..9cc1f384b5 100644 --- a/lib/vis/test/timeline.html +++ b/lib/vis/test/timeline.html @@ -216,6 +216,8 @@ items.on('update', console.log.bind(console)); items.on('remove', console.log.bind(console)); + +// timeline.setOptions({timeAxis:{scale: 'minute', step: 5}}) \ No newline at end of file diff --git a/lib/vis/test/timeline_groups.html b/lib/vis/test/timeline_groups.html index aac1c2ca23..4df1b4330b 100644 --- a/lib/vis/test/timeline_groups.html +++ b/lib/vis/test/timeline_groups.html @@ -71,7 +71,9 @@ } // create a dataset with items - var items = new vis.DataSet(); + var items = new vis.DataSet({ + type: {start: 'Moment', end: 'Moment'} + }); for (var i = 0; i < itemCount; i++) { var start = now.clone().add(Math.random() * 200, 'hours'); var end = Math.random() > 0.5 ? start.clone().add(24, 'hours') : undefined; @@ -117,6 +119,7 @@ }, onMove: function (item, callback) { + console.log('onMove', item) if (confirm('Do you really want to move the item to\n' + 'start: ' + item.start + '\n' + 'end: ' + item.end + '?')) {