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
@@ -1,7 +1,4 @@
|
|
1
|
-
|
2
|
-
L.provide('OML.abstract_widget', ["vendor/d3/d3.js"], function () {
|
3
|
-
|
4
|
-
if (typeof(OML) == "undefined") OML = {};
|
1
|
+
define(['omf/data_source_repo', 'vendor/d3/d3'], function(ds_repo) {
|
5
2
|
|
6
3
|
if (typeof(d3.each) == 'undefined') {
|
7
4
|
d3.each = function(array, f) {
|
@@ -15,10 +12,10 @@ L.provide('OML.abstract_widget', ["vendor/d3/d3.js"], function () {
|
|
15
12
|
return a;
|
16
13
|
};
|
17
14
|
};
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
15
|
+
|
16
|
+
|
17
|
+
var abstract_widget = Backbone.Model.extend({
|
18
|
+
|
22
19
|
defaults: function() {
|
23
20
|
return {
|
24
21
|
base_el: "body",
|
@@ -34,44 +31,44 @@ L.provide('OML.abstract_widget', ["vendor/d3/d3.js"], function () {
|
|
34
31
|
x: 0,
|
35
32
|
y: 0
|
36
33
|
},
|
37
|
-
}
|
34
|
+
}
|
38
35
|
},
|
39
|
-
|
36
|
+
|
40
37
|
//base_css_class: 'oml-chart',
|
41
|
-
|
38
|
+
|
42
39
|
initialize: function(opts) {
|
43
40
|
var o = this.opts = this.deep_defaults(opts, this.defaults());
|
44
|
-
|
41
|
+
|
45
42
|
var base_el = o.base_el;
|
46
43
|
if (typeof(base_el) == "string") base_el = d3.select(base_el);
|
47
44
|
this.base_el = base_el;
|
48
|
-
|
45
|
+
|
49
46
|
this.init_data_source();
|
50
47
|
this.process_schema();
|
51
48
|
this.resize();
|
52
|
-
|
49
|
+
|
53
50
|
var self = this;
|
54
51
|
OHUB.bind('layout.resize', function(e) {
|
55
52
|
self.resize();
|
56
53
|
self.update();
|
57
|
-
});
|
54
|
+
});
|
58
55
|
},
|
59
|
-
|
56
|
+
|
60
57
|
update: function() {
|
61
58
|
if ($(this.opts.base_el).is(':hidden')) {
|
62
59
|
return;
|
63
60
|
}
|
64
|
-
|
61
|
+
|
65
62
|
var data;
|
66
63
|
if ((data = this.data_source.rows()) == null) {
|
67
64
|
throw "Missing rows in data source"
|
68
65
|
}
|
69
66
|
if (data.length == 0) return;
|
70
|
-
|
67
|
+
|
71
68
|
this.redraw(data);
|
72
|
-
|
69
|
+
|
73
70
|
},
|
74
|
-
|
71
|
+
|
75
72
|
resize: function() {
|
76
73
|
var o = this.opts;
|
77
74
|
var w = o.width;
|
@@ -87,9 +84,9 @@ L.provide('OML.abstract_widget', ["vendor/d3/d3.js"], function () {
|
|
87
84
|
var elw = bel.width();
|
88
85
|
w = w * elw;
|
89
86
|
//w = w * this.base_el[0][0].clientWidth;
|
90
|
-
if (isNaN(w)) w = 800;
|
87
|
+
if (isNaN(w)) w = 800;
|
91
88
|
}
|
92
|
-
|
89
|
+
|
93
90
|
var h = o.height;
|
94
91
|
if (h <= 1.0) {
|
95
92
|
h = h * w;
|
@@ -98,30 +95,30 @@ L.provide('OML.abstract_widget', ["vendor/d3/d3.js"], function () {
|
|
98
95
|
|
99
96
|
return this;
|
100
97
|
},
|
101
|
-
|
102
|
-
|
103
|
-
_resize_base_el: function(w, h) {
|
98
|
+
|
99
|
+
|
100
|
+
_resize_base_el: function(w, h) {
|
104
101
|
var m = this.opts.margin;
|
105
102
|
this.w = w - m.left - m.right; // take away the margins
|
106
103
|
this.h = h - m.top - m.bottom;
|
107
104
|
this.base_el
|
108
105
|
.style('height', this.h + 'px')
|
109
|
-
.style('width', this.w + 'px')
|
106
|
+
.style('width', this.w + 'px')
|
110
107
|
.style('margin-left', m.left + 'px')
|
111
|
-
.style('margin-right', m.right + 'px')
|
112
|
-
.style('margin-top', m.top + 'px')
|
113
|
-
.style('margin-bottom', m.bottom + 'px')
|
108
|
+
.style('margin-right', m.right + 'px')
|
109
|
+
.style('margin-top', m.top + 'px')
|
110
|
+
.style('margin-bottom', m.bottom + 'px')
|
114
111
|
;
|
115
112
|
},
|
116
|
-
|
117
|
-
|
113
|
+
|
114
|
+
|
118
115
|
// Find the appropriate data source and bind to it
|
119
116
|
//
|
120
117
|
init_data_source: function() {
|
121
118
|
var o = this.opts;
|
122
119
|
var sources = o.data_sources;
|
123
120
|
var self = this;
|
124
|
-
|
121
|
+
|
125
122
|
if (! (sources instanceof Array)) {
|
126
123
|
throw "Expected an array"
|
127
124
|
}
|
@@ -130,27 +127,27 @@ L.provide('OML.abstract_widget', ["vendor/d3/d3.js"], function () {
|
|
130
127
|
}
|
131
128
|
this.data_source = this.init_single_data_source(sources[0]);
|
132
129
|
},
|
133
|
-
|
134
|
-
|
130
|
+
|
131
|
+
|
135
132
|
// Find the appropriate data source and bind to it
|
136
133
|
//
|
137
134
|
init_single_data_source: function(ds_descr) {
|
138
|
-
var ds =
|
135
|
+
var ds = ds_repo.lookup(ds_descr.stream);
|
139
136
|
var self = this;
|
140
137
|
OHUB.bind(ds.event_name, function() {
|
141
138
|
self.update();;
|
142
139
|
})
|
143
140
|
return ds;
|
144
141
|
},
|
145
|
-
|
146
|
-
|
142
|
+
|
143
|
+
|
147
144
|
process_schema: function() {
|
148
145
|
this.schema = this.process_single_schema(this.data_source);
|
149
146
|
if (typeof(this.decl_properties) != "undefined") {
|
150
147
|
this.mapping = this.process_single_mapping(null, this.opts.mapping, this.decl_properties);
|
151
148
|
}
|
152
149
|
},
|
153
|
-
|
150
|
+
|
154
151
|
process_single_schema: function(data_source) {
|
155
152
|
var self = this;
|
156
153
|
var o = this.opts;
|
@@ -161,11 +158,11 @@ L.provide('OML.abstract_widget', ["vendor/d3/d3.js"], function () {
|
|
161
158
|
});
|
162
159
|
return schema;
|
163
160
|
},
|
164
|
-
|
161
|
+
|
165
162
|
process_single_mapping: function(source_name, mapping_decl, properties_decl) {
|
166
163
|
var self = this;
|
167
164
|
var m = {};
|
168
|
-
var om = mapping_decl || {};
|
165
|
+
var om = mapping_decl || {};
|
169
166
|
_.map(properties_decl, function(a) {
|
170
167
|
var pname = a[0]; var type = a[1]; var def = a[2];
|
171
168
|
var descr = om[pname];
|
@@ -182,8 +179,8 @@ L.provide('OML.abstract_widget', ["vendor/d3/d3.js"], function () {
|
|
182
179
|
throw "Can't provide named stream '" + stream + "'.";
|
183
180
|
}
|
184
181
|
return this.schema;
|
185
|
-
},
|
186
|
-
|
182
|
+
},
|
183
|
+
|
187
184
|
/*
|
188
185
|
* Return data_source named 'name'.
|
189
186
|
*/
|
@@ -192,7 +189,7 @@ L.provide('OML.abstract_widget', ["vendor/d3/d3.js"], function () {
|
|
192
189
|
throw "Can't provide named stream '" + name + "'.";
|
193
190
|
}
|
194
191
|
return this.data_source;
|
195
|
-
},
|
192
|
+
},
|
196
193
|
|
197
194
|
create_mapping: function(mname, descr, stream, type, def) {
|
198
195
|
var self = this;
|
@@ -223,7 +220,7 @@ L.provide('OML.abstract_widget', ["vendor/d3/d3.js"], function () {
|
|
223
220
|
if (schema == undefined) {
|
224
221
|
throw "Can't find schema for stream '" + stream + "'.";
|
225
222
|
}
|
226
|
-
|
223
|
+
|
227
224
|
if (type == 'index') {
|
228
225
|
var key = descr.key;
|
229
226
|
if (key == undefined || stream == undefined) {
|
@@ -234,7 +231,7 @@ L.provide('OML.abstract_widget', ["vendor/d3/d3.js"], function () {
|
|
234
231
|
throw "Unknown stream element '" + key + "'.";
|
235
232
|
}
|
236
233
|
var vindex = col_schema.index;
|
237
|
-
|
234
|
+
|
238
235
|
var jstream_name = descr.join_stream;
|
239
236
|
if (jstream_name == undefined) {
|
240
237
|
throw "Missing join stream declaration in '" + mname + "'.";
|
@@ -244,15 +241,15 @@ L.provide('OML.abstract_widget', ["vendor/d3/d3.js"], function () {
|
|
244
241
|
throw "Can't find schema for stream '" + jstream_name + "'.";
|
245
242
|
}
|
246
243
|
var jstream = this.data_source_for_stream(jstream_name);
|
247
|
-
|
244
|
+
|
248
245
|
var jkey = descr.join_key;
|
249
246
|
if (jkey == undefined) jkey = 'id';
|
250
|
-
var jcol_schema = jschema[jkey];
|
247
|
+
var jcol_schema = jschema[jkey];
|
251
248
|
if (jcol_schema == undefined) {
|
252
249
|
throw "Unknown stream element '" + jkey + "' in '" + jstream + "'.";
|
253
250
|
}
|
254
251
|
var index_f = jstream.index_for_column(jcol_schema);
|
255
|
-
|
252
|
+
|
256
253
|
return function(d) {
|
257
254
|
var join = d[vindex];
|
258
255
|
//var t = jstream.get_indexed_row(jindex, join); //self.get_indexed_table(jstream, jindex);
|
@@ -282,35 +279,35 @@ L.provide('OML.abstract_widget', ["vendor/d3/d3.js"], function () {
|
|
282
279
|
}
|
283
280
|
var index = col_schema.index;
|
284
281
|
switch (type) {
|
285
|
-
case 'int':
|
286
|
-
case 'float':
|
282
|
+
case 'int':
|
283
|
+
case 'float':
|
287
284
|
case 'key' :
|
288
285
|
var scale = descr.scale;
|
289
286
|
var min_value = descr.min;
|
290
287
|
var max_value = descr.max;
|
291
288
|
return function(d) {
|
292
289
|
var v = d[index];
|
293
|
-
if (scale != undefined) v = v * scale;
|
294
|
-
if (min_value != undefined && v < min_value) v = min_value;
|
295
|
-
if (max_value != undefined && v > max_value) v = max_value;
|
290
|
+
if (scale != undefined) v = v * scale;
|
291
|
+
if (min_value != undefined && v < min_value) v = min_value;
|
292
|
+
if (max_value != undefined && v > max_value) v = max_value;
|
296
293
|
return v;
|
297
294
|
};
|
298
|
-
case 'color':
|
295
|
+
case 'color':
|
299
296
|
var color_fname = descr.color;
|
300
297
|
if (color_fname == undefined) {
|
301
298
|
throw "Missing color function for '" + mname + "'.";
|
302
|
-
}
|
299
|
+
}
|
303
300
|
var color_fp = self.decl_color_func[color_fname];
|
304
301
|
if (color_fp == undefined) {
|
305
302
|
throw "Unknown color function '" + color_fname + "'.";
|
306
|
-
}
|
303
|
+
}
|
307
304
|
var color_f = color_fp();
|
308
305
|
var scale = descr.scale;
|
309
306
|
var min_value = descr.min;
|
310
307
|
return function(d) {
|
311
308
|
var v = d[index];
|
312
|
-
if (scale != undefined) v = v * scale;
|
313
|
-
if (min_value != undefined && v < min_value) v = min_value;
|
309
|
+
if (scale != undefined) v = v * scale;
|
310
|
+
if (min_value != undefined && v < min_value) v = min_value;
|
314
311
|
var color = color_f(v);
|
315
312
|
return color;
|
316
313
|
};
|
@@ -318,14 +315,14 @@ L.provide('OML.abstract_widget', ["vendor/d3/d3.js"], function () {
|
|
318
315
|
// return function(d) {
|
319
316
|
// return d[index];
|
320
317
|
// }
|
321
|
-
default:
|
318
|
+
default:
|
322
319
|
throw "Unknown mapping type '" + type + "'";
|
323
320
|
}
|
324
321
|
}
|
325
322
|
var i = 0;
|
326
323
|
},
|
327
324
|
|
328
|
-
|
325
|
+
|
329
326
|
// Fill in a given object (and any objects it contains) with default properties.
|
330
327
|
// ... borrowed from unerscore.js
|
331
328
|
//
|
@@ -339,7 +336,9 @@ L.provide('OML.abstract_widget', ["vendor/d3/d3.js"], function () {
|
|
339
336
|
}
|
340
337
|
return source;
|
341
338
|
},
|
342
|
-
|
343
|
-
|
339
|
+
|
340
|
+
|
344
341
|
});
|
342
|
+
|
343
|
+
return abstract_widget;
|
345
344
|
})
|
@@ -1,34 +1,35 @@
|
|
1
1
|
//L.provide('OML.axis', ["graph.css", ["/resource/vendor/d3/d3.js", "/resource/vendor/d3/d3.time.js"]], function () {
|
2
|
-
L.provide('OML.axis', ["graph/css/graph.css", "vendor/d3/d3.js"], function () {
|
2
|
+
//L.provide('OML.axis', ["graph/css/graph.css", "vendor/d3/d3.js"], function () {
|
3
|
+
define(["vendor/d3/d3"], function () {
|
3
4
|
|
4
|
-
|
5
|
+
var axis = function(options) {
|
5
6
|
if (!options) options = {};
|
6
|
-
|
7
|
+
|
7
8
|
var d3_axis = d3.svg.axis();
|
8
9
|
|
9
10
|
var defaults = {
|
10
11
|
legend: {
|
11
12
|
text: 'DESCRIBE ME',
|
12
|
-
offset: 40
|
13
|
+
offset: 40
|
13
14
|
},
|
14
15
|
ticks: {
|
15
16
|
// type: 'date',
|
16
17
|
// format: '%I:%M', // hour:minutes
|
17
18
|
// format: ",.0f" // integers with comma-grouping for thousands.
|
18
19
|
transition: 500 // smoothly transition the ticks when they change
|
19
|
-
}
|
20
|
+
}
|
20
21
|
};
|
21
22
|
|
22
23
|
var orient = 'bottom';
|
23
24
|
var scale;
|
24
25
|
var range = [0, 100]; // default range, should be set specifically
|
25
26
|
var opts = _.defaults((options || {}), defaults);
|
26
|
-
|
27
|
+
|
27
28
|
// LEGEND
|
28
29
|
var ol = options.legend;
|
29
30
|
ol = ol ? (typeof(ol) === "string" ? {text: ol} : ol) : {};
|
30
|
-
options.legend = _.defaults(ol, defaults.legend);
|
31
|
-
|
31
|
+
options.legend = _.defaults(ol, defaults.legend);
|
32
|
+
|
32
33
|
// TICKS
|
33
34
|
var ot = options.ticks = _.defaults(options.ticks, defaults.ticks);
|
34
35
|
// Check if we need a special formatter for the tick labels
|
@@ -36,7 +37,7 @@ L.provide('OML.axis', ["graph/css/graph.css", "vendor/d3/d3.js"], function () {
|
|
36
37
|
var d_f = d3.time.format(ot.format || "%X");
|
37
38
|
d3_axis.tickFormat(function(d) {
|
38
39
|
var date = new Date(1000 * d); // TODO: Implicitly assuming that value is in seconds is most likely NOT a good idea
|
39
|
-
var fs = d_f(date);
|
40
|
+
var fs = d_f(date);
|
40
41
|
return fs;
|
41
42
|
});
|
42
43
|
} else if (ot.type == 'key') {
|
@@ -45,14 +46,14 @@ L.provide('OML.axis', ["graph/css/graph.css", "vendor/d3/d3.js"], function () {
|
|
45
46
|
var l = lm[d] || ('??-' + d);
|
46
47
|
return l;
|
47
48
|
});
|
48
|
-
|
49
|
+
|
49
50
|
} else if (ot.format) {
|
50
51
|
d3_axis.tickFormat(d3.format(ot.format));
|
51
52
|
}
|
52
|
-
|
53
|
+
|
53
54
|
if (count = ot.count) d3_axis.ticks(count);
|
54
|
-
|
55
|
-
|
55
|
+
|
56
|
+
|
56
57
|
function axis(selection) {
|
57
58
|
selection.each(function(data) {
|
58
59
|
var o = opts;
|
@@ -71,7 +72,7 @@ L.provide('OML.axis', ["graph/css/graph.css", "vendor/d3/d3.js"], function () {
|
|
71
72
|
case 'left':
|
72
73
|
axisLabel.enter().append('text').attr('class', 'axis_legend')
|
73
74
|
.attr('transform', 'rotate(-90)')
|
74
|
-
.attr('y', -1 * ol.offset);
|
75
|
+
.attr('y', -1 * ol.offset);
|
75
76
|
axisLabel
|
76
77
|
.attr('x', -1 * (range[1] - range[0]) / 2);
|
77
78
|
break;
|
@@ -80,52 +81,56 @@ L.provide('OML.axis', ["graph/css/graph.css", "vendor/d3/d3.js"], function () {
|
|
80
81
|
axisLabel
|
81
82
|
.text(function(d) { return d });
|
82
83
|
|
83
|
-
// TICKS
|
84
|
+
// TICKS
|
84
85
|
var ot = opts.ticks;
|
85
86
|
var tl = ot.transition ? layer.transition().duration(ot.transition) : layer;
|
86
87
|
tl.call(d3_axis);
|
87
|
-
|
88
|
+
|
88
89
|
// d3.select(this).selectAll('line.tick')
|
89
90
|
// //.filter(function(d) { return !parseFloat(d) })
|
90
91
|
// .filter(function(d) {
|
91
|
-
// //this is because sometimes the 0 tick is a very small fraction, TODO: think of cleaner technique
|
92
|
+
// //this is because sometimes the 0 tick is a very small fraction, TODO: think of cleaner technique
|
92
93
|
// var v = !parseFloat(Math.round(d*100000)/1000000);
|
93
|
-
// return v;
|
94
|
-
// })
|
94
|
+
// return v;
|
95
|
+
// })
|
95
96
|
// .classed('zero', true);
|
96
97
|
});
|
97
98
|
return axis;
|
98
|
-
}
|
99
|
-
|
99
|
+
}
|
100
|
+
|
100
101
|
axis.orient = function(_) {
|
101
102
|
if (!arguments.length) return orient;
|
102
103
|
orient = _;
|
103
104
|
d3_axis.orient(orient);
|
104
105
|
return axis;
|
105
106
|
};
|
106
|
-
|
107
|
+
|
107
108
|
axis.range = function(_) {
|
108
109
|
if (!arguments.length) return range;
|
109
110
|
range = _;
|
110
111
|
return axis;
|
111
112
|
};
|
112
|
-
|
113
|
+
|
113
114
|
axis.scale = function(_) {
|
114
115
|
if (!arguments.length) return scale;
|
115
116
|
scale = _;
|
116
117
|
d3_axis.scale(scale);
|
117
118
|
return axis;
|
118
119
|
};
|
119
|
-
|
120
|
+
|
120
121
|
axis.tick_values = function(_) {
|
121
122
|
if (!arguments.length) return scale;
|
122
123
|
values = _;
|
123
124
|
d3_axis.tickValues(values);
|
124
125
|
return axis;
|
125
126
|
};
|
126
|
-
|
127
|
+
|
127
128
|
return axis;
|
128
129
|
}
|
130
|
+
|
131
|
+
return function(opts) {
|
132
|
+
return axis(opts);
|
133
|
+
}
|
129
134
|
})
|
130
135
|
|
131
136
|
/*
|
@@ -1,58 +1,58 @@
|
|
1
1
|
/*
|
2
|
-
* Draws a simple barchart
|
3
|
-
*
|
2
|
+
* Draws a simple barchart with a selection brush.
|
3
|
+
*
|
4
4
|
* Most code was copied from http://square.github.com/crossfilter/ and all that
|
5
5
|
* credit goes to Mike Bostok.
|
6
6
|
*/
|
7
7
|
|
8
8
|
|
9
|
-
|
9
|
+
define("graph/js/abstract_chart"], function (abstract_chart) {
|
10
10
|
|
11
|
-
|
11
|
+
var barchart_brush = abstract_chart.extend({
|
12
12
|
decl_properties: [
|
13
|
-
['key', 'int', {property: 'key'}],
|
14
|
-
['value', 'float', {property: 'value'}],
|
15
|
-
// ['x_axis', 'key', {property: 'x'}],
|
16
|
-
// ['y_axis', 'key', {property: 'y'}],
|
17
|
-
// ['group_by', 'key', {property: 'id', optional: true}],
|
18
|
-
['stroke_width', 'int', 2],
|
13
|
+
['key', 'int', {property: 'key'}],
|
14
|
+
['value', 'float', {property: 'value'}],
|
15
|
+
// ['x_axis', 'key', {property: 'x'}],
|
16
|
+
// ['y_axis', 'key', {property: 'y'}],
|
17
|
+
// ['group_by', 'key', {property: 'id', optional: true}],
|
18
|
+
['stroke_width', 'int', 2],
|
19
19
|
['stroke_color', 'color', 'white'],
|
20
20
|
['fill_color', 'color', 'blue']
|
21
21
|
],
|
22
|
-
|
22
|
+
|
23
23
|
defaults: function() {
|
24
24
|
return this.deep_defaults({
|
25
25
|
relative: false, // If true, report percentage
|
26
26
|
axis: {
|
27
27
|
orientation: 'horizontal'
|
28
28
|
}
|
29
|
-
},
|
29
|
+
}, barchart_brush.__super__.defaults.call(this));
|
30
30
|
},
|
31
|
-
|
31
|
+
|
32
32
|
configure_base_layer: function(vis) {
|
33
33
|
var base = this.base_layer = vis.append("svg:g")
|
34
34
|
.attr("class", "barchart")
|
35
35
|
;
|
36
|
-
var ca = this.chart_area;
|
36
|
+
var ca = this.chart_area;
|
37
37
|
this.legend_layer = base.append("svg:g");
|
38
38
|
this.chart_layer = base.append("svg:g");
|
39
39
|
this.axis_layer = base.append('g');
|
40
40
|
},
|
41
|
-
|
41
|
+
|
42
42
|
redraw: function(data) {
|
43
|
-
|
44
|
-
}
|
45
|
-
}) // end of barchart_brush
|
43
|
+
|
44
|
+
}
|
45
|
+
}) // end of barchart_brush
|
46
46
|
|
47
47
|
|
48
48
|
|
49
|
-
|
50
|
-
if (!
|
49
|
+
var _barchart_brush = function barChart() {
|
50
|
+
if (!_barchart_brush.id) _barchart_brush.id = 0;
|
51
51
|
|
52
52
|
var margin = {top: 10, right: 10, bottom: 20, left: 10},
|
53
53
|
x,
|
54
54
|
y = d3.scale.linear().range([100, 0]),
|
55
|
-
id =
|
55
|
+
id = _barchart_brush.id++,
|
56
56
|
axis = d3.svg.axis().orient("bottom"),
|
57
57
|
brush = d3.svg.brush(),
|
58
58
|
brushDirty,
|
@@ -237,4 +237,6 @@ L.provide('OML.barchart_brush', ["graph/js/abstract_chart", "#OML.abstract_chart
|
|
237
237
|
|
238
238
|
return d3.rebind(chart, brush, "on");
|
239
239
|
}
|
240
|
+
|
241
|
+
return barchart_brush;
|
240
242
|
});
|
@@ -1,7 +1,7 @@
|
|
1
|
-
|
1
|
+
define(["graph/abstract_widget"], function (abstract_widget) {
|
2
|
+
|
3
|
+
var code_mirror = abstract_widget.extend({
|
2
4
|
|
3
|
-
OML.code_mirror = OML.abstract_widget.extend({
|
4
|
-
|
5
5
|
defaults: function() {
|
6
6
|
return this.deep_defaults({
|
7
7
|
height: 1.0,
|
@@ -11,33 +11,33 @@ L.provide('OML.code_mirror', ["graph/js/abstract_widget", "#OML.abstract_widget"
|
|
11
11
|
right: 20,
|
12
12
|
bottom: 10
|
13
13
|
},
|
14
|
-
},
|
15
|
-
},
|
16
|
-
|
17
|
-
|
14
|
+
}, code_mirror.__super__.defaults.call(this));
|
15
|
+
},
|
16
|
+
|
17
|
+
|
18
18
|
initialize: function(opts) {
|
19
|
-
|
19
|
+
code_mirror.__super__.initialize.call(this, opts);
|
20
20
|
this.code_mirror = null;
|
21
21
|
this.update();
|
22
22
|
},
|
23
|
-
|
23
|
+
|
24
24
|
update: function() {
|
25
25
|
var o = this.opts;
|
26
|
-
|
26
|
+
|
27
27
|
if ($(o.base_el).is(':hidden')) {
|
28
28
|
this.code_mirror = null;
|
29
29
|
return;
|
30
30
|
}
|
31
31
|
|
32
|
-
// TODO: When we create a code mirror object and then make the
|
33
|
-
// encompassing element invisible and visible again, things seem
|
34
|
-
// go astray. Brute force solution is to recreate the editor on every
|
32
|
+
// TODO: When we create a code mirror object and then make the
|
33
|
+
// encompassing element invisible and visible again, things seem
|
34
|
+
// go astray. Brute force solution is to recreate the editor on every
|
35
35
|
// update.
|
36
|
-
|
36
|
+
|
37
37
|
if (!this.code_mirror) {
|
38
38
|
var edit_el = $(o.edit_el);
|
39
39
|
edit_el.empty(); // remove old instances if any
|
40
|
-
|
40
|
+
|
41
41
|
CodeMirror.modeURL = "/resource/vendor/codemirror/mode/%N/%N.js";
|
42
42
|
|
43
43
|
var self = this;
|
@@ -60,22 +60,22 @@ L.provide('OML.code_mirror', ["graph/js/abstract_widget", "#OML.abstract_widget"
|
|
60
60
|
CodeMirror.autoLoadMode(cm, o.mode);
|
61
61
|
|
62
62
|
var hlLine = cm.setLineClass(0, "activeline");
|
63
|
-
|
63
|
+
|
64
64
|
this.on_changed(this.code_mirror, null);
|
65
65
|
this.code_mirror.focus();
|
66
66
|
}
|
67
67
|
this._update_widget_height(o);
|
68
68
|
this.code_mirror.refresh();
|
69
69
|
},
|
70
|
-
|
70
|
+
|
71
71
|
_update_widget_height: function(opts) {
|
72
72
|
var s_el = $(opts.base_el + " .CodeMirror-scroll");
|
73
|
-
s_el.css('height', this.h);
|
73
|
+
s_el.css('height', this.h);
|
74
74
|
},
|
75
|
-
|
75
|
+
|
76
76
|
on_changed: function(editor, change) {
|
77
77
|
if (editor == undefined) return;
|
78
|
-
|
78
|
+
|
79
79
|
var o = this.opts;
|
80
80
|
var h = editor.historySize();
|
81
81
|
|
@@ -84,41 +84,43 @@ L.provide('OML.code_mirror', ["graph/js/abstract_widget", "#OML.abstract_widget"
|
|
84
84
|
var redo = h.redo > 0;
|
85
85
|
$(o.base_el + '_save_a').fadeTo('fast', save ? 1.0 : 0.3);
|
86
86
|
$(o.base_el + '_undo_a').fadeTo('fast', undo ? 1.0 : 0.3);
|
87
|
-
$(o.base_el + '_redo_a').fadeTo('fast', redo ? 1.0 : 0.3);
|
87
|
+
$(o.base_el + '_redo_a').fadeTo('fast', redo ? 1.0 : 0.3);
|
88
88
|
},
|
89
|
-
|
89
|
+
|
90
90
|
on_save_pressed: function() {
|
91
91
|
var o = this.opts;
|
92
92
|
var self = this;
|
93
93
|
var cm = this.code_mirror;
|
94
|
-
|
94
|
+
|
95
95
|
$.ajax({
|
96
96
|
url: o.save_url,
|
97
97
|
data: {content: cm.getValue()},
|
98
98
|
type: 'POST'
|
99
|
-
}).done(function() {
|
99
|
+
}).done(function() {
|
100
100
|
cm.clearHistory();
|
101
101
|
self.on_changed(cm, null);
|
102
102
|
OHUB.trigger('content.changed.' + o.content_id, {});
|
103
103
|
});
|
104
104
|
},
|
105
|
-
|
105
|
+
|
106
106
|
on_undo_pressed: function() {
|
107
107
|
this.code_mirror.undo();
|
108
108
|
},
|
109
|
-
|
109
|
+
|
110
110
|
on_redo_pressed: function() {
|
111
111
|
this.code_mirror.redo();
|
112
112
|
},
|
113
113
|
|
114
114
|
resize: function() {
|
115
|
-
|
116
|
-
var i = 0;
|
115
|
+
code_mirror.__super__.resize.call(this);
|
116
|
+
var i = 0;
|
117
117
|
},
|
118
|
-
|
118
|
+
|
119
119
|
init_data_source: function() {},
|
120
120
|
process_schema: function() {},
|
121
|
-
|
122
|
-
}) /* end of
|
123
|
-
|
124
|
-
|
121
|
+
|
122
|
+
}); /* end of code_mirror */
|
123
|
+
|
124
|
+
return code_mirror;
|
125
|
+
|
126
|
+
});
|