omf_web 0.9.1 → 0.9.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (243) hide show
  1. data/.gitignore +0 -1
  2. data/README.md +8 -2
  3. data/doc/screenshot.png +0 -0
  4. data/example/{basic → NOT_WORKING/basic}/hello-world-wired.rb +0 -0
  5. data/example/{basic → NOT_WORKING/basic}/visualisation.yml +0 -0
  6. data/example/{brooklyn → NOT_WORKING/brooklyn}/brooklynDemo.sq3 +0 -0
  7. data/example/{brooklyn → NOT_WORKING/brooklyn}/brooklyn_gps.dat +0 -0
  8. data/example/{brooklyn → NOT_WORKING/brooklyn}/brooklyn_server.rb +0 -0
  9. data/example/{brooklyn → NOT_WORKING/brooklyn}/brooklyn_wimax.dat +0 -0
  10. data/example/{brooklyn → NOT_WORKING/brooklyn}/sql_source.rb +0 -0
  11. data/example/{code → NOT_WORKING/code}/code_server.rb +0 -0
  12. data/example/{frisbee → NOT_WORKING/frisbee}/data_sources/parse_log.rb +0 -0
  13. data/example/{frisbee → NOT_WORKING/frisbee}/data_sources/pxe_slice-2012-06-02t02.25.00-04.00.log +0 -0
  14. data/example/{frisbee → NOT_WORKING/frisbee}/progress_chart.yaml +0 -0
  15. data/example/{frisbee → NOT_WORKING/frisbee}/progress_tab.yaml +0 -0
  16. data/example/{frisbee → NOT_WORKING/frisbee}/progress_table.yaml +0 -0
  17. data/example/{frisbee → NOT_WORKING/frisbee}/viz_server.rb +0 -0
  18. data/example/{gec12 → NOT_WORKING/gec12}/gec12-53.rb +0 -0
  19. data/example/{gec12 → NOT_WORKING/gec12}/gec12_demo.sq3 +0 -0
  20. data/example/{gec12 → NOT_WORKING/gec12}/gec12_demo_server.rb +0 -0
  21. data/example/{gec12 → NOT_WORKING/gec12}/visualization.rb +0 -0
  22. data/example/{incoming → NOT_WORKING/incoming}/ofpu_barchart_widget.yaml +0 -0
  23. data/example/{log → NOT_WORKING/log}/log_config.xml +0 -0
  24. data/example/{log → NOT_WORKING/log}/log_server.rb +0 -0
  25. data/example/{network → NOT_WORKING/network}/flow_tab.yaml +0 -0
  26. data/example/{network → NOT_WORKING/network}/network_server.rb +0 -0
  27. data/example/{text → NOT_WORKING/text}/test.md +0 -0
  28. data/example/{text → NOT_WORKING/text}/test.rb +0 -0
  29. data/example/{wimax → NOT_WORKING/wimax}/downlink.yaml +0 -0
  30. data/example/{wimax → NOT_WORKING/wimax}/power.yaml +0 -0
  31. data/example/{wimax → NOT_WORKING/wimax}/snapshot.db +0 -0
  32. data/example/{wimax → NOT_WORKING/wimax}/snapshot.sql +0 -0
  33. data/example/{wimax → NOT_WORKING/wimax}/test.rb +0 -0
  34. data/example/{wimax → NOT_WORKING/wimax}/uplink.yaml +0 -0
  35. data/example/{wimax → NOT_WORKING/wimax}/viz_server.rb +0 -0
  36. data/example/demo/data_sources/mobile_network.rb +3 -0
  37. data/example/demo/data_sources/static_network.rb +54 -0
  38. data/example/demo/widgets/charts_tab.yaml +21 -16
  39. data/example/demo/widgets/linked_graphs_tab.yaml +95 -0
  40. data/example/demo/widgets/mobile_network_widget.yaml +1 -1
  41. data/example/demo/widgets/pie_chart_widget.yaml +1 -1
  42. data/lib/omf-web/config.ru +2 -2
  43. data/lib/omf-web/data_source_proxy.rb +81 -19
  44. data/lib/omf-web/rack/websocket_handler.rb +77 -23
  45. data/lib/omf-web/theme/abstract_page.rb +43 -26
  46. data/lib/omf-web/theme/bright/code_renderer.rb +1 -1
  47. data/lib/omf-web/theme/bright/page.rb +1 -0
  48. data/lib/omf-web/theme/bright/tabbed_renderer.rb +7 -0
  49. data/lib/omf-web/version.rb +7 -0
  50. data/lib/omf-web/widget/data_widget.rb +38 -46
  51. data/lib/omf-web/widget/layout/stacked_layout.rb +2 -1
  52. data/lib/omf-web/widget/layout/tabbed_layout.rb +1 -2
  53. data/{MARUKU-LICENSE → lib/omf-web/widget/text/maruku/MARUKU-LICENSE} +0 -0
  54. data/lib/{maruku → omf-web/widget/text/maruku}/helpers.rb +0 -0
  55. data/lib/{maruku → omf-web/widget/text/maruku}/input/parse_block.rb +0 -0
  56. data/lib/{maruku → omf-web/widget/text/maruku}/output/to_html.rb +26 -21
  57. data/lib/omf-web/widget/text/maruku.rb +5 -0
  58. data/omf_web.gemspec +2 -1
  59. data/share/htdocs/{js → UNUSED}/log/table.js +0 -0
  60. data/share/htdocs/{css → graph/css}/graph.css +0 -0
  61. data/share/htdocs/{image/graph → graph/img}/bar_chart.png +0 -0
  62. data/share/htdocs/{image/graph → graph/img}/donut_chart.png +0 -0
  63. data/share/htdocs/{image/graph → graph/img}/funnel.png +0 -0
  64. data/share/htdocs/{image/graph → graph/img}/info.png +0 -0
  65. data/share/htdocs/{image/graph → graph/img}/line_chart.png +0 -0
  66. data/share/htdocs/{image/graph → graph/img}/line_chart_fill.png +0 -0
  67. data/share/htdocs/{image/graph → graph/img}/misc.png +0 -0
  68. data/share/htdocs/{image/graph → graph/img}/overview.png +0 -0
  69. data/share/htdocs/{image/graph → graph/img}/pie_chart.png +0 -0
  70. data/share/htdocs/{image/graph → graph/img}/scatter_plot.png +0 -0
  71. data/share/htdocs/{image/graph → graph/img}/stacked_bar_chart.png +0 -0
  72. data/share/htdocs/{image/graph → graph/img}/stacked_line_chart.png +0 -0
  73. data/share/htdocs/{image/graph → graph/img}/table.png +0 -0
  74. data/share/htdocs/{js/graph → graph/js}/abstract_chart.js +1 -1
  75. data/share/htdocs/{js/graph → graph/js}/abstract_nv_chart.js +8 -13
  76. data/share/htdocs/{js/graph → graph/js}/abstract_widget.js +9 -16
  77. data/share/htdocs/{js/graph → graph/js}/axis.js +1 -1
  78. data/share/htdocs/{js/graph → graph/js}/barchart.js +2 -2
  79. data/share/htdocs/{js/graph → graph/js}/code_mirror.js +1 -5
  80. data/share/htdocs/{js/graph → graph/js}/discrete_bar_chart.js +1 -1
  81. data/share/htdocs/{js/graph → graph/js}/histogram2.js +1 -1
  82. data/share/htdocs/{js/graph → graph/js}/holt_winters_chart.js +1 -1
  83. data/share/htdocs/{js/graph → graph/js}/line_chart3.js +1 -1
  84. data/share/htdocs/{js/graph → graph/js}/line_chart_with_focus.js +1 -1
  85. data/share/htdocs/{js/graph → graph/js}/map2.js +1 -1
  86. data/share/htdocs/{js/graph → graph/js}/multi_barchart.js +1 -1
  87. data/share/htdocs/graph/js/network2.js +412 -0
  88. data/share/htdocs/{js/graph → graph/js}/pie_chart2.js +1 -1
  89. data/share/htdocs/{js/graph → graph/js}/scatter_plot.js +1 -1
  90. data/share/htdocs/{js/graph → graph/js}/table2.js +17 -20
  91. data/share/htdocs/js/data_source2.js +187 -60
  92. data/share/htdocs/js/require3.js +38 -57
  93. data/share/htdocs/theme/bright/css/bright.css +4 -4
  94. data/share/htdocs/vendor/jquery/jquery.js +9404 -0
  95. data/share/htdocs/vendor/osa/LICENSE.txt +11 -0
  96. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_arrow_green_left.svg +0 -0
  97. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_arrow_yellow_right.svg +0 -0
  98. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_awareness.svg +0 -0
  99. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_camera-web.svg +0 -0
  100. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_cloud.svg +0 -0
  101. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_contract.svg +0 -0
  102. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_database.svg +0 -0
  103. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_desktop.svg +0 -0
  104. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_desktop_imac.svg +0 -0
  105. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_device-music.svg +0 -0
  106. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_device-scanner.svg +0 -0
  107. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_device-usb-wifi.svg +0 -0
  108. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_device-usb.svg +0 -0
  109. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_device-wireless-router.svg +0 -0
  110. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_disposal.svg +0 -0
  111. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_drive-harddisk.svg +0 -0
  112. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_drive-optical.svg +0 -0
  113. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_firewall.svg +0 -0
  114. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_home.svg +0 -0
  115. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_hub.svg +0 -0
  116. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_iPhone.svg +0 -0
  117. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_ics_drive.svg +0 -0
  118. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_ics_plc.svg +0 -0
  119. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_ics_thermometer.svg +0 -0
  120. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_id_card.svg +0 -0
  121. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_image-generic.svg +0 -0
  122. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_laptop.svg +0 -0
  123. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_lifecycle.svg +0 -0
  124. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_lightning.svg +0 -0
  125. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_media-flash.svg +0 -0
  126. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_media-optical.svg +0 -0
  127. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_media-tape.svg +0 -0
  128. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_mobile_pda.svg +0 -0
  129. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_padlock.svg +0 -0
  130. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_printer.svg +0 -0
  131. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_server.svg +0 -0
  132. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_server_application.svg +0 -0
  133. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_server_database.svg +0 -0
  134. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_server_directory.svg +0 -0
  135. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_server_distribution.svg +0 -0
  136. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_server_file.svg +0 -0
  137. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_server_gateway.svg +0 -0
  138. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_server_identity.svg +0 -0
  139. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_server_mail.svg +0 -0
  140. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_server_media.svg +0 -0
  141. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_server_monitor.svg +0 -0
  142. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_server_proxy.svg +0 -0
  143. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_server_terminal.svg +0 -0
  144. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_server_web.svg +0 -0
  145. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_site-branch.svg +0 -0
  146. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_site-factory.svg +0 -0
  147. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_site-head-office.svg +0 -0
  148. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_site-neighbourhood.svg +0 -0
  149. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_user_audit.svg +0 -0
  150. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_user_black_hat.svg +0 -0
  151. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_user_blue.svg +0 -0
  152. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_user_blue_security_specialist.svg +0 -0
  153. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_user_blue_sysadmin.svg +0 -0
  154. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_user_blue_tester.svg +0 -0
  155. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_user_blue_tie.svg +0 -0
  156. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_user_green.svg +0 -0
  157. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_user_green_architect.svg +0 -0
  158. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_user_green_business_manager.svg +0 -0
  159. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_user_green_developer.svg +0 -0
  160. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_user_green_operations.svg +0 -0
  161. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_user_green_project_manager.svg +0 -0
  162. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_user_green_service_manager.svg +0 -0
  163. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_user_green_warning.svg +0 -0
  164. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_user_large_group.svg +0 -0
  165. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_users_blue_green.svg +0 -0
  166. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_vpn.svg +0 -0
  167. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_warning.svg +0 -0
  168. data/share/htdocs/{svg/osa → vendor/osa/svg}/osa_wireless_network.svg +0 -0
  169. data/share/htdocs/{image → vendor/unknown/image}/.DS_Store +0 -0
  170. data/share/htdocs/{image → vendor/unknown/image}/add_icon.gif +0 -0
  171. data/share/htdocs/{image → vendor/unknown/image}/alertbad_icon.gif +0 -0
  172. data/share/htdocs/{image → vendor/unknown/image}/alertgood_icon.gif +0 -0
  173. data/share/htdocs/{image → vendor/unknown/image}/back_disabled.jpg +0 -0
  174. data/share/htdocs/{image → vendor/unknown/image}/back_disabled.png +0 -0
  175. data/share/htdocs/{image → vendor/unknown/image}/back_enabled.jpg +0 -0
  176. data/share/htdocs/{image → vendor/unknown/image}/back_enabled.png +0 -0
  177. data/share/htdocs/{image → vendor/unknown/image}/back_enabled_hover.jpg +0 -0
  178. data/share/htdocs/{image → vendor/unknown/image}/back_enabled_hover.png +0 -0
  179. data/share/htdocs/{image → vendor/unknown/image}/bottom-bg.gif +0 -0
  180. data/share/htdocs/{image → vendor/unknown/image}/forward_disabled.jpg +0 -0
  181. data/share/htdocs/{image → vendor/unknown/image}/forward_disabled.png +0 -0
  182. data/share/htdocs/{image → vendor/unknown/image}/forward_enabled.jpg +0 -0
  183. data/share/htdocs/{image → vendor/unknown/image}/forward_enabled.png +0 -0
  184. data/share/htdocs/{image → vendor/unknown/image}/forward_enabled_hover.jpg +0 -0
  185. data/share/htdocs/{image → vendor/unknown/image}/forward_enabled_hover.png +0 -0
  186. data/share/htdocs/{image → vendor/unknown/image}/icon-remove.gif +0 -0
  187. data/share/htdocs/{image → vendor/unknown/image}/indicator.gif +0 -0
  188. data/share/htdocs/{image → vendor/unknown/image}/laptop.png +0 -0
  189. data/share/htdocs/{image → vendor/unknown/image}/logo-bottom.gif +0 -0
  190. data/share/htdocs/{image → vendor/unknown/image}/nav-tab-arrow.gif +0 -0
  191. data/share/htdocs/{image → vendor/unknown/image}/norbit_big.gif +0 -0
  192. data/share/htdocs/{image → vendor/unknown/image}/norbit_clipart.png +0 -0
  193. data/share/htdocs/{image → vendor/unknown/image}/progress_bar.gif +0 -0
  194. data/share/htdocs/{image → vendor/unknown/image}/right-bg.gif +0 -0
  195. data/share/htdocs/{image → vendor/unknown/image}/sort_asc.png +0 -0
  196. data/share/htdocs/{image → vendor/unknown/image}/sort_asc_disabled.png +0 -0
  197. data/share/htdocs/{image → vendor/unknown/image}/sort_both.png +0 -0
  198. data/share/htdocs/{image → vendor/unknown/image}/sort_desc.png +0 -0
  199. data/share/htdocs/{image → vendor/unknown/image}/sort_desc_disabled.png +0 -0
  200. data/share/htdocs/{image → vendor/unknown/image}/spinner.gif +0 -0
  201. data/share/htdocs/{svg → vendor/unknown/svg}/ap.svg +0 -0
  202. data/share/htdocs/{svg → vendor/unknown/svg}/router.svg +0 -0
  203. metadata +198 -216
  204. data/example/demo/widgets/dashboard_tab.yaml +0 -28
  205. data/example/demo/widgets/download_tab.yaml +0 -42
  206. data/example/demo/widgets/edit_tab.yaml +0 -20
  207. data/example/demo/widgets/generator_tab.yaml +0 -12
  208. data/lib/omf-oml/endpoint.rb +0 -175
  209. data/lib/omf-oml/indexed_table.rb +0 -57
  210. data/lib/omf-oml/network.rb +0 -413
  211. data/lib/omf-oml/oml_tuple.rb +0 -62
  212. data/lib/omf-oml/schema.rb +0 -191
  213. data/lib/omf-oml/sequel/sequel_server.rb +0 -412
  214. data/lib/omf-oml/sql_row.rb +0 -302
  215. data/lib/omf-oml/sql_source.rb +0 -131
  216. data/lib/omf-oml/table.rb +0 -131
  217. data/lib/omf-oml/tuple.rb +0 -97
  218. data/lib/omf_oml.rb +0 -4
  219. data/share/htdocs/css/coderay.css +0 -127
  220. data/share/htdocs/css/ie.css +0 -40
  221. data/share/htdocs/css/lightbox.css +0 -62
  222. data/share/htdocs/css/scaffold.css +0 -74
  223. data/share/htdocs/css/screen.css +0 -1313
  224. data/share/htdocs/css/search.css +0 -102
  225. data/share/htdocs/css/table.css +0 -538
  226. data/share/htdocs/css/table2.css +0 -191
  227. data/share/htdocs/css/welcome.css +0 -103
  228. data/share/htdocs/css/wfob.css +0 -171
  229. data/share/htdocs/css/wshow.css +0 -69
  230. data/share/htdocs/gec9_demo.html +0 -39
  231. data/share/htdocs/images +0 -1
  232. data/share/htdocs/js/graph/histogram.js +0 -229
  233. data/share/htdocs/js/graph/line_chart.js +0 -342
  234. data/share/htdocs/js/graph/line_chart2.js +0 -232
  235. data/share/htdocs/js/graph/line_chart_fc.js +0 -94
  236. data/share/htdocs/js/graph/map.js +0 -85
  237. data/share/htdocs/js/graph/network.js +0 -591
  238. data/share/htdocs/js/graph/network2.js +0 -318
  239. data/share/htdocs/js/graph/pie_chart.js +0 -130
  240. data/share/htdocs/js/graph/table.js +0 -94
  241. data/share/htdocs/js/require2.js +0 -1998
  242. data/share/htdocs/js/timelines.js +0 -101
  243. data/share/htdocs/stylesheet/grid.css +0 -31
