omf_web 1.2.6 → 1.2.7
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/.travis.yml +13 -0
- data/README.md +6 -0
- data/example/bridge/README.md +1 -1
- data/example/bridge/bridge.yaml +10 -0
- data/example/bridge/bridge_viz_server +41 -0
- data/example/bridge/data_sources/sensor-sqlite.rb +3 -2
- data/example/bridge/htdocs/graph/js/event_table.js +2 -7
- data/example/bridge/tabs/overview.yaml +82 -0
- data/example/openflow-gec15/dashboard_tab.yaml +1 -0
- data/example/simple/simple.yaml +1 -1
- data/example/simple/simple_dynamic.yaml +5 -3
- data/example/topo_discovery/data_sources/links.csv +3 -0
- data/example/topo_discovery/data_sources/links2.csv +21 -0
- data/example/topo_discovery/data_sources/node_info.csv +10 -0
- data/example/topo_discovery/data_sources/nodes.csv +4 -0
- data/example/topo_discovery/data_sources/nodes2.csv +11 -0
- data/example/topo_discovery/introduction.md +17 -0
- data/example/topo_discovery/topo_discovery_simple.yaml +35 -0
- data/example/topo_discovery/topo_discovery_simple2.yaml +32 -0
- data/example/topo_discovery/widgets/network.yaml +52 -0
- data/example/topo_discovery/widgets/node_info.yaml +23 -0
- data/lib/omf-web/content/file_repository.rb +5 -1
- data/lib/omf-web/content/git_repository.rb +11 -0
- data/lib/omf-web/content/repository.rb +13 -2
- data/lib/omf-web/data_source_proxy.rb +22 -10
- data/lib/omf-web/theme.rb +11 -4
- data/lib/omf-web/theme/abstract_page.rb +5 -0
- data/lib/omf-web/thin/server.rb +62 -16
- data/lib/omf-web/version.rb +1 -1
- data/lib/omf-web/widget/code_widget.rb +24 -23
- data/lib/omf-web/widget/data_widget.rb +14 -5
- data/lib/omf-web/widget/text/maruku.rb +16 -1
- data/lib/omf-web/widget/text/text_widget.rb +1 -1
- data/share/htdocs/graph/js/abstract_chart.js +7 -1
- data/share/htdocs/graph/js/abstract_multiple_datasource_chart.js +21 -3
- data/share/htdocs/graph/js/abstract_nv_chart.js +17 -11
- data/share/htdocs/graph/js/abstract_widget.js +44 -14
- data/share/htdocs/graph/js/line_chart3.js +5 -9
- data/share/htdocs/graph/js/map2.js +122 -79
- data/share/htdocs/graph/js/network2.js +205 -36
- data/share/htdocs/graph/js/table2.js +7 -11
- data/share/htdocs/js/data_source3.js +24 -4
- data/share/htdocs/vendor/VERSION_MAP.yaml +1 -1
- data/share/htdocs/vendor/{font-awesome-4.0.3 → font-awesome-4.1.0}/css/font-awesome.css +251 -23
- data/share/htdocs/vendor/font-awesome-4.1.0/css/font-awesome.min.css +4 -0
- data/share/htdocs/vendor/font-awesome-4.1.0/fonts/FontAwesome.otf +0 -0
- data/share/htdocs/vendor/font-awesome-4.1.0/fonts/fontawesome-webfont.eot +0 -0
- data/share/htdocs/vendor/font-awesome-4.1.0/fonts/fontawesome-webfont.svg +504 -0
- data/share/htdocs/vendor/font-awesome-4.1.0/fonts/fontawesome-webfont.ttf +0 -0
- data/share/htdocs/vendor/font-awesome-4.1.0/fonts/fontawesome-webfont.woff +0 -0
- data/share/htdocs/vendor/{font-awesome-4.0.3 → font-awesome-4.1.0}/less/bordered-pulled.less +0 -0
- data/share/htdocs/vendor/{font-awesome-4.0.3 → font-awesome-4.1.0}/less/core.less +0 -0
- data/share/htdocs/vendor/{font-awesome-4.0.3 → font-awesome-4.1.0}/less/fixed-width.less +0 -0
- data/share/htdocs/vendor/font-awesome-4.1.0/less/font-awesome.less +17 -0
- data/share/htdocs/vendor/{font-awesome-4.0.3 → font-awesome-4.1.0}/less/icons.less +97 -3
- data/share/htdocs/vendor/{font-awesome-4.0.3 → font-awesome-4.1.0}/less/larger.less +0 -0
- data/share/htdocs/vendor/{font-awesome-4.0.3 → font-awesome-4.1.0}/less/list.less +0 -0
- data/share/htdocs/vendor/{font-awesome-4.0.3 → font-awesome-4.1.0}/less/mixins.less +0 -0
- data/share/htdocs/vendor/font-awesome-4.1.0/less/path.less +14 -0
- data/share/htdocs/vendor/{font-awesome-4.0.3 → font-awesome-4.1.0}/less/rotated-flipped.less +0 -0
- data/share/htdocs/vendor/{font-awesome-4.0.3 → font-awesome-4.1.0}/less/spinning.less +8 -6
- data/share/htdocs/vendor/{font-awesome-4.0.3 → font-awesome-4.1.0}/less/stacked.less +0 -0
- data/share/htdocs/vendor/{font-awesome-4.0.3 → font-awesome-4.1.0}/less/variables.less +463 -329
- data/share/htdocs/vendor/{font-awesome-4.0.3 → font-awesome-4.1.0}/scss/_bordered-pulled.scss +0 -0
- data/share/htdocs/vendor/{font-awesome-4.0.3 → font-awesome-4.1.0}/scss/_core.scss +0 -0
- data/share/htdocs/vendor/{font-awesome-4.0.3 → font-awesome-4.1.0}/scss/_fixed-width.scss +0 -0
- data/share/htdocs/vendor/{font-awesome-4.0.3 → font-awesome-4.1.0}/scss/_icons.scss +97 -3
- data/share/htdocs/vendor/{font-awesome-4.0.3 → font-awesome-4.1.0}/scss/_larger.scss +0 -0
- data/share/htdocs/vendor/{font-awesome-4.0.3 → font-awesome-4.1.0}/scss/_list.scss +0 -0
- data/share/htdocs/vendor/{font-awesome-4.0.3 → font-awesome-4.1.0}/scss/_mixins.scss +2 -2
- data/share/htdocs/vendor/{font-awesome-4.0.3 → font-awesome-4.1.0}/scss/_path.scss +0 -0
- data/share/htdocs/vendor/{font-awesome-4.0.3 → font-awesome-4.1.0}/scss/_rotated-flipped.scss +0 -0
- data/share/htdocs/vendor/{font-awesome-4.0.3 → font-awesome-4.1.0}/scss/_spinning.scss +8 -6
- data/share/htdocs/vendor/{font-awesome-4.0.3 → font-awesome-4.1.0}/scss/_stacked.scss +0 -0
- data/share/htdocs/vendor/{font-awesome-4.0.3 → font-awesome-4.1.0}/scss/_variables.scss +464 -330
- data/share/htdocs/vendor/{font-awesome-4.0.3 → font-awesome-4.1.0}/scss/font-awesome.scss +1 -1
- data/share/htdocs/vendor/jquery-ui-1.8.23/js/jquery-ui.js +125 -0
- data/share/htdocs/vendor/spin/jquery.spin.js +46 -24
- data/share/htdocs/vendor/spin/spin.js +20 -17
- metadata +277 -237
- data/example/bridge/data_sources/test2.oml +0 -1808
- data/example/bridge/data_sources/test2.sq3 +0 -0
- data/example/bridge/data_sources/test31.sq3 +0 -0
- data/example/bridge/viz_server.rb +0 -59
- data/share/htdocs/vendor/font-awesome-4.0.3/css/font-awesome.min.css +0 -4
- data/share/htdocs/vendor/font-awesome-4.0.3/fonts/FontAwesome.otf +0 -0
- data/share/htdocs/vendor/font-awesome-4.0.3/fonts/fontawesome-webfont.eot +0 -0
- data/share/htdocs/vendor/font-awesome-4.0.3/fonts/fontawesome-webfont.svg +0 -414
- data/share/htdocs/vendor/font-awesome-4.0.3/fonts/fontawesome-webfont.ttf +0 -0
- data/share/htdocs/vendor/font-awesome-4.0.3/fonts/fontawesome-webfont.woff +0 -0
- data/share/htdocs/vendor/font-awesome-4.0.3/less/font-awesome.less +0 -17
- data/share/htdocs/vendor/font-awesome-4.0.3/less/path.less +0 -14
- data/share/htdocs/vendor/spin/spin.min.js +0 -1
|
@@ -34,19 +34,28 @@ module OMF::Web::Widget
|
|
|
34
34
|
|
|
35
35
|
if (ds = opts.delete(:data_source))
|
|
36
36
|
# single source
|
|
37
|
-
data_sources = {:default => ds}
|
|
37
|
+
#data_sources = {:default => ds}
|
|
38
|
+
data_sources = [ds]
|
|
38
39
|
end
|
|
39
40
|
unless data_sources ||= opts.delete(:data_sources)
|
|
40
41
|
raise "Missing option ':data_sources' for widget '#{name}'"
|
|
41
42
|
end
|
|
42
|
-
|
|
43
|
-
|
|
43
|
+
if data_sources.kind_of? Hash
|
|
44
|
+
# turn into array an set stream
|
|
45
|
+
data_sources = data_sources.map do |sname, ds_descr|
|
|
46
|
+
ds_descr[:stream] ||= sname
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
unless data_sources.kind_of? Array
|
|
50
|
+
#data_sources = {:default => data_sources}
|
|
51
|
+
raise "Unexpected ':data_sources' for widget '#{name}' - #{data_sources}"
|
|
44
52
|
end
|
|
45
|
-
|
|
53
|
+
i = 0
|
|
54
|
+
opts[:data_sources] = data_sources.map do |ds_descr|
|
|
46
55
|
unless ds_descr.is_a? Hash
|
|
47
56
|
ds_descr = {:name => ds_descr}
|
|
48
57
|
end
|
|
49
|
-
ds_descr[:alias] = "#{name}_#{self.object_id}"
|
|
58
|
+
ds_descr[:alias] = "#{name}_#{self.object_id}_#{i += 1}"
|
|
50
59
|
#{:stream => ds_descr, :name => name}
|
|
51
60
|
unless OMF::Web::DataSourceProxy.validate_ds_description(ds_descr)
|
|
52
61
|
raise "Unknown data source requested for data widget - #{ds_descr}"
|
|
@@ -43,6 +43,16 @@ module OMF::Web::Widget::Text
|
|
|
43
43
|
::Maruku.new(content)
|
|
44
44
|
end
|
|
45
45
|
|
|
46
|
+
# The markdown document may have some meta instructions at the
|
|
47
|
+
# beginning of the document which are formatted like an HTTP header
|
|
48
|
+
def self.count_header_lines(content)
|
|
49
|
+
count = 0
|
|
50
|
+
match = (content =~ /\A((\w[\w\s\_\-]+: .*\n)+)\s*\n/)
|
|
51
|
+
return 0 if match != 0
|
|
52
|
+
|
|
53
|
+
headers = $1
|
|
54
|
+
headers.split("\n").length + 1
|
|
55
|
+
end
|
|
46
56
|
|
|
47
57
|
class WidgetElement < OMF::Base::LObject
|
|
48
58
|
|
|
@@ -138,7 +148,8 @@ if __FILE__ == $0
|
|
|
138
148
|
if fname = ARGV[0]
|
|
139
149
|
content = File.open(fname).read
|
|
140
150
|
else
|
|
141
|
-
content = %{
|
|
151
|
+
content = %{title: Lorem2
|
|
152
|
+
|
|
142
153
|
# Lorem ipsum dolor sit
|
|
143
154
|
|
|
144
155
|
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin
|
|
@@ -152,6 +163,10 @@ lorem, gravida scelerisque velit est vitae eros. Suspendisse eu
|
|
|
152
163
|
lacinia elit.
|
|
153
164
|
}
|
|
154
165
|
end
|
|
166
|
+
|
|
167
|
+
|
|
155
168
|
x = OMF::Web::Widget::Text::Maruku.format_content(content)
|
|
169
|
+
puts "HEADER LENGTH: #{OMF::Web::Widget::Text::Maruku.count_header_lines(content)}"
|
|
170
|
+
|
|
156
171
|
puts x.to_html(suppress_section: false)
|
|
157
172
|
end
|
|
@@ -61,7 +61,7 @@ define(["graph/abstract_widget"], function (abstract_widget) {
|
|
|
61
61
|
|
|
62
62
|
|
|
63
63
|
var vis = this.init_svg(this.w, this.h);
|
|
64
|
-
this.configure_base_layer(vis);
|
|
64
|
+
if (vis) this.configure_base_layer(vis);
|
|
65
65
|
|
|
66
66
|
var self = this;
|
|
67
67
|
OHUB.bind("graph.highlighted", function(evt) {
|
|
@@ -74,6 +74,7 @@ define(["graph/abstract_widget"], function (abstract_widget) {
|
|
|
74
74
|
});
|
|
75
75
|
|
|
76
76
|
//this.update(null);
|
|
77
|
+
this.init_chart();
|
|
77
78
|
this.update();
|
|
78
79
|
},
|
|
79
80
|
|
|
@@ -84,6 +85,11 @@ define(["graph/abstract_widget"], function (abstract_widget) {
|
|
|
84
85
|
}
|
|
85
86
|
},
|
|
86
87
|
|
|
88
|
+
// This is called once and just before update()
|
|
89
|
+
init_chart: function() {
|
|
90
|
+
// Do nothing, but allow override
|
|
91
|
+
},
|
|
92
|
+
|
|
87
93
|
_resize_base_el: function(w, h) {
|
|
88
94
|
// Do not add margins to the base_el, but to the inside of the SVG panes
|
|
89
95
|
this.w = w;
|
|
@@ -38,17 +38,34 @@ define(["graph/abstract_chart"], function(abstract_chart) {
|
|
|
38
38
|
process_schema: function() {
|
|
39
39
|
var self = this;
|
|
40
40
|
var ds_names = self.data_source_names;
|
|
41
|
+
var outstanding_schemas = ds_names.slice(0); // real copy
|
|
41
42
|
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
43
|
+
// CHeck for all the schemas first and when we have them, really
|
|
44
|
+
// process the schemas
|
|
45
|
+
_.each(ds_names, function(name) {
|
|
46
|
+
self.data_source[name].on_schema(function() {
|
|
47
|
+
outstanding_schemas = _.without(outstanding_schemas, name);
|
|
48
|
+
if (_.isEmpty(outstanding_schemas.length)) {
|
|
49
|
+
self._process_schema();
|
|
50
|
+
}
|
|
51
|
+
});
|
|
45
52
|
});
|
|
53
|
+
},
|
|
46
54
|
|
|
55
|
+
_process_schema: function() {
|
|
56
|
+
var self = this;
|
|
57
|
+
var ds_names = self.data_source_names;
|
|
47
58
|
var om = self.opts.mapping;
|
|
48
59
|
if (om == undefined) {
|
|
49
60
|
throw "Missing mapping instructions in 'options'.";
|
|
50
61
|
}
|
|
51
62
|
self.mapping = {};
|
|
63
|
+
var schemas = self.schema = {};
|
|
64
|
+
|
|
65
|
+
_.each(ds_names, function(ds_name) {
|
|
66
|
+
schemas[ds_name] = self.process_single_schema(self.data_source[ds_name]);
|
|
67
|
+
});
|
|
68
|
+
|
|
52
69
|
_.each(ds_names, function(ds_name) {
|
|
53
70
|
var mapping = om[ds_name];
|
|
54
71
|
if (mapping == undefined) {
|
|
@@ -56,6 +73,7 @@ define(["graph/abstract_chart"], function(abstract_chart) {
|
|
|
56
73
|
}
|
|
57
74
|
self.mapping[ds_name] = self.process_single_mapping(ds_name, mapping, self.decl_properties[ds_name]);
|
|
58
75
|
});
|
|
76
|
+
self.init_mapping();
|
|
59
77
|
},
|
|
60
78
|
|
|
61
79
|
/*
|
|
@@ -1,9 +1,5 @@
|
|
|
1
1
|
|
|
2
|
-
|
|
3
|
-
shim: {
|
|
4
|
-
"vendor/nv_d3/js/nv.d3": ["vendor/d3/d3", "css!vendor/nv_d3/css/nv.d3"]
|
|
5
|
-
}
|
|
6
|
-
});
|
|
2
|
+
OML.require_dependency("vendor/nv_d3/js/nv.d3", ["vendor/d3/d3", "css!vendor/nv_d3/css/nv.d3"]);
|
|
7
3
|
|
|
8
4
|
define(["graph/abstract_chart", 'vendor/nv_d3/js/nv.d3'], function (abstract_chart) {
|
|
9
5
|
|
|
@@ -37,9 +33,18 @@ define(["graph/abstract_chart", 'vendor/nv_d3/js/nv.d3'], function (abstract_cha
|
|
|
37
33
|
|
|
38
34
|
configure_base_layer: function(vis) {
|
|
39
35
|
this.base_layer = vis;
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
36
|
+
this._configure_options(this.opts, this.get_chart());
|
|
37
|
+
},
|
|
38
|
+
|
|
39
|
+
get_chart: function() {
|
|
40
|
+
if (! this.chart) {
|
|
41
|
+
this.chart = this._create_model(); //nv.models.lineWithFocusChart();
|
|
42
|
+
}
|
|
43
|
+
return this.chart;
|
|
44
|
+
},
|
|
45
|
+
|
|
46
|
+
init_mapping: function() {
|
|
47
|
+
this._configure_mapping(this.mapping, this.get_chart());
|
|
43
48
|
},
|
|
44
49
|
|
|
45
50
|
_configure_mapping: function(m, chart) {
|
|
@@ -116,9 +121,10 @@ define(["graph/abstract_chart", 'vendor/nv_d3/js/nv.d3'], function (abstract_cha
|
|
|
116
121
|
var self = this;
|
|
117
122
|
abstract_nv_chart.__super__.resize.call(this);
|
|
118
123
|
if (this.chart) {
|
|
119
|
-
this.chart.width(self.width);
|
|
120
|
-
this.chart.height(self.height);
|
|
121
|
-
|
|
124
|
+
// this.chart.width(self.width);
|
|
125
|
+
// this.chart.height(self.height);
|
|
126
|
+
this.chart.width(self.w);
|
|
127
|
+
this.chart.height(self.h);
|
|
122
128
|
}
|
|
123
129
|
},
|
|
124
130
|
|
|
@@ -142,12 +142,17 @@ define(['omf/data_source_repo', 'vendor/d3/d3'], function(ds_repo) {
|
|
|
142
142
|
return ds;
|
|
143
143
|
},
|
|
144
144
|
|
|
145
|
+
init_mapping: function() {},
|
|
145
146
|
|
|
146
147
|
process_schema: function() {
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
148
|
+
var self = this;
|
|
149
|
+
this.data_source.on_schema(function() {
|
|
150
|
+
self.schema = self.process_single_schema(self.data_source);
|
|
151
|
+
if (typeof(self.decl_properties) != "undefined") {
|
|
152
|
+
self.mapping = self.process_single_mapping(null, self.opts.mapping, self.decl_properties);
|
|
153
|
+
}
|
|
154
|
+
self.init_mapping();
|
|
155
|
+
});
|
|
151
156
|
},
|
|
152
157
|
|
|
153
158
|
process_single_schema: function(data_source) {
|
|
@@ -155,8 +160,12 @@ define(['omf/data_source_repo', 'vendor/d3/d3'], function(ds_repo) {
|
|
|
155
160
|
var o = this.opts;
|
|
156
161
|
var schema = {};
|
|
157
162
|
_.map(data_source.schema, function(s, i) {
|
|
158
|
-
|
|
159
|
-
|
|
163
|
+
// TODO: Remove, this is quick hack to addres a bug in Job Service
|
|
164
|
+
if (_.isArray(s)) { s = {name: s[0], type: s[1]}; }
|
|
165
|
+
// End of hack
|
|
166
|
+
|
|
167
|
+
s['index'] = i;
|
|
168
|
+
schema[s.name] = s;
|
|
160
169
|
});
|
|
161
170
|
return schema;
|
|
162
171
|
},
|
|
@@ -295,19 +304,40 @@ define(['omf/data_source_repo', 'vendor/d3/d3'], function(ds_repo) {
|
|
|
295
304
|
return v;
|
|
296
305
|
};
|
|
297
306
|
case 'color':
|
|
298
|
-
var
|
|
299
|
-
if (
|
|
300
|
-
throw "Missing color
|
|
307
|
+
var color_fdecl = descr.color;
|
|
308
|
+
if (color_fdecl == undefined) {
|
|
309
|
+
throw "Missing color mapping declaration for '" + mname + "'.";
|
|
301
310
|
}
|
|
302
|
-
var
|
|
303
|
-
if (
|
|
304
|
-
|
|
311
|
+
var color_f = null;
|
|
312
|
+
if (typeof color_fdecl == 'string') {
|
|
313
|
+
var color_fp = self.decl_color_func[color_fdecl];
|
|
314
|
+
if (color_fp == undefined) {
|
|
315
|
+
throw "Unknown color function '" + color_fname + "'.";
|
|
316
|
+
}
|
|
317
|
+
color_f = color_fp();
|
|
318
|
+
} else if (color_fdecl instanceof Object) {
|
|
319
|
+
if (color_fdecl instanceof Array) {
|
|
320
|
+
var l = color_fdecl.length;
|
|
321
|
+
color_f = function(v) {
|
|
322
|
+
if (v < 0) v = 0;
|
|
323
|
+
if (v >= l) v = l - 1;
|
|
324
|
+
return color_fdecl[v];
|
|
325
|
+
};
|
|
326
|
+
} else {
|
|
327
|
+
// hash table, mapping some name to color
|
|
328
|
+
return function(d) {
|
|
329
|
+
var key = d[index];
|
|
330
|
+
var c = color_fdecl[key] || 'black';
|
|
331
|
+
return c;
|
|
332
|
+
};
|
|
333
|
+
}
|
|
334
|
+
} else {
|
|
335
|
+
throw "Unknown color function type '" + color_fdecl + "'.";
|
|
305
336
|
}
|
|
306
|
-
var color_f = color_fp();
|
|
307
337
|
var scale = descr.scale;
|
|
308
338
|
var min_value = descr.min;
|
|
309
339
|
return function(d) {
|
|
310
|
-
var v = d[index];
|
|
340
|
+
var v = parseInt(d[index]);
|
|
311
341
|
if (scale != undefined) v = v * scale;
|
|
312
342
|
if (min_value != undefined && v < min_value) v = min_value;
|
|
313
343
|
var color = color_f(v);
|
|
@@ -1,11 +1,7 @@
|
|
|
1
1
|
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
"vendor/nv_d3/js/models/line": ["vendor/nv_d3/js/nv.d3"],
|
|
6
|
-
"vendor/nv_d3/js/models/lineChart": ["vendor/nv_d3/js/models/line"],
|
|
7
|
-
}
|
|
8
|
-
});
|
|
2
|
+
OML.require_dependency("vendor/nv_d3/js/nv.d3", ["vendor/d3/d3", "css!vendor/nv_d3/css/nv.d3"]);
|
|
3
|
+
OML.require_dependency("vendor/nv_d3/js/models/line", ["vendor/nv_d3/js/nv.d3"]);
|
|
4
|
+
OML.require_dependency("vendor/nv_d3/js/models/lineChart", ["vendor/nv_d3/js/models/line"]);
|
|
9
5
|
|
|
10
6
|
define(["graph/abstract_nv_chart",
|
|
11
7
|
"graph/abstract_chart", "graph/axis",
|
|
@@ -52,7 +48,7 @@ define(["graph/abstract_nv_chart",
|
|
|
52
48
|
// ;
|
|
53
49
|
|
|
54
50
|
this.opts.transition_duration = 0; // force no smooth transition
|
|
55
|
-
this._configure_xy_axis(opts, chart)
|
|
51
|
+
this._configure_xy_axis(opts, chart);
|
|
56
52
|
},
|
|
57
53
|
|
|
58
54
|
_datum: function(data, chart) {
|
|
@@ -67,7 +63,7 @@ define(["graph/abstract_nv_chart",
|
|
|
67
63
|
} else {
|
|
68
64
|
data = [data];
|
|
69
65
|
};
|
|
70
|
-
chart.showLegend(
|
|
66
|
+
chart.showLegend(group_by != null);
|
|
71
67
|
|
|
72
68
|
return data.map(function(rows, i) {
|
|
73
69
|
var name = m.group_by != null ? m.group_by(rows[0]) : 'unknown';
|
|
@@ -1,26 +1,28 @@
|
|
|
1
1
|
|
|
2
2
|
|
|
3
3
|
//L.provide('OML.map', ["d3", "http://maps.googleapis.com/maps/api/js?sensor=true"], function () {
|
|
4
|
-
|
|
5
|
-
google.load("maps", "3", {"callback" : onMapLoaded, "other_params":"sensor=true"});
|
|
6
|
-
});
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
4
|
+
// define(["http://www.google.com/jsapi"], function () {
|
|
5
|
+
// google.load("maps", "3", {"callback" : onMapLoaded, "other_params":"sensor=true"});
|
|
6
|
+
// });
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
define(["graph/abstract_chart", "http://www.google.com/jsapi"], function (abstract_chart) {
|
|
10
|
+
|
|
11
|
+
//L.provide('OML.map2', ["graph/js/abstract_chart", "#OML.abstract_chart"], function () {
|
|
12
|
+
|
|
13
|
+
var map2 = abstract_chart.extend({
|
|
13
14
|
//this.opts = opts;
|
|
14
|
-
|
|
15
|
+
|
|
15
16
|
decl_properties: [
|
|
16
|
-
['
|
|
17
|
-
['
|
|
18
|
-
['radius', 'int', 10],
|
|
19
|
-
['
|
|
20
|
-
['
|
|
21
|
-
['
|
|
17
|
+
['latitude', 'key', {property: 'latitude'}],
|
|
18
|
+
['longitude', 'key', {property: 'longitude'}],
|
|
19
|
+
//['radius', 'key', {property: 'radius', type: 'int', default: 10}],
|
|
20
|
+
['radius', 'int', 10],
|
|
21
|
+
['fill_color', 'color', 'blue'],
|
|
22
|
+
['stroke_width', 'int', 1],
|
|
23
|
+
['stroke_color', 'color', 'black'],
|
|
22
24
|
],
|
|
23
|
-
|
|
25
|
+
|
|
24
26
|
defaults: function() {
|
|
25
27
|
return this.deep_defaults({
|
|
26
28
|
margin: {
|
|
@@ -29,10 +31,13 @@ function onMapLoaded() {
|
|
|
29
31
|
right: 20,
|
|
30
32
|
bottom: 0
|
|
31
33
|
},
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
34
|
+
events: {
|
|
35
|
+
// click: event_name
|
|
36
|
+
}
|
|
37
|
+
}, map2.__super__.defaults.call(this));
|
|
38
|
+
},
|
|
39
|
+
|
|
40
|
+
|
|
36
41
|
init_svg: function(w, h) {
|
|
37
42
|
//this.init = function(opts) {
|
|
38
43
|
var self = this;
|
|
@@ -40,9 +45,9 @@ function onMapLoaded() {
|
|
|
40
45
|
var base_el = opts.base_el || '#map';
|
|
41
46
|
d3.select(base_el)
|
|
42
47
|
.style('position', 'relative')
|
|
43
|
-
.style("height", "100%")
|
|
48
|
+
.style("height", "100%")
|
|
44
49
|
.style("width", "100%")
|
|
45
|
-
.style("height", h)
|
|
50
|
+
.style("height", h)
|
|
46
51
|
.style("width", w)
|
|
47
52
|
;
|
|
48
53
|
|
|
@@ -54,74 +59,90 @@ function onMapLoaded() {
|
|
|
54
59
|
var center = opts.map.center || [151.197189, -33.895508];
|
|
55
60
|
var zoom = opts.map.zoom;
|
|
56
61
|
if (zoom == undefined) zoom = 17;
|
|
57
|
-
var map = this.map = new google.maps.Map(node, {
|
|
58
|
-
zoom: zoom,
|
|
59
|
-
center: new google.maps.LatLng(center[1], center[0]),
|
|
60
|
-
mapTypeId: google.maps.MapTypeId.ROADMAP
|
|
61
|
-
});
|
|
62
62
|
// force width and height AFTER creating the map, otherwise height is zero.
|
|
63
63
|
var ca = this.widget_area;
|
|
64
64
|
d3.select('#' + map_el)
|
|
65
|
-
.style("height", ca.h + "px")
|
|
65
|
+
.style("height", ca.h + "px")
|
|
66
66
|
.style("width", ca.w + "px")
|
|
67
67
|
.style("position", "relative")
|
|
68
68
|
// .style("position", "absolute")
|
|
69
|
-
.style("top", ca.ty + "px")
|
|
69
|
+
.style("top", ca.ty + "px")
|
|
70
70
|
.style("left", ca.x + "px")
|
|
71
|
-
//.style('z-index', '10')
|
|
71
|
+
//.style('z-index', '10')
|
|
72
72
|
;
|
|
73
73
|
|
|
74
74
|
this.offset = {left: 0, top: 0};
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
75
|
+
|
|
76
|
+
var map = null;
|
|
77
|
+
google.load("maps", "3", {
|
|
78
|
+
"other_params":"sensor=true",
|
|
79
|
+
"callback" : function() {
|
|
80
|
+
map = self.map = new google.maps.Map(node, {
|
|
81
|
+
zoom: zoom,
|
|
82
|
+
center: new google.maps.LatLng(center[1], center[0]),
|
|
83
|
+
mapTypeId: google.maps.MapTypeId.ROADMAP
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
google.maps.event.addListener(map, 'bounds_changed', function() {
|
|
87
|
+
self._resize();
|
|
88
|
+
self.redraw();
|
|
89
|
+
});
|
|
90
|
+
google.maps.event.addListener(map, 'zoom_changed', function() {
|
|
91
|
+
// some things aren't set yet when 'bounds_changed' is called after a zoom'
|
|
92
|
+
setTimeout(function() {
|
|
93
|
+
self._resize();
|
|
94
|
+
self.redraw();
|
|
95
|
+
}, 100);
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
self._configure_base_layer();
|
|
84
99
|
self.redraw();
|
|
85
|
-
}
|
|
86
|
-
});
|
|
100
|
+
}
|
|
101
|
+
});
|
|
102
|
+
return null;
|
|
87
103
|
},
|
|
88
|
-
|
|
104
|
+
|
|
105
|
+
// _google_init: function() {
|
|
106
|
+
//
|
|
107
|
+
// },
|
|
108
|
+
|
|
89
109
|
_resize: function() {
|
|
90
110
|
var self = this;
|
|
91
|
-
|
|
111
|
+
|
|
92
112
|
if (self.svg_layer) {
|
|
93
113
|
var map_el = self.map_el;
|
|
94
114
|
var map = $('#' + map_el);
|
|
95
|
-
var div = $('#' + map_el + '_div');
|
|
115
|
+
var div = $('#' + map_el + '_div');
|
|
96
116
|
var svg = $('#' + map_el + '_svg');
|
|
97
117
|
var map_offset = map.offset();
|
|
98
118
|
var div_offset = div.offset();
|
|
99
|
-
|
|
119
|
+
|
|
100
120
|
svg.width($('#' + map_el).width());
|
|
101
|
-
svg.height($('#' + map_el).height());
|
|
121
|
+
svg.height($('#' + map_el).height());
|
|
102
122
|
|
|
103
123
|
//console.log(map_offset.left - div_offset.left);
|
|
104
124
|
// Reposition the SVG layer to cover the entire map area - requires readjustment later (this.offset)
|
|
105
125
|
self.svg_layer
|
|
106
|
-
.style("top", (self.offset.top = map_offset.top - div_offset.top) + "px")
|
|
126
|
+
.style("top", (self.offset.top = map_offset.top - div_offset.top) + "px")
|
|
107
127
|
.style("left", (self.offset.left = map_offset.left - div_offset.left) + "px")
|
|
108
|
-
;
|
|
109
|
-
}
|
|
128
|
+
;
|
|
129
|
+
}
|
|
110
130
|
},
|
|
111
|
-
|
|
131
|
+
|
|
112
132
|
redraw: function() {
|
|
113
133
|
//console.log("redraw");
|
|
114
134
|
if (this.draw_layer) this._draw(null);
|
|
115
135
|
//this.overlay.map_changed();
|
|
116
136
|
},
|
|
117
|
-
|
|
137
|
+
|
|
118
138
|
_draw: function(overlay) {
|
|
119
|
-
var
|
|
139
|
+
var self = this;
|
|
140
|
+
var projection = this.overlay.getProjection();
|
|
120
141
|
var m = this.mapping;
|
|
121
142
|
var offset = this.offset;
|
|
122
143
|
var x_f = function(d) {
|
|
123
|
-
var lat = m.
|
|
124
|
-
var lng = m.
|
|
144
|
+
var lat = m.latitude(d.value);
|
|
145
|
+
var lng = m.longitude(d.value);
|
|
125
146
|
var point = new google.maps.LatLng(lat, lng);
|
|
126
147
|
var xy = d.xy = projection.fromLatLngToDivPixel(point);
|
|
127
148
|
return xy.x - offset.left;
|
|
@@ -131,60 +152,82 @@ function onMapLoaded() {
|
|
|
131
152
|
};
|
|
132
153
|
var m_f = function(d, m) {
|
|
133
154
|
return (typeof m === "function") ? m(d.value) : m;
|
|
134
|
-
}
|
|
135
|
-
|
|
155
|
+
};
|
|
156
|
+
|
|
136
157
|
var data = d3.entries(this.data_source.rows());
|
|
137
158
|
this.draw_layer.selectAll('.marker')
|
|
138
159
|
.data(data)
|
|
139
|
-
.attr("cx", x_f)
|
|
160
|
+
.attr("cx", x_f)
|
|
140
161
|
.attr("cy", y_f)
|
|
141
|
-
.attr("r", function(d) {return m_f(d, m.radius)})
|
|
142
|
-
.style("fill", function(d) {return m_f(d, m.fill_color)})
|
|
143
|
-
.style("stroke", function(d) {return m_f(d, m.stroke_color)})
|
|
144
|
-
.style("stroke-width", function(d) {return m_f(d, m.stroke_width)})
|
|
162
|
+
.attr("r", function(d) {return m_f(d, m.radius);})
|
|
163
|
+
.style("fill", function(d) {return m_f(d, m.fill_color);})
|
|
164
|
+
.style("stroke", function(d) {return m_f(d, m.stroke_color);})
|
|
165
|
+
.style("stroke-width", function(d) {return m_f(d, m.stroke_width);})
|
|
145
166
|
.enter().append('svg:circle')
|
|
146
167
|
.attr("class", "marker")
|
|
147
|
-
.attr("cx", x_f)
|
|
168
|
+
.attr("cx", x_f)
|
|
148
169
|
.attr("cy", y_f)
|
|
149
|
-
.attr("r", function(d) {return m_f(d, m.radius)})
|
|
150
|
-
.style("fill", function(d) {return m_f(d, m.fill_color)})
|
|
151
|
-
.style("stroke", function(d) {return m_f(d, m.stroke_color)})
|
|
152
|
-
.style("stroke-width", function(d) {return m_f(d, m.stroke_width)})
|
|
170
|
+
.attr("r", function(d) {return m_f(d, m.radius);})
|
|
171
|
+
.style("fill", function(d) {return m_f(d, m.fill_color);})
|
|
172
|
+
.style("stroke", function(d) {return m_f(d, m.stroke_color);})
|
|
173
|
+
.style("stroke-width", function(d) {return m_f(d, m.stroke_width);})
|
|
174
|
+
.call(self._configure_events, self.opts.events, self)
|
|
175
|
+
.style("cursor", 'pointer')
|
|
176
|
+
// .on('click', function(d) {
|
|
177
|
+
// var x = self;
|
|
178
|
+
// var i = 0;
|
|
179
|
+
// })
|
|
180
|
+
// .on('mouseover', function(d) {
|
|
181
|
+
// var x = self;
|
|
182
|
+
// var i = 0;
|
|
183
|
+
// })
|
|
153
184
|
;
|
|
154
185
|
},
|
|
155
186
|
|
|
156
|
-
|
|
187
|
+
_configure_events: function(el, events, self) {
|
|
188
|
+
_.each(events, function(v, event) {
|
|
189
|
+
el.on(event, function(d) {
|
|
190
|
+
var ev_name = v;
|
|
191
|
+
OHUB.trigger(ev_name, {el: self, datum: d.value, schema: self.schema});
|
|
192
|
+
});
|
|
193
|
+
});
|
|
194
|
+
},
|
|
195
|
+
|
|
196
|
+
// Should only call this after Google map is initialised
|
|
197
|
+
_configure_base_layer: function(vis) {
|
|
157
198
|
var overlay = this.overlay = new google.maps.OverlayView();
|
|
158
199
|
var self = this;
|
|
159
|
-
|
|
200
|
+
|
|
160
201
|
// Add the container when the overlay is added to the map.
|
|
161
202
|
overlay.onAdd = function() {
|
|
162
|
-
var overlay_layer = this.getPanes().
|
|
203
|
+
var overlay_layer = this.getPanes().overlayMouseTarget;
|
|
163
204
|
d3.select(overlay_layer).attr('id', 'fooooo');
|
|
164
205
|
self.div_layer = d3.select(overlay_layer).append("div")
|
|
165
206
|
.attr('id', self.map_el + '_div')
|
|
166
207
|
//.attr('class', this.base_css_class);
|
|
167
|
-
;
|
|
208
|
+
;
|
|
168
209
|
self.svg_layer = self.div_layer.append("svg:svg")
|
|
169
210
|
.attr('id', self.map_el + '_svg')
|
|
170
211
|
.style("position", "absolute")
|
|
171
|
-
.style('z-index', '10')
|
|
212
|
+
.style('z-index', '10')
|
|
172
213
|
;
|
|
173
214
|
self.draw_layer = self.svg_layer.append("svg:g")
|
|
174
215
|
;
|
|
175
216
|
self._resize();
|
|
176
|
-
|
|
217
|
+
|
|
177
218
|
overlay.draw = function() {
|
|
178
|
-
//console.log("overlay draw");
|
|
179
|
-
self._draw(this)
|
|
219
|
+
//console.log("overlay draw");
|
|
220
|
+
self._draw(this);
|
|
180
221
|
};
|
|
181
|
-
};
|
|
222
|
+
};
|
|
182
223
|
overlay.setMap(this.map);
|
|
183
224
|
}
|
|
184
|
-
|
|
225
|
+
|
|
226
|
+
});
|
|
227
|
+
|
|
228
|
+
return map2;
|
|
185
229
|
});
|
|
186
230
|
|
|
187
|
-
}
|
|
188
231
|
|
|
189
232
|
/*
|
|
190
233
|
Local Variables:
|
|
@@ -192,4 +235,4 @@ function onMapLoaded() {
|
|
|
192
235
|
tab-width: 2
|
|
193
236
|
indent-tabs-mode: nil
|
|
194
237
|
End:
|
|
195
|
-
*/
|
|
238
|
+
*/
|