vis-rails 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
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