omf_web 1.0.0 → 1.2.0
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.
- data/bin/omf_web_server +18 -0
- data/example/bridge/README.md +7 -0
- data/example/bridge/data_sources/sensor-sqlite.rb +15 -15
- data/example/bridge/htdocs/graph/js/bridge.js +35 -45
- data/example/bridge/htdocs/graph/js/event_line_chart.js +20 -18
- data/example/bridge/htdocs/graph/js/event_table.js +26 -28
- data/example/bridge/viz_server.rb +5 -9
- data/example/demo/demo_viz_server.rb +2 -2
- data/example/demo/widgets/linked_graphs_tab.yaml +9 -32
- data/example/openflow-gec15/code_tab.yaml +7 -12
- data/example/openflow-gec15/dashboard_tab.yaml +11 -12
- data/example/openflow-gec15/exp_source.rb +26 -26
- data/example/openflow-gec15/of_viz_server.rb +7 -7
- data/example/simple/simple.yaml +2 -1
- data/example/simple/simple_dynamic.yaml +1 -1
- data/example/web_rtc/web_rtc.yaml +54 -0
- data/example/web_rtc/webrtc-exp_1381786573.sq3 +0 -0
- data/lib/omf-web/config.ru +1 -1
- data/lib/omf-web/content/content_proxy.rb +2 -2
- data/lib/omf-web/content/file_repository.rb +11 -53
- data/lib/omf-web/content/git_repository.rb +1 -1
- data/lib/omf-web/content/irods_repository.rb +1 -1
- data/lib/omf-web/content/repository.rb +5 -3
- data/lib/omf-web/content/static_repository.rb +25 -11
- data/lib/omf-web/data_source_proxy.rb +3 -3
- data/lib/omf-web/rack/content_handler.rb +2 -2
- data/lib/omf-web/rack/session_authenticator.rb +3 -3
- data/lib/omf-web/rack/tab_mapper.rb +2 -2
- data/lib/omf-web/rack/update_handler.rb +2 -2
- data/lib/omf-web/rack/websocket_handler.rb +3 -3
- data/lib/omf-web/rack/widget_mapper.rb +2 -2
- data/lib/omf-web/session_store.rb +2 -2
- data/lib/omf-web/theme/abstract_page.rb +15 -24
- data/lib/omf-web/theme/bright/code_renderer.rb +24 -30
- data/lib/omf-web/theme/bright/data_renderer.rb +7 -5
- data/lib/omf-web/theme/bright/page.rb +2 -1
- data/lib/omf-web/theme/bright/widget_chrome.rb +16 -14
- data/lib/omf-web/theme.rb +1 -1
- data/lib/omf-web/thin/logging.rb +18 -13
- data/lib/omf-web/thin/runner.rb +2 -2
- data/lib/omf-web/thin/server.rb +105 -27
- data/lib/omf-web/version.rb +1 -1
- data/lib/omf-web/widget/abstract_widget.rb +3 -3
- data/lib/omf-web/widget/data_widget.rb +1 -0
- data/lib/omf-web/widget/text/maruku.rb +1 -1
- data/lib/omf-web/widget.rb +22 -22
- data/lib/omf_web.rb +1 -1
- data/omf_web.gemspec +18 -15
- data/share/htdocs/graph/js/abstract_chart.js +69 -68
- data/share/htdocs/graph/js/abstract_nv_chart.js +35 -33
- data/share/htdocs/graph/js/abstract_widget.js +61 -62
- data/share/htdocs/graph/js/axis.js +30 -25
- data/share/htdocs/graph/js/barchart_brush.js +23 -21
- data/share/htdocs/graph/js/code_mirror.js +35 -33
- data/share/htdocs/graph/js/discrete_bar_chart.js +27 -30
- data/share/htdocs/graph/js/histogram2.js +37 -47
- data/share/htdocs/graph/js/line_chart3.js +36 -30
- data/share/htdocs/graph/js/line_chart_with_focus.js +10 -9
- data/share/htdocs/graph/js/multi_barchart.js +33 -30
- data/share/htdocs/graph/js/network2.js +98 -97
- data/share/htdocs/graph/js/pie_chart2.js +25 -23
- data/share/htdocs/graph/js/scatter_plot.js +38 -36
- data/share/htdocs/graph/js/table2.js +60 -54
- data/share/htdocs/js/app.js +43 -0
- data/share/htdocs/js/{data_source2.js → data_source3.js} +44 -73
- data/share/htdocs/js/data_source_repo.js +42 -0
- data/share/htdocs/require/nv_d3.js +2 -0
- data/share/htdocs/theme/abstract/abstract.js +4 -4
- data/share/htdocs/vendor/VERSION_MAP.yaml +2 -0
- data/share/htdocs/vendor/require-2.1.8/require.js +2053 -0
- data/share/htdocs/vendor/require-2.1.8/require.min.js +36 -0
- data/share/htdocs/vendor/require-css-0.0.7/.gitignore +1 -0
- data/share/htdocs/vendor/require-css-0.0.7/LICENSE +10 -0
- data/share/htdocs/vendor/require-css-0.0.7/README.md +231 -0
- data/share/htdocs/vendor/require-css-0.0.7/bower.json +5 -0
- data/share/htdocs/vendor/require-css-0.0.7/css-builder.js +251 -0
- data/share/htdocs/vendor/require-css-0.0.7/css.js +436 -0
- data/share/htdocs/vendor/require-css-0.0.7/normalize.js +138 -0
- data/share/htdocs/vendor/require-css-0.0.7/package.json +5 -0
- data/share/htdocs/vendor/spin/jquery.spin.js +6 -4
- metadata +100 -74
- checksums.yaml +0 -7
- data/bin/omf_web_demo +0 -3
- data/bin/omf_web_demo.sh +0 -7
- data/bin/omf_web_server.rb +0 -157
- data/lib/omf_common/lobject.rb +0 -187
- data/lib/omf_common/log4r_outputter.rb +0 -69
- data/sample.sq3 +0 -0
- data/share/htdocs/js/data_source.js +0 -173
- data/share/htdocs/js/require3.js +0 -292
data/lib/omf-web/widget.rb
CHANGED
|
@@ -2,12 +2,12 @@
|
|
|
2
2
|
require 'erector'
|
|
3
3
|
|
|
4
4
|
module OMF::Web::Widget
|
|
5
|
-
|
|
6
|
-
|
|
5
|
+
|
|
6
|
+
|
|
7
7
|
@@widgets = {}
|
|
8
|
-
@@descriptions = {}
|
|
9
|
-
@@type2class = {}
|
|
10
|
-
|
|
8
|
+
@@descriptions = {}
|
|
9
|
+
@@type2class = {}
|
|
10
|
+
|
|
11
11
|
def self.register_widget(wdescr)
|
|
12
12
|
unless id = wdescr[:id]
|
|
13
13
|
raise "Missing 'id' for widget '#{wdescr.inspect}'"
|
|
@@ -15,25 +15,25 @@ module OMF::Web::Widget
|
|
|
15
15
|
id = id.to_sym
|
|
16
16
|
if (@@descriptions.key? id)
|
|
17
17
|
raise "Repeated try to register widget '#{id}'"
|
|
18
|
-
end
|
|
18
|
+
end
|
|
19
19
|
@@descriptions[id] = wdescr
|
|
20
20
|
end
|
|
21
|
-
|
|
21
|
+
|
|
22
22
|
def self.registered_widgets()
|
|
23
23
|
@@descriptions
|
|
24
24
|
end
|
|
25
|
-
|
|
25
|
+
|
|
26
26
|
def self.register_widget_type(id, widget_class)
|
|
27
27
|
id = id.to_sym
|
|
28
28
|
if (@@type2class.key? id)
|
|
29
29
|
raise "Repeated try to register widget type '#{id}'"
|
|
30
|
-
end
|
|
30
|
+
end
|
|
31
31
|
@@type2class[id] = widget_class
|
|
32
32
|
end
|
|
33
|
-
|
|
34
|
-
|
|
33
|
+
|
|
34
|
+
|
|
35
35
|
# Return the number of top level widgets. If 'restrict_to' is an
|
|
36
|
-
# array, only return those.
|
|
36
|
+
# array, only return those.
|
|
37
37
|
#
|
|
38
38
|
def self.toplevel_widgets(restrict_to = nil)
|
|
39
39
|
if restrict_to
|
|
@@ -49,15 +49,15 @@ module OMF::Web::Widget
|
|
|
49
49
|
end.compact
|
|
50
50
|
end
|
|
51
51
|
wa.sort do |a, b|
|
|
52
|
-
(b[:priority] || 100) <=> (a[:priority] || 100)
|
|
52
|
+
(b[:priority] || 100) <=> (a[:priority] || 100)
|
|
53
53
|
end
|
|
54
|
-
end
|
|
55
|
-
|
|
54
|
+
end
|
|
55
|
+
|
|
56
56
|
def self.create_widget(name)
|
|
57
57
|
if name.is_a? Array
|
|
58
58
|
# this is short notation for a stacked widget
|
|
59
59
|
#
|
|
60
|
-
wdescr = { :type => 'layout/stacked', :widgets => name}
|
|
60
|
+
wdescr = { :type => 'layout/stacked', :widgets => name}
|
|
61
61
|
elsif name.is_a? Hash
|
|
62
62
|
wdescr = name
|
|
63
63
|
else
|
|
@@ -85,25 +85,25 @@ module OMF::Web::Widget
|
|
|
85
85
|
w = OMF::Web::Widget::DataWidget.new(wdescr)
|
|
86
86
|
when /^layout/
|
|
87
87
|
require 'omf-web/widget/layout'
|
|
88
|
-
w = OMF::Web::Widget::Layout.create_layout_widget(type, wdescr)
|
|
88
|
+
w = OMF::Web::Widget::Layout.create_layout_widget(type, wdescr)
|
|
89
89
|
when /^text/
|
|
90
90
|
require 'omf-web/widget/text/text_widget'
|
|
91
|
-
w = OMF::Web::Widget::TextWidget.create_text_widget(type, wdescr)
|
|
91
|
+
w = OMF::Web::Widget::TextWidget.create_text_widget(type, wdescr)
|
|
92
92
|
when /^code/
|
|
93
93
|
require 'omf-web/widget/code_widget'
|
|
94
|
-
w = OMF::Web::Widget::CodeWidget.create_code_widget(type, wdescr)
|
|
94
|
+
w = OMF::Web::Widget::CodeWidget.create_code_widget(type, wdescr)
|
|
95
95
|
when /^moustache/
|
|
96
96
|
require 'omf-web/widget/mustache_widget'
|
|
97
|
-
w = OMF::Web::Widget::MustacheWidget.create_mustache_widget(type, wdescr)
|
|
97
|
+
w = OMF::Web::Widget::MustacheWidget.create_mustache_widget(type, wdescr)
|
|
98
98
|
else
|
|
99
99
|
raise "Unknown widget type '#{type}' (#{wdescr.inspect})"
|
|
100
100
|
end
|
|
101
101
|
@@widgets[wdescr[:id]] = w
|
|
102
102
|
end
|
|
103
|
-
|
|
103
|
+
|
|
104
104
|
def self._init()
|
|
105
105
|
register_widget
|
|
106
106
|
end
|
|
107
|
-
|
|
107
|
+
|
|
108
108
|
|
|
109
109
|
end # OMF::Web::Widget
|
data/lib/omf_web.rb
CHANGED
|
@@ -42,7 +42,7 @@ module OMF
|
|
|
42
42
|
if w = y['widget']
|
|
43
43
|
OMF::Web.register_widget w
|
|
44
44
|
else
|
|
45
|
-
OMF::
|
|
45
|
+
OMF::Base::LObject.error "Doesn't seem to be a widget definition. Expected 'widget' but found '#{y.keys.join(', ')}'"
|
|
46
46
|
end
|
|
47
47
|
end
|
|
48
48
|
|
data/omf_web.gemspec
CHANGED
|
@@ -20,21 +20,24 @@ Gem::Specification.new do |s|
|
|
|
20
20
|
|
|
21
21
|
# specify any dependencies here; for example:
|
|
22
22
|
# s.add_development_dependency "minitest", "~> 2.11.3"
|
|
23
|
-
s.add_runtime_dependency "omf_oml", "~> 1
|
|
24
|
-
s.add_runtime_dependency "
|
|
25
|
-
s.add_runtime_dependency "
|
|
26
|
-
s.add_runtime_dependency "
|
|
27
|
-
s.add_runtime_dependency "
|
|
28
|
-
s.add_runtime_dependency "
|
|
29
|
-
s.add_runtime_dependency "
|
|
30
|
-
s.add_runtime_dependency "maruku", "~> 0.6
|
|
31
|
-
s.add_runtime_dependency "ritex", "~> 1.0
|
|
32
|
-
s.add_runtime_dependency "json", "~> 1.7
|
|
33
|
-
s.add_runtime_dependency "grit", "~> 2.5
|
|
34
|
-
s.add_runtime_dependency "
|
|
35
|
-
s.add_runtime_dependency "
|
|
36
|
-
s.add_runtime_dependency "
|
|
37
|
-
|
|
23
|
+
s.add_runtime_dependency "omf_oml", "~> 1"
|
|
24
|
+
s.add_runtime_dependency "omf_base"
|
|
25
|
+
s.add_runtime_dependency "erector", "~> 0.9"
|
|
26
|
+
s.add_runtime_dependency "activesupport", "~> 3.0" # required by erector:table
|
|
27
|
+
s.add_runtime_dependency "rack", "~> 1"
|
|
28
|
+
s.add_runtime_dependency "thin", "~> 1"
|
|
29
|
+
s.add_runtime_dependency "coderay", "~> 1"
|
|
30
|
+
s.add_runtime_dependency "maruku", "~> 0.6"
|
|
31
|
+
s.add_runtime_dependency "ritex", "~> 1.0"
|
|
32
|
+
s.add_runtime_dependency "json", "~> 1.7"
|
|
33
|
+
s.add_runtime_dependency "grit", "~> 2.5"
|
|
34
|
+
s.add_runtime_dependency "websocket-rack", "~> 0.4"
|
|
35
|
+
s.add_runtime_dependency "rack-accept", "~> 0.4"
|
|
36
|
+
s.add_runtime_dependency "i18n"
|
|
37
|
+
|
|
38
|
+
# Do we need the next two dependencies?
|
|
39
|
+
#s.add_runtime_dependency "sqlite3", "~> 1.3.6"
|
|
40
|
+
#s.add_runtime_dependency "postgres-pr", "~> 0.6.3"
|
|
38
41
|
|
|
39
42
|
s.add_runtime_dependency "ruby-openid", "~> 2.2.3"
|
|
40
43
|
|
|
@@ -1,46 +1,47 @@
|
|
|
1
1
|
|
|
2
|
-
L.provide('OML.abstract_chart', ["graph/js/abstract_widget", "#OML.abstract_widget", "vendor/d3/d3.js"], function () {
|
|
2
|
+
//L.provide('OML.abstract_chart', ["graph/js/abstract_widget", "#OML.abstract_widget", "vendor/d3/d3.js"], function () {
|
|
3
|
+
|
|
4
|
+
define(["graph/abstract_widget"], function (abstract_widget) {
|
|
5
|
+
|
|
6
|
+
var abstract_chart = abstract_widget.extend({
|
|
3
7
|
|
|
4
|
-
|
|
5
|
-
OML.abstract_chart = OML.abstract_widget.extend({
|
|
6
|
-
|
|
7
8
|
decl_color_func: {
|
|
8
9
|
// scale
|
|
9
10
|
"green_yellow80_red()": function() {
|
|
10
11
|
return d3.scale.linear()
|
|
11
12
|
.domain([0, 0.8, 1])
|
|
12
|
-
.range(["green", "yellow", "red"])
|
|
13
|
+
.range(["green", "yellow", "red"]);
|
|
13
14
|
},
|
|
14
15
|
"green_red()": function() {
|
|
15
16
|
return d3.scale.linear()
|
|
16
17
|
.domain([0, 1])
|
|
17
|
-
.range(["green", "red"])
|
|
18
|
+
.range(["green", "red"]);
|
|
18
19
|
},
|
|
19
20
|
"red_yellow20_green()": function() {
|
|
20
21
|
return d3.scale.linear()
|
|
21
22
|
.domain([0, 0.2, 1])
|
|
22
|
-
.range(["red", "yellow", "green"])
|
|
23
|
+
.range(["red", "yellow", "green"]);
|
|
23
24
|
},
|
|
24
25
|
"red_green()": function() {
|
|
25
26
|
return d3.scale.linear()
|
|
26
27
|
.domain([0, 1])
|
|
27
|
-
.range(["red", "green"])
|
|
28
|
+
.range(["red", "green"]);
|
|
28
29
|
},
|
|
29
30
|
// category
|
|
30
31
|
"category10()": function() {
|
|
31
|
-
return d3.scale.category10()
|
|
32
|
+
return d3.scale.category10();
|
|
32
33
|
},
|
|
33
34
|
"category20()": function() {
|
|
34
|
-
return d3.scale.category20()
|
|
35
|
+
return d3.scale.category20();
|
|
35
36
|
},
|
|
36
37
|
"category20b()": function() {
|
|
37
|
-
return d3.scale.category20b()
|
|
38
|
+
return d3.scale.category20b();
|
|
38
39
|
},
|
|
39
40
|
"category20c()": function() {
|
|
40
|
-
return d3.scale.category20c()
|
|
41
|
+
return d3.scale.category20c();
|
|
41
42
|
},
|
|
42
43
|
},
|
|
43
|
-
|
|
44
|
+
|
|
44
45
|
defaults: function() {
|
|
45
46
|
return this.deep_defaults({
|
|
46
47
|
margin: {
|
|
@@ -49,19 +50,19 @@ L.provide('OML.abstract_chart', ["graph/js/abstract_widget", "#OML.abstract_widg
|
|
|
49
50
|
right: 50,
|
|
50
51
|
bottom: 40
|
|
51
52
|
},
|
|
52
|
-
},
|
|
53
|
-
},
|
|
54
|
-
|
|
55
|
-
|
|
53
|
+
}, abstract_chart.__super__.defaults.call(this));
|
|
54
|
+
},
|
|
55
|
+
|
|
56
|
+
|
|
56
57
|
//base_css_class: 'oml-chart',
|
|
57
|
-
|
|
58
|
+
|
|
58
59
|
initialize: function(opts) {
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
60
|
+
abstract_chart.__super__.initialize.call(this, opts);
|
|
61
|
+
|
|
62
|
+
|
|
62
63
|
var vis = this.init_svg(this.w, this.h);
|
|
63
64
|
this.configure_base_layer(vis);
|
|
64
|
-
|
|
65
|
+
|
|
65
66
|
var self = this;
|
|
66
67
|
OHUB.bind("graph.highlighted", function(evt) {
|
|
67
68
|
if (evt.source == self) return;
|
|
@@ -71,43 +72,43 @@ L.provide('OML.abstract_chart', ["graph/js/abstract_widget", "#OML.abstract_widg
|
|
|
71
72
|
if (evt.source == self) return;
|
|
72
73
|
self.on_dehighlighted(evt);
|
|
73
74
|
});
|
|
74
|
-
|
|
75
|
+
|
|
75
76
|
//this.update(null);
|
|
76
|
-
this.update();
|
|
77
|
+
this.update();
|
|
77
78
|
},
|
|
78
|
-
|
|
79
|
-
_resize_base_el: function(w, h) {
|
|
79
|
+
|
|
80
|
+
_resize_base_el: function(w, h) {
|
|
80
81
|
// Do not add margins to the base_el, but to the inside of the SVG panes
|
|
81
82
|
this.w = w;
|
|
82
83
|
this.h = h;
|
|
83
84
|
this.base_el
|
|
84
85
|
.style('height', this.h + 'px')
|
|
85
|
-
.style('width', this.w + 'px')
|
|
86
|
+
.style('width', this.w + 'px')
|
|
86
87
|
.style('margin-left', 0 + 'px')
|
|
87
|
-
.style('margin-right', 0 + 'px')
|
|
88
|
-
.style('margin-top', 0 + 'px')
|
|
89
|
-
.style('margin-bottom', 0 + 'px')
|
|
88
|
+
.style('margin-right', 0 + 'px')
|
|
89
|
+
.style('margin-top', 0 + 'px')
|
|
90
|
+
.style('margin-bottom', 0 + 'px')
|
|
90
91
|
;
|
|
91
|
-
|
|
92
|
+
|
|
92
93
|
//var m = _.defaults(opts.margin || {}, this.defaults.margin);
|
|
93
94
|
var m = this.opts.margin;
|
|
94
95
|
var ca = this.widget_area = {
|
|
95
|
-
x: m.left,
|
|
96
|
-
rx: w - m.left,
|
|
97
|
-
y: m.bottom,
|
|
98
|
-
ty: m.top,
|
|
99
|
-
w: w - m.left - m.right,
|
|
96
|
+
x: m.left,
|
|
97
|
+
rx: w - m.left,
|
|
98
|
+
y: m.bottom,
|
|
99
|
+
ty: m.top,
|
|
100
|
+
w: w - m.left - m.right,
|
|
100
101
|
h: h - m.top - m.bottom,
|
|
101
102
|
ow: w, // outer dimensions
|
|
102
103
|
oh: h
|
|
103
104
|
};
|
|
104
|
-
|
|
105
|
-
},
|
|
106
|
-
|
|
107
|
-
|
|
105
|
+
|
|
106
|
+
},
|
|
107
|
+
|
|
108
|
+
|
|
108
109
|
init_svg: function(w, h) {
|
|
109
110
|
var opts = this.opts;
|
|
110
|
-
|
|
111
|
+
|
|
111
112
|
var vis = opts.svg = this.svg_base = this.base_el.append("svg:svg")
|
|
112
113
|
// .attr("width", w)
|
|
113
114
|
// .attr("height", h)
|
|
@@ -116,25 +117,25 @@ L.provide('OML.abstract_chart', ["graph/js/abstract_widget", "#OML.abstract_widg
|
|
|
116
117
|
.attr('class', this.base_css_class);
|
|
117
118
|
var offset = opts.offset;
|
|
118
119
|
if (offset.x) {
|
|
119
|
-
// the next two lines do the same, but only one works
|
|
120
|
+
// the next two lines do the same, but only one works
|
|
120
121
|
// in the specific context
|
|
121
122
|
vis.attr("x", offset.x);
|
|
122
|
-
vis.style("margin-left", offset.x + "px");
|
|
123
|
+
vis.style("margin-left", offset.x + "px");
|
|
123
124
|
}
|
|
124
125
|
if (offset.y) {
|
|
125
126
|
vis.attr("y", offset.y);
|
|
126
|
-
vis.style("margin-top", offset.y + "px");
|
|
127
|
+
vis.style("margin-top", offset.y + "px");
|
|
127
128
|
}
|
|
128
129
|
return vis;
|
|
129
130
|
},
|
|
130
131
|
|
|
131
|
-
// Split tuple array into array of tuple arrays grouped by
|
|
132
|
+
// Split tuple array into array of tuple arrays grouped by
|
|
132
133
|
// the tuple element at +index+.
|
|
133
134
|
//
|
|
134
135
|
group_by: function(in_data, index_f) {
|
|
135
136
|
var data = [];
|
|
136
137
|
var groups = {};
|
|
137
|
-
|
|
138
|
+
|
|
138
139
|
_.map(in_data, function(d) {
|
|
139
140
|
var key = index_f(d);
|
|
140
141
|
var a = groups[key];
|
|
@@ -147,7 +148,7 @@ L.provide('OML.abstract_chart', ["graph/js/abstract_widget", "#OML.abstract_widg
|
|
|
147
148
|
// Sort by 'group_by' index to keep the same order and with it same color assignment.
|
|
148
149
|
var data = _.sortBy(data, function(a) {
|
|
149
150
|
return index_f(a[0])
|
|
150
|
-
});
|
|
151
|
+
});
|
|
151
152
|
return data;
|
|
152
153
|
},
|
|
153
154
|
|
|
@@ -156,11 +157,11 @@ L.provide('OML.abstract_chart', ["graph/js/abstract_widget", "#OML.abstract_widg
|
|
|
156
157
|
this.ic = {
|
|
157
158
|
handler: handler,
|
|
158
159
|
};
|
|
159
|
-
|
|
160
|
+
|
|
160
161
|
var ig = this.base_layer.append("svg:g")
|
|
161
162
|
.attr("pointer-events", "all")
|
|
162
163
|
.on("mousedown", mousedown);
|
|
163
|
-
|
|
164
|
+
|
|
164
165
|
var ca = this.chart_area;
|
|
165
166
|
var frame = ig.append("svg:rect")
|
|
166
167
|
.attr("class", "graph-area")
|
|
@@ -171,7 +172,7 @@ L.provide('OML.abstract_chart', ["graph/js/abstract_widget", "#OML.abstract_widg
|
|
|
171
172
|
.attr("fill", "none")
|
|
172
173
|
.attr("stroke", "none")
|
|
173
174
|
;
|
|
174
|
-
|
|
175
|
+
|
|
175
176
|
function mousedown() {
|
|
176
177
|
var ic = self.ic;
|
|
177
178
|
if (!ic.rect) {
|
|
@@ -189,7 +190,7 @@ L.provide('OML.abstract_chart', ["graph/js/abstract_widget", "#OML.abstract_widg
|
|
|
189
190
|
ic.move_event_consumed = false;
|
|
190
191
|
d3.event.preventDefault();
|
|
191
192
|
}
|
|
192
|
-
|
|
193
|
+
|
|
193
194
|
function mousedown_box() {
|
|
194
195
|
var ic = self.ic;
|
|
195
196
|
mousedown();
|
|
@@ -197,20 +198,20 @@ L.provide('OML.abstract_chart', ["graph/js/abstract_widget", "#OML.abstract_widg
|
|
|
197
198
|
ic.offsetx = ic.x0[0] - ic.minx;
|
|
198
199
|
}
|
|
199
200
|
}
|
|
200
|
-
|
|
201
|
+
|
|
201
202
|
function mousemove(x, d, i) {
|
|
202
203
|
var ic = self.ic;
|
|
203
204
|
var ca = self.chart_area;
|
|
204
|
-
|
|
205
|
+
|
|
205
206
|
if (!ic.rect) return;
|
|
206
207
|
if (!ic.is_dragging) return;
|
|
207
208
|
ic.has_moved = true;
|
|
208
|
-
|
|
209
|
+
|
|
209
210
|
var x1 = d3.svg.mouse(ic.rect.node());
|
|
210
211
|
var minx;
|
|
211
212
|
if (ic.offsetx) {
|
|
212
213
|
minx = Math.max(ca.x, x1[0] - ic.offsetx);
|
|
213
|
-
minx = ic.minx = Math.min(minx, ca.x + ca.w - ic.width);
|
|
214
|
+
minx = ic.minx = Math.min(minx, ca.x + ca.w - ic.width);
|
|
214
215
|
} else {
|
|
215
216
|
minx = ic.minx = Math.max(ca.x, Math.min(ic.x0[0], x1[0]));
|
|
216
217
|
var maxx = Math.min(ca.x + ca.w, Math.max(ic.x0[0], x1[0]));
|
|
@@ -218,7 +219,7 @@ L.provide('OML.abstract_chart', ["graph/js/abstract_widget", "#OML.abstract_widg
|
|
|
218
219
|
}
|
|
219
220
|
self.update_selection({screen_minx: minx});
|
|
220
221
|
}
|
|
221
|
-
|
|
222
|
+
|
|
222
223
|
function mouseup() {
|
|
223
224
|
var ic = self.ic;
|
|
224
225
|
if (!ic.rect) return;
|
|
@@ -231,18 +232,18 @@ L.provide('OML.abstract_chart', ["graph/js/abstract_widget", "#OML.abstract_widg
|
|
|
231
232
|
if (ic.handler) ic.handler(this, 0, 0);
|
|
232
233
|
}
|
|
233
234
|
}
|
|
234
|
-
|
|
235
|
+
|
|
235
236
|
d3.select(window)
|
|
236
237
|
.on("mousemove", mousemove)
|
|
237
238
|
.on("mouseup", mouseup);
|
|
238
239
|
},
|
|
239
|
-
|
|
240
|
+
|
|
240
241
|
update_selection: function(selection) {
|
|
241
242
|
if (!this.ic) return;
|
|
242
|
-
|
|
243
|
+
|
|
243
244
|
var ic = this.ic;
|
|
244
245
|
var ca = this.chart_area;
|
|
245
|
-
|
|
246
|
+
|
|
246
247
|
var sminx = selection.screen_minx;
|
|
247
248
|
if (sminx) {
|
|
248
249
|
ic.rect
|
|
@@ -260,16 +261,16 @@ L.provide('OML.abstract_chart', ["graph/js/abstract_widget", "#OML.abstract_widg
|
|
|
260
261
|
ic.handler(this, imin, imax);
|
|
261
262
|
}
|
|
262
263
|
},
|
|
263
|
-
|
|
264
|
+
|
|
264
265
|
/*************
|
|
265
266
|
* Deal with schema and turn +mapping+ instructions into actionable functions.
|
|
266
267
|
*/
|
|
267
|
-
|
|
268
|
-
|
|
268
|
+
|
|
269
|
+
|
|
269
270
|
on_highlighted: function(evt) {},
|
|
270
271
|
on_dehighlighted: function(evt) {},
|
|
271
|
-
|
|
272
|
-
|
|
272
|
+
|
|
273
|
+
|
|
273
274
|
// Return an array with the 'min' and 'max' value returned by running 'f' over 'data'
|
|
274
275
|
// However, any 'min' and 'max' values in 'opts' take precedence.
|
|
275
276
|
//
|
|
@@ -286,7 +287,7 @@ L.provide('OML.abstract_chart', ["graph/js/abstract_widget", "#OML.abstract_widg
|
|
|
286
287
|
var min = o.min != undefined ? o.min : d3.min(data, function(s) {return d3.min(s, f)});
|
|
287
288
|
return [min, max];
|
|
288
289
|
}
|
|
289
|
-
|
|
290
|
-
|
|
291
290
|
});
|
|
292
|
-
|
|
291
|
+
|
|
292
|
+
return abstract_chart;
|
|
293
|
+
});
|
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
2
|
+
require.config({
|
|
3
|
+
shim: {
|
|
4
|
+
"vendor/nv_d3/js/nv.d3": ["vendor/d3/d3", "css!vendor/nv_d3/css/nv.d3"]
|
|
5
|
+
}
|
|
6
|
+
});
|
|
5
7
|
|
|
6
|
-
|
|
7
|
-
//"graph/js/axis", "#OML.axis", "graph/css/graph.css",
|
|
8
|
-
"#nv_d3"], function () {
|
|
8
|
+
define(["graph/abstract_chart", 'vendor/nv_d3/js/nv.d3'], function (abstract_chart) {
|
|
9
9
|
|
|
10
|
-
|
|
10
|
+
var abstract_nv_chart = abstract_chart.extend({
|
|
11
11
|
axis_defaults: {
|
|
12
12
|
legend: {
|
|
13
13
|
text: 'DESCRIBE ME',
|
|
14
|
-
offset: 40
|
|
14
|
+
offset: 40
|
|
15
15
|
},
|
|
16
16
|
ticks: {
|
|
17
17
|
// type: 'date',
|
|
@@ -25,15 +25,15 @@ L.provide('OML.abstract_nv_chart', ["graph/js/abstract_chart", "#OML.abstract_ch
|
|
|
25
25
|
},
|
|
26
26
|
margin: {
|
|
27
27
|
top: 0, right: 0, bottom: 0, left: 50 // not sure what impact this really has?
|
|
28
|
-
}
|
|
28
|
+
}
|
|
29
29
|
},
|
|
30
|
-
|
|
30
|
+
|
|
31
31
|
defaults: function() {
|
|
32
32
|
return this.deep_defaults({
|
|
33
33
|
transition_duration: 500
|
|
34
|
-
},
|
|
35
|
-
},
|
|
36
|
-
|
|
34
|
+
}, abstract_nv_chart.__super__.defaults.call(this));
|
|
35
|
+
},
|
|
36
|
+
|
|
37
37
|
|
|
38
38
|
configure_base_layer: function(vis) {
|
|
39
39
|
this.base_layer = vis;
|
|
@@ -41,24 +41,24 @@ L.provide('OML.abstract_nv_chart', ["graph/js/abstract_chart", "#OML.abstract_ch
|
|
|
41
41
|
this._configure_mapping(this.mapping, chart);
|
|
42
42
|
this._configure_options(this.opts, chart);
|
|
43
43
|
},
|
|
44
|
-
|
|
44
|
+
|
|
45
45
|
_configure_mapping: function(m, chart) {
|
|
46
46
|
},
|
|
47
|
-
|
|
47
|
+
|
|
48
48
|
_configure_options: function(opts, chart) {
|
|
49
49
|
chart.margin(opts.margin);
|
|
50
50
|
},
|
|
51
|
-
|
|
51
|
+
|
|
52
52
|
_configure_xy_axis: function(opts, chart) {
|
|
53
53
|
var oaxis = opts.axis || {};
|
|
54
54
|
var a_defaults = this.axis_defaults;
|
|
55
|
-
|
|
55
|
+
|
|
56
56
|
var xao = _.defaults(oaxis.x || {}, a_defaults);
|
|
57
57
|
this._configure_axis('x', chart.xAxis, xao);
|
|
58
58
|
var yao = _.defaults(oaxis.y || {}, a_defaults);
|
|
59
59
|
this._configure_axis('y', chart.yAxis, yao);
|
|
60
60
|
},
|
|
61
|
-
|
|
61
|
+
|
|
62
62
|
_configure_axis: function(name, axis, opts) {
|
|
63
63
|
// LABEL
|
|
64
64
|
var ol = opts.legend;
|
|
@@ -67,15 +67,15 @@ L.provide('OML.abstract_nv_chart', ["graph/js/abstract_chart", "#OML.abstract_ch
|
|
|
67
67
|
//ol = _.defaults(ol, defaults.axis);
|
|
68
68
|
axis.axisLabel(ol.text);
|
|
69
69
|
}
|
|
70
|
-
|
|
70
|
+
|
|
71
71
|
// TICKS
|
|
72
|
-
var ot = opts.ticks // _.defaults(opts.ticks || {}, defaults.ticks);
|
|
72
|
+
var ot = opts.ticks; // _.defaults(opts.ticks || {}, defaults.ticks);
|
|
73
73
|
// Check if we need a special formatter for the tick labels
|
|
74
74
|
if (ot.type == 'date' || ot.type == 'dateTime') {
|
|
75
75
|
var d_f = d3.time.format(ot.format || "%X");
|
|
76
76
|
axis.tickFormat(function(d) {
|
|
77
77
|
var date = new Date(1000 * d); // TODO: Implicitly assuming that value is in seconds is most likely NOT a good idea
|
|
78
|
-
var fs = d_f(date);
|
|
78
|
+
var fs = d_f(date);
|
|
79
79
|
return fs;
|
|
80
80
|
});
|
|
81
81
|
} else if (ot.type == 'key') {
|
|
@@ -90,7 +90,7 @@ L.provide('OML.abstract_nv_chart', ["graph/js/abstract_chart", "#OML.abstract_ch
|
|
|
90
90
|
if (ot.subdivide) axis.tickSubdivide(ot.subdivide);
|
|
91
91
|
if (ot.size) {
|
|
92
92
|
// apply doesn't seem to work here
|
|
93
|
-
if (typeof ot.size === 'number')
|
|
93
|
+
if (typeof ot.size === 'number')
|
|
94
94
|
axis.tickSize(ot.size);
|
|
95
95
|
else {
|
|
96
96
|
var a = ot.size;
|
|
@@ -103,37 +103,39 @@ L.provide('OML.abstract_nv_chart', ["graph/js/abstract_chart", "#OML.abstract_ch
|
|
|
103
103
|
}
|
|
104
104
|
if (ot.padding) axis.tickPadding(ot.padding);
|
|
105
105
|
if (ot.count) axis.ticks(ot.count);
|
|
106
|
-
|
|
106
|
+
|
|
107
107
|
// MARGIN
|
|
108
|
-
var om = opts.margin //_.defaults(ot.margin || {}, defaults.margin);
|
|
108
|
+
var om = opts.margin; //_.defaults(ot.margin || {}, defaults.margin);
|
|
109
109
|
axis.margin(om);
|
|
110
110
|
|
|
111
111
|
// MISC
|
|
112
|
-
axis.showMaxMin(false)
|
|
112
|
+
axis.showMaxMin(false);
|
|
113
113
|
},
|
|
114
114
|
|
|
115
115
|
resize: function() {
|
|
116
116
|
var self = this;
|
|
117
|
-
|
|
117
|
+
abstract_nv_chart.__super__.resize.call(this);
|
|
118
118
|
if (this.chart) {
|
|
119
119
|
this.chart.width(self.width);
|
|
120
|
-
this.chart.height(self.height);
|
|
120
|
+
this.chart.height(self.height);
|
|
121
121
|
this.chart.update();
|
|
122
|
-
}
|
|
122
|
+
}
|
|
123
123
|
},
|
|
124
|
-
|
|
124
|
+
|
|
125
125
|
redraw: function(data) {
|
|
126
126
|
var bl = this.base_layer//.select(".chart_layer")
|
|
127
127
|
.datum(this._datum(data, this.chart))
|
|
128
128
|
;
|
|
129
129
|
if (this.opts.transition_duration > 0) {
|
|
130
|
-
bl = bl.transition().duration(500)
|
|
130
|
+
bl = bl.transition().duration(500);
|
|
131
131
|
}
|
|
132
132
|
bl.call(this.chart);
|
|
133
133
|
},
|
|
134
|
-
|
|
135
|
-
})
|
|
136
|
-
|
|
134
|
+
|
|
135
|
+
});
|
|
136
|
+
|
|
137
|
+
return abstract_nv_chart;
|
|
138
|
+
});
|
|
137
139
|
|
|
138
140
|
/*
|
|
139
141
|
Local Variables:
|