@ -104,7 +104,7 @@ return /******/ (function(modules) { // webpackBootstrap
exports . Graph2d = __webpack_require__ ( 42 ) ;
exports . timeline = {
DateUtil : __webpack_require__ ( 24 ) ,
DataStep : __webpack_require__ ( 45 ) ,
DataStep : __webpack_require__ ( 44 ) ,
Range : __webpack_require__ ( 21 ) ,
stack : __webpack_require__ ( 33 ) ,
TimeStep : __webpack_require__ ( 27 ) ,
@ -121,7 +121,7 @@ return /******/ (function(modules) { // webpackBootstrap
Component : __webpack_require__ ( 23 ) ,
CurrentTime : __webpack_require__ ( 28 ) ,
CustomTime : __webpack_require__ ( 30 ) ,
DataAxis : __webpack_require__ ( 44 ) ,
DataAxis : __webpack_require__ ( 45 ) ,
GraphGroup : __webpack_require__ ( 46 ) ,
Group : __webpack_require__ ( 32 ) ,
BackgroundGroup : __webpack_require__ ( 36 ) ,
@ -20031,7 +20031,7 @@ return /******/ (function(modules) { // webpackBootstrap
var DataSet = __webpack_require__ ( 7 ) ;
var DataView = __webpack_require__ ( 9 ) ;
var Component = __webpack_require__ ( 23 ) ;
var DataAxis = __webpack_require__ ( 44 ) ;
var DataAxis = __webpack_require__ ( 45 ) ;
var GraphGroup = __webpack_require__ ( 46 ) ;
var Legend = __webpack_require__ ( 47 ) ;
@ -20319,8 +20319,8 @@ return /******/ (function(modules) { // webpackBootstrap
* @ param { vis . DataSet } groups
* /
LineGraph . prototype . setGroups = function ( groups ) {
var me = this ,
ids ;
var me = this ;
var ids ;
// unsubscribe from current dataset
if ( this . groupsData ) {
@ -20386,7 +20386,7 @@ 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 . hasOwnProperty ( groupIds [ i ] ) ) {
if ( this . groups [ groupIds [ i ] ] . options . yAxisOrientation == 'right' ) {
this . yAxisRight . removeGroup ( groupIds [ i ] ) ;
this . legendRight . removeGroup ( groupIds [ i ] ) ;
@ -20451,6 +20451,9 @@ return /******/ (function(modules) { // webpackBootstrap
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. 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 ) ;
}
@ -21331,12 +21334,240 @@ return /******/ (function(modules) { // webpackBootstrap
/***/ } ,
/* 44 */
/***/ function ( module , exports , __webpack_require__ ) {
/ * *
* @ 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 ) {
// variables
this . current = 0 ;
this . autoScale = true ;
this . stepIndex = 0 ;
this . step = 1 ;
this . scale = 1 ;
this . marginStart ;
this . marginEnd ;
this . deadSpace = 0 ;
this . majorSteps = [ 1 , 2 , 5 , 10 ] ;
this . minorSteps = [ 0.25 , 0.5 , 1 , 2 ] ;
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 -= 0.75 ;
this . _end += 1 ;
}
if ( this . autoScale ) {
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 milliseconds
* /
DataStep . prototype . setMinimumStep = function ( minimumStep , containerHeight ) {
// round to floor
var size = this . _end - this . _start ;
var safeSize = size * 1.2 ;
var minimumStepValue = minimumStep * ( safeSize / containerHeight ) ;
var orderOfMagnitude = Math . round ( Math . log ( safeSize ) / 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 ;
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 ( ) {
var toPrecision = '' + Number ( this . current ) . toPrecision ( 5 ) ;
if ( toPrecision . indexOf ( "," ) != - 1 || toPrecision . indexOf ( "." ) != - 1 ) {
for ( var i = toPrecision . length - 1 ; i > 0 ; i -- ) {
if ( toPrecision [ i ] == "0" ) {
toPrecision = toPrecision . slice ( 0 , i ) ;
}
else if ( toPrecision [ i ] == "." || toPrecision [ i ] == "," ) {
toPrecision = toPrecision . slice ( 0 , i ) ;
break ;
}
else {
break ;
}
}
}
return toPrecision ;
} ;
/ * *
* Snap a date to a rounded value .
* The snap intervals are dependent on the current scale and step .
* @ param { Date } date the date to be snapped .
* @ return { Date } snappedDate
* /
DataStep . prototype . snap = function ( date ) {
} ;
/ * *
* 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 ) ;
} ;
module . exports = DataStep ;
/***/ } ,
/* 45 */
/***/ function ( module , exports , __webpack_require__ ) {
var util = __webpack_require__ ( 1 ) ;
var DOMutil = __webpack_require__ ( 6 ) ;
var Component = __webpack_require__ ( 23 ) ;
var DataStep = __webpack_require__ ( 45 ) ;
var DataStep = __webpack_require__ ( 44 ) ;
/ * *
* A horizontal time axis
@ -21836,234 +22067,6 @@ return /******/ (function(modules) { // webpackBootstrap
module . exports = DataAxis ;
/***/ } ,
/* 45 */
/***/ function ( module , exports , __webpack_require__ ) {
/ * *
* @ 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 ) {
// variables
this . current = 0 ;
this . autoScale = true ;
this . stepIndex = 0 ;
this . step = 1 ;
this . scale = 1 ;
this . marginStart ;
this . marginEnd ;
this . deadSpace = 0 ;
this . majorSteps = [ 1 , 2 , 5 , 10 ] ;
this . minorSteps = [ 0.25 , 0.5 , 1 , 2 ] ;
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 -= 0.75 ;
this . _end += 1 ;
}
if ( this . autoScale ) {
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 milliseconds
* /
DataStep . prototype . setMinimumStep = function ( minimumStep , containerHeight ) {
// round to floor
var size = this . _end - this . _start ;
var safeSize = size * 1.2 ;
var minimumStepValue = minimumStep * ( safeSize / containerHeight ) ;
var orderOfMagnitude = Math . round ( Math . log ( safeSize ) / 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 ;
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 ( ) {
var toPrecision = '' + Number ( this . current ) . toPrecision ( 5 ) ;
if ( toPrecision . indexOf ( "," ) != - 1 || toPrecision . indexOf ( "." ) != - 1 ) {
for ( var i = toPrecision . length - 1 ; i > 0 ; i -- ) {
if ( toPrecision [ i ] == "0" ) {
toPrecision = toPrecision . slice ( 0 , i ) ;
}
else if ( toPrecision [ i ] == "." || toPrecision [ i ] == "," ) {
toPrecision = toPrecision . slice ( 0 , i ) ;
break ;
}
else {
break ;
}
}
}
return toPrecision ;
} ;
/ * *
* Snap a date to a rounded value .
* The snap intervals are dependent on the current scale and step .
* @ param { Date } date the date to be snapped .
* @ return { Date } snappedDate
* /
DataStep . prototype . snap = function ( date ) {
} ;
/ * *
* 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 ) ;
} ;
module . exports = DataStep ;
/***/ } ,
/* 46 */
/***/ function ( module , exports , __webpack_require__ ) {
@ -22247,6 +22250,10 @@ return /******/ (function(modules) { // webpackBootstrap
Legend . prototype = new Component ( ) ;
Legend . prototype . clear = function ( ) {
this . groups = { } ;
this . amountOfGroups = 0 ;
}
Legend . prototype . addGroup = function ( label , graphOptions ) {
if ( ! this . groups . hasOwnProperty ( label ) ) {