|
@ -5,7 +5,7 @@ |
|
|
* A dynamic, browser-based visualization library. |
|
|
* A dynamic, browser-based visualization library. |
|
|
* |
|
|
* |
|
|
* @version 0.0.8 |
|
|
* @version 0.0.8 |
|
|
* @date 2013-05-23 |
|
|
|
|
|
|
|
|
* @date 2013-05-24 |
|
|
* |
|
|
* |
|
|
* @license |
|
|
* @license |
|
|
* Copyright (C) 2011-2013 Almende B.V, http://almende.com
|
|
|
* Copyright (C) 2011-2013 Almende B.V, http://almende.com
|
|
@ -2589,7 +2589,7 @@ DataView.prototype._trigger = DataSet.prototype._trigger; |
|
|
function Stack (parent, options) { |
|
|
function Stack (parent, options) { |
|
|
this.parent = parent; |
|
|
this.parent = parent; |
|
|
|
|
|
|
|
|
this.options = Object.create(parent && parent.options || 0); |
|
|
|
|
|
|
|
|
this.options = options || {}; |
|
|
this.defaultOptions = { |
|
|
this.defaultOptions = { |
|
|
order: function (a, b) { |
|
|
order: function (a, b) { |
|
|
//return (b.width - a.width) || (a.left - b.left); // TODO: cleanup
|
|
|
//return (b.width - a.width) || (a.left - b.left); // TODO: cleanup
|
|
@ -2620,8 +2620,6 @@ function Stack (parent, options) { |
|
|
}; |
|
|
}; |
|
|
|
|
|
|
|
|
this.ordered = []; // ordered items
|
|
|
this.ordered = []; // ordered items
|
|
|
|
|
|
|
|
|
this.setOptions(options); |
|
|
|
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
/** |
|
|
/** |
|
@ -2795,9 +2793,9 @@ function Range(options) { |
|
|
zoomMax: null |
|
|
zoomMax: null |
|
|
}; |
|
|
}; |
|
|
|
|
|
|
|
|
this.setOptions(options); |
|
|
|
|
|
|
|
|
|
|
|
this.listeners = []; |
|
|
this.listeners = []; |
|
|
|
|
|
|
|
|
|
|
|
this.setOptions(options); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
/** |
|
|
/** |
|
@ -3730,9 +3728,7 @@ function Panel(parent, depends, options) { |
|
|
this.parent = parent; |
|
|
this.parent = parent; |
|
|
this.depends = depends; |
|
|
this.depends = depends; |
|
|
|
|
|
|
|
|
this.options = Object.create(parent && parent.options || null); |
|
|
|
|
|
|
|
|
|
|
|
this.setOptions(options); |
|
|
|
|
|
|
|
|
this.options = options || {}; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
Panel.prototype = new Component(); |
|
|
Panel.prototype = new Component(); |
|
@ -3746,11 +3742,7 @@ Panel.prototype = new Component(); |
|
|
* {String | Number | function} [width] |
|
|
* {String | Number | function} [width] |
|
|
* {String | Number | function} [height] |
|
|
* {String | Number | function} [height] |
|
|
*/ |
|
|
*/ |
|
|
Panel.prototype.setOptions = function (options) { |
|
|
|
|
|
if (options) { |
|
|
|
|
|
util.extend(this.options, options); |
|
|
|
|
|
} |
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
Panel.prototype.setOptions = Component.prototype.setOptions; |
|
|
|
|
|
|
|
|
/** |
|
|
/** |
|
|
* Get the container element of the panel, which can be used by a child to |
|
|
* Get the container element of the panel, which can be used by a child to |
|
@ -3842,14 +3834,12 @@ function RootPanel(container, options) { |
|
|
this.id = util.randomUUID(); |
|
|
this.id = util.randomUUID(); |
|
|
this.container = container; |
|
|
this.container = container; |
|
|
|
|
|
|
|
|
this.options = Object.create(options || null); |
|
|
|
|
|
|
|
|
this.options = options || {} |
|
|
this.defaultOptions = { |
|
|
this.defaultOptions = { |
|
|
autoResize: true |
|
|
autoResize: true |
|
|
}; |
|
|
}; |
|
|
|
|
|
|
|
|
this.listeners = {}; // event listeners
|
|
|
this.listeners = {}; // event listeners
|
|
|
|
|
|
|
|
|
this.setOptions(options); |
|
|
|
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
RootPanel.prototype = new Panel(); |
|
|
RootPanel.prototype = new Panel(); |
|
@ -3864,19 +3854,7 @@ RootPanel.prototype = new Panel(); |
|
|
* {String | Number | function} [height] |
|
|
* {String | Number | function} [height] |
|
|
* {Boolean | function} [autoResize] |
|
|
* {Boolean | function} [autoResize] |
|
|
*/ |
|
|
*/ |
|
|
RootPanel.prototype.setOptions = function (options) { |
|
|
|
|
|
if (options) { |
|
|
|
|
|
util.extend(this.options, options); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
var autoResize = this.getOption('autoResize'); |
|
|
|
|
|
if (autoResize) { |
|
|
|
|
|
this._watch(); |
|
|
|
|
|
} |
|
|
|
|
|
else { |
|
|
|
|
|
this._unwatch(); |
|
|
|
|
|
} |
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
RootPanel.prototype.setOptions = Component.prototype.setOptions; |
|
|
|
|
|
|
|
|
/** |
|
|
/** |
|
|
* Repaint the component |
|
|
* Repaint the component |
|
@ -3914,6 +3892,7 @@ RootPanel.prototype.repaint = function () { |
|
|
changed += update(frame.style, 'height', asSize(options.height, '100%')); |
|
|
changed += update(frame.style, 'height', asSize(options.height, '100%')); |
|
|
|
|
|
|
|
|
this._updateEventEmitters(); |
|
|
this._updateEventEmitters(); |
|
|
|
|
|
this._updateWatch(); |
|
|
|
|
|
|
|
|
return (changed > 0); |
|
|
return (changed > 0); |
|
|
}; |
|
|
}; |
|
@ -3940,6 +3919,20 @@ RootPanel.prototype.reflow = function () { |
|
|
return (changed > 0); |
|
|
return (changed > 0); |
|
|
}; |
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
* Update watching for resize, depending on the current option |
|
|
|
|
|
* @private |
|
|
|
|
|
*/ |
|
|
|
|
|
RootPanel.prototype._updateWatch = function () { |
|
|
|
|
|
var autoResize = this.getOption('autoResize'); |
|
|
|
|
|
if (autoResize) { |
|
|
|
|
|
this._watch(); |
|
|
|
|
|
} |
|
|
|
|
|
else { |
|
|
|
|
|
this._unwatch(); |
|
|
|
|
|
} |
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
/** |
|
|
/** |
|
|
* Watch for changes in the size of the frame. On resize, the Panel will |
|
|
* Watch for changes in the size of the frame. On resize, the Panel will |
|
|
* automatically redraw itself. |
|
|
* automatically redraw itself. |
|
@ -4073,7 +4066,7 @@ function TimeAxis (parent, depends, options) { |
|
|
lineTop: 0 |
|
|
lineTop: 0 |
|
|
}; |
|
|
}; |
|
|
|
|
|
|
|
|
this.options = Object.create(parent && parent.options || null); |
|
|
|
|
|
|
|
|
this.options = options || {}; |
|
|
this.defaultOptions = { |
|
|
this.defaultOptions = { |
|
|
orientation: 'bottom', // supported: 'top', 'bottom'
|
|
|
orientation: 'bottom', // supported: 'top', 'bottom'
|
|
|
// TODO: implement timeaxis orientations 'left' and 'right'
|
|
|
// TODO: implement timeaxis orientations 'left' and 'right'
|
|
@ -4083,18 +4076,12 @@ function TimeAxis (parent, depends, options) { |
|
|
|
|
|
|
|
|
this.conversion = null; |
|
|
this.conversion = null; |
|
|
this.range = null; |
|
|
this.range = null; |
|
|
|
|
|
|
|
|
this.setOptions(options); |
|
|
|
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
TimeAxis.prototype = new Component(); |
|
|
TimeAxis.prototype = new Component(); |
|
|
|
|
|
|
|
|
// TODO: comment options
|
|
|
// TODO: comment options
|
|
|
TimeAxis.prototype.setOptions = function (options) { |
|
|
|
|
|
if (options) { |
|
|
|
|
|
util.extend(this.options, options); |
|
|
|
|
|
} |
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
TimeAxis.prototype.setOptions = Component.prototype.setOptions; |
|
|
|
|
|
|
|
|
/** |
|
|
/** |
|
|
* Set a range (start and end) |
|
|
* Set a range (start and end) |
|
@ -4584,7 +4571,7 @@ function ItemSet(parent, depends, options) { |
|
|
this.depends = depends; |
|
|
this.depends = depends; |
|
|
|
|
|
|
|
|
// one options object is shared by this itemset and all its items
|
|
|
// one options object is shared by this itemset and all its items
|
|
|
this.options = Object.create(parent && parent.options || null); |
|
|
|
|
|
|
|
|
this.options = options || {}; |
|
|
this.defaultOptions = { |
|
|
this.defaultOptions = { |
|
|
style: 'box', |
|
|
style: 'box', |
|
|
align: 'center', |
|
|
align: 'center', |
|
@ -4622,10 +4609,10 @@ function ItemSet(parent, depends, options) { |
|
|
|
|
|
|
|
|
this.items = {}; // object with an Item for every data item
|
|
|
this.items = {}; // object with an Item for every data item
|
|
|
this.queue = {}; // queue with id/actions: 'add', 'update', 'delete'
|
|
|
this.queue = {}; // queue with id/actions: 'add', 'update', 'delete'
|
|
|
this.stack = new Stack(this); |
|
|
|
|
|
|
|
|
this.stack = new Stack(this, Object.create(this.options)); |
|
|
this.conversion = null; |
|
|
this.conversion = null; |
|
|
|
|
|
|
|
|
this.setOptions(options); |
|
|
|
|
|
|
|
|
// TODO: ItemSet should also attach event listeners for rangechange and rangechanged, like timeaxis
|
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
ItemSet.prototype = new Panel(); |
|
|
ItemSet.prototype = new Panel(); |
|
@ -4662,13 +4649,7 @@ ItemSet.types = { |
|
|
* Padding of the contents of an item in pixels. |
|
|
* Padding of the contents of an item in pixels. |
|
|
* Must correspond with the items css. Default is 5. |
|
|
* Must correspond with the items css. Default is 5. |
|
|
*/ |
|
|
*/ |
|
|
ItemSet.prototype.setOptions = function setOptions(options) { |
|
|
|
|
|
if (options) { |
|
|
|
|
|
util.extend(this.options, options); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// TODO: ItemSet should also attach event listeners for rangechange and rangechanged, like timeaxis
|
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
ItemSet.prototype.setOptions = Component.prototype.setOptions; |
|
|
|
|
|
|
|
|
/** |
|
|
/** |
|
|
* Set range (start and end). |
|
|
* Set range (start and end). |
|
@ -6019,24 +6000,19 @@ function Group (parent, groupId, options) { |
|
|
this.groupId = groupId; |
|
|
this.groupId = groupId; |
|
|
this.itemsData = null; // DataSet
|
|
|
this.itemsData = null; // DataSet
|
|
|
this.itemset = null; // ItemSet
|
|
|
this.itemset = null; // ItemSet
|
|
|
this.options = Object.create(parent && parent.options || null); |
|
|
|
|
|
|
|
|
this.options = options || {}; |
|
|
this.options.top = 0; |
|
|
this.options.top = 0; |
|
|
|
|
|
|
|
|
this.top = 0; |
|
|
this.top = 0; |
|
|
this.left = 0; |
|
|
this.left = 0; |
|
|
this.width = 0; |
|
|
this.width = 0; |
|
|
this.height = 0; |
|
|
this.height = 0; |
|
|
|
|
|
|
|
|
this.setOptions(options); |
|
|
|
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
Group.prototype = new Component(); |
|
|
Group.prototype = new Component(); |
|
|
|
|
|
|
|
|
Group.prototype.setOptions = function setOptions(options) { |
|
|
|
|
|
if (options) { |
|
|
|
|
|
util.extend(this.options, options); |
|
|
|
|
|
} |
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
// TODO: comment
|
|
|
|
|
|
Group.prototype.setOptions = Component.prototype.setOptions; |
|
|
|
|
|
|
|
|
/** |
|
|
/** |
|
|
* Get the container element of the panel, which can be used by a child to |
|
|
* Get the container element of the panel, which can be used by a child to |
|
@ -6065,7 +6041,8 @@ Group.prototype.setItems = function setItems(items) { |
|
|
if (items) { |
|
|
if (items) { |
|
|
var groupId = this.groupId; |
|
|
var groupId = this.groupId; |
|
|
|
|
|
|
|
|
this.itemset = new ItemSet(this); |
|
|
|
|
|
|
|
|
var itemsetOptions = Object.create(this.options); |
|
|
|
|
|
this.itemset = new ItemSet(this, null, itemsetOptions); |
|
|
this.itemset.setRange(this.parent.range); |
|
|
this.itemset.setRange(this.parent.range); |
|
|
|
|
|
|
|
|
this.view = new DataView(items, { |
|
|
this.view = new DataView(items, { |
|
@ -6116,7 +6093,7 @@ function GroupSet(parent, depends, options) { |
|
|
this.parent = parent; |
|
|
this.parent = parent; |
|
|
this.depends = depends; |
|
|
this.depends = depends; |
|
|
|
|
|
|
|
|
this.options = Object.create(parent && parent.options || null); |
|
|
|
|
|
|
|
|
this.options = options || {}; |
|
|
|
|
|
|
|
|
this.range = null; // Range or Object {start: number, end: number}
|
|
|
this.range = null; // Range or Object {start: number, end: number}
|
|
|
this.itemsData = null; // DataSet with items
|
|
|
this.itemsData = null; // DataSet with items
|
|
@ -6139,8 +6116,6 @@ function GroupSet(parent, depends, options) { |
|
|
me._onRemove(params.items); |
|
|
me._onRemove(params.items); |
|
|
} |
|
|
} |
|
|
}; |
|
|
}; |
|
|
|
|
|
|
|
|
this.setOptions(options); |
|
|
|
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
GroupSet.prototype = new Panel(); |
|
|
GroupSet.prototype = new Panel(); |
|
@ -6150,11 +6125,7 @@ GroupSet.prototype = new Panel(); |
|
|
* @param {Object} [options] The following options are available: |
|
|
* @param {Object} [options] The following options are available: |
|
|
* TODO: describe options |
|
|
* TODO: describe options |
|
|
*/ |
|
|
*/ |
|
|
GroupSet.prototype.setOptions = function setOptions(options) { |
|
|
|
|
|
if (options) { |
|
|
|
|
|
util.extend(this.options, options); |
|
|
|
|
|
} |
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
GroupSet.prototype.setOptions = Component.prototype.setOptions; |
|
|
|
|
|
|
|
|
GroupSet.prototype.setRange = function (range) { |
|
|
GroupSet.prototype.setRange = function (range) { |
|
|
// TODO: implement setRange
|
|
|
// TODO: implement setRange
|
|
@ -6314,7 +6285,8 @@ GroupSet.prototype.repaint = function repaint() { |
|
|
case 'add': |
|
|
case 'add': |
|
|
case 'update': |
|
|
case 'update': |
|
|
if (!group) { |
|
|
if (!group) { |
|
|
group = new Group(me, id); |
|
|
|
|
|
|
|
|
var groupOptions = Object.create(me.options); |
|
|
|
|
|
group = new Group(me, id, groupOptions); |
|
|
group.setItems(me.itemsData); // attach items data
|
|
|
group.setItems(me.itemsData); // attach items data
|
|
|
groups.push(group); |
|
|
groups.push(group); |
|
|
|
|
|
|
|
@ -6551,7 +6523,7 @@ function Timeline (container, items, options) { |
|
|
// TODO: put the listeners in setOptions, be able to dynamically change with options moveable and zoomable
|
|
|
// TODO: put the listeners in setOptions, be able to dynamically change with options moveable and zoomable
|
|
|
|
|
|
|
|
|
// time axis
|
|
|
// time axis
|
|
|
var timeaxisOptions = Object.create(this.options); |
|
|
|
|
|
|
|
|
var timeaxisOptions = Object.create(mainOptions); |
|
|
timeaxisOptions.range = this.range; |
|
|
timeaxisOptions.range = this.range; |
|
|
this.timeaxis = new TimeAxis(this.root, [], timeaxisOptions); |
|
|
this.timeaxis = new TimeAxis(this.root, [], timeaxisOptions); |
|
|
this.timeaxis.setRange(this.range); |
|
|
this.timeaxis.setRange(this.range); |
|
@ -6563,9 +6535,6 @@ function Timeline (container, items, options) { |
|
|
this.itemsData = null; // DataSet
|
|
|
this.itemsData = null; // DataSet
|
|
|
this.groupsData = null; // DataSet
|
|
|
this.groupsData = null; // DataSet
|
|
|
|
|
|
|
|
|
// set options (must take place before setting the data)
|
|
|
|
|
|
this.setOptions(options); |
|
|
|
|
|
|
|
|
|
|
|
// set data
|
|
|
// set data
|
|
|
if (items) { |
|
|
if (items) { |
|
|
this.setItems(items); |
|
|
this.setItems(items); |
|
@ -6666,7 +6635,8 @@ Timeline.prototype.setGroups = function(groups) { |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
// create new content set
|
|
|
// create new content set
|
|
|
var options = { |
|
|
|
|
|
|
|
|
var options = Object.create(this.options); |
|
|
|
|
|
util.extend(options, { |
|
|
top: function () { |
|
|
top: function () { |
|
|
if (me.options.orientation == 'top') { |
|
|
if (me.options.orientation == 'top') { |
|
|
return me.timeaxis.height; |
|
|
return me.timeaxis.height; |
|
@ -6694,7 +6664,7 @@ Timeline.prototype.setGroups = function(groups) { |
|
|
return null; |
|
|
return null; |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
}; |
|
|
|
|
|
|
|
|
}); |
|
|
this.content = new type(this.root, [this.timeaxis], options); |
|
|
this.content = new type(this.root, [this.timeaxis], options); |
|
|
if (this.content.setRange) { |
|
|
if (this.content.setRange) { |
|
|
this.content.setRange(this.range); |
|
|
this.content.setRange(this.range); |
|
|