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.
Files changed (114) hide show
  1. data/.rspec +3 -0
  2. data/CHANGELOG +5 -0
  3. data/Gemfile +4 -0
  4. data/LICENSE.txt +22 -0
  5. data/Rakefile +1 -0
  6. data/app/assets/images/data_grid/calendar_view_month.png +0 -0
  7. data/app/assets/images/data_grid/csv.gif +0 -0
  8. data/app/assets/images/data_grid/delete.png +0 -0
  9. data/app/assets/images/data_grid/edit.png +0 -0
  10. data/app/assets/images/data_grid/no.png +0 -0
  11. data/app/assets/images/data_grid/sort_down.gif +0 -0
  12. data/app/assets/images/data_grid/sort_up.gif +0 -0
  13. data/app/assets/images/data_grid/yes.png +0 -0
  14. data/app/assets/javascripts/data_grid/data_grid.js +24 -0
  15. data/app/assets/javascripts/data_grid/grid_calendar/calendar-setup.js +200 -0
  16. data/app/assets/javascripts/data_grid/grid_calendar/calendar-setup_stripped.js +21 -0
  17. data/app/assets/javascripts/data_grid/grid_calendar/calendar.js +1819 -0
  18. data/app/assets/javascripts/data_grid/grid_calendar/calendar_original.js +1845 -0
  19. data/app/assets/javascripts/data_grid/grid_calendar/calendar_patched.js +1819 -0
  20. data/app/assets/javascripts/data_grid/grid_calendar/calendar_stripped.js +14 -0
  21. data/app/assets/javascripts/data_grid/grid_calendar/img.gif +0 -0
  22. data/app/assets/javascripts/data_grid/grid_calendar/lang/calendar-af.js +39 -0
  23. data/app/assets/javascripts/data_grid/grid_calendar/lang/calendar-al.js +101 -0
  24. data/app/assets/javascripts/data_grid/grid_calendar/lang/calendar-bg.js +124 -0
  25. data/app/assets/javascripts/data_grid/grid_calendar/lang/calendar-big5-utf8.js +123 -0
  26. data/app/assets/javascripts/data_grid/grid_calendar/lang/calendar-big5.js +123 -0
  27. data/app/assets/javascripts/data_grid/grid_calendar/lang/calendar-br.js +108 -0
  28. data/app/assets/javascripts/data_grid/grid_calendar/lang/calendar-ca.js +123 -0
  29. data/app/assets/javascripts/data_grid/grid_calendar/lang/calendar-cs-utf8.js +65 -0
  30. data/app/assets/javascripts/data_grid/grid_calendar/lang/calendar-cs-win.js +65 -0
  31. data/app/assets/javascripts/data_grid/grid_calendar/lang/calendar-da.js +123 -0
  32. data/app/assets/javascripts/data_grid/grid_calendar/lang/calendar-de.js +124 -0
  33. data/app/assets/javascripts/data_grid/grid_calendar/lang/calendar-du.js +45 -0
  34. data/app/assets/javascripts/data_grid/grid_calendar/lang/calendar-el.js +89 -0
  35. data/app/assets/javascripts/data_grid/grid_calendar/lang/calendar-en.js +127 -0
  36. data/app/assets/javascripts/data_grid/grid_calendar/lang/calendar-es.js +129 -0
  37. data/app/assets/javascripts/data_grid/grid_calendar/lang/calendar-fi.js +98 -0
  38. data/app/assets/javascripts/data_grid/grid_calendar/lang/calendar-fr.js +125 -0
  39. data/app/assets/javascripts/data_grid/grid_calendar/lang/calendar-he-utf8.js +123 -0
  40. data/app/assets/javascripts/data_grid/grid_calendar/lang/calendar-hr-utf8.js +49 -0
  41. data/app/assets/javascripts/data_grid/grid_calendar/lang/calendar-hr.js +0 -0
  42. data/app/assets/javascripts/data_grid/grid_calendar/lang/calendar-hu.js +124 -0
  43. data/app/assets/javascripts/data_grid/grid_calendar/lang/calendar-it.js +124 -0
  44. data/app/assets/javascripts/data_grid/grid_calendar/lang/calendar-jp.js +45 -0
  45. data/app/assets/javascripts/data_grid/grid_calendar/lang/calendar-ko-utf8.js +120 -0
  46. data/app/assets/javascripts/data_grid/grid_calendar/lang/calendar-ko.js +120 -0
  47. data/app/assets/javascripts/data_grid/grid_calendar/lang/calendar-lt-utf8.js +114 -0
  48. data/app/assets/javascripts/data_grid/grid_calendar/lang/calendar-lt.js +114 -0
  49. data/app/assets/javascripts/data_grid/grid_calendar/lang/calendar-lv.js +123 -0
  50. data/app/assets/javascripts/data_grid/grid_calendar/lang/calendar-nl.js +73 -0
  51. data/app/assets/javascripts/data_grid/grid_calendar/lang/calendar-no.js +114 -0
  52. data/app/assets/javascripts/data_grid/grid_calendar/lang/calendar-pl-utf8.js +93 -0
  53. data/app/assets/javascripts/data_grid/grid_calendar/lang/calendar-pl.js +56 -0
  54. data/app/assets/javascripts/data_grid/grid_calendar/lang/calendar-pt.js +123 -0
  55. data/app/assets/javascripts/data_grid/grid_calendar/lang/calendar-ro.js +66 -0
  56. data/app/assets/javascripts/data_grid/grid_calendar/lang/calendar-ru.js +123 -0
  57. data/app/assets/javascripts/data_grid/grid_calendar/lang/calendar-ru_win_.js +123 -0
  58. data/app/assets/javascripts/data_grid/grid_calendar/lang/calendar-si.js +94 -0
  59. data/app/assets/javascripts/data_grid/grid_calendar/lang/calendar-sk.js +99 -0
  60. data/app/assets/javascripts/data_grid/grid_calendar/lang/calendar-sp.js +110 -0
  61. data/app/assets/javascripts/data_grid/grid_calendar/lang/calendar-sv.js +93 -0
  62. data/app/assets/javascripts/data_grid/grid_calendar/lang/calendar-tr.js +58 -0
  63. data/app/assets/javascripts/data_grid/grid_calendar/lang/calendar-zh.js +119 -0
  64. data/app/assets/javascripts/data_grid/grid_calendar/lang/cn_utf8.js +123 -0
  65. data/app/assets/javascripts/data_grid/grid_calendar/menuarrow.gif +0 -0
  66. data/app/assets/javascripts/data_grid/grid_calendar/menuarrow2.gif +0 -0
  67. data/app/assets/stylesheets/data_grid/data_grid.css +90 -0
  68. data/app/assets/stylesheets/data_grid/data_grid_3_0.css +90 -0
  69. data/app/assets/stylesheets/data_grid/grid_calendar/calendar-blue.css +233 -0
  70. data/app/assets/stylesheets/data_grid/grid_calendar/calendar-blue2.css +237 -0
  71. data/app/assets/stylesheets/data_grid/grid_calendar/calendar-brown.css +226 -0
  72. data/app/assets/stylesheets/data_grid/grid_calendar/calendar-green.css +230 -0
  73. data/app/assets/stylesheets/data_grid/grid_calendar/calendar-system.css +252 -0
  74. data/app/assets/stylesheets/data_grid/grid_calendar/calendar-tas.css +240 -0
  75. data/app/assets/stylesheets/data_grid/grid_calendar/calendar-win2k-1.css +272 -0
  76. data/app/assets/stylesheets/data_grid/grid_calendar/calendar-win2k-2.css +272 -0
  77. data/app/assets/stylesheets/data_grid/grid_calendar/calendar-win2k-cold-1.css +266 -0
  78. data/app/assets/stylesheets/data_grid/grid_calendar/calendar-win2k-cold-2.css +272 -0
  79. data/app/assets/stylesheets/data_grid/grid_calendar/img.gif +0 -0
  80. data/app/assets/stylesheets/data_grid/grid_calendar/menuarrow.gif +0 -0
  81. data/app/assets/stylesheets/data_grid/grid_calendar/menuarrow2.gif +0 -0
  82. data/app/assets/stylesheets/data_grid/grid_calendar/skins/aqua/active-bg.gif +0 -0
  83. data/app/assets/stylesheets/data_grid/grid_calendar/skins/aqua/dark-bg.gif +0 -0
  84. data/app/assets/stylesheets/data_grid/grid_calendar/skins/aqua/hover-bg.gif +0 -0
  85. data/app/assets/stylesheets/data_grid/grid_calendar/skins/aqua/menuarrow.gif +0 -0
  86. data/app/assets/stylesheets/data_grid/grid_calendar/skins/aqua/normal-bg.gif +0 -0
  87. data/app/assets/stylesheets/data_grid/grid_calendar/skins/aqua/rowhover-bg.gif +0 -0
  88. data/app/assets/stylesheets/data_grid/grid_calendar/skins/aqua/status-bg.gif +0 -0
  89. data/app/assets/stylesheets/data_grid/grid_calendar/skins/aqua/theme.css +236 -0
  90. data/app/assets/stylesheets/data_grid/grid_calendar/skins/aqua/title-bg.gif +0 -0
  91. data/app/assets/stylesheets/data_grid/grid_calendar/skins/aqua/today-bg.gif +0 -0
  92. data/app/views/data_grid/_data_grid.html.erb +101 -0
  93. data/config/locales/en.yml +10 -0
  94. data/data_grid.gemspec +27 -0
  95. data/lib/data_grid/column.rb +38 -0
  96. data/lib/data_grid/controller.rb +30 -0
  97. data/lib/data_grid/cookies_state_saver.rb +42 -0
  98. data/lib/data_grid/csv_exporter.rb +79 -0
  99. data/lib/data_grid/data_grid_logic.rb +175 -0
  100. data/lib/data_grid/data_source_array.rb +267 -0
  101. data/lib/data_grid/data_source_orm.rb +207 -0
  102. data/lib/data_grid/engine.rb +19 -0
  103. data/lib/data_grid/summaries.rb +34 -0
  104. data/lib/data_grid/version.rb +3 -0
  105. data/lib/data_grid/view_helpers.rb +271 -0
  106. data/lib/data_grid.rb +43 -0
  107. data/lib/generators/data_grid/copy_view_generator.rb +16 -0
  108. data/lib/generators/data_grid/install_generator.rb +29 -0
  109. data/lib/generators/templates/data_grid.rb +29 -0
  110. data/lib/generators/templates/stylesheets/data_grid/data_grid_3_0.css +90 -0
  111. data/spec/orm_spec.rb +57 -0
  112. data/spec/spec_helper.rb +15 -0
  113. data/spec/support/active_record.rb +17 -0
  114. 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 = '&nbsp;'
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
@@ -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