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,251 @@
1
+ /**
2
+ * @constructor ItemRange
3
+ * @extends Item
4
+ * @param {ItemSet} parent
5
+ * @param {Object} data Object containing parameters start, end
6
+ * content, className.
7
+ * @param {Object} [options] Options to set initial property values
8
+ * @param {Object} [defaultOptions] default options
9
+ * // TODO: describe available options
10
+ */
11
+ function ItemRange (parent, data, options, defaultOptions) {
12
+ this.props = {
13
+ content: {
14
+ left: 0,
15
+ width: 0
16
+ }
17
+ };
18
+
19
+ Item.call(this, parent, data, options, defaultOptions);
20
+ }
21
+
22
+ ItemRange.prototype = new Item (null, null);
23
+
24
+ /**
25
+ * Repaint the item
26
+ * @return {Boolean} changed
27
+ */
28
+ ItemRange.prototype.repaint = function repaint() {
29
+ // TODO: make an efficient repaint
30
+ var changed = false;
31
+ var dom = this.dom;
32
+
33
+ if (!dom) {
34
+ this._create();
35
+ dom = this.dom;
36
+ changed = true;
37
+ }
38
+
39
+ if (dom) {
40
+ if (!this.parent) {
41
+ throw new Error('Cannot repaint item: no parent attached');
42
+ }
43
+ var foreground = this.parent.getForeground();
44
+ if (!foreground) {
45
+ throw new Error('Cannot repaint time axis: ' +
46
+ 'parent has no foreground container element');
47
+ }
48
+
49
+ if (!dom.box.parentNode) {
50
+ foreground.appendChild(dom.box);
51
+ changed = true;
52
+ }
53
+
54
+ // update content
55
+ if (this.data.content != this.content) {
56
+ this.content = this.data.content;
57
+ if (this.content instanceof Element) {
58
+ dom.content.innerHTML = '';
59
+ dom.content.appendChild(this.content);
60
+ }
61
+ else if (this.data.content != undefined) {
62
+ dom.content.innerHTML = this.content;
63
+ }
64
+ else {
65
+ throw new Error('Property "content" missing in item ' + this.data.id);
66
+ }
67
+ changed = true;
68
+ }
69
+
70
+ // update class
71
+ var className = (this.data.className? ' ' + this.data.className : '') +
72
+ (this.selected ? ' selected' : '');
73
+ if (this.className != className) {
74
+ this.className = className;
75
+ dom.box.className = 'item range' + className;
76
+ changed = true;
77
+ }
78
+ }
79
+
80
+ return changed;
81
+ };
82
+
83
+ /**
84
+ * Show the item in the DOM (when not already visible). The items DOM will
85
+ * be created when needed.
86
+ * @return {Boolean} changed
87
+ */
88
+ ItemRange.prototype.show = function show() {
89
+ if (!this.dom || !this.dom.box.parentNode) {
90
+ return this.repaint();
91
+ }
92
+ else {
93
+ return false;
94
+ }
95
+ };
96
+
97
+ /**
98
+ * Hide the item from the DOM (when visible)
99
+ * @return {Boolean} changed
100
+ */
101
+ ItemRange.prototype.hide = function hide() {
102
+ var changed = false,
103
+ dom = this.dom;
104
+ if (dom) {
105
+ if (dom.box.parentNode) {
106
+ dom.box.parentNode.removeChild(dom.box);
107
+ changed = true;
108
+ }
109
+ }
110
+ return changed;
111
+ };
112
+
113
+ /**
114
+ * Reflow the item: calculate its actual size from the DOM
115
+ * @return {boolean} resized returns true if the axis is resized
116
+ * @override
117
+ */
118
+ ItemRange.prototype.reflow = function reflow() {
119
+ var changed = 0,
120
+ dom,
121
+ props,
122
+ options,
123
+ margin,
124
+ padding,
125
+ parent,
126
+ start,
127
+ end,
128
+ data,
129
+ range,
130
+ update,
131
+ box,
132
+ parentWidth,
133
+ contentLeft,
134
+ orientation,
135
+ top;
136
+
137
+ if (this.data.start == undefined) {
138
+ throw new Error('Property "start" missing in item ' + this.data.id);
139
+ }
140
+ if (this.data.end == undefined) {
141
+ throw new Error('Property "end" missing in item ' + this.data.id);
142
+ }
143
+
144
+ data = this.data;
145
+ range = this.parent && this.parent.range;
146
+ if (data && range) {
147
+ // TODO: account for the width of the item. Take some margin
148
+ this.visible = (data.start < range.end) && (data.end > range.start);
149
+ }
150
+ else {
151
+ this.visible = false;
152
+ }
153
+
154
+ if (this.visible) {
155
+ dom = this.dom;
156
+ if (dom) {
157
+ props = this.props;
158
+ options = this.options;
159
+ parent = this.parent;
160
+ start = parent.toScreen(this.data.start);
161
+ end = parent.toScreen(this.data.end);
162
+ update = util.updateProperty;
163
+ box = dom.box;
164
+ parentWidth = parent.width;
165
+ orientation = options.orientation || this.defaultOptions.orientation;
166
+ margin = options.margin && options.margin.axis || this.defaultOptions.margin.axis;
167
+ padding = options.padding || this.defaultOptions.padding;
168
+
169
+ changed += update(props.content, 'width', dom.content.offsetWidth);
170
+
171
+ changed += update(this, 'height', box.offsetHeight);
172
+
173
+ // limit the width of the this, as browsers cannot draw very wide divs
174
+ if (start < -parentWidth) {
175
+ start = -parentWidth;
176
+ }
177
+ if (end > 2 * parentWidth) {
178
+ end = 2 * parentWidth;
179
+ }
180
+
181
+ // when range exceeds left of the window, position the contents at the left of the visible area
182
+ if (start < 0) {
183
+ contentLeft = Math.min(-start,
184
+ (end - start - props.content.width - 2 * padding));
185
+ // TODO: remove the need for options.padding. it's terrible.
186
+ }
187
+ else {
188
+ contentLeft = 0;
189
+ }
190
+ changed += update(props.content, 'left', contentLeft);
191
+
192
+ if (orientation == 'top') {
193
+ top = margin;
194
+ changed += update(this, 'top', top);
195
+ }
196
+ else {
197
+ // default or 'bottom'
198
+ top = parent.height - this.height - margin;
199
+ changed += update(this, 'top', top);
200
+ }
201
+
202
+ changed += update(this, 'left', start);
203
+ changed += update(this, 'width', Math.max(end - start, 1)); // TODO: reckon with border width;
204
+ }
205
+ else {
206
+ changed += 1;
207
+ }
208
+ }
209
+
210
+ return (changed > 0);
211
+ };
212
+
213
+ /**
214
+ * Create an items DOM
215
+ * @private
216
+ */
217
+ ItemRange.prototype._create = function _create() {
218
+ var dom = this.dom;
219
+ if (!dom) {
220
+ this.dom = dom = {};
221
+ // background box
222
+ dom.box = document.createElement('div');
223
+ // className is updated in repaint()
224
+
225
+ // contents box
226
+ dom.content = document.createElement('div');
227
+ dom.content.className = 'content';
228
+ dom.box.appendChild(dom.content);
229
+
230
+ // attach this item as attribute
231
+ dom.box['timeline-item'] = this;
232
+ }
233
+ };
234
+
235
+ /**
236
+ * Reposition the item, recalculate its left, top, and width, using the current
237
+ * range and size of the items itemset
238
+ * @override
239
+ */
240
+ ItemRange.prototype.reposition = function reposition() {
241
+ var dom = this.dom,
242
+ props = this.props;
243
+
244
+ if (dom) {
245
+ dom.box.style.top = this.top + 'px';
246
+ dom.box.style.left = this.left + 'px';
247
+ dom.box.style.width = this.width + 'px';
248
+
249
+ dom.content.style.left = props.content.left + 'px';
250
+ }
251
+ };
@@ -0,0 +1,91 @@
1
+ /**
2
+ * @constructor ItemRangeOverflow
3
+ * @extends ItemRange
4
+ * @param {ItemSet} parent
5
+ * @param {Object} data Object containing parameters start, end
6
+ * content, className.
7
+ * @param {Object} [options] Options to set initial property values
8
+ * @param {Object} [defaultOptions] default options
9
+ * // TODO: describe available options
10
+ */
11
+ function ItemRangeOverflow (parent, data, options, defaultOptions) {
12
+ this.props = {
13
+ content: {
14
+ left: 0,
15
+ width: 0
16
+ }
17
+ };
18
+
19
+ ItemRange.call(this, parent, data, options, defaultOptions);
20
+ }
21
+
22
+ ItemRangeOverflow.prototype = new ItemRange (null, null);
23
+
24
+ /**
25
+ * Repaint the item
26
+ * @return {Boolean} changed
27
+ */
28
+ ItemRangeOverflow.prototype.repaint = function repaint() {
29
+ // TODO: make an efficient repaint
30
+ var changed = false;
31
+ var dom = this.dom;
32
+
33
+ if (!dom) {
34
+ this._create();
35
+ dom = this.dom;
36
+ changed = true;
37
+ }
38
+
39
+ if (dom) {
40
+ if (!this.parent) {
41
+ throw new Error('Cannot repaint item: no parent attached');
42
+ }
43
+ var foreground = this.parent.getForeground();
44
+ if (!foreground) {
45
+ throw new Error('Cannot repaint time axis: ' +
46
+ 'parent has no foreground container element');
47
+ }
48
+
49
+ if (!dom.box.parentNode) {
50
+ foreground.appendChild(dom.box);
51
+ changed = true;
52
+ }
53
+
54
+ // update content
55
+ if (this.data.content != this.content) {
56
+ this.content = this.data.content;
57
+ if (this.content instanceof Element) {
58
+ dom.content.innerHTML = '';
59
+ dom.content.appendChild(this.content);
60
+ }
61
+ else if (this.data.content != undefined) {
62
+ dom.content.innerHTML = this.content;
63
+ }
64
+ else {
65
+ throw new Error('Property "content" missing in item ' + this.data.id);
66
+ }
67
+ changed = true;
68
+ }
69
+
70
+ // update class
71
+ var className = this.data.className ? (' ' + this.data.className) : '';
72
+ if (this.className != className) {
73
+ this.className = className;
74
+ dom.box.className = 'item rangeoverflow' + className;
75
+ changed = true;
76
+ }
77
+ }
78
+
79
+ return changed;
80
+ };
81
+
82
+ /**
83
+ * Return the items width
84
+ * @return {Number} width
85
+ */
86
+ ItemRangeOverflow.prototype.getWidth = function getWidth() {
87
+ if (this.props.content !== undefined && this.width < this.props.content.width)
88
+ return this.props.content.width;
89
+ else
90
+ return this.width;
91
+ };