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