object-view 0.5.1 → 0.5.2
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.
- checksums.yaml +4 -4
- data/lib/object-view.rb +3 -0
- data/lib/object_view/chart_data.rb +3 -3
- data/lib/object_view/high_chart_ajax_javascript.rb +360 -0
- data/lib/object_view/line_chart.rb +17 -0
- data/lib/object_view/pie_chart.rb +12 -0
- metadata +4 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 789698e398c060a73331c478334ebfea705f5ed1
|
4
|
+
data.tar.gz: 9d4a12327c47ad84c221e0e8781f071cec7f2474
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a9d01a138e154c216b5f18771ccc48d5495be149cc5332926c3b252bf4ac0183f8564ab016cb26dda256bb1b83cc535f8cf7fd938d133c0de8fe08c31f447dd0
|
7
|
+
data.tar.gz: 87dcef46cbaf4de1ea57478f9b2639ba5ddc9e426146c9175436bd2134cb0430887d8d4b42dbcd64e36ac93936c26a55320758446d43d90aec8233687e38ed3d
|
data/lib/object-view.rb
CHANGED
@@ -18,6 +18,9 @@ require_relative "object_view/paragraph"
|
|
18
18
|
require_relative 'object_view/span'
|
19
19
|
require_relative 'object_view/input'
|
20
20
|
require_relative 'object_view/iframe'
|
21
|
+
require_relative 'object_view/pie_chart'
|
22
|
+
require_relative 'object_view/line_chart'
|
23
|
+
require_relative 'object_view/iframe'
|
21
24
|
|
22
25
|
|
23
26
|
module ObjectView
|
@@ -1,15 +1,15 @@
|
|
1
|
-
@@chart_id = 0
|
2
|
-
|
3
|
-
|
4
1
|
module ObjectView
|
5
2
|
# ajax_method_for_params specifies a javascript method that will be called by ajax update script to retrieve non-static params
|
6
3
|
# This method needs to be added to page and returns a string in the form : "a=b&c=d&e=f"
|
7
4
|
class ChartData
|
5
|
+
@@chart_id = 0
|
8
6
|
attr_accessor :id, :series, :label, :chart_type, :x_axis_label, :y_axis_labels, :ajax_url, :ajax_params, :ajax_refresh_seconds, :ajax_method_for_params
|
9
7
|
|
10
8
|
def initialize(type)
|
11
9
|
@@chart_id += 1
|
12
10
|
@ajax_method_for_params = nil
|
11
|
+
@ajax_refresh_seconds = 20
|
12
|
+
|
13
13
|
@ajax_params = Hash.new
|
14
14
|
@id = "chart_#{@@chart_id}"
|
15
15
|
@chart_type = type
|
@@ -0,0 +1,360 @@
|
|
1
|
+
require_relative "./javascript"
|
2
|
+
module ObjectView
|
3
|
+
|
4
|
+
class HighChartLoadJavascriptAjax < ObjectView::Javascript
|
5
|
+
|
6
|
+
def initialize(chart_data_list, prepend_script)
|
7
|
+
super()
|
8
|
+
|
9
|
+
script = ""
|
10
|
+
if (prepend_script != nil)
|
11
|
+
script += prepend_script
|
12
|
+
end
|
13
|
+
|
14
|
+
script += chart_class_script()
|
15
|
+
|
16
|
+
|
17
|
+
script += "
|
18
|
+
_chartHash = new Object();
|
19
|
+
_chartList = new Array();
|
20
|
+
"
|
21
|
+
chart_data_list.each do |chart_data|
|
22
|
+
params_line = params_for_chart(chart_data)
|
23
|
+
refresh_seconds = chart_data.ajax_refresh_seconds
|
24
|
+
if (refresh_seconds == nil)
|
25
|
+
refresh_seconds = "null"
|
26
|
+
end
|
27
|
+
|
28
|
+
# 'apple=green&extent=' + _extent + ''
|
29
|
+
# 'extent=' + _extent + '&' + 'apple=green' + '&' + 'banana=yellow'
|
30
|
+
script += "
|
31
|
+
#{params_line}
|
32
|
+
var chartDraw = new HighChartDraw('#{chart_data.id}', '#{chart_data.ajax_url}', params, #{refresh_seconds});
|
33
|
+
_chartHash['#{chart_data.id}'] = chartDraw;
|
34
|
+
_chartList.push(chartDraw);
|
35
|
+
console.log('_chartList.length: ' + _chartList.length);
|
36
|
+
"
|
37
|
+
end
|
38
|
+
script += "
|
39
|
+
function periodicCheckForChartDraw() {
|
40
|
+
var chartCount = _chartList.length;
|
41
|
+
//console.log('periodicCheckForChartDraw() count: ' + chartCount);
|
42
|
+
for (i = 0; i < chartCount; i++) {
|
43
|
+
chart = _chartList[i];
|
44
|
+
chart.periodicCheck();
|
45
|
+
}
|
46
|
+
}
|
47
|
+
setInterval(periodicCheckForChartDraw, 500);
|
48
|
+
"
|
49
|
+
|
50
|
+
self.add script
|
51
|
+
end
|
52
|
+
|
53
|
+
def chart_class_script
|
54
|
+
script =
|
55
|
+
"
|
56
|
+
|
57
|
+
function prepareChartData(chartData) {
|
58
|
+
console.log('Data type: ' + typeof(chartData));
|
59
|
+
prepareObjectAndChildren(chartData);
|
60
|
+
}
|
61
|
+
|
62
|
+
|
63
|
+
|
64
|
+
function prepareObjectAndChildren(object) {
|
65
|
+
if (typeof(object) == 'object') {
|
66
|
+
for (var key in object) {
|
67
|
+
if (object.hasOwnProperty(key)) {
|
68
|
+
//console.log('key is: ' + key + ', value is: ' + object[key]);
|
69
|
+
child = object[key];
|
70
|
+
if (typeof(child) == \"object\" ) {
|
71
|
+
prepareObjectAndChildren(child);
|
72
|
+
} else if (typeof(child) == 'string') {
|
73
|
+
//console.log('STRING key is: ' + key + ', value is: ' + object[key]);
|
74
|
+
if (child.indexOf('/@') == 0) {
|
75
|
+
var functionCode = child.replace('/@', '');
|
76
|
+
functionCode = functionCode.replace('@/', '');
|
77
|
+
object[key] = function() {
|
78
|
+
return eval(functionCode);
|
79
|
+
}
|
80
|
+
//console.log('STRING (functionCode): ' + key + ', value is: ' + functionCode);
|
81
|
+
//console.log('STRING was function ' + key + ', value is: ' + object[key]);
|
82
|
+
}
|
83
|
+
}
|
84
|
+
}
|
85
|
+
}
|
86
|
+
}
|
87
|
+
}
|
88
|
+
//response = response.replace('\"@@', '');
|
89
|
+
//response = response.replace('@@\"', '');
|
90
|
+
|
91
|
+
|
92
|
+
function HighChartDraw(chartId, ajaxUrl, ajaxParams, refreshSeconds) {
|
93
|
+
console.log('Created HighChartDraw (' + chartId + ')');
|
94
|
+
this.nextTimeToDraw = 0;
|
95
|
+
this.currentlyDrawing = false;
|
96
|
+
this.ajaxUrl = ajaxUrl;
|
97
|
+
this.ajaxParams = ajaxParams;
|
98
|
+
this.refreshSeconds = refreshSeconds;
|
99
|
+
this.chartId = chartId;
|
100
|
+
console.log('Initializing chart: ' + this.chartId);
|
101
|
+
this.chartRequestMade = false;
|
102
|
+
this.clearChart();
|
103
|
+
}
|
104
|
+
|
105
|
+
HighChartDraw.prototype.buildParamString = function() {
|
106
|
+
var paramString = '';
|
107
|
+
for (var paramName in this.ajaxParams) {
|
108
|
+
if (this.ajaxParams.hasOwnProperty(paramName)) {
|
109
|
+
paramValue = this.ajaxParams[paramName];
|
110
|
+
if (paramString.length > 0) {
|
111
|
+
paramString = paramString + '&';
|
112
|
+
}
|
113
|
+
paramString += paramName + '=';
|
114
|
+
var indexOfVal = paramValue.indexOf('VAR|');
|
115
|
+
if (indexOfVal == 0) {
|
116
|
+
var variable = paramValue.substring(4, paramValue.length);
|
117
|
+
console.log('Variable for eval: ' + variable);
|
118
|
+
paramString += encodeURIComponent(eval(variable));
|
119
|
+
//paramString += eval(variable);
|
120
|
+
} else {
|
121
|
+
paramString += encodeURIComponent(paramValue);
|
122
|
+
//paramString += paramValue;
|
123
|
+
}
|
124
|
+
}
|
125
|
+
}
|
126
|
+
console.log('Post params: ' + paramString);
|
127
|
+
return paramString;
|
128
|
+
}
|
129
|
+
|
130
|
+
|
131
|
+
HighChartDraw.prototype.draw = function() {
|
132
|
+
try {
|
133
|
+
this.currentlyDrawing = true;
|
134
|
+
console.log('Drawing chart (' + this.chartId + ')');
|
135
|
+
var chartElementId = 'chart_1';
|
136
|
+
var chartId = this.chartId;
|
137
|
+
$.ajax({
|
138
|
+
type: 'GET',
|
139
|
+
url: this.ajaxUrl,
|
140
|
+
data: this.buildParamString(),
|
141
|
+
dataType: 'text',
|
142
|
+
success: function(response) {
|
143
|
+
var chartData = jQuery.parseJSON(response);
|
144
|
+
prepareChartData(chartData);
|
145
|
+
$('#' + chartId).highcharts(chartData);
|
146
|
+
},
|
147
|
+
error: function(XMLHttpRequest, textStatus, errorThrown) {
|
148
|
+
$('#' + chartId).html('<h3>Error getting chart data - QA server may be down.</h3>');
|
149
|
+
}
|
150
|
+
});
|
151
|
+
console.log('finished drawing chart. Queuing another drawHighChart request.');
|
152
|
+
if (this.refreshSeconds != null) {
|
153
|
+
this.makeChartDrawRequest(1000 * this.refreshSeconds);
|
154
|
+
}
|
155
|
+
this.currentlyDrawing = false;
|
156
|
+
} catch(error) {
|
157
|
+
console.log('Exception drawing chart: ' + error);
|
158
|
+
this.currentlyDrawing = false;
|
159
|
+
this.makeChartDrawRequest(1000);
|
160
|
+
throw error;
|
161
|
+
}
|
162
|
+
this.currentlyDrawing = false;
|
163
|
+
}
|
164
|
+
|
165
|
+
HighChartDraw.prototype.clearChart = function() {
|
166
|
+
$('#' + this.chartId).html('<h2 style=\"color: #aaaaaa\">Building Chart...</h2>');
|
167
|
+
}
|
168
|
+
|
169
|
+
HighChartDraw.prototype.makeChartDrawRequest = function(millisFromNow) {
|
170
|
+
var nextTime = jQuery.now() + millisFromNow;
|
171
|
+
if ((this.nextTimeToDraw == null) || (nextTime < this.nextTimeToDraw)) {
|
172
|
+
this.nextTimeToDraw = nextTime;
|
173
|
+
}
|
174
|
+
console.log('Request to drawHighChart (' + this.chartId + ') queued for: ' + this.nextTimeToDraw);
|
175
|
+
}
|
176
|
+
|
177
|
+
HighChartDraw.prototype.periodicCheck = function() {
|
178
|
+
//console.log('periodicCheck for ' + this.chartId);
|
179
|
+
var now = jQuery.now();
|
180
|
+
if (this.nextTimeToDraw != null) {
|
181
|
+
if (now > this.nextTimeToDraw) {
|
182
|
+
this.doingPeriodicCheck = false;
|
183
|
+
if (this.currentlyDrawing == false) {
|
184
|
+
this.nextTimeToDraw = null;
|
185
|
+
this.draw();
|
186
|
+
} else {
|
187
|
+
//console.log('periodicCheck for ' + this.chartId + ' currently drawing, so ignoring request');
|
188
|
+
}
|
189
|
+
} else {
|
190
|
+
//console.log('periodicCheck for ' + this.chartId + ' next draw time not reached');
|
191
|
+
}
|
192
|
+
} else {
|
193
|
+
//console.log('periodicCheck for ' + this.chartId + ' nextTimeToDraw is null');
|
194
|
+
}
|
195
|
+
this.doingPeriodicCheck = false;
|
196
|
+
}
|
197
|
+
"
|
198
|
+
return script
|
199
|
+
end
|
200
|
+
|
201
|
+
|
202
|
+
|
203
|
+
def draw_chart_function(ajax_refresh_seconds, chart_data_list)
|
204
|
+
script = "
|
205
|
+
function drawHighChart() {
|
206
|
+
console.log('drawHighChart called');
|
207
|
+
"
|
208
|
+
script += "
|
209
|
+
try {
|
210
|
+
_currentlyDrawing = true;
|
211
|
+
console.log('Drawing charts.');
|
212
|
+
//alert('drawHighChart()');
|
213
|
+
"
|
214
|
+
script += " #{chart_data_load_script(chart_data_list)}\n"
|
215
|
+
|
216
|
+
if (ajax_refresh_seconds != nil)
|
217
|
+
script += "
|
218
|
+
console.log('finished drawing chart. Queuing another drawHighChart request.');
|
219
|
+
makeChartDrawRequest(#{ajax_refresh_seconds * 1000});\n
|
220
|
+
_currentlyDrawing = false;
|
221
|
+
"
|
222
|
+
end
|
223
|
+
|
224
|
+
script += "
|
225
|
+
} catch(error) {
|
226
|
+
console.log('Exception drawing chart: ' + error);
|
227
|
+
_currentlyDrawing = false;
|
228
|
+
makeChartDrawRequest(1000);
|
229
|
+
}
|
230
|
+
"
|
231
|
+
|
232
|
+
script += "
|
233
|
+
_currentlyDrawing = false;
|
234
|
+
}
|
235
|
+
"
|
236
|
+
return script
|
237
|
+
end
|
238
|
+
|
239
|
+
|
240
|
+
def clear_script_for_each_chart(chart_data_list)
|
241
|
+
script = ""
|
242
|
+
chart_data_list.each do |chart_data|
|
243
|
+
chart_data.id
|
244
|
+
script += " $('##{chart_data.id}').html('<h3 style=\"color: #aaaaaa\">Building Chart</h3>');\n"
|
245
|
+
end
|
246
|
+
return script
|
247
|
+
end
|
248
|
+
|
249
|
+
def periodic_check_function(chart_data_list)
|
250
|
+
script = "
|
251
|
+
function periodicCheck(chartId) {
|
252
|
+
var now = jQuery.now();
|
253
|
+
if (_nextTimeToDraw[chartId] != null) {
|
254
|
+
if (now > _nextTimeToDraw[chartId]) {
|
255
|
+
_doingPeriodicCheck = false;
|
256
|
+
if (_currentlyDrawing == false) {
|
257
|
+
_nextTimeToDraw[chartId] = null;
|
258
|
+
drawHighChart(chartId);
|
259
|
+
} else {
|
260
|
+
}
|
261
|
+
}
|
262
|
+
}
|
263
|
+
_doingPeriodicCheck = false;
|
264
|
+
}
|
265
|
+
}
|
266
|
+
"
|
267
|
+
|
268
|
+
script +=
|
269
|
+
"
|
270
|
+
function periodicCheckAll() {
|
271
|
+
if (!_doingPeriodicCheck) {
|
272
|
+
_doingPeriodicCheck = true;
|
273
|
+
"
|
274
|
+
|
275
|
+
chart_data_list.each do |chart_data|
|
276
|
+
script += " periodicCheck('#{chart_data.id}'); "
|
277
|
+
end
|
278
|
+
|
279
|
+
script +=
|
280
|
+
"
|
281
|
+
}
|
282
|
+
}
|
283
|
+
"
|
284
|
+
end
|
285
|
+
|
286
|
+
def params_for_chart(chart_data)
|
287
|
+
params_str = "var params = new Object();\n"
|
288
|
+
|
289
|
+
chart_data.ajax_params.each do |name, value|
|
290
|
+
params_str += " params['#{name}'] = '#{value}';\n"
|
291
|
+
end
|
292
|
+
|
293
|
+
return params_str
|
294
|
+
end
|
295
|
+
|
296
|
+
# def params_for_chart(chart_data)
|
297
|
+
# params_str = "var params = '' + "
|
298
|
+
#
|
299
|
+
# chart_data.ajax_params.each do |name, value|
|
300
|
+
# # params_string += "#{name}=#{value}&"
|
301
|
+
# if (value.to_s.start_with? "VAR|")
|
302
|
+
# params_str += "'#{name}=' + #{value[4..(value.length - 1)]}"
|
303
|
+
# else
|
304
|
+
# encoded_value = URI.encode_www_form([[name, value]])
|
305
|
+
# params_str += "'#{encoded_value}'"
|
306
|
+
# #params_str += "'#{name}=#{encoded_value}'"
|
307
|
+
# end
|
308
|
+
# params_str += "+'&'+"
|
309
|
+
# end
|
310
|
+
#
|
311
|
+
# params_str = params_str[0..params_str.length - 6]
|
312
|
+
# params_str += ';'
|
313
|
+
# # if (params_string.length > 0)
|
314
|
+
# # params_string = params_string[0..params_string.length - 2]
|
315
|
+
# # end
|
316
|
+
# # params_string = URI.encode_www_form(params)
|
317
|
+
# return params_str
|
318
|
+
# end
|
319
|
+
|
320
|
+
def chart_data_load_script(chart_data_list)
|
321
|
+
script = ""
|
322
|
+
chart_data_list.each do |chart_data|
|
323
|
+
|
324
|
+
|
325
|
+
script +=
|
326
|
+
"
|
327
|
+
var chartElementId = '#{chart_data.id}';
|
328
|
+
$.ajax({
|
329
|
+
type: 'GET',
|
330
|
+
url: '#{chart_data.ajax_url}',
|
331
|
+
data: params,
|
332
|
+
dataType: 'text',
|
333
|
+
success: function(response) {
|
334
|
+
//alert('Response: ' + response);
|
335
|
+
var chartData = jQuery.parseJSON(response);
|
336
|
+
//alert('Response: ' + response);
|
337
|
+
$('#' + chartElementId).highcharts(chartData);"
|
338
|
+
|
339
|
+
|
340
|
+
if (chart_data.ajax_refresh_seconds != nil)
|
341
|
+
script += "
|
342
|
+
makeChartDrawRequest(#{chart_data.ajax_refresh_seconds * 1000});
|
343
|
+
"
|
344
|
+
end
|
345
|
+
|
346
|
+
script += "
|
347
|
+
},
|
348
|
+
error: function(XMLHttpRequest, textStatus, errorThrown) {
|
349
|
+
$('#' + chartElementId).html('<h3>Error getting chart data - QA server may be down.</h3>');
|
350
|
+
}
|
351
|
+
});
|
352
|
+
"
|
353
|
+
end
|
354
|
+
return script
|
355
|
+
end
|
356
|
+
|
357
|
+
end
|
358
|
+
|
359
|
+
|
360
|
+
end # Module
|
@@ -0,0 +1,17 @@
|
|
1
|
+
class LineChart < ObjectView::Div
|
2
|
+
include ObjectView
|
3
|
+
|
4
|
+
attr_reader :data
|
5
|
+
|
6
|
+
def initialize(label)
|
7
|
+
super()
|
8
|
+
@data = ChartData.new(:line)
|
9
|
+
@data.label = label
|
10
|
+
@data.chart_type = :line
|
11
|
+
self.id = @data.id
|
12
|
+
add "Loading Chart..."
|
13
|
+
self.style = "border: 1px solid black; width: 300px; height: 120px"
|
14
|
+
end
|
15
|
+
|
16
|
+
|
17
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
class PieChart < LineChart
|
2
|
+
def initialize(label)
|
3
|
+
super(label)
|
4
|
+
|
5
|
+
self.data.chart_type = :pie
|
6
|
+
self.data.x_axis_label = "Functional Area"
|
7
|
+
self.data.y_axis_labels = ["Defects"]
|
8
|
+
add "Loading Chart..."
|
9
|
+
self.style = "border: 1px solid black; width: 200px; height: 200px"
|
10
|
+
|
11
|
+
end
|
12
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: object-view
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.5.
|
4
|
+
version: 0.5.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mike Moore
|
@@ -83,15 +83,18 @@ files:
|
|
83
83
|
- lib/object_view/errors/object_view_error.rb
|
84
84
|
- lib/object_view/head.rb
|
85
85
|
- lib/object_view/header.rb
|
86
|
+
- lib/object_view/high_chart_ajax_javascript.rb
|
86
87
|
- lib/object_view/iframe.rb
|
87
88
|
- lib/object_view/image.rb
|
88
89
|
- lib/object_view/input.rb
|
89
90
|
- lib/object_view/javascript.rb
|
90
91
|
- lib/object_view/javascript_file.rb
|
92
|
+
- lib/object_view/line_chart.rb
|
91
93
|
- lib/object_view/link.rb
|
92
94
|
- lib/object_view/nav.rb
|
93
95
|
- lib/object_view/page.rb
|
94
96
|
- lib/object_view/paragraph.rb
|
97
|
+
- lib/object_view/pie_chart.rb
|
95
98
|
- lib/object_view/span.rb
|
96
99
|
- lib/object_view/stylesheet.rb
|
97
100
|
- lib/object_view/table.rb
|