vis-rails 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +17 -0
  3. data/.gitmodules +3 -0
  4. data/.project +11 -0
  5. data/Gemfile +4 -0
  6. data/LICENSE +202 -0
  7. data/README.md +29 -0
  8. data/Rakefile +1 -0
  9. data/lib/vis/rails/engine.rb +6 -0
  10. data/lib/vis/rails/version.rb +5 -0
  11. data/lib/vis/rails.rb +7 -0
  12. data/vendor/assets/javascripts/vis.js +1 -0
  13. data/vendor/assets/stylesheets/vis.css +3 -0
  14. data/vendor/assets/vis/DataSet.js +936 -0
  15. data/vendor/assets/vis/DataView.js +281 -0
  16. data/vendor/assets/vis/EventBus.js +89 -0
  17. data/vendor/assets/vis/events.js +116 -0
  18. data/vendor/assets/vis/graph/ClusterMixin.js +1019 -0
  19. data/vendor/assets/vis/graph/Edge.js +620 -0
  20. data/vendor/assets/vis/graph/Graph.js +2111 -0
  21. data/vendor/assets/vis/graph/Groups.js +80 -0
  22. data/vendor/assets/vis/graph/Images.js +41 -0
  23. data/vendor/assets/vis/graph/NavigationMixin.js +245 -0
  24. data/vendor/assets/vis/graph/Node.js +978 -0
  25. data/vendor/assets/vis/graph/Popup.js +105 -0
  26. data/vendor/assets/vis/graph/SectorsMixin.js +547 -0
  27. data/vendor/assets/vis/graph/SelectionMixin.js +515 -0
  28. data/vendor/assets/vis/graph/dotparser.js +829 -0
  29. data/vendor/assets/vis/graph/img/downarrow.png +0 -0
  30. data/vendor/assets/vis/graph/img/leftarrow.png +0 -0
  31. data/vendor/assets/vis/graph/img/minus.png +0 -0
  32. data/vendor/assets/vis/graph/img/plus.png +0 -0
  33. data/vendor/assets/vis/graph/img/rightarrow.png +0 -0
  34. data/vendor/assets/vis/graph/img/uparrow.png +0 -0
  35. data/vendor/assets/vis/graph/img/zoomExtends.png +0 -0
  36. data/vendor/assets/vis/graph/shapes.js +225 -0
  37. data/vendor/assets/vis/module/exports.js +68 -0
  38. data/vendor/assets/vis/module/header.js +24 -0
  39. data/vendor/assets/vis/module/imports.js +32 -0
  40. data/vendor/assets/vis/shim.js +252 -0
  41. data/vendor/assets/vis/timeline/Controller.js +172 -0
  42. data/vendor/assets/vis/timeline/Range.js +553 -0
  43. data/vendor/assets/vis/timeline/Stack.js +192 -0
  44. data/vendor/assets/vis/timeline/TimeStep.js +449 -0
  45. data/vendor/assets/vis/timeline/Timeline.js +476 -0
  46. data/vendor/assets/vis/timeline/component/Component.js +148 -0
  47. data/vendor/assets/vis/timeline/component/ContentPanel.js +113 -0
  48. data/vendor/assets/vis/timeline/component/CurrentTime.js +101 -0
  49. data/vendor/assets/vis/timeline/component/CustomTime.js +255 -0
  50. data/vendor/assets/vis/timeline/component/Group.js +129 -0
  51. data/vendor/assets/vis/timeline/component/GroupSet.js +546 -0
  52. data/vendor/assets/vis/timeline/component/ItemSet.js +612 -0
  53. data/vendor/assets/vis/timeline/component/Panel.js +112 -0
  54. data/vendor/assets/vis/timeline/component/RootPanel.js +215 -0
  55. data/vendor/assets/vis/timeline/component/TimeAxis.js +522 -0
  56. data/vendor/assets/vis/timeline/component/css/currenttime.css +5 -0
  57. data/vendor/assets/vis/timeline/component/css/customtime.css +6 -0
  58. data/vendor/assets/vis/timeline/component/css/groupset.css +59 -0
  59. data/vendor/assets/vis/timeline/component/css/item.css +93 -0
  60. data/vendor/assets/vis/timeline/component/css/itemset.css +17 -0
  61. data/vendor/assets/vis/timeline/component/css/panel.css +14 -0
  62. data/vendor/assets/vis/timeline/component/css/timeaxis.css +41 -0
  63. data/vendor/assets/vis/timeline/component/css/timeline.css +2 -0
  64. data/vendor/assets/vis/timeline/component/item/Item.js +81 -0
  65. data/vendor/assets/vis/timeline/component/item/ItemBox.js +302 -0
  66. data/vendor/assets/vis/timeline/component/item/ItemPoint.js +237 -0
  67. data/vendor/assets/vis/timeline/component/item/ItemRange.js +251 -0
  68. data/vendor/assets/vis/timeline/component/item/ItemRangeOverflow.js +91 -0
  69. data/vendor/assets/vis/util.js +673 -0
  70. data/vis-rails.gemspec +47 -0
  71. metadata +142 -0
