query_report 0.1.2 → 1.0.0
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/{LICENSE.txt → MIT-LICENSE} +2 -4
- data/README.md +32 -53
- data/Rakefile +50 -0
- data/app/helpers/query_report_filter_helper.rb +22 -0
- data/app/helpers/query_report_helper.rb +31 -0
- data/app/views/query_report/_charts.html.erb +10 -0
- data/app/views/query_report/_search.html.erb +8 -0
- data/app/views/query_report/list.html.erb +19 -38
- data/config/locales/query_report.yml +7 -0
- data/config/routes.rb +2 -0
- data/db/schema.rb +34 -0
- data/lib/query_report.rb +22 -15
- data/lib/query_report/chart/chart_base.rb +60 -0
- data/lib/query_report/chart/chart_column.rb +12 -0
- data/lib/query_report/chart/column_chart.rb +40 -0
- data/lib/query_report/chart/pie_chart.rb +22 -25
- data/lib/query_report/chart/themes.rb +18 -114
- data/lib/query_report/column.rb +29 -18
- data/lib/query_report/config.rb +6 -0
- data/lib/query_report/engine.rb +4 -0
- data/lib/query_report/errors.rb +4 -0
- data/lib/query_report/filter.rb +110 -31
- data/lib/query_report/helper.rb +19 -3
- data/lib/query_report/paginate.rb +13 -0
- data/lib/query_report/record.rb +46 -0
- data/lib/query_report/report.rb +19 -102
- data/lib/query_report/report_pdf.rb +68 -84
- data/lib/query_report/version.rb +1 -1
- data/lib/tasks/query_report_tasks.rake +4 -0
- data/test/dummy/README.rdoc +261 -0
- data/test/dummy/Rakefile +7 -0
- data/test/dummy/app/assets/javascripts/application.js +15 -0
- data/test/dummy/app/assets/javascripts/invoices.js +2 -0
- data/test/dummy/app/assets/javascripts/users.js +2 -0
- data/test/dummy/app/assets/stylesheets/application.css +13 -0
- data/test/dummy/app/assets/stylesheets/invoices.css +4 -0
- data/test/dummy/app/assets/stylesheets/scaffold.css +56 -0
- data/test/dummy/app/assets/stylesheets/users.css +4 -0
- data/test/dummy/app/controllers/application_controller.rb +3 -0
- data/test/dummy/app/controllers/invoices_controller.rb +114 -0
- data/test/dummy/app/controllers/users_controller.rb +91 -0
- data/test/dummy/app/helpers/application_helper.rb +2 -0
- data/test/dummy/app/helpers/invoices_helper.rb +2 -0
- data/test/dummy/app/helpers/users_helper.rb +2 -0
- data/test/dummy/app/models/invoice.rb +3 -0
- data/test/dummy/app/models/pdf_report_template.rb +24 -0
- data/test/dummy/app/models/user.rb +3 -0
- data/test/dummy/app/views/invoices/_form.html.erb +33 -0
- data/test/dummy/app/views/invoices/edit.html.erb +6 -0
- data/test/dummy/app/views/invoices/index.html.erb +29 -0
- data/test/dummy/app/views/invoices/new.html.erb +5 -0
- data/test/dummy/app/views/invoices/show.html.erb +25 -0
- data/test/dummy/app/views/layouts/application.html.erb +14 -0
- data/test/dummy/app/views/users/_form.html.erb +33 -0
- data/test/dummy/app/views/users/edit.html.erb +6 -0
- data/test/dummy/app/views/users/index.html.erb +29 -0
- data/test/dummy/app/views/users/new.html.erb +5 -0
- data/test/dummy/app/views/users/show.html.erb +25 -0
- data/test/dummy/config.ru +4 -0
- data/test/dummy/config/application.rb +60 -0
- data/test/dummy/config/boot.rb +10 -0
- data/test/dummy/config/database.yml +25 -0
- data/test/dummy/config/environment.rb +5 -0
- data/test/dummy/config/environments/development.rb +37 -0
- data/test/dummy/config/environments/production.rb +67 -0
- data/test/dummy/config/environments/test.rb +37 -0
- data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/test/dummy/config/initializers/inflections.rb +15 -0
- data/test/dummy/config/initializers/mime_types.rb +5 -0
- data/test/dummy/config/initializers/query_report.rb +3 -0
- data/test/dummy/config/initializers/secret_token.rb +7 -0
- data/test/dummy/config/initializers/session_store.rb +8 -0
- data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/test/dummy/config/locales/en.yml +10 -0
- data/test/dummy/config/routes.rb +64 -0
- data/test/dummy/db/development.sqlite3 +0 -0
- data/test/dummy/db/migrate/20130622120853_create_users.rb +12 -0
- data/test/dummy/db/migrate/20130630132513_create_invoices.rb +12 -0
- data/test/dummy/db/schema.rb +34 -0
- data/test/dummy/db/seed.rb +4 -0
- data/test/dummy/db/test.sqlite3 +0 -0
- data/test/dummy/log/development.log +30613 -0
- data/test/dummy/log/test.log +28 -0
- data/test/dummy/public/404.html +26 -0
- data/test/dummy/public/422.html +26 -0
- data/test/dummy/public/500.html +25 -0
- data/test/dummy/public/favicon.ico +0 -0
- data/test/dummy/script/rails +6 -0
- data/test/dummy/test/fixtures/invoices.yml +13 -0
- data/test/dummy/test/functional/invoices_controller_test.rb +49 -0
- data/test/dummy/test/unit/helpers/invoices_helper_test.rb +4 -0
- data/test/dummy/test/unit/invoice_test.rb +7 -0
- data/test/dummy/tmp/cache/assets/C8C/B80/sprockets%2F371bf96e99717688ed7313a0c53f4212 +0 -0
- data/test/dummy/tmp/cache/assets/CA9/F20/sprockets%2F00ff4f84806dd8834ab35f800a082640 +0 -0
- data/test/dummy/tmp/cache/assets/CAA/620/sprockets%2F87b209c0c9da28094a8d5581a21262c6 +0 -0
- data/test/dummy/tmp/cache/assets/CB5/B70/sprockets%2Fa769d915e72b1c8c0614793b54d02c86 +0 -0
- data/test/dummy/tmp/cache/assets/CD8/370/sprockets%2F357970feca3ac29060c1e3861e2c0953 +0 -0
- data/test/dummy/tmp/cache/assets/CD8/B70/sprockets%2F4050a4e5062ab95c9f32e9b6940821ea +0 -0
- data/test/dummy/tmp/cache/assets/CF0/1D0/sprockets%2F6fc757c2c8329244ca95d6909865bbc2 +0 -0
- data/test/dummy/tmp/cache/assets/D32/A10/sprockets%2F13fe41fee1fe35b49d145bcc06610705 +0 -0
- data/test/dummy/tmp/cache/assets/D46/650/sprockets%2Ff56253b5f374fff1a33fbbc9881c9124 +0 -0
- data/test/dummy/tmp/cache/assets/D4E/1B0/sprockets%2Ff7cbd26ba1d28d48de824f0e94586655 +0 -0
- data/test/dummy/tmp/cache/assets/D54/B90/sprockets%2F90719d7bdca76469cd487928f710decb +0 -0
- data/test/dummy/tmp/cache/assets/D5A/EA0/sprockets%2Fd771ace226fc8215a3572e0aa35bb0d6 +0 -0
- data/test/dummy/tmp/cache/assets/D67/B60/sprockets%2F5f1a0d05e77ca8b9a1fc2a47e17a8174 +0 -0
- data/test/dummy/tmp/cache/assets/D7C/990/sprockets%2F302f7d851fcdb17936f8096bfb967cab +0 -0
- data/test/dummy/tmp/cache/assets/D7F/AF0/sprockets%2Fa7deca9af827ab462635389b96c7da39 +0 -0
- data/test/dummy/tmp/cache/assets/DA3/AC0/sprockets%2F797d3e5f21daaf5c046cc6ec4830e95b +0 -0
- data/test/dummy/tmp/cache/assets/DDC/400/sprockets%2Fcffd775d018f68ce5dba1ee0d951a994 +0 -0
- data/test/dummy/tmp/cache/assets/DFC/6F0/sprockets%2F2c45c36e4d7c7bfaeb826eeba29a09d2 +0 -0
- data/test/dummy/tmp/cache/assets/E04/890/sprockets%2F2f5173deea6c795b8fdde723bb4b63af +0 -0
- data/test/dummy/tmp/cache/assets/E0E/8A0/sprockets%2Fbecd48a9cf2ece858e433d7dcf0554f6 +0 -0
- data/test/dummy/tmp/miniprofiler/mp_timers_5awpjfhldzcfjkeiia3p +0 -0
- data/test/dummy/tmp/miniprofiler/mp_timers_a7ev5lal7xp2xzjj2n9p +0 -0
- data/test/dummy/tmp/miniprofiler/mp_timers_c5lzifpf785aic4t3cm8 +0 -0
- data/test/dummy/tmp/miniprofiler/mp_timers_etmdhvrbbmdadc7oyw8q +0 -0
- data/test/dummy/tmp/miniprofiler/mp_timers_m0kxxiow6jlfcjulu02t +0 -0
- data/test/dummy/tmp/miniprofiler/mp_timers_m2ow1xy7c6tw0f4fj2co +0 -0
- data/test/dummy/tmp/miniprofiler/mp_timers_mitzsa7y0lvka04il6an +0 -0
- data/test/dummy/tmp/miniprofiler/mp_timers_ujpdek4jfp8flbqp7fi3 +0 -0
- data/test/dummy/tmp/miniprofiler/mp_timers_wbiyljqrnox89js4m0at +0 -0
- data/test/dummy/tmp/miniprofiler/mp_views_127.0.0.1 +1 -0
- data/test/test_helper.rb +15 -0
- metadata +380 -24
- data/.gitignore +0 -18
- data/Gemfile +0 -10
- data/README.rdoc +0 -3
- data/app/views/query_report/_custom_filters.html.erb +0 -7
- data/lib/query_report/chart/basic_chart.rb +0 -41
- data/lib/query_report/chart/custom_chart.rb +0 -55
- data/lib/query_report/row.rb +0 -11
- data/query_report.gemspec +0 -31
data/lib/query_report/helper.rb
CHANGED
|
@@ -1,4 +1,11 @@
|
|
|
1
|
+
# Author:: A.K.M. Ashrafuzzaman (mailto:ashrafuzzaman.g2@gmail.com)
|
|
2
|
+
# License:: MIT-LICENSE
|
|
3
|
+
|
|
4
|
+
# The purpose of the helper module is to help controllers with the responders
|
|
5
|
+
|
|
6
|
+
require 'csv'
|
|
1
7
|
require 'query_report/report'
|
|
8
|
+
require 'query_report/report_pdf'
|
|
2
9
|
|
|
3
10
|
module QueryReport
|
|
4
11
|
module Helper
|
|
@@ -13,10 +20,19 @@ module QueryReport
|
|
|
13
20
|
respond_to do |format|
|
|
14
21
|
format.js { render 'query_report/list' }
|
|
15
22
|
format.html { render 'query_report/list' }
|
|
16
|
-
format.json { render json: @report.
|
|
23
|
+
format.json { render json: @report.all_records }
|
|
17
24
|
format.csv { send_data generate_csv_for_report(@report.all_records), :disposition => "attachment;" }
|
|
18
|
-
format.pdf {
|
|
25
|
+
format.pdf { send_data query_report_pdf_template_class.new(@report).to_pdf.render }
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def query_report_pdf_template_class
|
|
30
|
+
options = QueryReport.config.pdf_options
|
|
31
|
+
if options[:template_class]
|
|
32
|
+
@template_class ||= options[:template_class].to_s.constantize
|
|
33
|
+
return @template_class
|
|
19
34
|
end
|
|
35
|
+
reurn QueryReport::ReportPdf
|
|
20
36
|
end
|
|
21
37
|
|
|
22
38
|
def generate_csv_for_report(records)
|
|
@@ -25,7 +41,7 @@ module QueryReport
|
|
|
25
41
|
CSV.generate do |csv|
|
|
26
42
|
csv << columns
|
|
27
43
|
records.each do |record|
|
|
28
|
-
csv << record.values
|
|
44
|
+
csv << record.values.collect { |val| val.kind_of?(String) ? view_context.strip_links(val) : val }
|
|
29
45
|
end
|
|
30
46
|
end
|
|
31
47
|
else
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# Author:: A.K.M. Ashrafuzzaman (mailto:ashrafuzzaman.g2@gmail.com)
|
|
2
|
+
# License:: MIT-LICENSE
|
|
3
|
+
|
|
4
|
+
# The purpose of the paginate module is to offer support for pagination
|
|
5
|
+
|
|
6
|
+
module QueryReport
|
|
7
|
+
module PaginateModule
|
|
8
|
+
def apply_pagination(query, params)
|
|
9
|
+
page_method_name = Kaminari.config.page_method_name
|
|
10
|
+
query.send(page_method_name, params[:page])
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
end
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
module QueryReport
|
|
2
|
+
module Record
|
|
3
|
+
attr_accessor :query
|
|
4
|
+
|
|
5
|
+
def model_class
|
|
6
|
+
query.klass
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def filtered_query
|
|
10
|
+
apply
|
|
11
|
+
@filtered_query
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def paginated_query
|
|
15
|
+
apply
|
|
16
|
+
@paginated_query
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def search
|
|
20
|
+
apply
|
|
21
|
+
@search
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def apply
|
|
25
|
+
@filtered_query ||= apply_filters(query.clone, @params)
|
|
26
|
+
@paginated_query ||= apply_pagination(@filtered_query, @params)
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def records
|
|
30
|
+
@records ||= map_record(paginated_query, true)
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def all_records
|
|
34
|
+
@all_records ||= map_record(filtered_query, false)
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def map_record(query, render_from_view)
|
|
38
|
+
@columns = @columns.delete_if { |col| col.only_on_web? } unless render_from_view
|
|
39
|
+
|
|
40
|
+
query.map do |record|
|
|
41
|
+
array = @columns.collect { |column| [column.humanize, column.value(record)] }
|
|
42
|
+
Hash[*array.flatten]
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
data/lib/query_report/report.rb
CHANGED
|
@@ -1,25 +1,31 @@
|
|
|
1
|
-
require 'query_report/filter'
|
|
2
|
-
require 'query_report/column'
|
|
3
|
-
|
|
4
1
|
module QueryReport
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
2
|
+
autoload :ColumnModule, 'query_report/column'
|
|
3
|
+
autoload :FilterModule, 'query_report/filter'
|
|
4
|
+
autoload :PaginateModule, 'query_report/paginate'
|
|
5
|
+
autoload :Record, 'query_report/record'
|
|
6
|
+
autoload :ColumnChartModule, 'query_report/chart/column_chart'
|
|
7
|
+
autoload :PieChartModule, 'query_report/chart/pie_chart'
|
|
8
|
+
|
|
9
|
+
DEFAULT_OPTIONS = {enable_chart: true, chart_on_web: true, chart_on_pdf: true, paginate: true}
|
|
8
10
|
|
|
9
11
|
class Report
|
|
10
12
|
include QueryReport::ColumnModule
|
|
11
13
|
include QueryReport::FilterModule
|
|
14
|
+
include QueryReport::PaginateModule
|
|
15
|
+
include QueryReport::Record
|
|
16
|
+
include QueryReport::ColumnChartModule
|
|
17
|
+
include QueryReport::PieChartModule
|
|
12
18
|
|
|
13
|
-
|
|
19
|
+
attr_reader :params, :template, :options, :charts
|
|
14
20
|
|
|
15
21
|
def initialize(params, template, options={}, &block)
|
|
16
22
|
@params, @template = params, template
|
|
17
|
-
@columns, @filters, @
|
|
18
|
-
@current_scope = @params[:scope] || 'all'
|
|
23
|
+
@columns, @filters, @charts = [], [], []
|
|
19
24
|
@options = QueryReport::DEFAULT_OPTIONS.merge options
|
|
20
25
|
instance_eval &block if block_given?
|
|
21
26
|
end
|
|
22
27
|
|
|
28
|
+
# define options methods
|
|
23
29
|
QueryReport::DEFAULT_OPTIONS.each do |option_name, value|
|
|
24
30
|
if value.class == TrueClass or value.class == FalseClass
|
|
25
31
|
define_method "#{option_name.to_s}?" do
|
|
@@ -28,6 +34,10 @@ module QueryReport
|
|
|
28
34
|
end
|
|
29
35
|
end
|
|
30
36
|
|
|
37
|
+
def has_chart?
|
|
38
|
+
!@charts.empty?
|
|
39
|
+
end
|
|
40
|
+
|
|
31
41
|
# to support the helper methods
|
|
32
42
|
def method_missing(meth, *args, &block)
|
|
33
43
|
if @template.respond_to?(meth)
|
|
@@ -36,98 +46,5 @@ module QueryReport
|
|
|
36
46
|
super
|
|
37
47
|
end
|
|
38
48
|
end
|
|
39
|
-
|
|
40
|
-
def model_name
|
|
41
|
-
query.table.name.singularize
|
|
42
|
-
end
|
|
43
|
-
|
|
44
|
-
def query=(query)
|
|
45
|
-
@query_cache = query
|
|
46
|
-
end
|
|
47
|
-
|
|
48
|
-
def query
|
|
49
|
-
apply_filters_and_pagination
|
|
50
|
-
@query_cache
|
|
51
|
-
end
|
|
52
|
-
|
|
53
|
-
def query_without_pagination
|
|
54
|
-
apply_filters_and_pagination
|
|
55
|
-
@query_without_pagination_cache
|
|
56
|
-
end
|
|
57
|
-
|
|
58
|
-
def records
|
|
59
|
-
@cached_records ||= map_record(query)
|
|
60
|
-
end
|
|
61
|
-
|
|
62
|
-
def all_records
|
|
63
|
-
@cached_all_records ||= map_record(query_without_pagination)
|
|
64
|
-
end
|
|
65
|
-
|
|
66
|
-
def map_record(query)
|
|
67
|
-
query.clone.map do |record|
|
|
68
|
-
array = @columns.collect { |column| [column.humanize,
|
|
69
|
-
(column.data.kind_of?(Symbol) ? record.send(column.name) : column.data.call(record))] }
|
|
70
|
-
Hash[*array.flatten]
|
|
71
|
-
end
|
|
72
|
-
end
|
|
73
|
-
|
|
74
|
-
def scope(scope)
|
|
75
|
-
@scopes << scope
|
|
76
|
-
@scopes = @scopes.uniq
|
|
77
|
-
end
|
|
78
|
-
|
|
79
|
-
def search
|
|
80
|
-
apply_filters_and_pagination
|
|
81
|
-
@search
|
|
82
|
-
end
|
|
83
|
-
|
|
84
|
-
def compare_with_column_chart(title, x_axis='', &block)
|
|
85
|
-
@chart = QueryReport::Chart::CustomChart.new(:column, title, query_without_pagination)
|
|
86
|
-
@chart.add_column x_axis
|
|
87
|
-
@chart.instance_eval &block if block_given?
|
|
88
|
-
@charts << @chart
|
|
89
|
-
end
|
|
90
|
-
|
|
91
|
-
def pie_chart(title, &block)
|
|
92
|
-
@chart = QueryReport::Chart::PieChart.new(title, query_without_pagination)
|
|
93
|
-
@chart.instance_eval &block if block_given?
|
|
94
|
-
@charts << @chart
|
|
95
|
-
end
|
|
96
|
-
|
|
97
|
-
private
|
|
98
|
-
def apply_filters_and_pagination
|
|
99
|
-
return if @applied_filters_and_pagination
|
|
100
|
-
#apply ransack
|
|
101
|
-
@search = @query_cache.search(@params[:q])
|
|
102
|
-
@query_cache = @search.result
|
|
103
|
-
|
|
104
|
-
#apply scope
|
|
105
|
-
if @current_scope and !['all', 'delete_all', 'destroy_all'].include?(@current_scope)
|
|
106
|
-
@query_cache = @query_cache.send(@current_scope)
|
|
107
|
-
end
|
|
108
|
-
|
|
109
|
-
#apply filters
|
|
110
|
-
@filters.each do |filter|
|
|
111
|
-
if filter.custom
|
|
112
|
-
param = @params[:custom_search]
|
|
113
|
-
first_val = param[filter.keys.first] rescue nil
|
|
114
|
-
last_val = param[filter.keys.last] rescue nil
|
|
115
|
-
case filter.keys.size
|
|
116
|
-
when 1
|
|
117
|
-
@query_cache = filter.block.call(@query_cache, first_val) if first_val.present?
|
|
118
|
-
break
|
|
119
|
-
when 2
|
|
120
|
-
@query_cache = filter.block.call(@query_cache, first_val, last_val) if first_val.present? and last_val.present?
|
|
121
|
-
break
|
|
122
|
-
end
|
|
123
|
-
end
|
|
124
|
-
end
|
|
125
|
-
|
|
126
|
-
#apply pagination
|
|
127
|
-
@query_without_pagination_cache = @query_cache
|
|
128
|
-
page_method_name = Kaminari.config.page_method_name
|
|
129
|
-
@query_cache = @query_without_pagination_cache.send(page_method_name, @params[:page])
|
|
130
|
-
@applied_filters_and_pagination = true
|
|
131
|
-
end
|
|
132
49
|
end
|
|
133
50
|
end
|
|
@@ -1,113 +1,97 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
module QueryReport
|
|
2
|
+
class ReportPdf
|
|
3
|
+
attr_reader :pdf, :options, :report
|
|
4
|
+
|
|
5
|
+
def initialize(report)
|
|
6
|
+
@report = report
|
|
7
|
+
@options = QueryReport.config.pdf_options
|
|
8
|
+
@pdf = Prawn::Document.new
|
|
9
|
+
end
|
|
6
10
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
color: '000000',
|
|
12
|
-
light_color: '555555'}
|
|
13
|
-
self.pdf = Prawn::Document.new
|
|
14
|
-
end
|
|
11
|
+
#render the header from the template class
|
|
12
|
+
def render_header
|
|
13
|
+
template.try(:render_header)
|
|
14
|
+
end
|
|
15
15
|
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
# :at => [400, pdf.cursor+20],
|
|
20
|
-
# :inline_format => true,
|
|
21
|
-
# :height => 100,
|
|
22
|
-
# :width => 100
|
|
23
|
-
#end
|
|
24
|
-
end
|
|
16
|
+
def render_footer
|
|
17
|
+
template.try(:render_footer)
|
|
18
|
+
end
|
|
25
19
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
20
|
+
def to_pdf
|
|
21
|
+
render_charts_with report
|
|
22
|
+
render_table_with report
|
|
23
|
+
pdf
|
|
24
|
+
end
|
|
31
25
|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
26
|
+
private
|
|
27
|
+
def render_charts_with(report)
|
|
28
|
+
return if report.charts.empty? #or !report.chart_on_pdf?
|
|
29
|
+
height = options[:chart][:height] * (report.charts.size.to_f/2).ceil
|
|
30
|
+
pdf.column_box([0, pdf.cursor], :columns => 2, :width => pdf.bounds.width, :height => height) do
|
|
31
|
+
report.charts.each do |chart|
|
|
32
|
+
render_chart(chart)
|
|
33
|
+
end
|
|
34
|
+
end
|
|
36
35
|
end
|
|
37
|
-
end
|
|
38
36
|
|
|
39
|
-
|
|
40
|
-
def render_charts_with(report)
|
|
41
|
-
return if report.charts.nil? or !report.chart_on_pdf?
|
|
42
|
-
report.charts.each do |chart|
|
|
37
|
+
def render_chart(chart)
|
|
43
38
|
if chart.respond_to?(:to_blob)
|
|
44
39
|
blob = chart.to_blob
|
|
45
40
|
data = StringIO.new(blob)
|
|
46
41
|
pdf.pad_top(10) do
|
|
47
|
-
pdf.image(data, :width =>
|
|
42
|
+
pdf.image(data, :width => options[:chart][:width])
|
|
48
43
|
end
|
|
49
44
|
end
|
|
50
45
|
end
|
|
51
|
-
end
|
|
52
46
|
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
47
|
+
def table_header_for(table_items)
|
|
48
|
+
table_items.first.keys
|
|
49
|
+
end
|
|
56
50
|
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
51
|
+
def humanized_table_header
|
|
52
|
+
report_columns.collect(&:humanize)
|
|
53
|
+
end
|
|
60
54
|
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
55
|
+
def table_content_for(report)
|
|
56
|
+
table_items = report.all_records
|
|
57
|
+
table_items.map do |item|
|
|
58
|
+
item_values = []
|
|
64
59
|
|
|
65
|
-
|
|
66
|
-
|
|
60
|
+
report_columns.collect(&:humanize).each do |column|
|
|
61
|
+
item_values << item[column].to_s
|
|
62
|
+
end
|
|
63
|
+
item_values
|
|
67
64
|
end
|
|
68
|
-
item_values
|
|
69
65
|
end
|
|
70
|
-
end
|
|
71
66
|
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
return pdf.make_table(val)
|
|
67
|
+
def render_table_with(report)
|
|
68
|
+
items = [humanized_table_header]
|
|
69
|
+
items += table_content_for(report)
|
|
70
|
+
render_table(items)
|
|
77
71
|
end
|
|
78
|
-
val
|
|
79
|
-
end
|
|
80
72
|
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
options[:
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
73
|
+
def render_table(items)
|
|
74
|
+
header_bg_color = options[:table][:header][:bg_color]
|
|
75
|
+
alternate_row_bg_color = [options[:table][:row][:odd_bg_color], options[:table][:row][:even_bg_color]]
|
|
76
|
+
font_size = options[:font_size]
|
|
77
|
+
header_font_size = options[:table][:header][:font_size]
|
|
78
|
+
pdf.move_down 10
|
|
79
|
+
pdf.table(items, :row_colors => alternate_row_bg_color, :header => true, :cell_style => {:inline_format => true, :size => font_size}) do
|
|
80
|
+
row(0).style(:font_style => :bold, :background_color => header_bg_color, :size => header_font_size)
|
|
81
|
+
end
|
|
89
82
|
end
|
|
90
|
-
pdf
|
|
91
|
-
end
|
|
92
83
|
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
pdf.move_down 10
|
|
97
|
-
pdf.table(items, :row_colors => options[:alternate_row_bg_color], :header => true, :cell_style => {:inline_format => true, :size => options[:font_size] || 10}) do
|
|
98
|
-
row(0).style(:font_style => :bold, :background_color => header_bg_color, :size => options[:header_font_size] || 14)
|
|
99
|
-
row(items.size-1).style(:font_style => :bold) if options[:bold_footer]
|
|
84
|
+
private
|
|
85
|
+
def report_columns
|
|
86
|
+
report.columns.select { |c| !c.only_on_web? }
|
|
100
87
|
end
|
|
101
|
-
end
|
|
102
88
|
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
89
|
+
def template
|
|
90
|
+
if options[:template_class]
|
|
91
|
+
@template ||= options[:template_class].to_s.constantize.new(report, pdf)
|
|
92
|
+
return @template
|
|
93
|
+
end
|
|
94
|
+
nil
|
|
108
95
|
end
|
|
109
|
-
|
|
110
|
-
render_footer_with_col_span(total_hash, options)
|
|
111
96
|
end
|
|
112
|
-
|
|
113
97
|
end
|
data/lib/query_report/version.rb
CHANGED