object-view 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/object_view.rb +16 -0
- data/lib/object_view/body.rb +12 -0
- data/lib/object_view/chart_data.rb +22 -0
- data/lib/object_view/chart_load_javascript.rb +127 -0
- data/lib/object_view/chart_load_javascript_ajax.rb +204 -0
- data/lib/object_view/div.rb +16 -0
- data/lib/object_view/element.rb +153 -0
- data/lib/object_view/head.rb +11 -0
- data/lib/object_view/header.rb +14 -0
- data/lib/object_view/javascript.rb +15 -0
- data/lib/object_view/javascript_file.rb +17 -0
- data/lib/object_view/link.rb +18 -0
- data/lib/object_view/object_view_error.rb +9 -0
- data/lib/object_view/page.rb +59 -0
- data/lib/object_view/span.rb +13 -0
- data/lib/object_view/table.rb +122 -0
- metadata +63 -0
data/lib/object_view.rb
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'object_view/page.rb'
|
2
|
+
require 'object_view/element.rb'
|
3
|
+
require 'object_view/body'
|
4
|
+
require 'object_view/head'
|
5
|
+
require 'object_view/header'
|
6
|
+
require 'object_view/javascript_file'
|
7
|
+
require 'object_view/div'
|
8
|
+
require 'object_view/span'
|
9
|
+
require 'object_view/javascript'
|
10
|
+
require 'object_view/table'
|
11
|
+
require "object_view/link"
|
12
|
+
require "object_view/chart_data"
|
13
|
+
|
14
|
+
|
15
|
+
module ObjectView
|
16
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
@@chart_id = 0
|
2
|
+
|
3
|
+
|
4
|
+
module ObjectView
|
5
|
+
# ajax_method_for_params specifies a javascript method that will be called by ajax update script to retrieve non-static params
|
6
|
+
# This method needs to be added to page and returns a string in the form : "a=b&c=d&e=f"
|
7
|
+
class ChartData
|
8
|
+
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
|
+
|
10
|
+
def initialize(type)
|
11
|
+
@@chart_id += 1
|
12
|
+
@ajax_method_for_params = nil
|
13
|
+
@ajax_params = Hash.new
|
14
|
+
@id = "chart_#{@@chart_id}"
|
15
|
+
@chart_type = type
|
16
|
+
@series = []
|
17
|
+
@x_axis_label = "Time"
|
18
|
+
@y_axis_labels = ["Count"]
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,127 @@
|
|
1
|
+
require_relative "./page"
|
2
|
+
|
3
|
+
module ObjectView
|
4
|
+
class ChartLoadJavascript < ObjectView::Javascript
|
5
|
+
|
6
|
+
def initialize(chart_load_js_content)
|
7
|
+
super()
|
8
|
+
add "
|
9
|
+
// Chart Partial erb: <%= Time.new.to_s%>
|
10
|
+
|
11
|
+
function drawChart() {
|
12
|
+
#{chart_data_load_script(chart_load_js_content)}
|
13
|
+
}
|
14
|
+
|
15
|
+
function initializeChart() {
|
16
|
+
google.load('visualization', '1', {packages:['corechart']});
|
17
|
+
google.setOnLoadCallback(drawChart);
|
18
|
+
}
|
19
|
+
initializeChart();
|
20
|
+
"
|
21
|
+
end
|
22
|
+
|
23
|
+
def chart_data_load_script(chart_load_js_content)
|
24
|
+
script = ""
|
25
|
+
chart_load_js_content.each do |chart_data|
|
26
|
+
chart_object = "Error"
|
27
|
+
if (chart_data.chart_type == :line)
|
28
|
+
chart_object = "LineChart"
|
29
|
+
elsif(chart_data.chart_type == :pie)
|
30
|
+
chart_object = "PieChart"
|
31
|
+
elsif(chart_data.chart_type == :stacked_area)
|
32
|
+
chart_object = "AreaChart"
|
33
|
+
elsif(chart_data.chart_type == :area)
|
34
|
+
chart_object = "AreaChart"
|
35
|
+
elsif(chart_data.chart_type == :stepped_area)
|
36
|
+
chart_object = "SteppedAreaChart"
|
37
|
+
else
|
38
|
+
raise ("chart_data needs a valid 'chart_type': :line or :pie")
|
39
|
+
end
|
40
|
+
|
41
|
+
# Rails.logger.info "Chart data y-axis (as js render): #{chart_data.y_axis_labels}"
|
42
|
+
y_axis_elements = ""
|
43
|
+
chart_data.y_axis_labels.each do |label|
|
44
|
+
y_axis_elements += "'#{label}'"
|
45
|
+
if (chart_data.y_axis_labels.last != label)
|
46
|
+
y_axis_elements += ", "
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
# script += "// #{chart_data.series}\n"
|
51
|
+
script += "var chartArray = ([ \n"
|
52
|
+
script += "['#{chart_data.x_axis_label}', #{y_axis_elements}], \n"
|
53
|
+
show_legend = false
|
54
|
+
chart_data.series.each do |data|
|
55
|
+
script += " "
|
56
|
+
script += "["
|
57
|
+
if (data.length > 2)
|
58
|
+
show_legend = true
|
59
|
+
end
|
60
|
+
|
61
|
+
(0..data.length - 1).each do |i|
|
62
|
+
data_item = data[i]
|
63
|
+
if (i == 0)
|
64
|
+
script += "'#{data_item}'"
|
65
|
+
else
|
66
|
+
script += "#{data_item}"
|
67
|
+
end
|
68
|
+
if (i != data.length - 1)
|
69
|
+
script += ", "
|
70
|
+
end
|
71
|
+
end
|
72
|
+
script += "]"
|
73
|
+
if (chart_data.series.last != data)
|
74
|
+
script += ","
|
75
|
+
script += "\n"
|
76
|
+
end
|
77
|
+
end
|
78
|
+
script += " ]);\n"
|
79
|
+
script += " var chartData = google.visualization.arrayToDataTable(chartArray); \n"
|
80
|
+
script += " var chart = new google.visualization.#{chart_object}(document.getElementById('#{chart_data.id}'));\n"
|
81
|
+
if (chart_data.chart_type == :pie)
|
82
|
+
script += "
|
83
|
+
var options = {
|
84
|
+
title: '#{chart_data.label}'
|
85
|
+
}
|
86
|
+
"
|
87
|
+
else
|
88
|
+
if (show_legend)
|
89
|
+
legend_value = ""
|
90
|
+
else
|
91
|
+
legend_value = "legend: 'none',"
|
92
|
+
end
|
93
|
+
|
94
|
+
|
95
|
+
if(chart_data.chart_type == :stacked_area)
|
96
|
+
|
97
|
+
script += "
|
98
|
+
var options = {
|
99
|
+
vAxis: {minValue: 0},
|
100
|
+
isStacked: true,
|
101
|
+
title: '#{chart_data.label}',
|
102
|
+
displayAnnotations: true,
|
103
|
+
curveType: 'function',
|
104
|
+
fontSize: 10
|
105
|
+
}
|
106
|
+
"
|
107
|
+
else
|
108
|
+
script += "
|
109
|
+
var options = {
|
110
|
+
title: '#{chart_data.label}',
|
111
|
+
#{legend_value}
|
112
|
+
displayAnnotations: true,
|
113
|
+
curveType: 'function',
|
114
|
+
fontSize: 10
|
115
|
+
}
|
116
|
+
"
|
117
|
+
end
|
118
|
+
end
|
119
|
+
script += " chart.draw(chartData, options);\n"
|
120
|
+
|
121
|
+
end
|
122
|
+
return script
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
|
127
|
+
end
|
@@ -0,0 +1,204 @@
|
|
1
|
+
require_relative "./page"
|
2
|
+
require 'uri'
|
3
|
+
|
4
|
+
|
5
|
+
module ObjectView
|
6
|
+
class ChartLoadJavascriptAjax < ObjectView::Javascript
|
7
|
+
|
8
|
+
def initialize(chart_load_js_content, ajax_refresh_seconds = nil, prepend_script = "")
|
9
|
+
super()
|
10
|
+
|
11
|
+
|
12
|
+
|
13
|
+
script = "
|
14
|
+
#{prepend_script}
|
15
|
+
|
16
|
+
var _nextTimeToDraw = jQuery.now() + 1000;
|
17
|
+
var _doingPeriodicCheck = false;
|
18
|
+
|
19
|
+
function periodicCheck() {
|
20
|
+
if (_initializedCharts) {
|
21
|
+
if (!_doingPeriodicCheck) {
|
22
|
+
_doingPeriodicCheck = true;
|
23
|
+
var now = jQuery.now();
|
24
|
+
if (_nextTimeToDraw != null) {
|
25
|
+
if (now > _nextTimeToDraw) {
|
26
|
+
_doingPeriodicCheck = false;
|
27
|
+
if (_currentlyDrawing == false) {
|
28
|
+
_nextTimeToDraw = null;
|
29
|
+
drawChart();
|
30
|
+
} else {
|
31
|
+
}
|
32
|
+
}
|
33
|
+
}
|
34
|
+
_doingPeriodicCheck = false;
|
35
|
+
}
|
36
|
+
} else {
|
37
|
+
console.log('Waiting for google charts to initialize');
|
38
|
+
initializeChart();
|
39
|
+
}
|
40
|
+
}
|
41
|
+
|
42
|
+
|
43
|
+
var _chartRequestMade = false;
|
44
|
+
function makeChartDrawRequest(time) {
|
45
|
+
var nextTime = jQuery.now() + time;
|
46
|
+
if ((_nextTimeToDraw == null) || (nextTime < _nextTimeToDraw)) {
|
47
|
+
_nextTimeToDraw = nextTime;
|
48
|
+
}
|
49
|
+
console.log('Request to drawChart queued for: ' + _nextTimeToDraw);
|
50
|
+
}
|
51
|
+
|
52
|
+
function clearCharts() {
|
53
|
+
#{clear_script_for_each_chart(chart_load_js_content)}
|
54
|
+
}
|
55
|
+
|
56
|
+
|
57
|
+
_currentlyDrawing = false;
|
58
|
+
function drawChart() {
|
59
|
+
console.log('drawChart called');
|
60
|
+
try {
|
61
|
+
_currentlyDrawing = true;
|
62
|
+
console.log('Drawing charts.');
|
63
|
+
//alert('drawChart()');
|
64
|
+
#{chart_data_load_script(chart_load_js_content)}
|
65
|
+
console.log('Finished drawing charts.');
|
66
|
+
"
|
67
|
+
if (ajax_refresh_seconds != nil)
|
68
|
+
script += "
|
69
|
+
console.log('finished drawing chart. Queuing another drawChart request.');
|
70
|
+
|
71
|
+
makeChartDrawRequest(#{ajax_refresh_seconds * 1000});\n
|
72
|
+
_currentlyDrawing = false;
|
73
|
+
"
|
74
|
+
end
|
75
|
+
|
76
|
+
script += "
|
77
|
+
} catch(error) {
|
78
|
+
console.log('Exception drawing chart: ' + error);
|
79
|
+
_currentlyDrawing = false;
|
80
|
+
makeChartDrawRequest(1000);
|
81
|
+
}
|
82
|
+
_currentlyDrawing = false;
|
83
|
+
}
|
84
|
+
"
|
85
|
+
chart_load_js_content.each do |chart_data|
|
86
|
+
script += " $('##{chart_data.id}').html('<h2 style=\"color: #aaaaaa\">Building Chart...</h2>'); \n"
|
87
|
+
end
|
88
|
+
|
89
|
+
script += " initializeChart();\n;"
|
90
|
+
script += " setInterval(periodicCheck, 500);\n"
|
91
|
+
if (ajax_refresh_seconds != nil)
|
92
|
+
script += " makeChartDrawRequest(1000); \n"
|
93
|
+
else
|
94
|
+
script += "makeChartDrawRequest(1000);\n"
|
95
|
+
end
|
96
|
+
add script
|
97
|
+
end
|
98
|
+
|
99
|
+
|
100
|
+
def clear_script_for_each_chart(chart_load_js_content)
|
101
|
+
script = ""
|
102
|
+
chart_load_js_content.each do |chart_data|
|
103
|
+
chart_data.id
|
104
|
+
script += " $('##{chart_data.id}').html('<h3 style=\"color: #aaaaaa\">Building Chart</h3>');\n"
|
105
|
+
end
|
106
|
+
return script
|
107
|
+
end
|
108
|
+
|
109
|
+
|
110
|
+
def chart_data_load_script(chart_load_js_content)
|
111
|
+
script = ""
|
112
|
+
chart_load_js_content.each do |chart_data|
|
113
|
+
params = []
|
114
|
+
|
115
|
+
chart_data.ajax_params.each do |name, value|
|
116
|
+
# params_string += "#{name}=#{value}&"
|
117
|
+
params << [name, value]
|
118
|
+
end
|
119
|
+
# if (params_string.length > 0)
|
120
|
+
# params_string = params_string[0..params_string.length - 2]
|
121
|
+
# end
|
122
|
+
params_string = URI.encode_www_form(params)
|
123
|
+
|
124
|
+
|
125
|
+
chart_object = "Error"
|
126
|
+
additional_options_script = ""
|
127
|
+
if (chart_data.chart_type == :line)
|
128
|
+
chart_object = "LineChart"
|
129
|
+
elsif(chart_data.chart_type == :pie)
|
130
|
+
chart_object = "PieChart"
|
131
|
+
elsif(chart_data.chart_type == :stacked_area)
|
132
|
+
chart_object = "AreaChart"
|
133
|
+
additional_options_script = " options['isStacked'] = true;\n"
|
134
|
+
elsif(chart_data.chart_type == :area)
|
135
|
+
chart_object = "AreaChart"
|
136
|
+
elsif(chart_data.chart_type == :stepped_area)
|
137
|
+
chart_object = "SteppedAreaChart"
|
138
|
+
else
|
139
|
+
raise ("chart_data needs a valid 'chart_type': :line or :pie")
|
140
|
+
end
|
141
|
+
|
142
|
+
if (params_string.length > 0)
|
143
|
+
script += " var params = '#{params_string}';\n"
|
144
|
+
if (chart_data.ajax_method_for_params != nil)
|
145
|
+
script += " params = params + '&' + #{chart_data.ajax_method_for_params};\n"
|
146
|
+
end
|
147
|
+
else
|
148
|
+
if (chart_data.ajax_method_for_params != nil)
|
149
|
+
script += " var params = #{chart_data.ajax_method_for_params};\n"
|
150
|
+
else
|
151
|
+
script += " var params = '';\n"
|
152
|
+
end
|
153
|
+
end
|
154
|
+
|
155
|
+
script += "
|
156
|
+
$.ajax({
|
157
|
+
type: 'POST',
|
158
|
+
url: '#{chart_data.ajax_url}',
|
159
|
+
data: params,
|
160
|
+
dataType: 'text',
|
161
|
+
success: function(response) {
|
162
|
+
//alert(\"Response: \" + response);
|
163
|
+
var chartData = jQuery.parseJSON(response);
|
164
|
+
|
165
|
+
//alert('Json: ' + chartData);
|
166
|
+
var seriesJson = chartData.series;
|
167
|
+
|
168
|
+
var options = chartData.options;
|
169
|
+
#{additional_options_script}
|
170
|
+
//alert('Options: ' + options);
|
171
|
+
|
172
|
+
var series = [];
|
173
|
+
for (var i = 0; i < seriesJson.length; i++) {
|
174
|
+
var dataPointJson = seriesJson[i];
|
175
|
+
var dataPoint = [];
|
176
|
+
dataPoint.push(dataPointJson[0].toString());
|
177
|
+
for (var j = 1; j < dataPointJson.length; j++) {
|
178
|
+
dataPoint.push(dataPointJson[j]);
|
179
|
+
}
|
180
|
+
series.push(dataPoint);
|
181
|
+
}
|
182
|
+
|
183
|
+
// var number = 5
|
184
|
+
// var series = [ ['Time', 'Count'], [number.toString(), 0], ['04/30/2013', 0], ['05/28/2013', 0], ['06/25/2013', 0] ];
|
185
|
+
var chartElementId = '#{chart_data.id}';
|
186
|
+
//alert('Series: ' + series);
|
187
|
+
var chartData = google.visualization.arrayToDataTable(series);
|
188
|
+
var chart = new google.visualization.#{chart_object}(document.getElementById(chartElementId));
|
189
|
+
|
190
|
+
chart.draw(chartData, options);
|
191
|
+
},
|
192
|
+
error: function(XMLHttpRequest, textStatus, errorThrown) {
|
193
|
+
$('##{chart_data.id}').html('<h3>Error getting chart data - QA server may be down.</h3>');
|
194
|
+
}
|
195
|
+
});
|
196
|
+
"
|
197
|
+
end
|
198
|
+
return script
|
199
|
+
end
|
200
|
+
|
201
|
+
end
|
202
|
+
|
203
|
+
|
204
|
+
end
|
@@ -0,0 +1,153 @@
|
|
1
|
+
require_relative './object_view_error'
|
2
|
+
|
3
|
+
module ObjectView
|
4
|
+
|
5
|
+
class Element
|
6
|
+
attr_accessor :tag, :attributes, :single_line, :acceptable_children
|
7
|
+
attr_reader :children
|
8
|
+
|
9
|
+
def initialize
|
10
|
+
@tab = " "
|
11
|
+
@single_line = false
|
12
|
+
@tag = nil
|
13
|
+
@attributes = Hash.new
|
14
|
+
@children = []
|
15
|
+
@acceptable_children = [String, Element]
|
16
|
+
end
|
17
|
+
|
18
|
+
|
19
|
+
def find_element_with_tag(tag)
|
20
|
+
found = []
|
21
|
+
@children.each do |child|
|
22
|
+
if (child.is_a?(Element)) && (child.tag == tag)
|
23
|
+
found << child
|
24
|
+
end
|
25
|
+
end
|
26
|
+
if (found.length == 0)
|
27
|
+
return nil
|
28
|
+
elsif (found.length == 1)
|
29
|
+
return found[0]
|
30
|
+
else
|
31
|
+
return found
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
35
|
+
|
36
|
+
def attr(name, value)
|
37
|
+
@attributes[name] = value
|
38
|
+
end
|
39
|
+
|
40
|
+
def on_click=(value)
|
41
|
+
self.attr("onclick", value)
|
42
|
+
end
|
43
|
+
|
44
|
+
def style=(the_style)
|
45
|
+
self.attr("style", the_style)
|
46
|
+
end
|
47
|
+
|
48
|
+
def css_class=(value)
|
49
|
+
self.attr("class", value)
|
50
|
+
end
|
51
|
+
|
52
|
+
def id=(value)
|
53
|
+
self.attr("id", value)
|
54
|
+
end
|
55
|
+
|
56
|
+
def is_acceptable_child?(child)
|
57
|
+
@acceptable_children.each do |good_class|
|
58
|
+
if (child.is_a?(good_class))
|
59
|
+
return true
|
60
|
+
end
|
61
|
+
end
|
62
|
+
return false
|
63
|
+
end
|
64
|
+
|
65
|
+
def add(element_or_string)
|
66
|
+
if (self.is_acceptable_child?(element_or_string))
|
67
|
+
@children << element_or_string
|
68
|
+
elsif (element_or_string.is_a?(Array))
|
69
|
+
element_or_string.each do |child|
|
70
|
+
add child
|
71
|
+
end
|
72
|
+
else
|
73
|
+
raise "Parent: #{self.tag} - Attempt to add an element that is not a valid child, and not an ObjectView::Element. Class of element: #{element_or_string.class.name}: #{element_or_string}\nTag of parent: #{self.tag}.\nAcceptable children: #{@acceptable_children.join(',')}"
|
74
|
+
end
|
75
|
+
|
76
|
+
return element_or_string
|
77
|
+
end
|
78
|
+
|
79
|
+
def add_with_tag(tag, content = nil)
|
80
|
+
element = Element.new
|
81
|
+
element.tag = tag
|
82
|
+
if (content != nil)
|
83
|
+
element.children << content
|
84
|
+
end
|
85
|
+
element.single_line = false
|
86
|
+
self.children << element
|
87
|
+
return element
|
88
|
+
end
|
89
|
+
|
90
|
+
def <<(item)
|
91
|
+
self.children << item
|
92
|
+
end
|
93
|
+
|
94
|
+
def render_children(indent = 0)
|
95
|
+
html = StringIO.new
|
96
|
+
@children.each do |child|
|
97
|
+
if (indent != nil)
|
98
|
+
if (!self.single_line)
|
99
|
+
html << "\n"
|
100
|
+
end
|
101
|
+
html << @tab * indent
|
102
|
+
end
|
103
|
+
if (child.class.name == "String")
|
104
|
+
html << child
|
105
|
+
else
|
106
|
+
child_html = child.render(indent)
|
107
|
+
html << child_html
|
108
|
+
end
|
109
|
+
end
|
110
|
+
return html.string
|
111
|
+
end
|
112
|
+
|
113
|
+
def render_attributes
|
114
|
+
html = StringIO.new
|
115
|
+
if (@attributes.length > 0)
|
116
|
+
@attributes.each do |name, value|
|
117
|
+
html << " #{name}=\"#{value}\""
|
118
|
+
end
|
119
|
+
end
|
120
|
+
return html.string
|
121
|
+
end
|
122
|
+
|
123
|
+
def render(indent = 0)
|
124
|
+
#Rails.logger.debug "Rendering: #{self} Tag: #{self.tag}"
|
125
|
+
html = StringIO.new
|
126
|
+
if (indent != nil)
|
127
|
+
html << (@tab * indent)
|
128
|
+
end
|
129
|
+
html << "<#{tag}#{render_attributes}>"
|
130
|
+
if (self.single_line)
|
131
|
+
html << "#{render_children(nil)}"
|
132
|
+
else
|
133
|
+
if (indent == nil)
|
134
|
+
html << render_children(indent)
|
135
|
+
else
|
136
|
+
html << render_children(indent + 1)
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
140
|
+
|
141
|
+
if (!self.single_line)
|
142
|
+
html << "\n"
|
143
|
+
if (indent != nil)
|
144
|
+
html << @tab * indent
|
145
|
+
end
|
146
|
+
end
|
147
|
+
|
148
|
+
html << "</#{tag}>\n"
|
149
|
+
return html.string
|
150
|
+
end
|
151
|
+
|
152
|
+
end
|
153
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require_relative './element'
|
2
|
+
|
3
|
+
module ObjectView
|
4
|
+
|
5
|
+
class JavascriptFile < Element
|
6
|
+
|
7
|
+
def initialize(file)
|
8
|
+
super()
|
9
|
+
self.single_line = true
|
10
|
+
attr("type", "text/javascript")
|
11
|
+
attr("src", file)
|
12
|
+
@tag = "script"
|
13
|
+
end
|
14
|
+
|
15
|
+
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
require_relative './element'
|
2
|
+
require_relative './body'
|
3
|
+
require_relative './head'
|
4
|
+
require_relative './header'
|
5
|
+
require_relative './javascript_file'
|
6
|
+
require_relative './div'
|
7
|
+
require_relative './span'
|
8
|
+
require_relative './javascript'
|
9
|
+
require_relative './table'
|
10
|
+
require_relative "./link"
|
11
|
+
require_relative "./chart_data"
|
12
|
+
require_relative "./chart_load_javascript"
|
13
|
+
require_relative "./chart_load_javascript_ajax"
|
14
|
+
|
15
|
+
|
16
|
+
|
17
|
+
module ObjectView
|
18
|
+
class Page < Element
|
19
|
+
attr_accessor :head, :body, :title, :title_div, :top_div
|
20
|
+
|
21
|
+
def initialize
|
22
|
+
super
|
23
|
+
puts "Element tag: #{@tag}"
|
24
|
+
self.tag = "html"
|
25
|
+
@head = Head.new
|
26
|
+
@title = "No Title"
|
27
|
+
self.add @head
|
28
|
+
@body = Body.new
|
29
|
+
self.add @body
|
30
|
+
@top_div = self.body.add Div.new
|
31
|
+
@title_div = self.body.add Div.new
|
32
|
+
@title = "No Title"
|
33
|
+
@acceptable_children = [Head, Body]
|
34
|
+
end
|
35
|
+
|
36
|
+
def displayed_title=(title)
|
37
|
+
self.title_div.add(Header.new(1, title))
|
38
|
+
end
|
39
|
+
|
40
|
+
def title=(title)
|
41
|
+
title_element = @head.find_element_with_tag("title")
|
42
|
+
if (title_element == nil)
|
43
|
+
title_element = @head.add_with_tag("title", title)
|
44
|
+
end
|
45
|
+
title_element.add(title)
|
46
|
+
end
|
47
|
+
|
48
|
+
def use_google_charts(chart_load_js_content)
|
49
|
+
self.head.add JavascriptFile.new("https://www.google.com/jsapi")
|
50
|
+
self.body.add ChartLoadJavascript.new(chart_load_js_content)
|
51
|
+
end
|
52
|
+
|
53
|
+
def use_google_charts_ajax(chart_load_js_content, refresh_seconds = nil, prepend_js_script = "")
|
54
|
+
self.head.add JavascriptFile.new("https://www.google.com/jsapi")
|
55
|
+
self.body.add ChartLoadJavascriptAjax.new(chart_load_js_content, refresh_seconds, prepend_js_script)
|
56
|
+
end
|
57
|
+
|
58
|
+
end
|
59
|
+
end
|
@@ -0,0 +1,122 @@
|
|
1
|
+
module ObjectView
|
2
|
+
|
3
|
+
class Table < Element
|
4
|
+
attr_reader :tbody, :thead
|
5
|
+
|
6
|
+
def initialize
|
7
|
+
super()
|
8
|
+
@tag = "table"
|
9
|
+
end
|
10
|
+
|
11
|
+
def header_row(labels = nil)
|
12
|
+
self.add @thead = THead.new
|
13
|
+
row = THeadRow.new
|
14
|
+
@thead.add row
|
15
|
+
if (labels != nil)
|
16
|
+
labels.each do |label|
|
17
|
+
row.cell(label)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
return row
|
21
|
+
end
|
22
|
+
|
23
|
+
def row(cell_data = nil, cell_attributes = nil)
|
24
|
+
if (@tbody == nil)
|
25
|
+
self.add @tbody = TBody.new
|
26
|
+
end
|
27
|
+
row = @tbody.row
|
28
|
+
if (cell_data != nil)
|
29
|
+
cell_data.each do |element|
|
30
|
+
cell = row.cell(element)
|
31
|
+
if (cell_attributes != nil)
|
32
|
+
cell_attributes.each do |name, value|
|
33
|
+
cell.attr(name.to_s, value)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
return row
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
class THead < Element
|
43
|
+
def initialize
|
44
|
+
super()
|
45
|
+
self.single_line = true
|
46
|
+
@tag = "thead"
|
47
|
+
end
|
48
|
+
|
49
|
+
def row
|
50
|
+
@row = THeadRow.new
|
51
|
+
self.add(@row)
|
52
|
+
return @row
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|
56
|
+
|
57
|
+
class TBody < Element
|
58
|
+
def initialize
|
59
|
+
super()
|
60
|
+
@tag = "tbody"
|
61
|
+
end
|
62
|
+
|
63
|
+
def row
|
64
|
+
@row = TRow.new
|
65
|
+
self.add(@row)
|
66
|
+
return @row
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
|
71
|
+
|
72
|
+
class TRow < Element
|
73
|
+
def initialize
|
74
|
+
super()
|
75
|
+
@tag = "tr"
|
76
|
+
end
|
77
|
+
|
78
|
+
def cell(content = nil)
|
79
|
+
cell = TCell.new
|
80
|
+
if (content != nil)
|
81
|
+
cell.add content
|
82
|
+
end
|
83
|
+
self.add cell
|
84
|
+
return cell
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
class THeadRow < TRow
|
89
|
+
def initialize
|
90
|
+
super()
|
91
|
+
@tag = "tr"
|
92
|
+
end
|
93
|
+
|
94
|
+
def cell(content = nil)
|
95
|
+
cell = THeadCell.new
|
96
|
+
if (content != nil)
|
97
|
+
cell.add content
|
98
|
+
end
|
99
|
+
self.add cell
|
100
|
+
return cell
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
|
105
|
+
class TCell < Element
|
106
|
+
def initialize
|
107
|
+
super()
|
108
|
+
self.single_line = true
|
109
|
+
@tag = "td"
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
|
114
|
+
class THeadCell < TCell
|
115
|
+
def initialize
|
116
|
+
super()
|
117
|
+
self.single_line = true
|
118
|
+
@tag = "th"
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
end
|
metadata
ADDED
@@ -0,0 +1,63 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: object-view
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.4.0
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Mike Moore
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2014-03-10 00:00:00.000000000 Z
|
13
|
+
dependencies: []
|
14
|
+
description: Object oriented approach to generating HTML content
|
15
|
+
email: m.moore.denver@gmail.com
|
16
|
+
executables: []
|
17
|
+
extensions: []
|
18
|
+
extra_rdoc_files: []
|
19
|
+
files:
|
20
|
+
- lib/object_view/body.rb
|
21
|
+
- lib/object_view/chart_data.rb
|
22
|
+
- lib/object_view/chart_load_javascript.rb
|
23
|
+
- lib/object_view/chart_load_javascript_ajax.rb
|
24
|
+
- lib/object_view/div.rb
|
25
|
+
- lib/object_view/element.rb
|
26
|
+
- lib/object_view/head.rb
|
27
|
+
- lib/object_view/header.rb
|
28
|
+
- lib/object_view/javascript.rb
|
29
|
+
- lib/object_view/javascript_file.rb
|
30
|
+
- lib/object_view/link.rb
|
31
|
+
- lib/object_view/object_view_error.rb
|
32
|
+
- lib/object_view/page.rb
|
33
|
+
- lib/object_view/span.rb
|
34
|
+
- lib/object_view/table.rb
|
35
|
+
- lib/object_view.rb
|
36
|
+
homepage: https://github.com/mikejmoore/object-view
|
37
|
+
licenses:
|
38
|
+
- MIT
|
39
|
+
post_install_message:
|
40
|
+
rdoc_options: []
|
41
|
+
require_paths:
|
42
|
+
- lib
|
43
|
+
- lib/object_view
|
44
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
45
|
+
none: false
|
46
|
+
requirements:
|
47
|
+
- - ! '>='
|
48
|
+
- !ruby/object:Gem::Version
|
49
|
+
version: '0'
|
50
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
51
|
+
none: false
|
52
|
+
requirements:
|
53
|
+
- - ! '>='
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
version: '0'
|
56
|
+
requirements: []
|
57
|
+
rubyforge_project:
|
58
|
+
rubygems_version: 1.8.23
|
59
|
+
signing_key:
|
60
|
+
specification_version: 3
|
61
|
+
summary: Object oriented views
|
62
|
+
test_files: []
|
63
|
+
has_rdoc:
|