omf_web 1.2.6 → 1.2.7
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
+
*/
|