data_grid 0.0.1 → 0.0.2

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.
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