rgviz-rails 0.28 → 0.29
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/lib/rgviz_rails/view_helper.rb +145 -60
- data/rails/init.rb +2 -2
- metadata +4 -4
@@ -1,6 +1,25 @@
|
|
1
1
|
module Rgviz
|
2
2
|
module ViewHelper
|
3
3
|
def rgviz(options = {})
|
4
|
+
def opts_to_json(opts, special_keys)
|
5
|
+
@s = '{'
|
6
|
+
i = 0
|
7
|
+
opts.each do |key, value|
|
8
|
+
key = key.to_s.gsub('"', '\"')
|
9
|
+
|
10
|
+
@s << ',' if i > 0
|
11
|
+
@s << "\"#{key}\":"
|
12
|
+
if special_keys.include?(key) || !value.kind_of?(String)
|
13
|
+
@s << value.to_s
|
14
|
+
else
|
15
|
+
value = value.gsub('"', '\"')
|
16
|
+
@s << "\"#{value}\""
|
17
|
+
end
|
18
|
+
i += 1
|
19
|
+
end
|
20
|
+
@s << '}'
|
21
|
+
end
|
22
|
+
|
4
23
|
options = options.with_indifferent_access
|
5
24
|
|
6
25
|
id = options[:id]
|
@@ -23,7 +42,36 @@ module Rgviz
|
|
23
42
|
opts = options[:options] || {}
|
24
43
|
opts[:width] = 640 unless opts[:width]
|
25
44
|
opts[:height] = 480 unless opts[:height]
|
26
|
-
|
45
|
+
|
46
|
+
params = []
|
47
|
+
uses_rgviz_get_value = false
|
48
|
+
uses_rgviz_append = false
|
49
|
+
|
50
|
+
visitor = MagicNamesVisitor.new(html_prefix, js_prefix, param_prefix)
|
51
|
+
|
52
|
+
special_keys = []
|
53
|
+
|
54
|
+
opts.each do |key, value|
|
55
|
+
next unless value.kind_of?(String)
|
56
|
+
|
57
|
+
source = visitor.get_source(value, false)
|
58
|
+
next unless source[:source]
|
59
|
+
|
60
|
+
special_keys << key
|
61
|
+
|
62
|
+
case source[:source]
|
63
|
+
when :html
|
64
|
+
opts[key] = "rgviz_get_value('#{source[:id]}')"
|
65
|
+
uses_rgviz_get_value = true
|
66
|
+
when :js
|
67
|
+
opts[key] = "#{source[:id]}()"
|
68
|
+
when :param
|
69
|
+
opts[key] = "param_#{source[:id]}"
|
70
|
+
params << source[:id].to_i unless params.include?(source[:id])
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
opts = opts_to_json(opts, special_keys)
|
27
75
|
|
28
76
|
raise "Must specify an :id" unless id
|
29
77
|
raise "Must specify a :kind" unless kind
|
@@ -35,11 +83,14 @@ module Rgviz
|
|
35
83
|
query = Parser.new(query).parse
|
36
84
|
|
37
85
|
# And replace the html_ and javascript_ magic names
|
38
|
-
visitor = MagicNamesVisitor.new(html_prefix, js_prefix, param_prefix)
|
39
86
|
query.accept visitor
|
40
87
|
query_builder = visitor.query_builder
|
41
88
|
query_builder_var = visitor.query_builder_var
|
42
|
-
|
89
|
+
|
90
|
+
uses_rgviz_get_value |= visitor.uses_rgviz_get_value?
|
91
|
+
uses_rgviz_append |= visitor.uses_rgviz_append?
|
92
|
+
|
93
|
+
visitor.params.each{|p| params << p unless params.include?(p)}
|
43
94
|
params = params.sort!.map{|i| "param_#{i}"}
|
44
95
|
|
45
96
|
out = ''
|
@@ -49,11 +100,49 @@ module Rgviz
|
|
49
100
|
if @first_time == 1
|
50
101
|
out << "<script type=\"text/javascript\" src=\"http://www.google.com/jsapi\"></script>\n"
|
51
102
|
end
|
52
|
-
@first_time = 0
|
53
|
-
|
54
103
|
# Now the real script
|
55
104
|
out << "<script type=\"text/javascript\">\n"
|
56
105
|
|
106
|
+
# Define a function to get the value of an html element
|
107
|
+
if uses_rgviz_get_value && !@defined_rgviz_get_value
|
108
|
+
out << "function rgviz_get_value(id) {\n"
|
109
|
+
out << "var e = document.getElementById(id);\n"
|
110
|
+
out << "var n = e.tagName.toLowerCase();\n"
|
111
|
+
out << "var s = null;\n"
|
112
|
+
out << "if (n == 'select' && e.multiple) {\n"
|
113
|
+
out << "var s = [];\n"
|
114
|
+
out << "var o = e.options;\n"
|
115
|
+
out << "for(var i = 0; i < o.length; i++)\n"
|
116
|
+
out << "if (o[i].selected) s.push(o[i].value);\n"
|
117
|
+
out << "} else if (n == 'input' && e.type.toLowerCase() == 'checkbox') {\n"
|
118
|
+
out << "s = [e.checked];\n"
|
119
|
+
out << "} else {\n"
|
120
|
+
out << "s = [e.value];\n"
|
121
|
+
out << "}\n"
|
122
|
+
out << "return s;\n"
|
123
|
+
out << "}\n"
|
124
|
+
@defined_rgviz_get_value = true
|
125
|
+
end
|
126
|
+
|
127
|
+
# Define a function to append the value of a magic something
|
128
|
+
if uses_rgviz_append && !@defined_rgviz_append
|
129
|
+
out << "function rgviz_append(s, b, a) {\n"
|
130
|
+
out << "var q = '';\n"
|
131
|
+
out << "if (s.length == 0) {\n"
|
132
|
+
out << "q += '1 = 2';\n";
|
133
|
+
out << "} else {\n"
|
134
|
+
out << "if (s.length > 1) q += '(';\n"
|
135
|
+
out << "for(var i = 0; i < s.length; i++) {\n";
|
136
|
+
out << "if (i > 0) q += ' or ';\n"
|
137
|
+
out << "q += b + s[i] + a;\n"
|
138
|
+
out << "}";
|
139
|
+
out << "if (s.length > 1) q += ')';\n"
|
140
|
+
out << "}\n"
|
141
|
+
out << "return q;\n"
|
142
|
+
out << "}\n"
|
143
|
+
@defined_rgviz_append = true
|
144
|
+
end
|
145
|
+
|
57
146
|
# Load visualizations and the package, if not already loaded
|
58
147
|
pack = kind.downcase
|
59
148
|
@packages ||= []
|
@@ -99,6 +188,8 @@ module Rgviz
|
|
99
188
|
end
|
100
189
|
out << "></div>\n"
|
101
190
|
|
191
|
+
@first_time = 0
|
192
|
+
|
102
193
|
out
|
103
194
|
end
|
104
195
|
|
@@ -126,8 +217,15 @@ module Rgviz
|
|
126
217
|
@params
|
127
218
|
end
|
128
219
|
|
220
|
+
def uses_rgviz_get_value?
|
221
|
+
@uses_rgviz_get_value
|
222
|
+
end
|
223
|
+
|
224
|
+
def uses_rgviz_append?
|
225
|
+
@uses_rgviz_append
|
226
|
+
end
|
227
|
+
|
129
228
|
def visit_query(node)
|
130
|
-
@s << "var e = null;\n"
|
131
229
|
@s << "var q = '"
|
132
230
|
node.select.accept self if node.select
|
133
231
|
node.where.accept self if node.where
|
@@ -229,24 +327,10 @@ module Rgviz
|
|
229
327
|
@s << "';\n"
|
230
328
|
case source[:source]
|
231
329
|
when :html
|
232
|
-
@s << "
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
@s << "for(var i = 0; i < o.length; i++) {\n"
|
237
|
-
@s << "if (o[i].selected)\n";
|
238
|
-
@s << "s.push(o[i].value);\n"
|
239
|
-
@s << "}\n"
|
240
|
-
append_selections node, source
|
241
|
-
@s << "} else {\n"
|
242
|
-
@s << "q += '"
|
243
|
-
node.left.accept self
|
244
|
-
@s << " #{node.operator} "
|
245
|
-
@s << "';\n"
|
246
|
-
append_before_source_type source[:type]
|
247
|
-
@s << "e.value"
|
248
|
-
append_after_source_type source[:type]
|
249
|
-
@s << "}\n";
|
330
|
+
@s << "var s = rgviz_get_value('#{source[:id]}');\n"
|
331
|
+
append_selections node, source
|
332
|
+
|
333
|
+
@uses_rgviz_get_value = true
|
250
334
|
when :js
|
251
335
|
@s << "var s = #{source[:id]}();\n"
|
252
336
|
@s << "if (typeof(s) != 'object') s = [s];\n"
|
@@ -284,23 +368,19 @@ module Rgviz
|
|
284
368
|
when nil
|
285
369
|
@s << "`#{node.name}`"
|
286
370
|
when :html
|
287
|
-
@s << "';\n"
|
288
371
|
append_before_source_type source[:type]
|
289
|
-
@s << "
|
372
|
+
@s << " + rgviz_get_value('#{source[:id]}') + "
|
290
373
|
append_after_source_type source[:type]
|
291
|
-
|
374
|
+
|
375
|
+
@uses_rgviz_get_value = true
|
292
376
|
when :js
|
293
|
-
@s << "';\n"
|
294
377
|
append_before_source_type source[:type]
|
295
|
-
@s << "#{source[:id]}()"
|
378
|
+
@s << " + #{source[:id]}() + "
|
296
379
|
append_after_source_type source[:type]
|
297
|
-
@s << "q += '"
|
298
380
|
when :param
|
299
|
-
@s << "';\n"
|
300
381
|
append_before_source_type source[:type]
|
301
|
-
@s << "param_#{source[:id]}"
|
382
|
+
@s << " + param_#{source[:id]} + "
|
302
383
|
append_after_source_type source[:type]
|
303
|
-
@s << "q += '"
|
304
384
|
@params << source[:id].to_i unless @params.include?(source[:id])
|
305
385
|
end
|
306
386
|
end
|
@@ -310,7 +390,8 @@ module Rgviz
|
|
310
390
|
end
|
311
391
|
|
312
392
|
def visit_string_column(node)
|
313
|
-
|
393
|
+
value = node.value.gsub('"', '\"')
|
394
|
+
@s << "\"#{value}\""
|
314
395
|
end
|
315
396
|
|
316
397
|
def visit_boolean_column(node)
|
@@ -361,13 +442,25 @@ module Rgviz
|
|
361
442
|
end
|
362
443
|
end
|
363
444
|
|
364
|
-
def get_source(name)
|
445
|
+
def get_source(name, include_type = true)
|
365
446
|
if name.start_with?(@html_prefix)
|
366
|
-
|
447
|
+
if include_type
|
448
|
+
get_source_type :html, name[@html_prefix.length .. -1]
|
449
|
+
else
|
450
|
+
{:source => :html, :id => name[@html_prefix.length .. -1]}
|
451
|
+
end
|
367
452
|
elsif name.start_with?(@js_prefix)
|
368
|
-
|
453
|
+
if include_type
|
454
|
+
get_source_type :js, name[@js_prefix.length .. -1]
|
455
|
+
else
|
456
|
+
{:source => :js, :id => name[@js_prefix.length .. -1]}
|
457
|
+
end
|
369
458
|
elsif name.start_with?(@param_prefix)
|
370
|
-
|
459
|
+
if include_type
|
460
|
+
get_source_type :param, name[@param_prefix.length .. -1]
|
461
|
+
else
|
462
|
+
{:source => :param, :id => name[@param_prefix.length .. -1]}
|
463
|
+
end
|
371
464
|
else
|
372
465
|
{}
|
373
466
|
end
|
@@ -392,15 +485,15 @@ module Rgviz
|
|
392
485
|
def append_before_source_type(type)
|
393
486
|
case type
|
394
487
|
when :number
|
395
|
-
|
488
|
+
return
|
396
489
|
when :string
|
397
|
-
@s << "
|
490
|
+
@s << "\"'"
|
398
491
|
when :date
|
399
|
-
@s << "
|
492
|
+
@s << "date \"'"
|
400
493
|
when :datetime
|
401
|
-
@s << "
|
494
|
+
@s << "datetime \"'"
|
402
495
|
when :timeofday
|
403
|
-
@s << "
|
496
|
+
@s << "timeofday \"'"
|
404
497
|
end
|
405
498
|
end
|
406
499
|
|
@@ -409,27 +502,19 @@ module Rgviz
|
|
409
502
|
when :number
|
410
503
|
return
|
411
504
|
else
|
412
|
-
@s << "
|
505
|
+
@s << "'\""
|
413
506
|
end
|
414
507
|
end
|
415
508
|
|
416
509
|
def append_selections(node, source)
|
417
|
-
@s << "
|
418
|
-
|
419
|
-
@s << "}
|
420
|
-
|
421
|
-
|
422
|
-
|
423
|
-
|
424
|
-
|
425
|
-
@s << " #{node.operator} "
|
426
|
-
@s << "';\n"
|
427
|
-
append_before_source_type source[:type]
|
428
|
-
@s << "s[i]"
|
429
|
-
append_after_source_type source[:type]
|
430
|
-
@s << "}";
|
431
|
-
@s << "q += ')';\n"
|
432
|
-
@s << "}\n"
|
510
|
+
@s << "q += rgviz_append(s, '";
|
511
|
+
node.left.accept self
|
512
|
+
@s << " #{node.operator} "
|
513
|
+
append_before_source_type source[:type]
|
514
|
+
@s << ", "
|
515
|
+
append_after_source_type source[:type]
|
516
|
+
@s << "');\n"
|
517
|
+
@uses_rgviz_append = true
|
433
518
|
end
|
434
519
|
|
435
520
|
def has_magic_name?(node)
|
data/rails/init.rb
CHANGED
@@ -42,9 +42,9 @@ config.after_initialize do
|
|
42
42
|
original_render :text => Rgviz::JsRenderer.render_error('not_supported', "Unsupported output type: #{out}", tqx)
|
43
43
|
end
|
44
44
|
rescue ParseException => e
|
45
|
-
case out
|
45
|
+
case tqx['out']
|
46
46
|
when 'json'
|
47
|
-
original_render :text => Rgviz::JsRenderer.render_error('invalid_query', e.message)
|
47
|
+
original_render :text => Rgviz::JsRenderer.render_error('invalid_query', e.message, tqx)
|
48
48
|
when 'html'
|
49
49
|
original_render :text => "<b>Error:</b> #{e.message}"
|
50
50
|
when 'csv'
|
metadata
CHANGED
@@ -1,12 +1,12 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rgviz-rails
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 49
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
version: "0.
|
8
|
+
- 29
|
9
|
+
version: "0.29"
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Ary Borenszweig
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2010-08-
|
17
|
+
date: 2010-08-20 00:00:00 +07:00
|
18
18
|
default_executable:
|
19
19
|
dependencies: []
|
20
20
|
|