@@ -0,0 +1,515 @@
1
+
2
+ var SelectionMixin = {
3
+
4
+ /**
5
+ * This function can be called from the _doInAllSectors function
6
+ *
7
+ * @param object
8
+ * @param overlappingNodes
9
+ * @private
10
+ */
11
+ _getNodesOverlappingWith : function(object, overlappingNodes) {
12
+ var nodes = this.nodes;
13
+ for (var nodeId in nodes) {
14
+ if (nodes.hasOwnProperty(nodeId)) {
15
+ if (nodes[nodeId].isOverlappingWith(object)) {
16
+ overlappingNodes.push(nodeId);
17
+ }
18
+ }
19
+ }
20
+ },
21
+
22
+ /**
23
+ * retrieve all nodes overlapping with given object
24
+ * @param {Object} object An object with parameters left, top, right, bottom
25
+ * @return {Number[]} An array with id's of the overlapping nodes
26
+ * @private
27
+ */
28
+ _getAllNodesOverlappingWith : function (object) {
29
+ var overlappingNodes = [];
30
+ this._doInAllActiveSectors("_getNodesOverlappingWith",object,overlappingNodes);
31
+ return overlappingNodes;
32
+ },
33
+
34
+
35
+ /**
36
+ * retrieve all nodes in the navigation controls overlapping with given object
37
+ * @param {Object} object An object with parameters left, top, right, bottom
38
+ * @return {Number[]} An array with id's of the overlapping nodes
39
+ * @private
40
+ */
41
+ _getAllNavigationNodesOverlappingWith : function (object) {
42
+ var overlappingNodes = [];
43
+ this._doInNavigationSector("_getNodesOverlappingWith",object,overlappingNodes);
44
+ return overlappingNodes;
45
+ },
46
+
47
+ /**
48
+ * Return a position object in canvasspace from a single point in screenspace
49
+ *
50
+ * @param pointer
51
+ * @returns {{left: number, top: number, right: number, bottom: number}}
52
+ * @private
53
+ */
54
+ _pointerToPositionObject : function(pointer) {
55
+ var x = this._canvasToX(pointer.x);
56
+ var y = this._canvasToY(pointer.y);
57
+
58
+ return {left: x,
59
+ top: y,
60
+ right: x,
61
+ bottom: y};
62
+ },
63
+
64
+ /**
65
+ * Return a position object in canvasspace from a single point in screenspace
66
+ *
67
+ * @param pointer
68
+ * @returns {{left: number, top: number, right: number, bottom: number}}
69
+ * @private
70
+ */
71
+ _pointerToScreenPositionObject : function(pointer) {
72
+ var x = pointer.x;
73
+ var y = pointer.y;
74
+
75
+ return {left: x,
76
+ top: y,
77
+ right: x,
78
+ bottom: y};
79
+ },
80
+
81
+
82
+ /**
83
+ * Get the top navigation controls node at the a specific point (like a click)
84
+ *
85
+ * @param {{x: Number, y: Number}} pointer
86
+ * @return {Node | null} node
87
+ * @private
88
+ */
89
+ _getNavigationNodeAt : function (pointer) {
90
+ var screenPositionObject = this._pointerToScreenPositionObject(pointer);
91
+ var overlappingNodes = this._getAllNavigationNodesOverlappingWith(screenPositionObject);
92
+ if (overlappingNodes.length > 0) {
93
+ return this.sectors["navigation"]["nodes"][overlappingNodes[overlappingNodes.length - 1]];
94
+ }
95
+ else {
96
+ return null;
97
+ }
98
+ },
99
+
100
+
101
+ /**
102
+ * Get the top node at the a specific point (like a click)
103
+ *
104
+ * @param {{x: Number, y: Number}} pointer
105
+ * @return {Node | null} node
106
+ * @private
107
+ */
108
+ _getNodeAt : function (pointer) {
109
+ // we first check if this is an navigation controls element
110
+ var positionObject = this._pointerToPositionObject(pointer);
111
+ overlappingNodes = this._getAllNodesOverlappingWith(positionObject);
112
+
113
+ // if there are overlapping nodes, select the last one, this is the
114
+ // one which is drawn on top of the others
115
+ if (overlappingNodes.length > 0) {
116
+ return this.nodes[overlappingNodes[overlappingNodes.length - 1]];
117
+ }
118
+ else {
119
+ return null;
120
+ }
121
+ },
122
+
123
+
124
+ /**
125
+ * Place holder. To implement change the _getNodeAt to a _getObjectAt. Have the _getObjectAt call
126
+ * _getNodeAt and _getEdgesAt, then priortize the selection to user preferences.
127
+ *
128
+ * @param pointer
129
+ * @returns {null}
130
+ * @private
131
+ */
132
+ _getEdgeAt : function(pointer) {
133
+ return null;
134
+ },
135
+
136
+
137
+ /**
138
+ * Add object to the selection array. The this.selection id array may not be needed.
139
+ *
140
+ * @param obj
141
+ * @private
142
+ */
143
+ _addToSelection : function(obj) {
144
+ this.selection.push(obj.id);
145
+ this.selectionObj[obj.id] = obj;
146
+ },
147
+
148
+
149
+ /**
150
+ * Remove a single option from selection.
151
+ *
152
+ * @param obj
153
+ * @private
154
+ */
155
+ _removeFromSelection : function(obj) {
156
+ for (var i = 0; i < this.selection.length; i++) {
157
+ if (obj.id == this.selection[i]) {
158
+ this.selection.splice(i,1);
159
+ break;
160
+ }
161
+ }
162
+ delete this.selectionObj[obj.id];
163
+ },
164
+
165
+
166
+ /**
167
+ * Unselect all. The selectionObj is useful for this.
168
+ *
169
+ * @param {Boolean} [doNotTrigger] | ignore trigger
170
+ * @private
171
+ */
172
+ _unselectAll : function(doNotTrigger) {
173
+ if (doNotTrigger === undefined) {
174
+ doNotTrigger = false;
175
+ }
176
+
177
+ this.selection = [];
178
+ for (var objId in this.selectionObj) {
179
+ if (this.selectionObj.hasOwnProperty(objId)) {
180
+ this.selectionObj[objId].unselect();
181
+ }
182
+ }
183
+ this.selectionObj = {};
184
+
185
+ if (doNotTrigger == false) {
186
+ this._trigger('select', {
187
+ nodes: this.getSelection()
188
+ });
189
+ }
190
+ },
191
+
192
+
193
+ /**
194
+ * Check if anything is selected
195
+ *
196
+ * @returns {boolean}
197
+ * @private
198
+ */
199
+ _selectionIsEmpty : function() {
200
+ if (this.selection.length == 0) {
201
+ return true;
202
+ }
203
+ else {
204
+ return false;
205
+ }
206
+ },
207
+
208
+
209
+ /**
210
+ * This is called when someone clicks on a node. either select or deselect it.
211
+ * If there is an existing selection and we don't want to append to it, clear the existing selection
212
+ *
213
+ * @param {Node} node
214
+ * @param {Boolean} append
215
+ * @param {Boolean} [doNotTrigger] | ignore trigger
216
+ * @private
217
+ */
218
+ _selectNode : function(node, append, doNotTrigger) {
219
+ if (doNotTrigger === undefined) {
220
+ doNotTrigger = false;
221
+ }
222
+
223
+ if (this._selectionIsEmpty() == false && append == false) {
224
+ this._unselectAll(true);
225
+ }
226
+
227
+
228
+ if (node.selected == false) {
229
+ node.select();
230
+ this._addToSelection(node);
231
+ }
232
+ else {
233
+ node.unselect();
234
+ this._removeFromSelection(node);
235
+ }
236
+ if (doNotTrigger == false) {
237
+ this._trigger('select', {
238
+ nodes: this.getSelection()
239
+ });
240
+ }
241
+ },
242
+
243
+
244
+ /**
245
+ * handles the selection part of the touch, only for navigation controls elements;
246
+ * Touch is triggered before tap, also before hold. Hold triggers after a while.
247
+ * This is the most responsive solution
248
+ *
249
+ * @param {Object} pointer
250
+ * @private
251
+ */
252
+ _handleTouch : function(pointer) {
253
+ if (this.constants.navigation.enabled == true) {
254
+ var node = this._getNavigationNodeAt(pointer);
255
+ if (node != null) {
256
+ if (this[node.triggerFunction] !== undefined) {
257
+ this[node.triggerFunction]();
258
+ }
259
+ }
260
+ }
261
+ },
262
+
263
+
264
+ /**
265
+ * handles the selection part of the tap;
266
+ *
267
+ * @param {Object} pointer
268
+ * @private
269
+ */
270
+ _handleTap : function(pointer) {
271
+ var node = this._getNodeAt(pointer);
272
+ if (node != null) {
273
+ this._selectNode(node,false);
274
+ }
275
+ else {
276
+ this._unselectAll();
277
+ }
278
+ this._redraw();
279
+ },
280
+
281
+
282
+ /**
283
+ * handles the selection part of the double tap and opens a cluster if needed
284
+ *
285
+ * @param {Object} pointer
286
+ * @private
287
+ */
288
+ _handleDoubleTap : function(pointer) {
289
+ var node = this._getNodeAt(pointer);
290
+ if (node != null && node !== undefined) {
291
+ // we reset the areaCenter here so the opening of the node will occur
292
+ this.areaCenter = {"x" : this._canvasToX(pointer.x),
293
+ "y" : this._canvasToY(pointer.y)};
294
+ this.openCluster(node);
295
+ }
296
+ },
297
+
298
+
299
+ /**
300
+ * Handle the onHold selection part
301
+ *
302
+ * @param pointer
303
+ * @private
304
+ */
305
+ _handleOnHold : function(pointer) {
306
+ var node = this._getNodeAt(pointer);
307
+ if (node != null) {
308
+ this._selectNode(node,true);
309
+ }
310
+ this._redraw();
311
+ },
312
+
313
+
314
+ /**
315
+ * handle the onRelease event. These functions are here for the navigation controls module.
316
+ *
317
+ * @private
318
+ */
319
+ _handleOnRelease : function() {
320
+ this.xIncrement = 0;
321
+ this.yIncrement = 0;
322
+ this.zoomIncrement = 0;
323
+ this._unHighlightAll();
324
+ },
325
+
326
+
327
+
328
+ /**
329
+ *
330
+ * retrieve the currently selected nodes
331
+ * @return {Number[] | String[]} selection An array with the ids of the
332
+ * selected nodes.
333
+ */
334
+ getSelection : function() {
335
+ return this.selection.concat([]);
336
+ },
337
+
338
+ /**
339
+ *
340
+ * retrieve the currently selected nodes as objects
341
+ * @return {Objects} selection An array with the ids of the
342
+ * selected nodes.
343
+ */
344
+ getSelectionObjects : function() {
345
+ return this.selectionObj;
346
+ },
347
+
348
+ /**
349
+ * // TODO: rework this function, it is from the old system
350
+ *
351
+ * select zero or more nodes
352
+ * @param {Number[] | String[]} selection An array with the ids of the
353
+ * selected nodes.
354
+ */
355
+ setSelection : function(selection) {
356
+ var i, iMax, id;
357
+
358
+ if (!selection || (selection.length == undefined))
359
+ throw 'Selection must be an array with ids';
360
+
361
+ // first unselect any selected node
362
+ this._unselectAll(true);
363
+
364
+ for (i = 0, iMax = selection.length; i < iMax; i++) {
365
+ id = selection[i];
366
+
367
+ var node = this.nodes[id];
368
+ if (!node) {
369
+ throw new RangeError('Node with id "' + id + '" not found');
370
+ }
371
+ this._selectNode(node,true,true);
372
+ }
373
+
374
+ this.redraw();
375
+ },
376
+
377
+
378
+ /**
379
+ * TODO: rework this function, it is from the old system
380
+ *
381
+ * Validate the selection: remove ids of nodes which no longer exist
382
+ * @private
383
+ */
384
+ _updateSelection : function () {
385
+ var i = 0;
386
+ while (i < this.selection.length) {
387
+ var nodeId = this.selection[i];
388
+ if (!this.nodes.hasOwnProperty(nodeId)) {
389
+ this.selection.splice(i, 1);
390
+ delete this.selectionObj[nodeId];
391
+ }
392
+ else {
393
+ i++;
394
+ }
395
+ }
396
+ }
397
+
398
+
399
+ /**
400
+ * Unselect selected nodes. If no selection array is provided, all nodes
401
+ * are unselected
402
+ * @param {Object[]} selection Array with selection objects, each selection
403
+ * object has a parameter row. Optional
404
+ * @param {Boolean} triggerSelect If true (default), the select event
405
+ * is triggered when nodes are unselected
406
+ * @return {Boolean} changed True if the selection is changed
407
+ * @private
408
+ */
409
+ /* _unselectNodes : function(selection, triggerSelect) {
410
+ var changed = false;
411
+ var i, iMax, id;
412
+
413
+ if (selection) {
414
+ // remove provided selections
415
+ for (i = 0, iMax = selection.length; i < iMax; i++) {
416
+ id = selection[i];
417
+ if (this.nodes.hasOwnProperty(id)) {
418
+ this.nodes[id].unselect();
419
+ }
420
+ var j = 0;
421
+ while (j < this.selection.length) {
422
+ if (this.selection[j] == id) {
423
+ this.selection.splice(j, 1);
424
+ changed = true;
425
+ }
426
+ else {
427
+ j++;
428
+ }
429
+ }
430
+ }
431
+ }
432
+ else if (this.selection && this.selection.length) {
433
+ // remove all selections
434
+ for (i = 0, iMax = this.selection.length; i < iMax; i++) {
435
+ id = this.selection[i];
436
+ if (this.nodes.hasOwnProperty(id)) {
437
+ this.nodes[id].unselect();
438
+ }
439
+ changed = true;
440
+ }
441
+ this.selection = [];
442
+ }
443
+
444
+ if (changed && (triggerSelect == true || triggerSelect == undefined)) {
445
+ // fire the select event
446
+ this._trigger('select', {
447
+ nodes: this.getSelection()
448
+ });
449
+ }
450
+
451
+ return changed;
452
+ },
453
+ */
454
+ /**
455
+ * select all nodes on given location x, y
456
+ * @param {Array} selection an array with node ids
457
+ * @param {boolean} append If true, the new selection will be appended to the
458
+ * current selection (except for duplicate entries)
459
+ * @return {Boolean} changed True if the selection is changed
460
+ * @private
461
+ */
462
+ /* _selectNodes : function(selection, append) {
463
+ var changed = false;
464
+ var i, iMax;
465
+
466
+ // TODO: the selectNodes method is a little messy, rework this
467
+
468
+ // check if the current selection equals the desired selection
469
+ var selectionAlreadyThere = true;
470
+ if (selection.length != this.selection.length) {
471
+ selectionAlreadyThere = false;
472
+ }
473
+ else {
474
+ for (i = 0, iMax = Math.min(selection.length, this.selection.length); i < iMax; i++) {
475
+ if (selection[i] != this.selection[i]) {
476
+ selectionAlreadyThere = false;
477
+ break;
478
+ }
479
+ }
480
+ }
481
+ if (selectionAlreadyThere) {
482
+ return changed;
483
+ }
484
+
485
+ if (append == undefined || append == false) {
486
+ // first deselect any selected node
487
+ var triggerSelect = false;
488
+ changed = this._unselectNodes(undefined, triggerSelect);
489
+ }
490
+
491
+ for (i = 0, iMax = selection.length; i < iMax; i++) {
492
+ // add each of the new selections, but only when they are not duplicate
493
+ var id = selection[i];
494
+ var isDuplicate = (this.selection.indexOf(id) != -1);
495
+ if (!isDuplicate) {
496
+ this.nodes[id].select();
497
+ this.selection.push(id);
498
+ changed = true;
499
+ }
500
+ }
501
+
502
+ if (changed) {
503
+ // fire the select event
504
+ this._trigger('select', {
505
+ nodes: this.getSelection()
506
+ });
507
+ }
508
+
509
+ return changed;
510
+ },
511
+ */
512
+ };
513
+
514
+
515
+