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
|
@@ -27,7 +27,17 @@ define(["graph/abstract_chart"], function (abstract_chart) {
|
|
|
27
27
|
|
|
28
28
|
defaults: function() {
|
|
29
29
|
return this.deep_defaults({
|
|
30
|
+
line_mode: 'curved', // 'straight'
|
|
30
31
|
interaction_mode: 'none', // none, hover, click
|
|
32
|
+
force: {
|
|
33
|
+
// see https://github.com/mbostock/d3/wiki/Force-Layout
|
|
34
|
+
link_distance: null, // 150,
|
|
35
|
+
link_strength: null, // [0, 1] set to 1
|
|
36
|
+
charge: null, // -30 -500,
|
|
37
|
+
charge_distance: null,
|
|
38
|
+
gravity: null, // default: 0.1
|
|
39
|
+
theta: null, // default: 0.8
|
|
40
|
+
}
|
|
31
41
|
}, network2.__super__.defaults.call(this));
|
|
32
42
|
},
|
|
33
43
|
|
|
@@ -37,7 +47,9 @@ define(["graph/abstract_chart"], function (abstract_chart) {
|
|
|
37
47
|
this.graph_layer = vis.append("svg:g")
|
|
38
48
|
.attr("transform", "translate(0, " + ca.h + ")")
|
|
39
49
|
;
|
|
40
|
-
this.
|
|
50
|
+
this.link_layer = this.graph_layer.append("svg:g");
|
|
51
|
+
this.node_layer = this.graph_layer.append("svg:g");
|
|
52
|
+
this.legend_layer = this.graph_layer.append("svg:g");
|
|
41
53
|
},
|
|
42
54
|
|
|
43
55
|
base_css_class: 'oml-network',
|
|
@@ -53,23 +65,17 @@ define(["graph/abstract_chart"], function (abstract_chart) {
|
|
|
53
65
|
throw "Expected an array";
|
|
54
66
|
}
|
|
55
67
|
if (sources.length == 1) {
|
|
56
|
-
// Check if
|
|
68
|
+
// Check if we can find
|
|
57
69
|
// a _links and _nodes source
|
|
58
70
|
var s = sources[0];
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
if (typeof(ss) != 'object') {
|
|
63
|
-
ss = { name: ss };
|
|
64
|
-
}
|
|
65
|
-
var prefix = ss.name;
|
|
66
|
-
var sn = {}; for (var p in ss) { sn[p] = ss[p]; }; sn.name = prefix + '/nodes';
|
|
67
|
-
var sl = {}; for (var p in ss) { sl[p] = ss[p]; }; sl.name = prefix + '/links';
|
|
68
|
-
sources = [
|
|
69
|
-
{name: 'nodes', stream: sn},
|
|
70
|
-
{name: 'links', stream: sl},
|
|
71
|
-
];
|
|
71
|
+
var ss = s.stream || s.name;
|
|
72
|
+
if (typeof(ss) != 'object') {
|
|
73
|
+
ss = { name: ss };
|
|
72
74
|
}
|
|
75
|
+
var prefix = ss.name;
|
|
76
|
+
var sn = {}; for (var p in ss) { sn[p] = ss[p]; }; sn.name = 'nodes'; sn.stream = prefix + '/nodes';
|
|
77
|
+
var sl = {}; for (var p in ss) { sl[p] = ss[p]; }; sl.name = 'links'; sl.stream = prefix + '/links';
|
|
78
|
+
sources = [sn, sl];
|
|
73
79
|
}
|
|
74
80
|
if (sources.length != 2) {
|
|
75
81
|
throw "Expected TWO data source, one for nodes and one for links";
|
|
@@ -84,21 +90,81 @@ define(["graph/abstract_chart"], function (abstract_chart) {
|
|
|
84
90
|
},
|
|
85
91
|
|
|
86
92
|
process_schema: function() {
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
93
|
+
var self = this;
|
|
94
|
+
var ds_names = ['nodes', 'links'];
|
|
95
|
+
var outstanding_schemas = ds_names.slice(0); // real copy
|
|
96
|
+
|
|
97
|
+
// CHeck for all the schemas first and when we have them, really
|
|
98
|
+
// process the schemas
|
|
99
|
+
_.each(ds_names, function(name) {
|
|
100
|
+
self.data_source[name].on_schema(function() {
|
|
101
|
+
outstanding_schemas = _.without(outstanding_schemas, name);
|
|
102
|
+
if (_.isEmpty(outstanding_schemas.length)) {
|
|
103
|
+
self._process_schema();
|
|
104
|
+
}
|
|
105
|
+
});
|
|
106
|
+
});
|
|
107
|
+
},
|
|
91
108
|
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
109
|
+
_process_schema: function() {
|
|
110
|
+
var self = this;
|
|
111
|
+
var ds_names = ['nodes', 'links'];
|
|
112
|
+
var om = self.opts.mapping;
|
|
113
|
+
if (om == undefined) {
|
|
114
|
+
throw "Missing mapping instructions in 'options'.";
|
|
95
115
|
}
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
116
|
+
self.mapping = {};
|
|
117
|
+
var schemas = self.schema = {};
|
|
118
|
+
|
|
119
|
+
_.each(ds_names, function(ds_name) {
|
|
120
|
+
schemas[ds_name] = self.process_single_schema(self.data_source[ds_name]);
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
_.each(ds_names, function(ds_name) {
|
|
124
|
+
var mapping = om[ds_name];
|
|
125
|
+
if (mapping == undefined) {
|
|
126
|
+
throw "Missing mapping instructions in 'options' for '" + ds_name + "'.";
|
|
127
|
+
}
|
|
128
|
+
self.mapping[ds_name] = self.process_single_mapping(ds_name, mapping, self.decl_properties[ds_name]);
|
|
129
|
+
});
|
|
130
|
+
self.init_mapping();
|
|
100
131
|
},
|
|
101
132
|
|
|
133
|
+
|
|
134
|
+
// process_schema: function() {
|
|
135
|
+
//
|
|
136
|
+
//
|
|
137
|
+
// var self = this;
|
|
138
|
+
// var schemas = this.schema = {};
|
|
139
|
+
// var mappings = this.mapping = {};
|
|
140
|
+
// var om = this.opts.mapping;
|
|
141
|
+
// // if (om.links == undefined || om.nodes == undefined) {
|
|
142
|
+
// // throw "Missing mapping instructions in 'options' for either 'links' or 'nodes', or both.";
|
|
143
|
+
// // }
|
|
144
|
+
// // links: this.process_single_schema(this.data_source.links)
|
|
145
|
+
// // };
|
|
146
|
+
// // this.data_source.nodes.on_schema(function() {
|
|
147
|
+
// // schemas.nodes = self.process_single_schema(self.data_source.nodes);
|
|
148
|
+
// // mappings.nodes = self.process_single_mapping('nodes', om.nodes, self.decl_properties.nodes);
|
|
149
|
+
// // });
|
|
150
|
+
//
|
|
151
|
+
// _.each(['nodes', 'links'], function(name) {
|
|
152
|
+
// if (om[name] == undefined) {
|
|
153
|
+
// throw "Missing mapping instructions in 'options' for '" + name + "'.";
|
|
154
|
+
// }
|
|
155
|
+
// self.data_source[name].on_schema(function() {
|
|
156
|
+
// schemas[name] = self.process_single_schema(self.data_source[name]);
|
|
157
|
+
// mappings[name] = self.process_single_mapping(name, om[name], self.decl_properties[name]);
|
|
158
|
+
// });
|
|
159
|
+
// });
|
|
160
|
+
//
|
|
161
|
+
//
|
|
162
|
+
// // this.mapping = {
|
|
163
|
+
// // nodes: this.process_single_mapping('nodes', om.nodes, this.decl_properties.nodes),
|
|
164
|
+
// // links: this.process_single_mapping('links', om.links, this.decl_properties.links)
|
|
165
|
+
// // };
|
|
166
|
+
// },
|
|
167
|
+
|
|
102
168
|
/*
|
|
103
169
|
* Return schema for +stream+.
|
|
104
170
|
*/
|
|
@@ -115,27 +181,122 @@ define(["graph/abstract_chart"], function (abstract_chart) {
|
|
|
115
181
|
return ds;
|
|
116
182
|
},
|
|
117
183
|
|
|
184
|
+
// This is called once and just before update()
|
|
185
|
+
init_chart: function() {
|
|
186
|
+
network2.__super__.init_chart.call(this);
|
|
187
|
+
|
|
188
|
+
this.auto_placement = this.mapping.nodes.x == 'auto';
|
|
189
|
+
if (!this.auto_placement) return;
|
|
190
|
+
|
|
191
|
+
var self = this;
|
|
192
|
+
var o = this.opts.force;
|
|
193
|
+
var nmapping = this.mapping.nodes;
|
|
194
|
+
nmapping.x = function(d) {
|
|
195
|
+
return d.__force__.x / self.widget_area.w;
|
|
196
|
+
};
|
|
197
|
+
nmapping.y = function(d) {
|
|
198
|
+
return d.__force__.y / self.widget_area.h;
|
|
199
|
+
};
|
|
200
|
+
|
|
201
|
+
var ca = this.widget_area;
|
|
202
|
+
var force = this.force = d3.layout.force().size([ca.w, ca.h]);
|
|
203
|
+
|
|
204
|
+
if (o.link_distance) force.linkDistance(o.link_distance);
|
|
205
|
+
if (o.link_strength) force.linkStrength(o.link_strength);
|
|
206
|
+
if (o.charge) force.charge(o.charge);
|
|
207
|
+
if (o.charge_distance) force.chargeDistance(o.charge_distance);
|
|
208
|
+
if (o.gravity) force.gravity(o.gravity);
|
|
209
|
+
if (o.theta) force.theta(o.theta);
|
|
210
|
+
|
|
211
|
+
this.force.on('tick', function() {
|
|
212
|
+
var data = self.data;
|
|
213
|
+
self.redraw(data);
|
|
214
|
+
});
|
|
215
|
+
},
|
|
216
|
+
|
|
217
|
+
resize: function() {
|
|
218
|
+
network2.__super__.resize.call(this);
|
|
219
|
+
|
|
220
|
+
if (this.force) {
|
|
221
|
+
var ca = this.widget_area;
|
|
222
|
+
this.force.size([ca.w, ca.h]).start();
|
|
223
|
+
}
|
|
224
|
+
},
|
|
225
|
+
|
|
226
|
+
|
|
118
227
|
update: function() {
|
|
119
228
|
|
|
120
229
|
var ldata = this.data_source.links.rows();
|
|
121
230
|
var ndata = this.data_source.nodes.rows();
|
|
122
231
|
|
|
232
|
+
if (this.force) {
|
|
233
|
+
// The following sets up data structures to be used by
|
|
234
|
+
// force layout. It also needs node and link arrays but
|
|
235
|
+
// in a different format from how we use it here.
|
|
236
|
+
// To still work with the rest of the library, we are
|
|
237
|
+
// attaching an '__force__' entry to each data element
|
|
238
|
+
// which we then hand over to the force layouter but also
|
|
239
|
+
// can revert to when drawing the graph.
|
|
240
|
+
//
|
|
241
|
+
var nm = this.mapping.nodes;
|
|
242
|
+
var nmap = {};
|
|
243
|
+
var nodes = _.map(ndata, function(d) {
|
|
244
|
+
var f = d.__force__;
|
|
245
|
+
if (!f) {
|
|
246
|
+
var id = nm.key(d);
|
|
247
|
+
f = d.__force__ = {index: id, d: d};
|
|
248
|
+
}
|
|
249
|
+
nmap[f.index] = f;
|
|
250
|
+
return f;
|
|
251
|
+
});
|
|
252
|
+
|
|
253
|
+
var lm = this.mapping.links;
|
|
254
|
+
var links = _.map(ldata, function(d) {
|
|
255
|
+
var f = d.__force__;
|
|
256
|
+
if (!f) {
|
|
257
|
+
var s = lm.from(d);
|
|
258
|
+
var t = lm.to(d);
|
|
259
|
+
var id = nm.key(d);
|
|
260
|
+
f = d.__force__ = {index: id, source: s.__force__, target: t.__force__, d: d};
|
|
261
|
+
}
|
|
262
|
+
return f;
|
|
263
|
+
});
|
|
264
|
+
|
|
265
|
+
// TODO: We need to check if any new data items have been added or old ones
|
|
266
|
+
// removed. So the following may be a bit slow.
|
|
267
|
+
function isDiff(a1, a2) {
|
|
268
|
+
if (a1.length != a2.length) return true;
|
|
269
|
+
|
|
270
|
+
var i1 = _.map(a1, function(d) {return d.index; });
|
|
271
|
+
var i2 = _.map(a2, function(d) {return d.index; });
|
|
272
|
+
var d = _.difference(i1, i2);
|
|
273
|
+
return d.length > 0;
|
|
274
|
+
}
|
|
275
|
+
var force = this.force;
|
|
276
|
+
if (isDiff(force.nodes(), nodes) || isDiff(force.links(), links)) {
|
|
277
|
+
force.nodes(nodes);
|
|
278
|
+
force.links(links);
|
|
279
|
+
force.start();
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
|
|
123
283
|
this.redraw({links: ldata, nodes: ndata});
|
|
124
284
|
},
|
|
125
285
|
|
|
126
286
|
redraw: function(data) {
|
|
127
287
|
var self = this;
|
|
288
|
+
self.data = data;
|
|
128
289
|
var o = this.opts;
|
|
129
290
|
var mapping = this.mapping; //o.mapping || {};
|
|
130
291
|
var ca = this.widget_area;
|
|
131
292
|
|
|
132
293
|
var x = function(v) {
|
|
133
|
-
var x = v * ca.w + ca.x;
|
|
294
|
+
//var x = v * ca.w + ca.x;
|
|
134
295
|
var x = v * ca.w;
|
|
135
296
|
return x;
|
|
136
297
|
};
|
|
137
298
|
var y = function(v) {
|
|
138
|
-
var y = -1 * (v * ca.h + ca.y);
|
|
299
|
+
//var y = -1 * (v * ca.h + ca.y);
|
|
139
300
|
var y = -1 * (v * ca.h);
|
|
140
301
|
return y;
|
|
141
302
|
};
|
|
@@ -145,7 +306,7 @@ define(["graph/abstract_chart"], function (abstract_chart) {
|
|
|
145
306
|
var nmapping = mapping.nodes;
|
|
146
307
|
var iline_f = d3.svg.line().interpolate('basis');
|
|
147
308
|
|
|
148
|
-
// curved line
|
|
309
|
+
// curved line or straight depending on line_mode
|
|
149
310
|
var line_f = function(d) {
|
|
150
311
|
var a = 0.2;
|
|
151
312
|
var b = 0.3;
|
|
@@ -162,6 +323,9 @@ define(["graph/abstract_chart"], function (abstract_chart) {
|
|
|
162
323
|
var dx = x3 - x1;
|
|
163
324
|
var dy = y3 - y1;
|
|
164
325
|
var l = Math.sqrt(dx * dx + dy * dy);
|
|
326
|
+
if (l == 0 || self.opts.line_mode != 'curved') {
|
|
327
|
+
return iline_f([[x1, y1], [x3, y3]]);
|
|
328
|
+
}
|
|
165
329
|
|
|
166
330
|
var mx = x1 + a * dx;
|
|
167
331
|
var my = y1 + a * dy;
|
|
@@ -172,8 +336,11 @@ define(["graph/abstract_chart"], function (abstract_chart) {
|
|
|
172
336
|
};
|
|
173
337
|
|
|
174
338
|
var ldata = data.links;
|
|
175
|
-
var link2 = this.
|
|
176
|
-
.data(d3.values(ldata))
|
|
339
|
+
var link2 = this.link_layer.selectAll("path.link")
|
|
340
|
+
.data(d3.values(ldata), function(d) {
|
|
341
|
+
var k = lmapping.key(d);
|
|
342
|
+
return lmapping.key(d);
|
|
343
|
+
});
|
|
177
344
|
link2
|
|
178
345
|
//.each(position) // update existing markers
|
|
179
346
|
.style("stroke", lmapping.stroke_color)
|
|
@@ -193,8 +360,10 @@ define(["graph/abstract_chart"], function (abstract_chart) {
|
|
|
193
360
|
var ndata = data.nodes;
|
|
194
361
|
// first draw white circle to allow actual node to become transparent
|
|
195
362
|
// without links showing through
|
|
196
|
-
var bg_node = this.
|
|
197
|
-
.data(ndata, function(d) {
|
|
363
|
+
var bg_node = this.node_layer.selectAll("circle.bg_node")
|
|
364
|
+
.data(ndata, function(d) {
|
|
365
|
+
return nmapping.key(d);
|
|
366
|
+
})
|
|
198
367
|
.attr("cx", function(d) { return x(nmapping.x(d)); })
|
|
199
368
|
.attr("cy", function(d) { return y(nmapping.y(d)); })
|
|
200
369
|
.attr("r", nmapping.radius)
|
|
@@ -217,7 +386,7 @@ define(["graph/abstract_chart"], function (abstract_chart) {
|
|
|
217
386
|
.style("stroke-width", nmapping.stroke_width)
|
|
218
387
|
;
|
|
219
388
|
}
|
|
220
|
-
var node = this.
|
|
389
|
+
var node = this.node_layer.selectAll("circle.node")
|
|
221
390
|
.data(ndata, function(d) {
|
|
222
391
|
return nmapping.key(d);
|
|
223
392
|
});
|
|
@@ -256,7 +425,7 @@ define(["graph/abstract_chart"], function (abstract_chart) {
|
|
|
256
425
|
.style("font-size", nmapping.label_size)
|
|
257
426
|
.text(function(d) { return nmapping.label_text(d); });
|
|
258
427
|
}
|
|
259
|
-
var label = this.
|
|
428
|
+
var label = this.node_layer.selectAll("text.node_label")
|
|
260
429
|
.data(ndata, function(d) {
|
|
261
430
|
return nmapping.key(d);
|
|
262
431
|
});
|
|
@@ -442,4 +611,4 @@ define(["graph/abstract_chart"], function (abstract_chart) {
|
|
|
442
611
|
tab-width: 2
|
|
443
612
|
indent-tabs-mode: nil
|
|
444
613
|
End:
|
|
445
|
-
*/
|
|
614
|
+
*/
|
|
@@ -1,15 +1,11 @@
|
|
|
1
1
|
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
'vendor/slickgrid/controls/slick.pager': ['vendor/slickgrid/slick.core'],
|
|
10
|
-
'vendor/slickgrid/controls/slick.columnpicker': ['vendor/slickgrid/slick.core']
|
|
11
|
-
}
|
|
12
|
-
});
|
|
2
|
+
OML.require_dependency('vendor/slickgrid/slick.formatters', ['vendor/slickgrid/slick.core']);
|
|
3
|
+
OML.require_dependency('vendor/slickgrid/slick.editors', ['vendor/slickgrid/slick.core']);
|
|
4
|
+
OML.require_dependency('vendor/slickgrid/plugins/slick.rowselectionmodel', ['vendor/slickgrid/slick.core']);
|
|
5
|
+
OML.require_dependency('vendor/slickgrid/slick.grid', ['vendor/slickgrid/slick.core']);
|
|
6
|
+
OML.require_dependency('vendor/slickgrid/slick.dataview', ['vendor/slickgrid/slick.core']);
|
|
7
|
+
OML.require_dependency('vendor/slickgrid/controls/slick.pager', ['vendor/slickgrid/slick.core']);
|
|
8
|
+
OML.require_dependency('vendor/slickgrid/controls/slick.columnpicker', ['vendor/slickgrid/slick.core']);
|
|
13
9
|
|
|
14
10
|
|
|
15
11
|
define(["graph/abstract_widget",
|
|
@@ -19,6 +19,24 @@ function omf_web_data_source(opts) {
|
|
|
19
19
|
event_name: event_name,
|
|
20
20
|
};
|
|
21
21
|
|
|
22
|
+
var on_schema_callbacks = [];
|
|
23
|
+
|
|
24
|
+
data_source.on_schema = function(callback) {
|
|
25
|
+
if (schema) {
|
|
26
|
+
callback(schema);
|
|
27
|
+
} else {
|
|
28
|
+
// delay
|
|
29
|
+
on_schema_callbacks.push(callback);
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
function set_schema(new_schema) {
|
|
34
|
+
schema = data_source.schema = new_schema;
|
|
35
|
+
_.each(on_schema_callbacks, function(cbk) {
|
|
36
|
+
cbk(new_schema);
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
|
|
22
40
|
var indexes = {};
|
|
23
41
|
var unique_index_check = null;
|
|
24
42
|
|
|
@@ -188,7 +206,7 @@ function omf_web_data_source(opts) {
|
|
|
188
206
|
|
|
189
207
|
if (first_time) {
|
|
190
208
|
var self = this;
|
|
191
|
-
|
|
209
|
+
require(['vendor/jquery/jquery.periodicalupdater.js'], function() {
|
|
192
210
|
var update_interval = self.update_interval * 1000;
|
|
193
211
|
if (update_interval < 1000) update_interval = 3000;
|
|
194
212
|
var opts = {
|
|
@@ -213,7 +231,7 @@ function omf_web_data_source(opts) {
|
|
|
213
231
|
}
|
|
214
232
|
|
|
215
233
|
function fetch_data(data_url) {
|
|
216
|
-
require(['
|
|
234
|
+
require(['jquery'], function() {
|
|
217
235
|
$.ajax({
|
|
218
236
|
url: data_url,
|
|
219
237
|
dataType: 'json',
|
|
@@ -221,9 +239,11 @@ function omf_web_data_source(opts) {
|
|
|
221
239
|
type: 'GET'
|
|
222
240
|
}).done(function(reply) {
|
|
223
241
|
var data = reply.data;
|
|
224
|
-
|
|
225
|
-
_.each(data, function(r) { rows.push(r); });
|
|
242
|
+
set_schema(reply.schema);
|
|
226
243
|
|
|
244
|
+
// need to update 'rows' in place as it's referenced in other closures
|
|
245
|
+
rows.splice(0, rows.length);
|
|
246
|
+
_.each(data, function(r) { rows.push(r); });
|
|
227
247
|
update_indexes();
|
|
228
248
|
var evt = {data_source: data_source};
|
|
229
249
|
OHUB.trigger(event_name, evt);
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* Font Awesome 4.0
|
|
2
|
+
* Font Awesome 4.1.0 by @davegandy - http://fontawesome.io - @fontawesome
|
|
3
3
|
* License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
|
|
4
4
|
*/
|
|
5
5
|
/* FONT PATH
|
|
6
6
|
* -------------------------- */
|
|
7
7
|
@font-face {
|
|
8
8
|
font-family: 'FontAwesome';
|
|
9
|
-
src: url('../fonts/fontawesome-webfont.eot?v=4.0
|
|
10
|
-
src: url('../fonts/fontawesome-webfont.eot?#iefix&v=4.0
|
|
9
|
+
src: url('../fonts/fontawesome-webfont.eot?v=4.1.0');
|
|
10
|
+
src: url('../fonts/fontawesome-webfont.eot?#iefix&v=4.1.0') format('embedded-opentype'), url('../fonts/fontawesome-webfont.woff?v=4.1.0') format('woff'), url('../fonts/fontawesome-webfont.ttf?v=4.1.0') format('truetype'), url('../fonts/fontawesome-webfont.svg?v=4.1.0#fontawesomeregular') format('svg');
|
|
11
11
|
font-weight: normal;
|
|
12
12
|
font-style: normal;
|
|
13
13
|
}
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
}
|
|
23
23
|
/* makes the font 33% larger relative to the icon container */
|
|
24
24
|
.fa-lg {
|
|
25
|
-
font-size: 1.
|
|
25
|
+
font-size: 1.33333333em;
|
|
26
26
|
line-height: 0.75em;
|
|
27
27
|
vertical-align: -15%;
|
|
28
28
|
}
|
|
@@ -39,12 +39,12 @@
|
|
|
39
39
|
font-size: 5em;
|
|
40
40
|
}
|
|
41
41
|
.fa-fw {
|
|
42
|
-
width: 1.
|
|
42
|
+
width: 1.28571429em;
|
|
43
43
|
text-align: center;
|
|
44
44
|
}
|
|
45
45
|
.fa-ul {
|
|
46
46
|
padding-left: 0;
|
|
47
|
-
margin-left: 2.
|
|
47
|
+
margin-left: 2.14285714em;
|
|
48
48
|
list-style-type: none;
|
|
49
49
|
}
|
|
50
50
|
.fa-ul > li {
|
|
@@ -52,13 +52,13 @@
|
|
|
52
52
|
}
|
|
53
53
|
.fa-li {
|
|
54
54
|
position: absolute;
|
|
55
|
-
left: -2.
|
|
56
|
-
width: 2.
|
|
57
|
-
top: 0.
|
|
55
|
+
left: -2.14285714em;
|
|
56
|
+
width: 2.14285714em;
|
|
57
|
+
top: 0.14285714em;
|
|
58
58
|
text-align: center;
|
|
59
59
|
}
|
|
60
60
|
.fa-li.fa-lg {
|
|
61
|
-
left: -1.
|
|
61
|
+
left: -1.85714286em;
|
|
62
62
|
}
|
|
63
63
|
.fa-border {
|
|
64
64
|
padding: .2em .25em .15em;
|
|
@@ -107,19 +107,13 @@
|
|
|
107
107
|
-o-transform: rotate(359deg);
|
|
108
108
|
}
|
|
109
109
|
}
|
|
110
|
-
@-ms-keyframes spin {
|
|
111
|
-
0% {
|
|
112
|
-
-ms-transform: rotate(0deg);
|
|
113
|
-
}
|
|
114
|
-
100% {
|
|
115
|
-
-ms-transform: rotate(359deg);
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
110
|
@keyframes spin {
|
|
119
111
|
0% {
|
|
112
|
+
-webkit-transform: rotate(0deg);
|
|
120
113
|
transform: rotate(0deg);
|
|
121
114
|
}
|
|
122
115
|
100% {
|
|
116
|
+
-webkit-transform: rotate(359deg);
|
|
123
117
|
transform: rotate(359deg);
|
|
124
118
|
}
|
|
125
119
|
}
|
|
@@ -369,6 +363,8 @@
|
|
|
369
363
|
.fa-video-camera:before {
|
|
370
364
|
content: "\f03d";
|
|
371
365
|
}
|
|
366
|
+
.fa-photo:before,
|
|
367
|
+
.fa-image:before,
|
|
372
368
|
.fa-picture-o:before {
|
|
373
369
|
content: "\f03e";
|
|
374
370
|
}
|
|
@@ -732,6 +728,8 @@
|
|
|
732
728
|
.fa-square:before {
|
|
733
729
|
content: "\f0c8";
|
|
734
730
|
}
|
|
731
|
+
.fa-navicon:before,
|
|
732
|
+
.fa-reorder:before,
|
|
735
733
|
.fa-bars:before {
|
|
736
734
|
content: "\f0c9";
|
|
737
735
|
}
|
|
@@ -791,11 +789,11 @@
|
|
|
791
789
|
content: "\f0dc";
|
|
792
790
|
}
|
|
793
791
|
.fa-sort-down:before,
|
|
794
|
-
.fa-sort-
|
|
792
|
+
.fa-sort-desc:before {
|
|
795
793
|
content: "\f0dd";
|
|
796
794
|
}
|
|
797
795
|
.fa-sort-up:before,
|
|
798
|
-
.fa-sort-
|
|
796
|
+
.fa-sort-asc:before {
|
|
799
797
|
content: "\f0de";
|
|
800
798
|
}
|
|
801
799
|
.fa-envelope:before {
|
|
@@ -985,12 +983,10 @@
|
|
|
985
983
|
.fa-code:before {
|
|
986
984
|
content: "\f121";
|
|
987
985
|
}
|
|
986
|
+
.fa-mail-reply-all:before,
|
|
988
987
|
.fa-reply-all:before {
|
|
989
988
|
content: "\f122";
|
|
990
989
|
}
|
|
991
|
-
.fa-mail-reply-all:before {
|
|
992
|
-
content: "\f122";
|
|
993
|
-
}
|
|
994
990
|
.fa-star-half-empty:before,
|
|
995
991
|
.fa-star-half-full:before,
|
|
996
992
|
.fa-star-half-o:before {
|
|
@@ -1336,3 +1332,235 @@
|
|
|
1336
1332
|
.fa-plus-square-o:before {
|
|
1337
1333
|
content: "\f196";
|
|
1338
1334
|
}
|
|
1335
|
+
.fa-space-shuttle:before {
|
|
1336
|
+
content: "\f197";
|
|
1337
|
+
}
|
|
1338
|
+
.fa-slack:before {
|
|
1339
|
+
content: "\f198";
|
|
1340
|
+
}
|
|
1341
|
+
.fa-envelope-square:before {
|
|
1342
|
+
content: "\f199";
|
|
1343
|
+
}
|
|
1344
|
+
.fa-wordpress:before {
|
|
1345
|
+
content: "\f19a";
|
|
1346
|
+
}
|
|
1347
|
+
.fa-openid:before {
|
|
1348
|
+
content: "\f19b";
|
|
1349
|
+
}
|
|
1350
|
+
.fa-institution:before,
|
|
1351
|
+
.fa-bank:before,
|
|
1352
|
+
.fa-university:before {
|
|
1353
|
+
content: "\f19c";
|
|
1354
|
+
}
|
|
1355
|
+
.fa-mortar-board:before,
|
|
1356
|
+
.fa-graduation-cap:before {
|
|
1357
|
+
content: "\f19d";
|
|
1358
|
+
}
|
|
1359
|
+
.fa-yahoo:before {
|
|
1360
|
+
content: "\f19e";
|
|
1361
|
+
}
|
|
1362
|
+
.fa-google:before {
|
|
1363
|
+
content: "\f1a0";
|
|
1364
|
+
}
|
|
1365
|
+
.fa-reddit:before {
|
|
1366
|
+
content: "\f1a1";
|
|
1367
|
+
}
|
|
1368
|
+
.fa-reddit-square:before {
|
|
1369
|
+
content: "\f1a2";
|
|
1370
|
+
}
|
|
1371
|
+
.fa-stumbleupon-circle:before {
|
|
1372
|
+
content: "\f1a3";
|
|
1373
|
+
}
|
|
1374
|
+
.fa-stumbleupon:before {
|
|
1375
|
+
content: "\f1a4";
|
|
1376
|
+
}
|
|
1377
|
+
.fa-delicious:before {
|
|
1378
|
+
content: "\f1a5";
|
|
1379
|
+
}
|
|
1380
|
+
.fa-digg:before {
|
|
1381
|
+
content: "\f1a6";
|
|
1382
|
+
}
|
|
1383
|
+
.fa-pied-piper-square:before,
|
|
1384
|
+
.fa-pied-piper:before {
|
|
1385
|
+
content: "\f1a7";
|
|
1386
|
+
}
|
|
1387
|
+
.fa-pied-piper-alt:before {
|
|
1388
|
+
content: "\f1a8";
|
|
1389
|
+
}
|
|
1390
|
+
.fa-drupal:before {
|
|
1391
|
+
content: "\f1a9";
|
|
1392
|
+
}
|
|
1393
|
+
.fa-joomla:before {
|
|
1394
|
+
content: "\f1aa";
|
|
1395
|
+
}
|
|
1396
|
+
.fa-language:before {
|
|
1397
|
+
content: "\f1ab";
|
|
1398
|
+
}
|
|
1399
|
+
.fa-fax:before {
|
|
1400
|
+
content: "\f1ac";
|
|
1401
|
+
}
|
|
1402
|
+
.fa-building:before {
|
|
1403
|
+
content: "\f1ad";
|
|
1404
|
+
}
|
|
1405
|
+
.fa-child:before {
|
|
1406
|
+
content: "\f1ae";
|
|
1407
|
+
}
|
|
1408
|
+
.fa-paw:before {
|
|
1409
|
+
content: "\f1b0";
|
|
1410
|
+
}
|
|
1411
|
+
.fa-spoon:before {
|
|
1412
|
+
content: "\f1b1";
|
|
1413
|
+
}
|
|
1414
|
+
.fa-cube:before {
|
|
1415
|
+
content: "\f1b2";
|
|
1416
|
+
}
|
|
1417
|
+
.fa-cubes:before {
|
|
1418
|
+
content: "\f1b3";
|
|
1419
|
+
}
|
|
1420
|
+
.fa-behance:before {
|
|
1421
|
+
content: "\f1b4";
|
|
1422
|
+
}
|
|
1423
|
+
.fa-behance-square:before {
|
|
1424
|
+
content: "\f1b5";
|
|
1425
|
+
}
|
|
1426
|
+
.fa-steam:before {
|
|
1427
|
+
content: "\f1b6";
|
|
1428
|
+
}
|
|
1429
|
+
.fa-steam-square:before {
|
|
1430
|
+
content: "\f1b7";
|
|
1431
|
+
}
|
|
1432
|
+
.fa-recycle:before {
|
|
1433
|
+
content: "\f1b8";
|
|
1434
|
+
}
|
|
1435
|
+
.fa-automobile:before,
|
|
1436
|
+
.fa-car:before {
|
|
1437
|
+
content: "\f1b9";
|
|
1438
|
+
}
|
|
1439
|
+
.fa-cab:before,
|
|
1440
|
+
.fa-taxi:before {
|
|
1441
|
+
content: "\f1ba";
|
|
1442
|
+
}
|
|
1443
|
+
.fa-tree:before {
|
|
1444
|
+
content: "\f1bb";
|
|
1445
|
+
}
|
|
1446
|
+
.fa-spotify:before {
|
|
1447
|
+
content: "\f1bc";
|
|
1448
|
+
}
|
|
1449
|
+
.fa-deviantart:before {
|
|
1450
|
+
content: "\f1bd";
|
|
1451
|
+
}
|
|
1452
|
+
.fa-soundcloud:before {
|
|
1453
|
+
content: "\f1be";
|
|
1454
|
+
}
|
|
1455
|
+
.fa-database:before {
|
|
1456
|
+
content: "\f1c0";
|
|
1457
|
+
}
|
|
1458
|
+
.fa-file-pdf-o:before {
|
|
1459
|
+
content: "\f1c1";
|
|
1460
|
+
}
|
|
1461
|
+
.fa-file-word-o:before {
|
|
1462
|
+
content: "\f1c2";
|
|
1463
|
+
}
|
|
1464
|
+
.fa-file-excel-o:before {
|
|
1465
|
+
content: "\f1c3";
|
|
1466
|
+
}
|
|
1467
|
+
.fa-file-powerpoint-o:before {
|
|
1468
|
+
content: "\f1c4";
|
|
1469
|
+
}
|
|
1470
|
+
.fa-file-photo-o:before,
|
|
1471
|
+
.fa-file-picture-o:before,
|
|
1472
|
+
.fa-file-image-o:before {
|
|
1473
|
+
content: "\f1c5";
|
|
1474
|
+
}
|
|
1475
|
+
.fa-file-zip-o:before,
|
|
1476
|
+
.fa-file-archive-o:before {
|
|
1477
|
+
content: "\f1c6";
|
|
1478
|
+
}
|
|
1479
|
+
.fa-file-sound-o:before,
|
|
1480
|
+
.fa-file-audio-o:before {
|
|
1481
|
+
content: "\f1c7";
|
|
1482
|
+
}
|
|
1483
|
+
.fa-file-movie-o:before,
|
|
1484
|
+
.fa-file-video-o:before {
|
|
1485
|
+
content: "\f1c8";
|
|
1486
|
+
}
|
|
1487
|
+
.fa-file-code-o:before {
|
|
1488
|
+
content: "\f1c9";
|
|
1489
|
+
}
|
|
1490
|
+
.fa-vine:before {
|
|
1491
|
+
content: "\f1ca";
|
|
1492
|
+
}
|
|
1493
|
+
.fa-codepen:before {
|
|
1494
|
+
content: "\f1cb";
|
|
1495
|
+
}
|
|
1496
|
+
.fa-jsfiddle:before {
|
|
1497
|
+
content: "\f1cc";
|
|
1498
|
+
}
|
|
1499
|
+
.fa-life-bouy:before,
|
|
1500
|
+
.fa-life-saver:before,
|
|
1501
|
+
.fa-support:before,
|
|
1502
|
+
.fa-life-ring:before {
|
|
1503
|
+
content: "\f1cd";
|
|
1504
|
+
}
|
|
1505
|
+
.fa-circle-o-notch:before {
|
|
1506
|
+
content: "\f1ce";
|
|
1507
|
+
}
|
|
1508
|
+
.fa-ra:before,
|
|
1509
|
+
.fa-rebel:before {
|
|
1510
|
+
content: "\f1d0";
|
|
1511
|
+
}
|
|
1512
|
+
.fa-ge:before,
|
|
1513
|
+
.fa-empire:before {
|
|
1514
|
+
content: "\f1d1";
|
|
1515
|
+
}
|
|
1516
|
+
.fa-git-square:before {
|
|
1517
|
+
content: "\f1d2";
|
|
1518
|
+
}
|
|
1519
|
+
.fa-git:before {
|
|
1520
|
+
content: "\f1d3";
|
|
1521
|
+
}
|
|
1522
|
+
.fa-hacker-news:before {
|
|
1523
|
+
content: "\f1d4";
|
|
1524
|
+
}
|
|
1525
|
+
.fa-tencent-weibo:before {
|
|
1526
|
+
content: "\f1d5";
|
|
1527
|
+
}
|
|
1528
|
+
.fa-qq:before {
|
|
1529
|
+
content: "\f1d6";
|
|
1530
|
+
}
|
|
1531
|
+
.fa-wechat:before,
|
|
1532
|
+
.fa-weixin:before {
|
|
1533
|
+
content: "\f1d7";
|
|
1534
|
+
}
|
|
1535
|
+
.fa-send:before,
|
|
1536
|
+
.fa-paper-plane:before {
|
|
1537
|
+
content: "\f1d8";
|
|
1538
|
+
}
|
|
1539
|
+
.fa-send-o:before,
|
|
1540
|
+
.fa-paper-plane-o:before {
|
|
1541
|
+
content: "\f1d9";
|
|
1542
|
+
}
|
|
1543
|
+
.fa-history:before {
|
|
1544
|
+
content: "\f1da";
|
|
1545
|
+
}
|
|
1546
|
+
.fa-circle-thin:before {
|
|
1547
|
+
content: "\f1db";
|
|
1548
|
+
}
|
|
1549
|
+
.fa-header:before {
|
|
1550
|
+
content: "\f1dc";
|
|
1551
|
+
}
|
|
1552
|
+
.fa-paragraph:before {
|
|
1553
|
+
content: "\f1dd";
|
|
1554
|
+
}
|
|
1555
|
+
.fa-sliders:before {
|
|
1556
|
+
content: "\f1de";
|
|
1557
|
+
}
|
|
1558
|
+
.fa-share-alt:before {
|
|
1559
|
+
content: "\f1e0";
|
|
1560
|
+
}
|
|
1561
|
+
.fa-share-alt-square:before {
|
|
1562
|
+
content: "\f1e1";
|
|
1563
|
+
}
|
|
1564
|
+
.fa-bomb:before {
|
|
1565
|
+
content: "\f1e2";
|
|
1566
|
+
}
|