data_grid 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/.rspec +3 -0
- data/CHANGELOG +5 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/Rakefile +1 -0
- data/app/assets/images/data_grid/calendar_view_month.png +0 -0
- data/app/assets/images/data_grid/csv.gif +0 -0
- data/app/assets/images/data_grid/delete.png +0 -0
- data/app/assets/images/data_grid/edit.png +0 -0
- data/app/assets/images/data_grid/no.png +0 -0
- data/app/assets/images/data_grid/sort_down.gif +0 -0
- data/app/assets/images/data_grid/sort_up.gif +0 -0
- data/app/assets/images/data_grid/yes.png +0 -0
- data/app/assets/javascripts/data_grid/data_grid.js +24 -0
- data/app/assets/javascripts/data_grid/grid_calendar/calendar-setup.js +200 -0
- data/app/assets/javascripts/data_grid/grid_calendar/calendar-setup_stripped.js +21 -0
- data/app/assets/javascripts/data_grid/grid_calendar/calendar.js +1819 -0
- data/app/assets/javascripts/data_grid/grid_calendar/calendar_original.js +1845 -0
- data/app/assets/javascripts/data_grid/grid_calendar/calendar_patched.js +1819 -0
- data/app/assets/javascripts/data_grid/grid_calendar/calendar_stripped.js +14 -0
- data/app/assets/javascripts/data_grid/grid_calendar/img.gif +0 -0
- data/app/assets/javascripts/data_grid/grid_calendar/lang/calendar-af.js +39 -0
- data/app/assets/javascripts/data_grid/grid_calendar/lang/calendar-al.js +101 -0
- data/app/assets/javascripts/data_grid/grid_calendar/lang/calendar-bg.js +124 -0
- data/app/assets/javascripts/data_grid/grid_calendar/lang/calendar-big5-utf8.js +123 -0
- data/app/assets/javascripts/data_grid/grid_calendar/lang/calendar-big5.js +123 -0
- data/app/assets/javascripts/data_grid/grid_calendar/lang/calendar-br.js +108 -0
- data/app/assets/javascripts/data_grid/grid_calendar/lang/calendar-ca.js +123 -0
- data/app/assets/javascripts/data_grid/grid_calendar/lang/calendar-cs-utf8.js +65 -0
- data/app/assets/javascripts/data_grid/grid_calendar/lang/calendar-cs-win.js +65 -0
- data/app/assets/javascripts/data_grid/grid_calendar/lang/calendar-da.js +123 -0
- data/app/assets/javascripts/data_grid/grid_calendar/lang/calendar-de.js +124 -0
- data/app/assets/javascripts/data_grid/grid_calendar/lang/calendar-du.js +45 -0
- data/app/assets/javascripts/data_grid/grid_calendar/lang/calendar-el.js +89 -0
- data/app/assets/javascripts/data_grid/grid_calendar/lang/calendar-en.js +127 -0
- data/app/assets/javascripts/data_grid/grid_calendar/lang/calendar-es.js +129 -0
- data/app/assets/javascripts/data_grid/grid_calendar/lang/calendar-fi.js +98 -0
- data/app/assets/javascripts/data_grid/grid_calendar/lang/calendar-fr.js +125 -0
- data/app/assets/javascripts/data_grid/grid_calendar/lang/calendar-he-utf8.js +123 -0
- data/app/assets/javascripts/data_grid/grid_calendar/lang/calendar-hr-utf8.js +49 -0
- data/app/assets/javascripts/data_grid/grid_calendar/lang/calendar-hr.js +0 -0
- data/app/assets/javascripts/data_grid/grid_calendar/lang/calendar-hu.js +124 -0
- data/app/assets/javascripts/data_grid/grid_calendar/lang/calendar-it.js +124 -0
- data/app/assets/javascripts/data_grid/grid_calendar/lang/calendar-jp.js +45 -0
- data/app/assets/javascripts/data_grid/grid_calendar/lang/calendar-ko-utf8.js +120 -0
- data/app/assets/javascripts/data_grid/grid_calendar/lang/calendar-ko.js +120 -0
- data/app/assets/javascripts/data_grid/grid_calendar/lang/calendar-lt-utf8.js +114 -0
- data/app/assets/javascripts/data_grid/grid_calendar/lang/calendar-lt.js +114 -0
- data/app/assets/javascripts/data_grid/grid_calendar/lang/calendar-lv.js +123 -0
- data/app/assets/javascripts/data_grid/grid_calendar/lang/calendar-nl.js +73 -0
- data/app/assets/javascripts/data_grid/grid_calendar/lang/calendar-no.js +114 -0
- data/app/assets/javascripts/data_grid/grid_calendar/lang/calendar-pl-utf8.js +93 -0
- data/app/assets/javascripts/data_grid/grid_calendar/lang/calendar-pl.js +56 -0
- data/app/assets/javascripts/data_grid/grid_calendar/lang/calendar-pt.js +123 -0
- data/app/assets/javascripts/data_grid/grid_calendar/lang/calendar-ro.js +66 -0
- data/app/assets/javascripts/data_grid/grid_calendar/lang/calendar-ru.js +123 -0
- data/app/assets/javascripts/data_grid/grid_calendar/lang/calendar-ru_win_.js +123 -0
- data/app/assets/javascripts/data_grid/grid_calendar/lang/calendar-si.js +94 -0
- data/app/assets/javascripts/data_grid/grid_calendar/lang/calendar-sk.js +99 -0
- data/app/assets/javascripts/data_grid/grid_calendar/lang/calendar-sp.js +110 -0
- data/app/assets/javascripts/data_grid/grid_calendar/lang/calendar-sv.js +93 -0
- data/app/assets/javascripts/data_grid/grid_calendar/lang/calendar-tr.js +58 -0
- data/app/assets/javascripts/data_grid/grid_calendar/lang/calendar-zh.js +119 -0
- data/app/assets/javascripts/data_grid/grid_calendar/lang/cn_utf8.js +123 -0
- data/app/assets/javascripts/data_grid/grid_calendar/menuarrow.gif +0 -0
- data/app/assets/javascripts/data_grid/grid_calendar/menuarrow2.gif +0 -0
- data/app/assets/stylesheets/data_grid/data_grid.css +90 -0
- data/app/assets/stylesheets/data_grid/data_grid_3_0.css +90 -0
- data/app/assets/stylesheets/data_grid/grid_calendar/calendar-blue.css +233 -0
- data/app/assets/stylesheets/data_grid/grid_calendar/calendar-blue2.css +237 -0
- data/app/assets/stylesheets/data_grid/grid_calendar/calendar-brown.css +226 -0
- data/app/assets/stylesheets/data_grid/grid_calendar/calendar-green.css +230 -0
- data/app/assets/stylesheets/data_grid/grid_calendar/calendar-system.css +252 -0
- data/app/assets/stylesheets/data_grid/grid_calendar/calendar-tas.css +240 -0
- data/app/assets/stylesheets/data_grid/grid_calendar/calendar-win2k-1.css +272 -0
- data/app/assets/stylesheets/data_grid/grid_calendar/calendar-win2k-2.css +272 -0
- data/app/assets/stylesheets/data_grid/grid_calendar/calendar-win2k-cold-1.css +266 -0
- data/app/assets/stylesheets/data_grid/grid_calendar/calendar-win2k-cold-2.css +272 -0
- data/app/assets/stylesheets/data_grid/grid_calendar/img.gif +0 -0
- data/app/assets/stylesheets/data_grid/grid_calendar/menuarrow.gif +0 -0
- data/app/assets/stylesheets/data_grid/grid_calendar/menuarrow2.gif +0 -0
- data/app/assets/stylesheets/data_grid/grid_calendar/skins/aqua/active-bg.gif +0 -0
- data/app/assets/stylesheets/data_grid/grid_calendar/skins/aqua/dark-bg.gif +0 -0
- data/app/assets/stylesheets/data_grid/grid_calendar/skins/aqua/hover-bg.gif +0 -0
- data/app/assets/stylesheets/data_grid/grid_calendar/skins/aqua/menuarrow.gif +0 -0
- data/app/assets/stylesheets/data_grid/grid_calendar/skins/aqua/normal-bg.gif +0 -0
- data/app/assets/stylesheets/data_grid/grid_calendar/skins/aqua/rowhover-bg.gif +0 -0
- data/app/assets/stylesheets/data_grid/grid_calendar/skins/aqua/status-bg.gif +0 -0
- data/app/assets/stylesheets/data_grid/grid_calendar/skins/aqua/theme.css +236 -0
- data/app/assets/stylesheets/data_grid/grid_calendar/skins/aqua/title-bg.gif +0 -0
- data/app/assets/stylesheets/data_grid/grid_calendar/skins/aqua/today-bg.gif +0 -0
- data/app/views/data_grid/_data_grid.html.erb +101 -0
- data/config/locales/en.yml +10 -0
- data/data_grid.gemspec +27 -0
- data/lib/data_grid/column.rb +38 -0
- data/lib/data_grid/controller.rb +30 -0
- data/lib/data_grid/cookies_state_saver.rb +42 -0
- data/lib/data_grid/csv_exporter.rb +79 -0
- data/lib/data_grid/data_grid_logic.rb +175 -0
- data/lib/data_grid/data_source_array.rb +267 -0
- data/lib/data_grid/data_source_orm.rb +207 -0
- data/lib/data_grid/engine.rb +19 -0
- data/lib/data_grid/summaries.rb +34 -0
- data/lib/data_grid/version.rb +3 -0
- data/lib/data_grid/view_helpers.rb +271 -0
- data/lib/data_grid.rb +43 -0
- data/lib/generators/data_grid/copy_view_generator.rb +16 -0
- data/lib/generators/data_grid/install_generator.rb +29 -0
- data/lib/generators/templates/data_grid.rb +29 -0
- data/lib/generators/templates/stylesheets/data_grid/data_grid_3_0.css +90 -0
- data/spec/orm_spec.rb +57 -0
- data/spec/spec_helper.rb +15 -0
- data/spec/support/active_record.rb +17 -0
- metadata +118 -5
@@ -0,0 +1,271 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
# Views methods
|
3
|
+
|
4
|
+
module DataGrid
|
5
|
+
module ViewHelpers
|
6
|
+
|
7
|
+
# FORMATERS
|
8
|
+
def data_grid_formatter_plain_text(txt)
|
9
|
+
txt
|
10
|
+
end
|
11
|
+
|
12
|
+
def data_grid_formatter_bold(txt)
|
13
|
+
raw "<strong>#{txt}</strong>"
|
14
|
+
end
|
15
|
+
|
16
|
+
def data_grid_formatter_money_pl(price)
|
17
|
+
pieces = price.to_s.split('<br />')
|
18
|
+
results = []
|
19
|
+
pieces.each do |p|
|
20
|
+
p = p.to_f
|
21
|
+
p = ((p*100.0).round)/100.0
|
22
|
+
result = p.to_s
|
23
|
+
result = result + '0' if (((p*10).to_s == (p*10).to_i.to_f.to_s) and (p > 0))
|
24
|
+
result = '0' if p.zero?
|
25
|
+
|
26
|
+
results << result.gsub('.', ',')
|
27
|
+
end
|
28
|
+
raw(results.join('<br />'))
|
29
|
+
end
|
30
|
+
|
31
|
+
def data_grid_formatter_datetime(dt)
|
32
|
+
I18n.l(dt)
|
33
|
+
end
|
34
|
+
|
35
|
+
def data_grid_formatter_date(d)
|
36
|
+
I18n.l(d)
|
37
|
+
end
|
38
|
+
|
39
|
+
def show_grid(data_grid)
|
40
|
+
data_grid.view_context = self
|
41
|
+
data_grid.prepare_data
|
42
|
+
render 'data_grid/data_grid', :data_grid => data_grid
|
43
|
+
end
|
44
|
+
|
45
|
+
# Simple slug method used in URL params - column names
|
46
|
+
def slug(p_str)
|
47
|
+
str = String.new(p_str)
|
48
|
+
str.strip!
|
49
|
+
|
50
|
+
s = ['ą', 'ć', 'ę', 'ł', 'ń', 'ó', 'ś', 'ż', 'ź',
|
51
|
+
'Ą', 'Ć', 'Ę', 'Ł', 'Ń', 'Ó', 'Ś', 'Ż', 'Ź',
|
52
|
+
'é', 'à', ' - ', 'À', 'Á', 'Ã', 'Ä', 'Å',
|
53
|
+
'Æ', 'Ç', 'È', 'É', 'Ê', 'Ë', 'Ì', 'Í', 'Î',
|
54
|
+
'Ï', 'Đ', 'Ñ', 'Ô', 'Õ', 'Ö', 'Ù', 'Û', 'Ý',
|
55
|
+
'ß', 'à', 'á', 'â', 'ã', 'ä', 'å', 'æ', 'ç',
|
56
|
+
'è', 'é', 'ê', 'ë', 'ì', 'í', 'í', 'î', 'ï',
|
57
|
+
'ñ', 'ò', 'ô', 'õ', 'ö', 'ù', 'ú', 'û', 'ü',
|
58
|
+
'ý', 'ÿ', '€', '$', 'Š', 'š', 'ž', 'Œ', 'œ',
|
59
|
+
'Ÿ', '§', '@' ]
|
60
|
+
r = ['a', 'c', 'e', 'l', 'n', 'o', 's', 'z', 'z',
|
61
|
+
'a', 'c', 'e', 'l', 'n', 'o', 's', 'z', 'z',
|
62
|
+
'e', 'a', '-', 'a', 'a', 'a', 'a', 'a',
|
63
|
+
'ae', 'c', 'e', 'e', 'e', 'e', 'i', 'i', 'i',
|
64
|
+
'i', 'd', 'n', 'o', 'o', 'o', 'u', 'u', 'y',
|
65
|
+
'b', 'a', 'a', 'a', 'a', 'a', 'a', 'ae', 'c',
|
66
|
+
'e', 'e', 'e', 'e', 'i', 'i', 'i', 'i', 'i',
|
67
|
+
'n', 'o', 'o', 'o', 'o', 'u', 'u', 'u', 'u',
|
68
|
+
'y', 'y', 'e', 's', 's', 's', 'z', 'oe', 'oe',
|
69
|
+
'y', 'p', 'at' ]
|
70
|
+
s.each_index {|i| str.gsub!(s[i], r[i])}
|
71
|
+
str.downcase!
|
72
|
+
str.gsub!(Regexp.new('\ +'), '-')
|
73
|
+
str.gsub!(Regexp.new('[^A-z0-9\-]'), '')
|
74
|
+
str.gsub!(Regexp.new('\-+', '-'), '-')
|
75
|
+
str
|
76
|
+
end
|
77
|
+
|
78
|
+
# Render given column header
|
79
|
+
def data_grid_header(data_grid, column)
|
80
|
+
if column.sortable
|
81
|
+
col_index = data_grid.columns.index(column)
|
82
|
+
link_to(raw(column.title), data_grid.params.merge(
|
83
|
+
"sort_#{data_grid.name}" => slug(column.title) + '_' + col_index.to_s,
|
84
|
+
"sort_direction_#{data_grid.name}" => ((data_grid.sort == col_index) and (data_grid.sort_direction == 'ASC')) ? 'DESC' : 'ASC'), :class => 'underline sorting ' + ((data_grid.sort == col_index) ? ((data_grid.sort_direction == 'ASC') ? 'up' : 'down') : ''))
|
85
|
+
else
|
86
|
+
raw column.title
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
# Show export link
|
91
|
+
def data_grid_export_link(data_grid)
|
92
|
+
link_to(
|
93
|
+
image_tag("data_grid/#{data_grid.export_enabled}.gif", :border => 0),
|
94
|
+
data_grid.params.merge("export_#{data_grid.name}" => data_grid.export_enabled)
|
95
|
+
)
|
96
|
+
end
|
97
|
+
|
98
|
+
# Based on column filter type, display form with inputs
|
99
|
+
def data_grid_filter(data_grid, column)
|
100
|
+
hidden_submit_input = '<input type="submit" value="" style="width:0px; height: 0px; border: none; padding: 0px; font-size: 0px">'.html_safe
|
101
|
+
output = ''
|
102
|
+
col_index = data_grid.columns.index(column)
|
103
|
+
case column.filter
|
104
|
+
when :boolean
|
105
|
+
filter_select_name = "filter_#{data_grid.name}_#{col_index}"
|
106
|
+
base_url = url_for(data_grid.params.merge(filter_select_name => nil))
|
107
|
+
output = select_tag(filter_select_name,
|
108
|
+
options_for_select([[I18n.t('data_grid.all_options'), ''], [I18n.t('data_grid.option_true'), '1'], [I18n.t('data_grid.option_false'), '0']], column.filter_value),
|
109
|
+
:onchange => "window.location.href='#{base_url}#{(base_url.include?('?')) ? '&' : '?' }#{filter_select_name}=' + this.value")
|
110
|
+
when :auto
|
111
|
+
filter_select_name = "filter_#{data_grid.name}_#{col_index}"
|
112
|
+
base_url = url_for(data_grid.params.merge(filter_select_name => nil))
|
113
|
+
output = select_tag(filter_select_name,
|
114
|
+
options_for_select([[I18n.t('data_grid.all_options'), '']] + column.filter_data.map{|fd| [column.auto_filter_hash.nil? ? fd : column.auto_filter_hash[fd.to_s.to_sym], fd]}, column.filter_value),
|
115
|
+
:onchange => "window.location.href='#{base_url}#{(base_url.include?('?')) ? '&' : '?' }#{filter_select_name}=' + this.value")
|
116
|
+
|
117
|
+
when :text
|
118
|
+
filter_input_name = "filter_#{data_grid.name}_#{col_index}"
|
119
|
+
base_url = url_for(data_grid.params.merge(filter_input_name => nil))
|
120
|
+
output = form_tag(base_url, :method => 'GET') do
|
121
|
+
text_field_tag(filter_input_name, column.filter_value) +
|
122
|
+
data_grid_dump_as_hidden_fields(data_grid, [filter_input_name]) +
|
123
|
+
hidden_submit_input
|
124
|
+
end
|
125
|
+
when :number
|
126
|
+
filter_input_name = "filter_#{data_grid.name}_#{col_index}"
|
127
|
+
base_url = url_for(data_grid.params.merge(filter_input_name => nil))
|
128
|
+
output = form_tag(base_url, :method => 'GET') do
|
129
|
+
text_field_tag(filter_input_name, column.filter_value, :class => 'data_grid_filter_input') +
|
130
|
+
data_grid_dump_as_hidden_fields(data_grid, [filter_input_name]) +
|
131
|
+
hidden_submit_input
|
132
|
+
end
|
133
|
+
when :range
|
134
|
+
filter_input_name_from = "filter_#{data_grid.name}_#{col_index}_from"
|
135
|
+
filter_input_name_to = "filter_#{data_grid.name}_#{col_index}_to"
|
136
|
+
base_url = url_for(data_grid.params.merge(filter_input_name_from => nil, filter_input_name_to => nil))
|
137
|
+
output = form_tag(base_url, :method => 'GET') do
|
138
|
+
data_grid_dump_as_hidden_fields(data_grid, [filter_input_name_from, filter_input_name_to]) +
|
139
|
+
text_field_tag(filter_input_name_from, column.filter_value.to_s.split(DataGrid.range_separator)[0], :class => 'data_grid_filter_input') +
|
140
|
+
' - ' +
|
141
|
+
text_field_tag(filter_input_name_to, column.filter_value.to_s.split(DataGrid.range_separator)[1], :class => 'data_grid_filter_input') +
|
142
|
+
hidden_submit_input
|
143
|
+
end
|
144
|
+
|
145
|
+
when :date
|
146
|
+
date_format = I18n.t(:"date.formats.default", {:locale => I18n.locale })
|
147
|
+
filter_input_name_from = "filter_#{data_grid.name}_#{col_index}_from"
|
148
|
+
filter_input_name_to = "filter_#{data_grid.name}_#{col_index}_to"
|
149
|
+
form_id = "filter_#{data_grid.name}_#{col_index}_form"
|
150
|
+
|
151
|
+
base_url = url_for(data_grid.params.merge(filter_input_name_from => nil, filter_input_name_to => nil))
|
152
|
+
output = "<form method='get' action='#{base_url}' id='#{form_id}'>"
|
153
|
+
output << data_grid_dump_as_hidden_fields(data_grid, [filter_input_name_from, filter_input_name_to])
|
154
|
+
|
155
|
+
date_picker, datepicker_placeholder_id, trigger_id, dom_id, date_span_id = select_date_datetime_common(
|
156
|
+
{:id => "filter_#{data_grid.name}_#{col_index}_from", :name => filter_input_name_from}, data_grid.params[filter_input_name_from], form_id)
|
157
|
+
|
158
|
+
output << "#{I18n.t('data_grid.filter_date_from')}: <span id=\"#{datepicker_placeholder_id}\">#{date_picker}</span>"
|
159
|
+
output << %(<script type="text/javascript">\n)
|
160
|
+
output << %( Calendar.setup\({\n)
|
161
|
+
output << %( button : "#{trigger_id}",\n )
|
162
|
+
output << %( ifFormat : "#{date_format}",\n )
|
163
|
+
output << %( inputField : "#{dom_id}",\n )
|
164
|
+
output << %( include_blank : true,\n )
|
165
|
+
output << %( singleClick : true,\n)
|
166
|
+
output << %( onClose : function(cal){handleCalendarClose(cal, "#{dom_id}", "#{form_id}");}\n)
|
167
|
+
output << %( }\);\n)
|
168
|
+
output << %(</script><br />\n)
|
169
|
+
|
170
|
+
date_picker, datepicker_placeholder_id, trigger_id, dom_id, date_span_id = select_date_datetime_common(
|
171
|
+
{:id => "filter_#{data_grid.name}_#{col_index}_to", :name => filter_input_name_to}, data_grid.params[filter_input_name_to], form_id)
|
172
|
+
|
173
|
+
output << "#{I18n.t('data_grid.filter_date_to')}: <span id=\"#{datepicker_placeholder_id}\">#{date_picker}</span>"
|
174
|
+
output << %(<script type="text/javascript">\n)
|
175
|
+
output << %( Calendar.setup\({\n)
|
176
|
+
output << %( button : "#{trigger_id}",\n )
|
177
|
+
output << %( ifFormat : "#{date_format}",\n )
|
178
|
+
output << %( inputField : "#{dom_id}",\n )
|
179
|
+
output << %( include_blank : true,\n )
|
180
|
+
output << %( singleClick : true,\n)
|
181
|
+
output << %( onClose : function(cal){handleCalendarClose(cal, "#{dom_id}", "#{form_id}");}\n)
|
182
|
+
output << %( }\);\n)
|
183
|
+
output << %(</script>\n)
|
184
|
+
|
185
|
+
output << hidden_submit_input
|
186
|
+
output << '</form>'
|
187
|
+
|
188
|
+
else
|
189
|
+
output = ' '
|
190
|
+
end
|
191
|
+
|
192
|
+
raw output
|
193
|
+
end
|
194
|
+
|
195
|
+
# Prepare calendar in filters area
|
196
|
+
def select_date_datetime_common(options, date_string, form_id) #:nodoc:
|
197
|
+
dom_id = options[:id]
|
198
|
+
|
199
|
+
trigger_id = dom_id + '_trigger'
|
200
|
+
datepicker_placeholder_id = dom_id + '_date_placeholder'
|
201
|
+
date_span_id = dom_id + '_date_view'
|
202
|
+
|
203
|
+
date_picker = image_tag('data_grid/calendar_view_month.png', :id => trigger_id, :style => 'cursor: pointer') +
|
204
|
+
|
205
|
+
link_to_function(
|
206
|
+
content_tag(:span, date_string, :id => date_span_id),
|
207
|
+
%! dataGridSetInnerHtml("#{date_span_id}", ""); dataGridSetValue("#{dom_id}", ""); handleCalendarClose(false, "#{dom_id}", "#{form_id}");!,
|
208
|
+
:class => 'date_label') + ' ' +
|
209
|
+
|
210
|
+
hidden_field_tag(options[:name], date_string, :class => 'text-input', :id => dom_id,
|
211
|
+
:onchange => "dataGridSetInnerHtml(\"#{date_span_id}\", this.value);")
|
212
|
+
|
213
|
+
return date_picker, datepicker_placeholder_id, trigger_id, dom_id, date_span_id
|
214
|
+
end
|
215
|
+
|
216
|
+
|
217
|
+
# Display data_grid per page selector
|
218
|
+
def data_grid_per_page_selector(data_grid)
|
219
|
+
per_page_param = "per_page_#{data_grid.name}"
|
220
|
+
base_url = url_for(data_grid.params.merge(per_page_param => nil))
|
221
|
+
select_tag(:per_page,
|
222
|
+
options_for_select(DataGrid.available_per_pages, data_grid.per_page),
|
223
|
+
:onchange => "window.location.href='#{base_url}#{(base_url.include?('?')) ? '&' : '?' }#{per_page_param}=' + this.value", :class => 'data_grid_per_page_selector')
|
224
|
+
end
|
225
|
+
|
226
|
+
|
227
|
+
# Dump all data_grid options as hidden fields
|
228
|
+
def data_grid_dump_as_hidden_fields(data_grid, except = [])
|
229
|
+
output = ''
|
230
|
+
data_grid.params.each_pair do |k, v|
|
231
|
+
next if except.include?(k)
|
232
|
+
output << hidden_field_tag(k, v)
|
233
|
+
end
|
234
|
+
output.html_safe
|
235
|
+
end
|
236
|
+
|
237
|
+
|
238
|
+
# Displays data grid pager
|
239
|
+
def data_grid_pager(data_grid)
|
240
|
+
output = []
|
241
|
+
if data_grid.pages < 8
|
242
|
+
1.upto(data_grid.pages){|page_number|
|
243
|
+
if data_grid.page == page_number or data_grid.page == 0
|
244
|
+
output << "<li>#{page_number}</li>"
|
245
|
+
else
|
246
|
+
output << '<li>' + link_to(page_number, data_grid.params.merge('page_' + data_grid.name => page_number) ) + '</li>'
|
247
|
+
end
|
248
|
+
}
|
249
|
+
else
|
250
|
+
if data_grid.page - 4 > 0
|
251
|
+
output << '<li>' + link_to("1", data_grid.params.merge('page_' + data_grid.name => 1), :class => 'prev' ) + '</li><li>...</li>'
|
252
|
+
end
|
253
|
+
1.upto(data_grid.pages){|page_number|
|
254
|
+
if data_grid.page == page_number or data_grid.page == 0
|
255
|
+
output << "<li>#{page_number}</li>"
|
256
|
+
else
|
257
|
+
if page_number > data_grid.page - 4 and page_number < data_grid.page + 4
|
258
|
+
output << '<li>' + link_to(page_number, data_grid.params.merge('page_' + data_grid.name => page_number) ) + '</li>'
|
259
|
+
end
|
260
|
+
end
|
261
|
+
}
|
262
|
+
if data_grid.page + 3 < data_grid.pages
|
263
|
+
output << '<li>...</li><li>' + link_to("#{data_grid.pages}",data_grid.params.merge('page_' + data_grid.name => data_grid.pages), :class => 'next' ) + '</li>'
|
264
|
+
end
|
265
|
+
end
|
266
|
+
|
267
|
+
raw("<ul class='data_grid_pagination'>" + output.join(' ') + "</ul>")
|
268
|
+
end
|
269
|
+
end
|
270
|
+
end
|
271
|
+
|
data/lib/data_grid.rb
ADDED
@@ -0,0 +1,43 @@
|
|
1
|
+
require "data_grid/version"
|
2
|
+
require "data_grid/engine"
|
3
|
+
require "data_grid/controller"
|
4
|
+
require "data_grid/data_grid_logic"
|
5
|
+
require "data_grid/column"
|
6
|
+
require "data_grid/summaries"
|
7
|
+
require "data_grid/view_helpers"
|
8
|
+
|
9
|
+
module DataGrid
|
10
|
+
|
11
|
+
# Default per page
|
12
|
+
mattr_accessor :per_page
|
13
|
+
|
14
|
+
# Used in URL in range filter
|
15
|
+
mattr_accessor :range_separator
|
16
|
+
|
17
|
+
# Default columns sortable state
|
18
|
+
mattr_accessor :column_sortable
|
19
|
+
|
20
|
+
# Default column summary formatter
|
21
|
+
mattr_accessor :column_summary_formatter
|
22
|
+
|
23
|
+
# Default sort direction
|
24
|
+
mattr_accessor :sort_direction
|
25
|
+
|
26
|
+
# Show table footer
|
27
|
+
mattr_accessor :show_footer
|
28
|
+
|
29
|
+
# Available per page options
|
30
|
+
mattr_accessor :available_per_pages
|
31
|
+
|
32
|
+
# Method used to save grid state
|
33
|
+
mattr_accessor :state_saver_method
|
34
|
+
|
35
|
+
# Default export filename
|
36
|
+
mattr_accessor :export_filename
|
37
|
+
|
38
|
+
|
39
|
+
def self.setup
|
40
|
+
yield self
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module DataGrid
|
2
|
+
module Generators
|
3
|
+
class CopyViewGenerator < Rails::Generators::Base
|
4
|
+
@@root = File.expand_path("../../templates", __FILE__)
|
5
|
+
source_root @@root
|
6
|
+
|
7
|
+
desc "Copy views ..."
|
8
|
+
|
9
|
+
def copy_view_files
|
10
|
+
view_root = File.expand_path('../../../../app/views', __FILE__)
|
11
|
+
FileUtils.cp_r(Dir["#{view_root}/data_grid"], 'app/views')
|
12
|
+
end
|
13
|
+
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module DataGrid
|
2
|
+
module Generators
|
3
|
+
class InstallGenerator < Rails::Generators::Base
|
4
|
+
@@root = File.expand_path("../../templates", __FILE__)
|
5
|
+
source_root @@root
|
6
|
+
|
7
|
+
desc "Copy files ..."
|
8
|
+
|
9
|
+
def copy_initializer
|
10
|
+
template "data_grid.rb", "config/initializers/data_grid.rb"
|
11
|
+
end
|
12
|
+
|
13
|
+
|
14
|
+
def copy_all_files
|
15
|
+
assets_root = File.expand_path('../../../../app/assets', __FILE__)
|
16
|
+
|
17
|
+
# only for Rails = 3.0.x
|
18
|
+
if Rails::VERSION::MAJOR == 3 and Rails::VERSION::MINOR.zero?
|
19
|
+
copy_file "#{@@root}/stylesheets/data_grid/data_grid_3_0.css", "public/stylesheets/data_grid/data_grid.css"
|
20
|
+
copy_file "#{assets_root}/javascripts/data_grid/data_grid.js", "public/javascripts/data_grid/data_grid.js"
|
21
|
+
FileUtils.cp_r(Dir["#{assets_root}/stylesheets/data_grid/grid_calendar"], 'public/stylesheets/data_grid')
|
22
|
+
FileUtils.cp_r(Dir["#{assets_root}/javascripts/data_grid/grid_calendar"], 'public/javascripts/data_grid')
|
23
|
+
FileUtils.cp_r(Dir["#{assets_root}/images/data_grid"], 'public/images')
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
DataGrid.setup do |config|
|
2
|
+
|
3
|
+
# Default per page
|
4
|
+
config.per_page = 20
|
5
|
+
|
6
|
+
# Used in URL in range filter
|
7
|
+
config.range_separator = '--#--'
|
8
|
+
|
9
|
+
# Default columns sortable state
|
10
|
+
config.column_sortable = false
|
11
|
+
|
12
|
+
# Default column summary formatter
|
13
|
+
config.column_summary_formatter = 'plain_text'
|
14
|
+
|
15
|
+
# Default sort direction
|
16
|
+
config.sort_direction = 'asc'
|
17
|
+
|
18
|
+
# Show table footer
|
19
|
+
config.show_footer = true
|
20
|
+
|
21
|
+
# Available per page options
|
22
|
+
config.available_per_pages = [[10,10],[20,20],[50,50],[100,100],[500,500]]
|
23
|
+
|
24
|
+
# Method used to save grid state
|
25
|
+
config.state_saver_method = 'cookies'
|
26
|
+
|
27
|
+
# Default export filename
|
28
|
+
config.export_filename = 'export_to_csv.csv'
|
29
|
+
end
|
@@ -0,0 +1,90 @@
|
|
1
|
+
div.data_grid {
|
2
|
+
font-family: Verdana, Arial, Helvetica, sans-serif;
|
3
|
+
font-size: 12px;
|
4
|
+
}
|
5
|
+
|
6
|
+
table.data_grid {
|
7
|
+
border: 1px solid #808080;
|
8
|
+
border-collapse: separate;
|
9
|
+
width: 100%;
|
10
|
+
}
|
11
|
+
|
12
|
+
table.data_grid th {
|
13
|
+
text-align: left;
|
14
|
+
background-color: #C6D4E4;
|
15
|
+
padding: 6px 3px;
|
16
|
+
color: #000;
|
17
|
+
line-height: 18px;
|
18
|
+
}
|
19
|
+
|
20
|
+
table.data_grid td {
|
21
|
+
border-width: 1px;
|
22
|
+
padding: 3px;
|
23
|
+
border-style: none;
|
24
|
+
border-color: #011b36;
|
25
|
+
color: #000;
|
26
|
+
font-size: 11px;
|
27
|
+
line-height: 18px;
|
28
|
+
padding-left: 4px;
|
29
|
+
}
|
30
|
+
|
31
|
+
table.data_grid td.odd { background-color: #F0FFF0; }
|
32
|
+
|
33
|
+
table.data_grid tr.filters td {
|
34
|
+
background-color: #E9F0F4;
|
35
|
+
border-bottom: 1px solid #C0C0C0;
|
36
|
+
}
|
37
|
+
|
38
|
+
table.data_grid a, table.data_grid a:active, table.data_grid a:focus { color: #12c; }
|
39
|
+
|
40
|
+
table.data_grid tr:hover td.data_grid_row { background-color: #ddd; }
|
41
|
+
|
42
|
+
table.data_grid td.grid_no_data {
|
43
|
+
font-size:16px;
|
44
|
+
font-weight:bold;
|
45
|
+
}
|
46
|
+
|
47
|
+
table.data_grid tr.summary td { background-color: #E9F0F4; }
|
48
|
+
|
49
|
+
table.data_grid tfoot tr td { background-color: #E9F0F4; }
|
50
|
+
|
51
|
+
table.data_grid a.sorting.down {
|
52
|
+
padding-right: 13px;
|
53
|
+
background: url("/images/data_grid/sort_down.gif") right 4px no-repeat;
|
54
|
+
}
|
55
|
+
|
56
|
+
table.data_grid a.sorting.up {
|
57
|
+
padding-right: 13px;
|
58
|
+
background: url("/images/data_grid/sort_up.gif") right 4px no-repeat;
|
59
|
+
}
|
60
|
+
|
61
|
+
table.data_grid tfoot td div { margin: 0; padding: 0; }
|
62
|
+
table.data_grid tfoot td .data_grid_fl { float:left; }
|
63
|
+
table.data_grid tfoot td .data_grid_fr { float:right; }
|
64
|
+
table.data_grid tfoot td .data_grid_lmargin { margin-left: 20px; }
|
65
|
+
|
66
|
+
table.data_grid tfoot td .pagination { margin-right: 40px; }
|
67
|
+
table.data_grid tfoot td ul.data_grid_pagination {
|
68
|
+
display: inline-block;
|
69
|
+
padding: 0;
|
70
|
+
margin: 0;
|
71
|
+
|
72
|
+
*float: left;
|
73
|
+
}
|
74
|
+
table.data_grid tfoot td ul.data_grid_pagination li {
|
75
|
+
display: inline;
|
76
|
+
font-size: 14px;
|
77
|
+
font-weight: bold;
|
78
|
+
float: none;
|
79
|
+
margin: 0 2px;
|
80
|
+
}
|
81
|
+
table.data_grid tfoot td ul.data_grid_pagination a {
|
82
|
+
display: inline-block;
|
83
|
+
font-weight: bold;
|
84
|
+
font-size: 12px;
|
85
|
+
|
86
|
+
*display: block;
|
87
|
+
}
|
88
|
+
|
89
|
+
table.data_grid form input.data_grid_filter_input { width: 48px; }
|
90
|
+
|
data/spec/orm_spec.rb
ADDED
@@ -0,0 +1,57 @@
|
|
1
|
+
require 'active_support'
|
2
|
+
require 'support/active_record'
|
3
|
+
require 'data_grid/data_grid_logic'
|
4
|
+
require 'data_grid/data_source_orm'
|
5
|
+
|
6
|
+
describe DataGrid::DataSourceORM do
|
7
|
+
it "selects right data source (ORM)" do
|
8
|
+
data_grid_logic = DataGrid::DataGridLogic.new(:params => ActiveSupport::HashWithIndifferentAccess.new())
|
9
|
+
data_grid_logic.add_column(:name, :title => 'Name')
|
10
|
+
data_grid_logic.data = User.scoped
|
11
|
+
|
12
|
+
data_grid_logic.in_data.class.should eql(ActiveRecord::Relation)
|
13
|
+
end
|
14
|
+
|
15
|
+
it "paginate 10 per page from configuraion" do
|
16
|
+
data_grid_logic = DataGrid::DataGridLogic.new(:params => ActiveSupport::HashWithIndifferentAccess.new(:"page_" => '1'))
|
17
|
+
data_grid_logic.add_column(:name, :title => 'Name')
|
18
|
+
data_grid_logic.per_page = 10
|
19
|
+
data_grid_logic.data = User.scoped
|
20
|
+
data_grid_logic.get_params_from_request
|
21
|
+
data_grid_logic.prepare_data
|
22
|
+
|
23
|
+
data_grid_logic.out_data.size.should eql(10)
|
24
|
+
end
|
25
|
+
|
26
|
+
it "paginate 10 per page from params" do
|
27
|
+
data_grid_logic = DataGrid::DataGridLogic.new(:params => ActiveSupport::HashWithIndifferentAccess.new(:"page_" => '1', :"per_page_" => '10'))
|
28
|
+
data_grid_logic.add_column(:name, :title => 'Name')
|
29
|
+
data_grid_logic.per_page = 20
|
30
|
+
data_grid_logic.data = User.scoped
|
31
|
+
data_grid_logic.get_params_from_request
|
32
|
+
data_grid_logic.prepare_data
|
33
|
+
|
34
|
+
data_grid_logic.out_data.size.should eql(10)
|
35
|
+
end
|
36
|
+
|
37
|
+
it "paginate correct data and sort correctly" do
|
38
|
+
data_grid_logic = DataGrid::DataGridLogic.new(:params => ActiveSupport::HashWithIndifferentAccess.new(:"page_" => '2', :"per_page_" => '10', :"sort_" => 'name', :"sort_direction_" => 'ASC'))
|
39
|
+
data_grid_logic.add_column(:name, :title => 'Name')
|
40
|
+
data_grid_logic.data = User.scoped
|
41
|
+
data_grid_logic.get_params_from_request
|
42
|
+
data_grid_logic.prepare_data
|
43
|
+
|
44
|
+
data_grid_logic.out_data.first[0].should eql('John_19')
|
45
|
+
end
|
46
|
+
|
47
|
+
it "filter text method" do
|
48
|
+
data_grid_logic = DataGrid::DataGridLogic.new(:params => ActiveSupport::HashWithIndifferentAccess.new(:"page_" => '1', :"per_page_" => '10', :"filter__0" => '9', :"sort_" => 'name', :"sort_direction_" => 'ASC'))
|
49
|
+
data_grid_logic.add_column(:name, :title => 'Name', :filter => :text)
|
50
|
+
data_grid_logic.data = User.scoped
|
51
|
+
data_grid_logic.get_params_from_request
|
52
|
+
data_grid_logic.prepare_data
|
53
|
+
|
54
|
+
data_grid_logic.out_data.size.should eql(5)
|
55
|
+
data_grid_logic.out_data.first[0].should eql('John_19')
|
56
|
+
end
|
57
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
2
|
+
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
3
|
+
|
4
|
+
ENV["RAILS_ENV"] ||= 'test'
|
5
|
+
|
6
|
+
require "rails/all"
|
7
|
+
|
8
|
+
require 'rspec/rails'
|
9
|
+
|
10
|
+
root = File.expand_path(File.dirname(__FILE__))
|
11
|
+
|
12
|
+
RSpec.configure do |config|
|
13
|
+
end
|
14
|
+
|
15
|
+
require 'data_grid'
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'active_record'
|
2
|
+
require 'rspec/rails/extensions/active_record/base'
|
3
|
+
ActiveRecord::Base.establish_connection adapter: "sqlite3", database: ":memory:"
|
4
|
+
|
5
|
+
ActiveRecord::Migration.create_table :users do |t|
|
6
|
+
t.string :name
|
7
|
+
t.timestamps
|
8
|
+
end
|
9
|
+
|
10
|
+
class User < ActiveRecord::Base
|
11
|
+
end
|
12
|
+
|
13
|
+
1.upto(50) do |i|
|
14
|
+
User.create({
|
15
|
+
:name => "John_#{i}"
|
16
|
+
})
|
17
|
+
end
|