@@ -0,0 +1,412 @@
1
+ L.provide('OML.network2', ["graph/js/abstract_chart", "#OML.abstract_chart"], function () {
2
+
3
+
4
+
5
+ OML.network2 = OML.abstract_chart.extend({
6
+ decl_properties: {
7
+ nodes: [['key', 'key', {property: 'id'}],
8
+ ['radius', 'int', 30],
9
+ ['fill_color', 'color', 'blue'],
10
+ ['stroke_width', 'int', 1],
11
+ ['stroke_color', 'color', 'black'],
12
+ ['x', 'int', 10],
13
+ ['y', 'int', 10]
14
+ ],
15
+ links: [['key', 'key', {property: 'id'}],
16
+ ['stroke_width', 'int', 2],
17
+ ['stroke_color', 'color', 'black'],
18
+ ['stroke_fill', 'color', 'blue'],
19
+ ['from', 'index', {key: 'from_id', join_stream: 'nodes', join_key: 'id'}],
20
+ ['to', 'index', {key: 'to_id', join_stream: 'nodes'}] // join_key: 'id' ... default
21
+ ]
22
+ },
23
+
24
+ defaults: function() {
25
+ return this.deep_defaults({
26
+ interaction_mode: 'none', // none, hover, click
27
+ }, OML.network2.__super__.defaults.call(this));
28
+ },
29
+
30
+ configure_base_layer: function(vis) {
31
+ var ca = this.widget_area;
32
+
33
+ this.graph_layer = vis.append("svg:g")
34
+ .attr("transform", "translate(0, " + ca.h + ")")
35
+ ;
36
+ this.legend_layer = vis.append("svg:g");
37
+ },
38
+
39
+ base_css_class: 'oml-network',
40
+
41
+ // Find the appropriate data source and bind to it
42
+ //
43
+ init_data_source: function() {
44
+ var o = this.opts;
45
+ var sources = o.data_sources;
46
+ var self = this;
47
+
48
+ if (! (sources instanceof Array)) {
49
+ throw "Expected an array"
50
+ }
51
+ if (sources.length == 1) {
52
+ // Check if the source name is 'default' and we can find
53
+ // a _links and _nodes source
54
+ var s = sources[0];
55
+ if (s.name == 'default') {
56
+ // ok, lets expand it
57
+ var ss = s.stream;
58
+ if (typeof(ss) != 'object') {
59
+ ss = { name: ss };
60
+ }
61
+ var prefix = ss.name;
62
+ var sn = {}; for (var p in ss) { sn[p] = ss[p]; }; sn.name = prefix + '_nodes';
63
+ var sl = {}; for (var p in ss) { sl[p] = ss[p]; }; sl.name = prefix + '_links';
64
+ sources = [
65
+ {name: 'nodes', stream: sn},
66
+ {name: 'links', stream: sl},
67
+ ]
68
+ }
69
+ }
70
+ if (sources.length != 2) {
71
+ throw "Expected TWO data source, one for nodes and one for links"
72
+ }
73
+ var dsh = this.data_source = {};
74
+ _.map(sources, function(s) {
75
+ dsh[s.name] = self.init_single_data_source(s);
76
+ });
77
+ if (dsh.links == undefined || dsh.nodes == undefined) {
78
+ throw "Data sources need to be named 'links' and 'nodes'. Missing one or both.";
79
+ }
80
+ },
81
+
82
+ process_schema: function() {
83
+ this.schema = {
84
+ nodes: this.process_single_schema(this.data_source.nodes),
85
+ links: this.process_single_schema(this.data_source.links)
86
+ };
87
+
88
+ var om = this.opts.mapping;
89
+ if (om.links == undefined || om.nodes == undefined) {
90
+ throw "Missing mapping instructions in 'options' for either 'links' or 'nodes', or both.";
91
+ }
92
+ this.mapping = {
93
+ nodes: this.process_single_mapping('nodes', om.nodes, this.decl_properties.nodes),
94
+ links: this.process_single_mapping('links', om.links, this.decl_properties.links)
95
+ };
96
+ },
97
+
98
+ /*
99
+ * Return schema for +stream+.
100
+ */
101
+ schema_for_stream: function(stream) {
102
+ var schema = this.schema[stream];
103
+ return schema;
104
+ },
105
+
106
+ data_source_for_stream: function(stream) {
107
+ var ds = this.data_source[stream];
108
+ if (ds == undefined) {
109
+ throw "Unknown data_source '" + stream + "'.";
110
+ }
111
+ return ds;
112
+ },
113
+
114
+ update: function() {
115
+
116
+ var ldata = this.data_source.links.rows();
117
+ var ndata = this.data_source.nodes.rows();
118
+
119
+ this.redraw({links: ldata, nodes: ndata});
120
+ },
121
+
122
+ redraw: function(data) {
123
+ var self = this;
124
+ var o = this.opts;
125
+ var mapping = this.mapping; //o.mapping || {};
126
+ var ca = this.widget_area;
127
+
128
+ var x = function(v) {
129
+ var x = v * ca.w + ca.x;
130
+ var x = v * ca.w;
131
+ return x;
132
+ };
133
+ var y = function(v) {
134
+ var y = -1 * (v * ca.h + ca.y);
135
+ var y = -1 * (v * ca.h);
136
+ return y;
137
+ };
138
+
139
+ var vis = this.base_layer;
140
+ var lmapping = mapping.links;
141
+ var nmapping = mapping.nodes;
142
+ var iline_f = d3.svg.line().interpolate('basis');
143
+
144
+ // curved line
145
+ var line_f = function(d) {
146
+ var a = 0.2;
147
+ var b = 0.3;
148
+ var o = 30;
149
+
150
+ var from = lmapping.from(d);
151
+ var to = lmapping.to(d);
152
+
153
+ var x1 = x(nmapping.x(from));
154
+ var y1 = y(nmapping.y(from));
155
+ var x3 = x(nmapping.x(to));
156
+ var y3 = y(nmapping.y(to));
157
+
158
+ var dx = x3 - x1;
159
+ var dy = y3 - y1;
160
+ var l = Math.sqrt(dx * dx + dy * dy);
161
+
162
+ var mx = x1 + a * dx;
163
+ var my = y1 + a * dy;
164
+ var x2 = mx - (dy * o / l)
165
+ var y2 = my + (dx * o / l);
166
+
167
+ return iline_f([[x1, y1], [x2, y2], [x3, y3]]);
168
+ };
169
+
170
+ var ldata = data.links
171
+ var link2 = this.graph_layer.selectAll("path.link")
172
+ .data(d3.values(ldata));
173
+ link2
174
+ //.each(position) // update existing markers
175
+ .style("stroke", lmapping.stroke_color)
176
+ .style("stroke-width", lmapping.stroke_width)
177
+ .attr("d", line_f)
178
+ ;
179
+ var le = link2.enter().append("svg:path");
180
+ le.attr("class", "link")
181
+ .style("stroke", lmapping.stroke_color)
182
+ .style("stroke-width", lmapping.stroke_width)
183
+ .attr("fill", "none")
184
+ .attr("d", line_f)
185
+ ;
186
+ this._set_link_interaction_mode(le);
187
+
188
+
189
+ var ndata = data.nodes;
190
+ // first draw white circle to allow actual node to become transparent
191
+ // without links showing through
192
+ var bg_node = this.graph_layer.selectAll("circle.bg_node")
193
+ .data(ndata, function(d) { return nmapping.key(d); })
194
+ .attr("cx", function(d) { return x(nmapping.x(d)) })
195
+ .attr("cy", function(d) { return y(nmapping.y(d)) })
196
+ .attr("r", nmapping.radius)
197
+ .style("fill", 'white')
198
+ .enter().append("svg:circle")
199
+ .attr("class", "bg_node")
200
+ .attr("cx", function(d) { return x(nmapping.x(d)) })
201
+ .attr("cy", function(d) { return y(nmapping.y(d)) })
202
+ .attr("r", nmapping.radius)
203
+ .style("fill", 'white');
204
+ ;
205
+
206
+
207
+ var node = this.graph_layer.selectAll("circle.node")
208
+ .data(ndata, function(d) {
209
+ return nmapping.key(d);
210
+ });
211
+ //.data(d3.values(ndata));
212
+ //function(d) { return d.time; }
213
+ node
214
+ .attr("cx", function(d) { return x(nmapping.x(d)) })
215
+ .attr("cy", function(d) { return y(nmapping.y(d)) })
216
+ .attr("r", nmapping.radius)
217
+ .style("fill", nmapping.fill_color)
218
+ .style("stroke", nmapping.stroke_color)
219
+ .style("stroke-width", nmapping.stroke_width)
220
+ ;
221
+ var en = node.enter().append("svg:circle");
222
+ en.attr("class", "node")
223
+ .attr("cx", function(d) { return x(nmapping.x(d)) })
224
+ .attr("cy", function(d) { return y(nmapping.y(d)) })
225
+ .attr("r", nmapping.radius)
226
+ .style("fill", nmapping.fill_color)
227
+ .style("stroke", nmapping.stroke_color)
228
+ .style("stroke-width", nmapping.stroke_width)
229
+ .attr("fixed", true)
230
+ .transition()
231
+ .attr("r", nmapping.radius)
232
+ .delay(0)
233
+ ;
234
+ this._set_node_interaction_mode(en);
235
+ },
236
+
237
+ _set_link_interaction_mode: function(le) {
238
+ var self = this;
239
+ var o = this.opts;
240
+
241
+ if (o.interaction_mode == 'hover') {
242
+ le.on("mouseover", function(d) {
243
+ self._on_link_selected(d);
244
+ })
245
+ .on("mouseout", function(d) {
246
+ self._on_link_selected(d);
247
+ })
248
+ ;
249
+ } else if (o.interaction_mode == 'click') {
250
+ le.on("click", function(d) {
251
+ self._on_link_selected(d);
252
+ })
253
+ .style('cursor', 'hand')
254
+ ;
255
+ }
256
+ },
257
+
258
+ _on_link_selected: function(d) {
259
+ var key_f = this.mapping.links.key;
260
+ var id = key_f(d);
261
+ var msg = {id: id, type: 'link', source: this, data_source: this.data_source.links};
262
+
263
+ if (this.selected_link == id) {
264
+ // if same link is clicked twice, unselect it
265
+ this._render_selected_link(null);
266
+ this._render_selected_node(null);
267
+ } else {
268
+ this._render_selected_link(id);
269
+ this._render_selected_node('_NONE_');
270
+ this._report_selected(id, 'links');
271
+ }
272
+ },
273
+
274
+ // Make all but 'selected_id' link semi-transparent. If 'selected_id' is null
275
+ // revert selection.
276
+ //
277
+ _render_selected_link: function(selected_id) {
278
+ if (selected_id == null || selected_id == '_NONE_') {
279
+ if (this.selected_link) {
280
+ this._report_deselected(this.selected_link, 'links');
281
+ this.selected_link = null;
282
+ }
283
+ } else {
284
+ this.selected_link = selected_id;
285
+ }
286
+
287
+ var key_f = this.mapping.links.key;
288
+ if (selected_id) {
289
+ // grey out non-selected
290
+ this.graph_layer.selectAll("path.link")
291
+ .filter(function(d) {
292
+ var key = key_f(d);
293
+ return selected_id == '_NONE_' || key != selected_id;
294
+ })
295
+ .transition()
296
+ .style("opacity", 0.1)
297
+ .delay(0)
298
+ .duration(300);
299
+ }
300
+ // Ensure that selected link is shown fully
301
+ this.graph_layer.selectAll("path.link")
302
+ .filter(function(d) {
303
+ var key = key_f(d);
304
+ return selected_id == null || key == selected_id;
305
+ })
306
+ .transition()
307
+ .style("opacity", 1.0)
308
+ .delay(0)
309
+ .duration(300);
310
+
311
+ },
312
+
313
+ _set_node_interaction_mode: function(en) {
314
+ var self = this;
315
+ var o = this.opts;
316
+
317
+ var msg_frag = {type: 'node', data_source: this.data_source.nodes}
318
+ if (o.interaction_mode == 'hover') {
319
+ en.on("mouseover", function(d) {
320
+ self._on_node_selected(d);
321
+ })
322
+ .on("mouseout", function(d) {
323
+ self._on_node_selected(d);
324
+ })
325
+ ;
326
+ } else if (o.interaction_mode == 'click') {
327
+ en.on("click", function(d) {
328
+ self._on_node_selected(d);
329
+ })
330
+ .style('cursor', 'hand')
331
+ }
332
+
333
+ },
334
+
335
+ _on_node_selected: function(d) {
336
+ var key_f = this.mapping.nodes.key;
337
+ var id = key_f(d);
338
+ var msg = {id: id, type: 'node', source: this, data_source: this.data_source.nodes};
339
+
340
+ if (this.selected_node == id) {
341
+ // if same link is clicked twice, unselect it
342
+ this._render_selected_link(null);
343
+ this._render_selected_node(null);
344
+ } else {
345
+ this._render_selected_link('_NONE_');
346
+ this._render_selected_node(id);
347
+ this._report_selected(id, 'nodes');
348
+ }
349
+ },
350
+
351
+ // Make all but 'selected_id' node semi-transparent. If 'selected_id' is null
352
+ // revert selection.
353
+ //
354
+ _render_selected_node: function(selected_id) {
355
+ if (selected_id == null || selected_id == '_NONE_') {
356
+ if (this.selected_node) {
357
+ this._report_deselected(this.selected_node, 'nodes');
358
+ this.selected_node = null;
359
+ }
360
+ } else {
361
+ this.selected_node = selected_id;
362
+ }
363
+ var key_f = this.mapping.nodes.key;
364
+ if (selected_id) {
365
+ // grey out non-selected
366
+ this.graph_layer.selectAll("circle.node")
367
+ .filter(function(d) {
368
+ var key = key_f(d);
369
+ return selected_id == '_NONE_' || key != selected_id;
370
+ })
371
+ .transition()
372
+ .style("opacity", 0.1)
373
+ .delay(0)
374
+ .duration(300);
375
+ }
376
+ // Ensure that selected node is shown fully
377
+ this.graph_layer.selectAll("circle.node")
378
+ .filter(function(d) {
379
+ var key = key_f(d);
380
+ return selected_id == null || key == selected_id;
381
+ })
382
+ .transition()
383
+ .style("opacity", 1.0)
384
+ .delay(0)
385
+ .duration(300);
386
+
387
+ },
388
+
389
+ _report_selected: function(selected_id, type) {
390
+ var ds = this.data_source[type];
391
+ var msg = {id: selected_id, type: type, source: this, data_source: ds};
392
+ OHUB.trigger("graph.selected", msg);
393
+ OHUB.trigger("graph." + ds.name + ".selected", msg);
394
+ },
395
+
396
+ _report_deselected: function(selected_id, type) {
397
+ var ds = this.data_source[type];
398
+ var msg = {id: selected_id, type: type, source: this, data_source: ds};
399
+ OHUB.trigger("graph.deselected", msg);
400
+ OHUB.trigger("graph." + ds.name + ".deselected", msg);
401
+ }
402
+
403
+ })
404
+ })
405
+
406
+ /*
407
+ Local Variables:
408
+ mode: Javascript
409
+ tab-width: 2
410
+ indent-tabs-mode: nil
411
+ End:
412
+ */
@@ -1,4 +1,4 @@
1
- L.provide('OML.pie_chart2', ["graph/abstract_nv_chart", "#OML.abstract_nv_chart"], function () {
1
+ L.provide('OML.pie_chart2', ["graph/js/abstract_nv_chart", "#OML.abstract_nv_chart"], function () {
2
2
 
3
3
  OML.pie_chart2 = OML.abstract_nv_chart.extend({
4
4
  decl_properties: [
@@ -1,4 +1,4 @@
1
- L.provide('OML.scatter_plot', ["graph/abstract_chart", "#OML.abstract_chart", "graph/axis", "#OML.axis"], function () {
1
+ L.provide('OML.scatter_plot', ["graph/js/abstract_chart", "#OML.abstract_chart", "graph/js/axis", "#OML.axis"], function () {
2
2
 
3
3
  OML.scatter_plot = OML.abstract_chart.extend({
4
4
  decl_properties: [
@@ -1,24 +1,21 @@
1
- //
2
- //L.provide('OML.table2', ["graph/abstract_widget", "#OML.abstract_widget"], function () {
3
- L.provide('OML.table2', ["graph/abstract_widget", "#OML.abstract_widget", [
4
1
 
5
- '/resource/vendor/jquery/jquery-ui.custom.min.js',
6
- '/resource/vendor/jquery/jquery.event.drag.js',
7
- // ], [
8
-
9
- '/resource/vendor/slickgrid/slick.core.js',
10
- '/resource/vendor/slickgrid/slick.formatters.js',
11
- '/resource/vendor/slickgrid/slick.editors.js',
12
- '/resource/vendor/slickgrid/plugins/slick.rowselectionmodel.js',
13
- '/resource/vendor/slickgrid/slick.grid.js',
14
- '/resource/vendor/slickgrid/slick.dataview.js',
15
- '/resource/vendor/slickgrid/controls/slick.pager.js',
16
- '/resource/vendor/slickgrid/controls/slick.columnpicker.js',
17
- ],
18
- //'/resource/vendor/slickgrid/slick.grid.css',
19
- '/resource/theme/bright/css/slickgrid.css',
20
-
21
- ], function () {
2
+ L.provide('jquery.event.drag', ['vendor/jquery/jquery.event.drag.js'], function() {
3
+ // L.require(['theme/bright/css/slickgrid.css'], function() { // We seem to have a race condition with the CSS file
4
+ L.provide('slickgrid', [
5
+ 'vendor/slickgrid/slick.core.js',
6
+ 'vendor/slickgrid/slick.formatters.js',
7
+ 'vendor/slickgrid/slick.editors.js',
8
+ 'vendor/slickgrid/plugins/slick.rowselectionmodel.js',
9
+ 'vendor/slickgrid/slick.grid.js',
10
+ 'vendor/slickgrid/slick.dataview.js',
11
+ 'vendor/slickgrid/controls/slick.pager.js',
12
+ 'vendor/slickgrid/controls/slick.columnpicker.js',
13
+ 'theme/bright/css/slickgrid.css'
14
+ ]);
15
+ // });
16
+ });
17
+
18
+ L.provide('OML.table2', ["graph/js/abstract_widget", "#OML.abstract_widget", '#slickgrid'], function () {
22
19
 
23
20
  if (typeof(OML) == "undefined") OML = {};
24
21