Browse Source

allowed deleting values with null and undefined. Fix for global variables, fix for edge color strings

flowchartTest
Alex de Mulder 9 years ago
parent
commit
357853e2ce
10 changed files with 1965 additions and 1875 deletions
  1. +1883
    -1836
      dist/vis.js
  2. +7
    -5
      examples/network/01_basic_usage.html
  3. +1
    -1
      lib/network/modules/EdgesHandler.js
  4. +1
    -1
      lib/network/modules/InteractionHandler.js
  5. +1
    -1
      lib/network/modules/NodesHandler.js
  6. +1
    -1
      lib/network/modules/components/AllOptions.js
  7. +19
    -7
      lib/network/modules/components/Edge.js
  8. +13
    -5
      lib/network/modules/components/Node.js
  9. +4
    -4
      lib/network/modules/components/shared/Label.js
  10. +35
    -14
      lib/util.js

+ 1883
- 1836
dist/vis.js
File diff suppressed because it is too large
View File


+ 7
- 5
examples/network/01_basic_usage.html View File

@ -19,8 +19,10 @@
<script type="text/javascript">
// create an array with nodes
var nodesDS = new vis.DataSet();
var nodes = [
{id: 1, label: 'Node 1', value:3, title:'hello world'},
{id: 1, label: 'Node 1', value:3, title:'hello world', color:'red'},
{id: 2, label: 'Node 2', value:1, group:'bla'},
{id: 3, label: 'Node 3', value:5},
{id: 4, value:3},
@ -38,17 +40,17 @@
// create a network
var container = document.getElementById('mynetwork');
nodesDS.add(nodes);
var data = {
nodes: nodes,
nodes: nodesDS,
edges: edges
};
var options = {
// physics:{barnesHut:{gravitationslPull:34}, solver:'banana'},
edges:{color:'red'}
}
var network = new vis.Network(container, data, options);
// network.setOptions({nodes:{color:'red'}})
network.on("rightClick",function(e){console.log(e)})
nodesDS.update({id:1, color:undefined,label:'hi'});
</script>
<pre>
var options = {

+ 1
- 1
lib/network/modules/EdgesHandler.js View File

@ -170,7 +170,7 @@ class EdgesHandler {
// update fonts in all edges
if (options.font !== undefined) {
// use the parser from the Label class to fill in all shorthand notations
Label.parseOptions(this.options,options);
Label.parseOptions(this.options, options);
for (let edgeId in this.body.edges) {
if (this.body.edges.hasOwnProperty(edgeId)) {
this.body.edges[edgeId].updateLabelModule();

+ 1
- 1
lib/network/modules/InteractionHandler.js View File

@ -64,7 +64,7 @@ class InteractionHandler {
if (options !== undefined) {
// extend all but the values in fields
let fields = ['keyboard'];
util.selectiveNotDeepExtend(fields,this.options, options);
util.selectiveNotDeepExtend(fields, this.options, options);
// merge the keyboard options in.
util.mergeOptions(this.options, options, 'keyboard');

+ 1
- 1
lib/network/modules/NodesHandler.js View File

@ -130,7 +130,7 @@ class NodesHandler {
// update the shape size in all nodes
if (options.font !== undefined) {
Label.parseOptions(this.options.font,options);
Label.parseOptions(this.options.font, options);
for (let nodeId in this.body.nodes) {
if (this.body.nodes.hasOwnProperty(nodeId)) {
this.body.nodes[nodeId].updateLabelModule();

+ 1
- 1
lib/network/modules/components/AllOptions.js View File

@ -47,7 +47,7 @@ let allOptions = {
hover: {string},
inherit: {string:['from','to','both'],boolean},
opacity: {number},
__type__: {object}
__type__: {object, string}
},
dashes: {
enabled: {boolean},

+ 19
- 7
lib/network/modules/components/Edge.js View File

@ -64,7 +64,7 @@ class Edge {
}
this.colorDirty = true;
Edge.parseOptions(this.options, options);
Edge.parseOptions(this.options, options, true);
if (options.id !== undefined) {this.id = options.id;}
if (options.from !== undefined) {this.fromId = options.from;}
@ -87,7 +87,7 @@ class Edge {
return dataChanged;
}
static parseOptions(parentOptions, newOptions) {
static parseOptions(parentOptions, newOptions, allowDeletion = false) {
var fields = [
'id',
'font',
@ -108,21 +108,25 @@ class Edge {
];
// only deep extend the items in the field array. These do not have shorthand.
util.selectiveDeepExtend(fields, parentOptions, newOptions);
util.selectiveDeepExtend(fields, parentOptions, newOptions, allowDeletion);
util.mergeOptions(parentOptions, newOptions, 'smooth');
util.mergeOptions(parentOptions, newOptions, 'dashes');
util.mergeOptions(parentOptions, newOptions, 'shadow');
// set the scaling newOptions
if (newOptions.scaling !== undefined) {
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');
}
else if (allowDeletion === true) {
parentOptions.scaling = undefined;
delete parentOptions.scaling;
}
// hanlde multiple input cases for arrows
if (newOptions.arrows !== undefined) {
if (newOptions.arrows !== undefined && newOptions.arrows !== null) {
if (typeof newOptions.arrows === 'string') {
let arrows = newOptions.arrows.toLowerCase();
if (arrows.indexOf("to") != -1) {parentOptions.arrows.to.enabled = true;}
@ -138,9 +142,13 @@ class Edge {
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) {
parentOptions.arrows = undefined;
delete parentOptions.arrows;
}
// hanlde multiple input cases for color
if (newOptions.color !== undefined) {
if (newOptions.color !== undefined && newOptions.color !== null) {
if (util.isString(newOptions.color)) {
parentOptions.color.color = newOptions.color;
parentOptions.color.highlight = newOptions.color;
@ -160,6 +168,10 @@ class Edge {
}
}
}
else if (allowDeletion === true) {
parentOptions.color = undefined;
delete parentOptions.color;
}
}
@ -167,7 +179,7 @@ class Edge {
* update the options in the label module
*/
updateLabelModule() {
this.labelModule.setOptions(this.options);
this.labelModule.setOptions(this.options, true);
if (this.labelModule.baseSize !== undefined) {
this.baseFontSize = this.labelModule.baseSize;
}

+ 13
- 5
lib/network/modules/components/Node.js View File

@ -125,7 +125,7 @@ class Node {
if (options.value !== undefined) {options.value = parseInt(options.value);}
// this transforms all shorthands into fully defined options
Node.parseOptions(this.options,options);
Node.parseOptions(this.options, options, true);
// copy group options
if (typeof options.group === 'number' || (typeof options.group === 'string' && options.group != '')) {
@ -159,7 +159,7 @@ class Node {
* @param parentOptions
* @param newOptions
*/
static parseOptions(parentOptions, newOptions) {
static parseOptions(parentOptions, newOptions, allowDeletion = false) {
var fields = [
'color',
'fixed',
@ -172,12 +172,16 @@ class Node {
util.mergeOptions(parentOptions, newOptions, 'shadow');
// individual shape newOptions
if (newOptions.color !== undefined) {
if (newOptions.color !== undefined && newOptions.color !== null) {
let parsedColor = util.parseColor(newOptions.color);
util.fillIfDefined(parentOptions.color, parsedColor);
}
else if (allowDeletion === true) {
parentOptions.color = undefined;
delete parentOptions.color;
}
if (newOptions.fixed !== undefined) {
if (newOptions.fixed !== undefined && newOptions.fixed !== null) {
if (typeof newOptions.fixed === 'boolean') {
parentOptions.fixed.x = newOptions.fixed;
parentOptions.fixed.y = newOptions.fixed;
@ -191,13 +195,17 @@ class Node {
}
}
}
else if (allowDeletion === true) {
parentOptions.fixed = undefined;
delete parentOptions.fixed;
}
}
updateLabelModule() {
if (this.options.label === undefined || this.options.label === null) {
this.options.label = '';
}
this.labelModule.setOptions(this.options);
this.labelModule.setOptions(this.options, true);
if (this.labelModule.baseSize !== undefined) {
this.baseFontSize = this.labelModule.baseSize;
}

+ 4
- 4
lib/network/modules/components/shared/Label.js View File

@ -9,7 +9,7 @@ class Label {
this.size = {top: 0, left: 0, width: 0, height: 0, yLine: 0}; // could be cached
}
setOptions(options) {
setOptions(options, allowDeletion = false) {
this.options = options;
if (options.label !== undefined) {
@ -17,7 +17,7 @@ class Label {
}
if (options.font !== undefined) {
Label.parseOptions(this.options.font,options);
Label.parseOptions(this.options.font, options, allowDeletion);
if (typeof options.font === 'string') {
this.baseSize = this.options.font.size;
}
@ -29,7 +29,7 @@ class Label {
}
}
static parseOptions(parentOptions, newOptions) {
static parseOptions(parentOptions, newOptions, allowDeletion = false) {
if (typeof newOptions.font === 'string') {
let newOptionsArray = newOptions.font.split(" ");
parentOptions.size = newOptionsArray[0].replace("px",'');
@ -37,7 +37,7 @@ class Label {
parentOptions.color = newOptionsArray[2];
}
else if (typeof newOptions.font === 'object') {
util.fillIfDefined(parentOptions, newOptions.font);
util.fillIfDefined(parentOptions, newOptions.font, global);
}
parentOptions.size = Number(parentOptions.size);
}

+ 35
- 14
lib/util.js View File

@ -118,11 +118,16 @@ exports.assignAllKeys = function (obj, value) {
* @param obj
* @param value
*/
exports.fillIfDefined = function (parentObj, newObj) {
for (var prop in parentObj) {
if (newObj[prop] !== undefined) {
if (typeof newObj[prop] !== 'object') {
parentObj[prop] = newObj[prop];
exports.fillIfDefined = function (a, b, allowDeletion = false) {
for (var prop in a) {
if (b[prop] !== undefined) {
if (typeof b[prop] !== 'object') {
if ((b[prop] === undefined || b[prop] === null) && a[prop] !== undefined && allowDeletion === true) {
a[prop] = b[prop];
}
else {
a[prop] = b[prop];
}
}
}
}
@ -169,7 +174,7 @@ exports.extend = function (a, b) {
* Only properties with defined values are copied
* @param {Array.<String>} props
* @param {Object} a
* @param {... Object} b
* @param {Object} b
* @return {Object} a
*/
exports.selectiveExtend = function (props, a, b) {
@ -195,10 +200,10 @@ exports.selectiveExtend = function (props, a, b) {
* Only properties with defined values are copied
* @param {Array.<String>} props
* @param {Object} a
* @param {... Object} b
* @param {Object} b
* @return {Object} a
*/
exports.selectiveDeepExtend = function (props, a, b) {
exports.selectiveDeepExtend = function (props, a, b, allowDeletion = false) {
// TODO: add support for Arrays to deepExtend
if (Array.isArray(b)) {
throw new TypeError('Arrays are not supported by deepExtend');
@ -216,7 +221,12 @@ exports.selectiveDeepExtend = function (props, a, b) {
exports.deepExtend(a[prop], b[prop]);
}
else {
a[prop] = b[prop];
if ((b[prop] === undefined || b[prop] === null) && a[prop] !== undefined && allowDeletion === true) {
delete a[prop];
}
else {
a[prop] = b[prop];
}
}
} else if (Array.isArray(b[prop])) {
throw new TypeError('Arrays are not supported by deepExtend');
@ -235,10 +245,10 @@ exports.selectiveDeepExtend = function (props, a, b) {
* Only properties with defined values are copied
* @param {Array.<String>} props
* @param {Object} a
* @param {... Object} b
* @param {Object} b
* @return {Object} a
*/
exports.selectiveNotDeepExtend = function (props, a, b) {
exports.selectiveNotDeepExtend = function (props, a, b, allowDeletion = false) {
// TODO: add support for Arrays to deepExtend
if (Array.isArray(b)) {
throw new TypeError('Arrays are not supported by deepExtend');
@ -254,7 +264,12 @@ exports.selectiveNotDeepExtend = function (props, a, b) {
exports.deepExtend(a[prop], b[prop]);
}
else {
a[prop] = b[prop];
if ((b[prop] === undefined || b[prop] === null) && a[prop] !== undefined && allowDeletion === true) {
delete a[prop];
}
else {
a[prop] = b[prop];
}
}
} else if (Array.isArray(b[prop])) {
throw new TypeError('Arrays are not supported by deepExtend');
@ -273,9 +288,10 @@ exports.selectiveNotDeepExtend = function (props, a, b) {
* @param {Object} b
* @param [Boolean] protoExtend --> optional parameter. If true, the prototype values will also be extended.
* (ie. the options objects that inherit from others will also get the inherited options)
* @param [Boolean] global --> optional parameter. If true, the values of fields that are undefined or null will not deleted
* @returns {Object}
*/
exports.deepExtend = function(a, b, protoExtend) {
exports.deepExtend = function(a, b, protoExtend, allowDeletion) {
for (var prop in b) {
if (b.hasOwnProperty(prop) || protoExtend === true) {
if (b[prop] && b[prop].constructor === Object) {
@ -286,7 +302,12 @@ exports.deepExtend = function(a, b, protoExtend) {
exports.deepExtend(a[prop], b[prop], protoExtend);
}
else {
a[prop] = b[prop];
if ((b[prop] === undefined || b[prop] === null) && a[prop] !== undefined && allowDeletion === true) {
delete a[prop];
}
else {
a[prop] = b[prop];
}
}
} else if (Array.isArray(b[prop])) {
a[prop] = [];

Loading…
Cancel
Save