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,673 @@
1
+ /**
2
+ * utility functions
3
+ */
4
+ var util = {};
5
+
6
+ /**
7
+ * Test whether given object is a number
8
+ * @param {*} object
9
+ * @return {Boolean} isNumber
10
+ */
11
+ util.isNumber = function isNumber(object) {
12
+ return (object instanceof Number || typeof object == 'number');
13
+ };
14
+
15
+ /**
16
+ * Test whether given object is a string
17
+ * @param {*} object
18
+ * @return {Boolean} isString
19
+ */
20
+ util.isString = function isString(object) {
21
+ return (object instanceof String || typeof object == 'string');
22
+ };
23
+
24
+ /**
25
+ * Test whether given object is a Date, or a String containing a Date
26
+ * @param {Date | String} object
27
+ * @return {Boolean} isDate
28
+ */
29
+ util.isDate = function isDate(object) {
30
+ if (object instanceof Date) {
31
+ return true;
32
+ }
33
+ else if (util.isString(object)) {
34
+ // test whether this string contains a date
35
+ var match = ASPDateRegex.exec(object);
36
+ if (match) {
37
+ return true;
38
+ }
39
+ else if (!isNaN(Date.parse(object))) {
40
+ return true;
41
+ }
42
+ }
43
+
44
+ return false;
45
+ };
46
+
47
+ /**
48
+ * Test whether given object is an instance of google.visualization.DataTable
49
+ * @param {*} object
50
+ * @return {Boolean} isDataTable
51
+ */
52
+ util.isDataTable = function isDataTable(object) {
53
+ return (typeof (google) !== 'undefined') &&
54
+ (google.visualization) &&
55
+ (google.visualization.DataTable) &&
56
+ (object instanceof google.visualization.DataTable);
57
+ };
58
+
59
+ /**
60
+ * Create a semi UUID
61
+ * source: http://stackoverflow.com/a/105074/1262753
62
+ * @return {String} uuid
63
+ */
64
+ util.randomUUID = function randomUUID () {
65
+ var S4 = function () {
66
+ return Math.floor(
67
+ Math.random() * 0x10000 /* 65536 */
68
+ ).toString(16);
69
+ };
70
+
71
+ return (
72
+ S4() + S4() + '-' +
73
+ S4() + '-' +
74
+ S4() + '-' +
75
+ S4() + '-' +
76
+ S4() + S4() + S4()
77
+ );
78
+ };
79
+
80
+ /**
81
+ * Extend object a with the properties of object b or a series of objects
82
+ * Only properties with defined values are copied
83
+ * @param {Object} a
84
+ * @param {... Object} b
85
+ * @return {Object} a
86
+ */
87
+ util.extend = function (a, b) {
88
+ for (var i = 1, len = arguments.length; i < len; i++) {
89
+ var other = arguments[i];
90
+ for (var prop in other) {
91
+ if (other.hasOwnProperty(prop) && other[prop] !== undefined) {
92
+ a[prop] = other[prop];
93
+ }
94
+ }
95
+ }
96
+
97
+ return a;
98
+ };
99
+
100
+ /**
101
+ * Convert an object to another type
102
+ * @param {Boolean | Number | String | Date | Moment | Null | undefined} object
103
+ * @param {String | undefined} type Name of the type. Available types:
104
+ * 'Boolean', 'Number', 'String',
105
+ * 'Date', 'Moment', ISODate', 'ASPDate'.
106
+ * @return {*} object
107
+ * @throws Error
108
+ */
109
+ util.convert = function convert(object, type) {
110
+ var match;
111
+
112
+ if (object === undefined) {
113
+ return undefined;
114
+ }
115
+ if (object === null) {
116
+ return null;
117
+ }
118
+
119
+ if (!type) {
120
+ return object;
121
+ }
122
+ if (!(typeof type === 'string') && !(type instanceof String)) {
123
+ throw new Error('Type must be a string');
124
+ }
125
+
126
+ //noinspection FallthroughInSwitchStatementJS
127
+ switch (type) {
128
+ case 'boolean':
129
+ case 'Boolean':
130
+ return Boolean(object);
131
+
132
+ case 'number':
133
+ case 'Number':
134
+ return Number(object.valueOf());
135
+
136
+ case 'string':
137
+ case 'String':
138
+ return String(object);
139
+
140
+ case 'Date':
141
+ if (util.isNumber(object)) {
142
+ return new Date(object);
143
+ }
144
+ if (object instanceof Date) {
145
+ return new Date(object.valueOf());
146
+ }
147
+ else if (moment.isMoment(object)) {
148
+ return new Date(object.valueOf());
149
+ }
150
+ if (util.isString(object)) {
151
+ match = ASPDateRegex.exec(object);
152
+ if (match) {
153
+ // object is an ASP date
154
+ return new Date(Number(match[1])); // parse number
155
+ }
156
+ else {
157
+ return moment(object).toDate(); // parse string
158
+ }
159
+ }
160
+ else {
161
+ throw new Error(
162
+ 'Cannot convert object of type ' + util.getType(object) +
163
+ ' to type Date');
164
+ }
165
+
166
+ case 'Moment':
167
+ if (util.isNumber(object)) {
168
+ return moment(object);
169
+ }
170
+ if (object instanceof Date) {
171
+ return moment(object.valueOf());
172
+ }
173
+ else if (moment.isMoment(object)) {
174
+ return moment(object);
175
+ }
176
+ if (util.isString(object)) {
177
+ match = ASPDateRegex.exec(object);
178
+ if (match) {
179
+ // object is an ASP date
180
+ return moment(Number(match[1])); // parse number
181
+ }
182
+ else {
183
+ return moment(object); // parse string
184
+ }
185
+ }
186
+ else {
187
+ throw new Error(
188
+ 'Cannot convert object of type ' + util.getType(object) +
189
+ ' to type Date');
190
+ }
191
+
192
+ case 'ISODate':
193
+ if (util.isNumber(object)) {
194
+ return new Date(object);
195
+ }
196
+ else if (object instanceof Date) {
197
+ return object.toISOString();
198
+ }
199
+ else if (moment.isMoment(object)) {
200
+ return object.toDate().toISOString();
201
+ }
202
+ else if (util.isString(object)) {
203
+ match = ASPDateRegex.exec(object);
204
+ if (match) {
205
+ // object is an ASP date
206
+ return new Date(Number(match[1])).toISOString(); // parse number
207
+ }
208
+ else {
209
+ return new Date(object).toISOString(); // parse string
210
+ }
211
+ }
212
+ else {
213
+ throw new Error(
214
+ 'Cannot convert object of type ' + util.getType(object) +
215
+ ' to type ISODate');
216
+ }
217
+
218
+ case 'ASPDate':
219
+ if (util.isNumber(object)) {
220
+ return '/Date(' + object + ')/';
221
+ }
222
+ else if (object instanceof Date) {
223
+ return '/Date(' + object.valueOf() + ')/';
224
+ }
225
+ else if (util.isString(object)) {
226
+ match = ASPDateRegex.exec(object);
227
+ var value;
228
+ if (match) {
229
+ // object is an ASP date
230
+ value = new Date(Number(match[1])).valueOf(); // parse number
231
+ }
232
+ else {
233
+ value = new Date(object).valueOf(); // parse string
234
+ }
235
+ return '/Date(' + value + ')/';
236
+ }
237
+ else {
238
+ throw new Error(
239
+ 'Cannot convert object of type ' + util.getType(object) +
240
+ ' to type ASPDate');
241
+ }
242
+
243
+ default:
244
+ throw new Error('Cannot convert object of type ' + util.getType(object) +
245
+ ' to type "' + type + '"');
246
+ }
247
+ };
248
+
249
+ // parse ASP.Net Date pattern,
250
+ // for example '/Date(1198908717056)/' or '/Date(1198908717056-0700)/'
251
+ // code from http://momentjs.com/
252
+ var ASPDateRegex = /^\/?Date\((\-?\d+)/i;
253
+
254
+ /**
255
+ * Get the type of an object, for example util.getType([]) returns 'Array'
256
+ * @param {*} object
257
+ * @return {String} type
258
+ */
259
+ util.getType = function getType(object) {
260
+ var type = typeof object;
261
+
262
+ if (type == 'object') {
263
+ if (object == null) {
264
+ return 'null';
265
+ }
266
+ if (object instanceof Boolean) {
267
+ return 'Boolean';
268
+ }
269
+ if (object instanceof Number) {
270
+ return 'Number';
271
+ }
272
+ if (object instanceof String) {
273
+ return 'String';
274
+ }
275
+ if (object instanceof Array) {
276
+ return 'Array';
277
+ }
278
+ if (object instanceof Date) {
279
+ return 'Date';
280
+ }
281
+ return 'Object';
282
+ }
283
+ else if (type == 'number') {
284
+ return 'Number';
285
+ }
286
+ else if (type == 'boolean') {
287
+ return 'Boolean';
288
+ }
289
+ else if (type == 'string') {
290
+ return 'String';
291
+ }
292
+
293
+ return type;
294
+ };
295
+
296
+ /**
297
+ * Retrieve the absolute left value of a DOM element
298
+ * @param {Element} elem A dom element, for example a div
299
+ * @return {number} left The absolute left position of this element
300
+ * in the browser page.
301
+ */
302
+ util.getAbsoluteLeft = function getAbsoluteLeft (elem) {
303
+ var doc = document.documentElement;
304
+ var body = document.body;
305
+
306
+ var left = elem.offsetLeft;
307
+ var e = elem.offsetParent;
308
+ while (e != null && e != body && e != doc) {
309
+ left += e.offsetLeft;
310
+ left -= e.scrollLeft;
311
+ e = e.offsetParent;
312
+ }
313
+ return left;
314
+ };
315
+
316
+ /**
317
+ * Retrieve the absolute top value of a DOM element
318
+ * @param {Element} elem A dom element, for example a div
319
+ * @return {number} top The absolute top position of this element
320
+ * in the browser page.
321
+ */
322
+ util.getAbsoluteTop = function getAbsoluteTop (elem) {
323
+ var doc = document.documentElement;
324
+ var body = document.body;
325
+
326
+ var top = elem.offsetTop;
327
+ var e = elem.offsetParent;
328
+ while (e != null && e != body && e != doc) {
329
+ top += e.offsetTop;
330
+ top -= e.scrollTop;
331
+ e = e.offsetParent;
332
+ }
333
+ return top;
334
+ };
335
+
336
+ /**
337
+ * Get the absolute, vertical mouse position from an event.
338
+ * @param {Event} event
339
+ * @return {Number} pageY
340
+ */
341
+ util.getPageY = function getPageY (event) {
342
+ if ('pageY' in event) {
343
+ return event.pageY;
344
+ }
345
+ else {
346
+ var clientY;
347
+ if (('targetTouches' in event) && event.targetTouches.length) {
348
+ clientY = event.targetTouches[0].clientY;
349
+ }
350
+ else {
351
+ clientY = event.clientY;
352
+ }
353
+
354
+ var doc = document.documentElement;
355
+ var body = document.body;
356
+ return clientY +
357
+ ( doc && doc.scrollTop || body && body.scrollTop || 0 ) -
358
+ ( doc && doc.clientTop || body && body.clientTop || 0 );
359
+ }
360
+ };
361
+
362
+ /**
363
+ * Get the absolute, horizontal mouse position from an event.
364
+ * @param {Event} event
365
+ * @return {Number} pageX
366
+ */
367
+ util.getPageX = function getPageX (event) {
368
+ if ('pageY' in event) {
369
+ return event.pageX;
370
+ }
371
+ else {
372
+ var clientX;
373
+ if (('targetTouches' in event) && event.targetTouches.length) {
374
+ clientX = event.targetTouches[0].clientX;
375
+ }
376
+ else {
377
+ clientX = event.clientX;
378
+ }
379
+
380
+ var doc = document.documentElement;
381
+ var body = document.body;
382
+ return clientX +
383
+ ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) -
384
+ ( doc && doc.clientLeft || body && body.clientLeft || 0 );
385
+ }
386
+ };
387
+
388
+ /**
389
+ * add a className to the given elements style
390
+ * @param {Element} elem
391
+ * @param {String} className
392
+ */
393
+ util.addClassName = function addClassName(elem, className) {
394
+ var classes = elem.className.split(' ');
395
+ if (classes.indexOf(className) == -1) {
396
+ classes.push(className); // add the class to the array
397
+ elem.className = classes.join(' ');
398
+ }
399
+ };
400
+
401
+ /**
402
+ * add a className to the given elements style
403
+ * @param {Element} elem
404
+ * @param {String} className
405
+ */
406
+ util.removeClassName = function removeClassname(elem, className) {
407
+ var classes = elem.className.split(' ');
408
+ var index = classes.indexOf(className);
409
+ if (index != -1) {
410
+ classes.splice(index, 1); // remove the class from the array
411
+ elem.className = classes.join(' ');
412
+ }
413
+ };
414
+
415
+ /**
416
+ * For each method for both arrays and objects.
417
+ * In case of an array, the built-in Array.forEach() is applied.
418
+ * In case of an Object, the method loops over all properties of the object.
419
+ * @param {Object | Array} object An Object or Array
420
+ * @param {function} callback Callback method, called for each item in
421
+ * the object or array with three parameters:
422
+ * callback(value, index, object)
423
+ */
424
+ util.forEach = function forEach (object, callback) {
425
+ var i,
426
+ len;
427
+ if (object instanceof Array) {
428
+ // array
429
+ for (i = 0, len = object.length; i < len; i++) {
430
+ callback(object[i], i, object);
431
+ }
432
+ }
433
+ else {
434
+ // object
435
+ for (i in object) {
436
+ if (object.hasOwnProperty(i)) {
437
+ callback(object[i], i, object);
438
+ }
439
+ }
440
+ }
441
+ };
442
+
443
+ /**
444
+ * Update a property in an object
445
+ * @param {Object} object
446
+ * @param {String} key
447
+ * @param {*} value
448
+ * @return {Boolean} changed
449
+ */
450
+ util.updateProperty = function updateProp (object, key, value) {
451
+ if (object[key] !== value) {
452
+ object[key] = value;
453
+ return true;
454
+ }
455
+ else {
456
+ return false;
457
+ }
458
+ };
459
+
460
+ /**
461
+ * Add and event listener. Works for all browsers
462
+ * @param {Element} element An html element
463
+ * @param {string} action The action, for example "click",
464
+ * without the prefix "on"
465
+ * @param {function} listener The callback function to be executed
466
+ * @param {boolean} [useCapture]
467
+ */
468
+ util.addEventListener = function addEventListener(element, action, listener, useCapture) {
469
+ if (element.addEventListener) {
470
+ if (useCapture === undefined)
471
+ useCapture = false;
472
+
473
+ if (action === "mousewheel" && navigator.userAgent.indexOf("Firefox") >= 0) {
474
+ action = "DOMMouseScroll"; // For Firefox
475
+ }
476
+
477
+ element.addEventListener(action, listener, useCapture);
478
+ } else {
479
+ element.attachEvent("on" + action, listener); // IE browsers
480
+ }
481
+ };
482
+
483
+ /**
484
+ * Remove an event listener from an element
485
+ * @param {Element} element An html dom element
486
+ * @param {string} action The name of the event, for example "mousedown"
487
+ * @param {function} listener The listener function
488
+ * @param {boolean} [useCapture]
489
+ */
490
+ util.removeEventListener = function removeEventListener(element, action, listener, useCapture) {
491
+ if (element.removeEventListener) {
492
+ // non-IE browsers
493
+ if (useCapture === undefined)
494
+ useCapture = false;
495
+
496
+ if (action === "mousewheel" && navigator.userAgent.indexOf("Firefox") >= 0) {
497
+ action = "DOMMouseScroll"; // For Firefox
498
+ }
499
+
500
+ element.removeEventListener(action, listener, useCapture);
501
+ } else {
502
+ // IE browsers
503
+ element.detachEvent("on" + action, listener);
504
+ }
505
+ };
506
+
507
+
508
+ /**
509
+ * Get HTML element which is the target of the event
510
+ * @param {Event} event
511
+ * @return {Element} target element
512
+ */
513
+ util.getTarget = function getTarget(event) {
514
+ // code from http://www.quirksmode.org/js/events_properties.html
515
+ if (!event) {
516
+ event = window.event;
517
+ }
518
+
519
+ var target;
520
+
521
+ if (event.target) {
522
+ target = event.target;
523
+ }
524
+ else if (event.srcElement) {
525
+ target = event.srcElement;
526
+ }
527
+
528
+ if (target.nodeType != undefined && target.nodeType == 3) {
529
+ // defeat Safari bug
530
+ target = target.parentNode;
531
+ }
532
+
533
+ return target;
534
+ };
535
+
536
+ /**
537
+ * Stop event propagation
538
+ */
539
+ util.stopPropagation = function stopPropagation(event) {
540
+ if (!event)
541
+ event = window.event;
542
+
543
+ if (event.stopPropagation) {
544
+ event.stopPropagation(); // non-IE browsers
545
+ }
546
+ else {
547
+ event.cancelBubble = true; // IE browsers
548
+ }
549
+ };
550
+
551
+ /**
552
+ * Fake a hammer.js gesture. Event can be a ScrollEvent or MouseMoveEvent
553
+ * @param {Element} element
554
+ * @param {Event} event
555
+ */
556
+ util.fakeGesture = function fakeGesture (element, event) {
557
+ var eventType = null;
558
+
559
+ // for hammer.js 1.0.5
560
+ return Hammer.event.collectEventData(this, eventType, event);
561
+
562
+ // for hammer.js 1.0.6
563
+ //var touches = Hammer.event.getTouchList(event, eventType);
564
+ //return Hammer.event.collectEventData(this, eventType, touches, event);
565
+ };
566
+
567
+ /**
568
+ * Cancels the event if it is cancelable, without stopping further propagation of the event.
569
+ */
570
+ util.preventDefault = function preventDefault (event) {
571
+ if (!event)
572
+ event = window.event;
573
+
574
+ if (event.preventDefault) {
575
+ event.preventDefault(); // non-IE browsers
576
+ }
577
+ else {
578
+ event.returnValue = false; // IE browsers
579
+ }
580
+ };
581
+
582
+
583
+ util.option = {};
584
+
585
+ /**
586
+ * Convert a value into a boolean
587
+ * @param {Boolean | function | undefined} value
588
+ * @param {Boolean} [defaultValue]
589
+ * @returns {Boolean} bool
590
+ */
591
+ util.option.asBoolean = function (value, defaultValue) {
592
+ if (typeof value == 'function') {
593
+ value = value();
594
+ }
595
+
596
+ if (value != null) {
597
+ return (value != false);
598
+ }
599
+
600
+ return defaultValue || null;
601
+ };
602
+
603
+ /**
604
+ * Convert a value into a number
605
+ * @param {Boolean | function | undefined} value
606
+ * @param {Number} [defaultValue]
607
+ * @returns {Number} number
608
+ */
609
+ util.option.asNumber = function (value, defaultValue) {
610
+ if (typeof value == 'function') {
611
+ value = value();
612
+ }
613
+
614
+ if (value != null) {
615
+ return Number(value) || defaultValue || null;
616
+ }
617
+
618
+ return defaultValue || null;
619
+ };
620
+
621
+ /**
622
+ * Convert a value into a string
623
+ * @param {String | function | undefined} value
624
+ * @param {String} [defaultValue]
625
+ * @returns {String} str
626
+ */
627
+ util.option.asString = function (value, defaultValue) {
628
+ if (typeof value == 'function') {
629
+ value = value();
630
+ }
631
+
632
+ if (value != null) {
633
+ return String(value);
634
+ }
635
+
636
+ return defaultValue || null;
637
+ };
638
+
639
+ /**
640
+ * Convert a size or location into a string with pixels or a percentage
641
+ * @param {String | Number | function | undefined} value
642
+ * @param {String} [defaultValue]
643
+ * @returns {String} size
644
+ */
645
+ util.option.asSize = function (value, defaultValue) {
646
+ if (typeof value == 'function') {
647
+ value = value();
648
+ }
649
+
650
+ if (util.isString(value)) {
651
+ return value;
652
+ }
653
+ else if (util.isNumber(value)) {
654
+ return value + 'px';
655
+ }
656
+ else {
657
+ return defaultValue || null;
658
+ }
659
+ };
660
+
661
+ /**
662
+ * Convert a value into a DOM element
663
+ * @param {HTMLElement | function | undefined} value
664
+ * @param {HTMLElement} [defaultValue]
665
+ * @returns {HTMLElement | null} dom
666
+ */
667
+ util.option.asElement = function (value, defaultValue) {
668
+ if (typeof value == 'function') {
669
+ value = value();
670
+ }
671
+
672
+ return value || defaultValue || null;
673
+ };
data/vis-rails.gemspec ADDED
@@ -0,0 +1,47 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'vis/rails/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "vis-rails"
8
+ spec.version = Vis::Rails::VERSION
9
+ spec.authors = ["AlexVangelov"]
10
+ spec.email = ["email@data.bg"]
11
+ spec.description = %q{This gem provides Rails driver for http://visjs.org browser-based visualization library}
12
+ spec.summary = %q{Using http://visjs.org visualization library with Rails}
13
+ spec.homepage = "https://github.com/AlexVangelov/vis-rails"
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files`.split($/)
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_development_dependency "bundler", "~> 1.3"
22
+ spec.add_development_dependency "rake"
23
+
24
+ # get an array of submodule dirs by executing 'pwd' inside each submodule
25
+ `git submodule --quiet foreach pwd`.split($\).each do |submodule_path|
26
+ # for each submodule, change working directory to that submodule
27
+ Dir.chdir(submodule_path) do
28
+
29
+ # issue git ls-files in submodule's directory
30
+ submodule_files = `git ls-files`.split($\)
31
+
32
+ # prepend the submodule path to create absolute file paths
33
+ submodule_files_fullpaths = submodule_files.map do |filename|
34
+ "#{submodule_path}/#{filename}"
35
+ end
36
+
37
+ # remove leading path parts to get paths relative to the gem's root dir
38
+ # (this assumes, that the gemspec resides in the gem's root dir)
39
+ submodule_files_paths = submodule_files_fullpaths.map do |filename|
40
+ filename.gsub "#{File.dirname(__FILE__)}/", ""
41
+ end
42
+
43
+ # add relative paths to gem.files
44
+ spec.files += submodule_files_paths
45
+ end
46
+ end
47
+ end