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,236 @@
1
+ /* Distributed as part of The Coolest DHTML Calendar
2
+ Author: Mihai Bazon, www.bazon.net/mishoo
3
+ Copyright Dynarch.com 2005, www.dynarch.com
4
+ */
5
+
6
+ /* The main calendar widget. DIV containing a table. */
7
+
8
+ div.calendar { position: relative; }
9
+
10
+ .calendar, .calendar table {
11
+ border: 1px solid #bdb2bf;
12
+ font-size: 11px;
13
+ color: #000;
14
+ cursor: default;
15
+ background: url("normal-bg.gif");
16
+ font-family: "trebuchet ms",verdana,tahoma,sans-serif;
17
+ }
18
+
19
+ .calendar {
20
+ border-color: #797979;
21
+ }
22
+
23
+ /* Header part -- contains navigation buttons and day names. */
24
+
25
+ .calendar .button { /* "<<", "<", ">", ">>" buttons have this class */
26
+ text-align: center; /* They are the navigation buttons */
27
+ padding: 2px; /* Make the buttons seem like they're pressing */
28
+ background: url("title-bg.gif") repeat-x 0 100%; color: #000;
29
+ font-weight: bold;
30
+ }
31
+
32
+ .calendar .nav {
33
+ font-family: verdana,tahoma,sans-serif;
34
+ }
35
+
36
+ .calendar .nav div {
37
+ background: transparent url("menuarrow.gif") no-repeat 100% 100%;
38
+ }
39
+
40
+ .calendar thead tr { background: url("title-bg.gif") repeat-x 0 100%; color: #000; }
41
+
42
+ .calendar thead .title { /* This holds the current "month, year" */
43
+ font-weight: bold; /* Pressing it will take you to the current date */
44
+ text-align: center;
45
+ padding: 2px;
46
+ background: url("title-bg.gif") repeat-x 0 100%; color: #000;
47
+ }
48
+
49
+ .calendar thead .headrow { /* Row <TR> containing navigation buttons */
50
+ }
51
+
52
+ .calendar thead .name { /* Cells <TD> containing the day names */
53
+ border-bottom: 1px solid #797979;
54
+ padding: 2px;
55
+ text-align: center;
56
+ color: #000;
57
+ }
58
+
59
+ .calendar thead .weekend { /* How a weekend day name shows in header */
60
+ color: #c44;
61
+ }
62
+
63
+ .calendar thead .hilite { /* How do the buttons in header appear when hover */
64
+ background: url("hover-bg.gif");
65
+ border-bottom: 1px solid #797979;
66
+ padding: 2px 2px 1px 2px;
67
+ }
68
+
69
+ .calendar thead .active { /* Active (pressed) buttons in header */
70
+ background: url("active-bg.gif"); color: #fff;
71
+ padding: 3px 1px 0px 3px;
72
+ border-bottom: 1px solid #797979;
73
+ }
74
+
75
+ .calendar thead .daynames { /* Row <TR> containing the day names */
76
+ background: url("dark-bg.gif");
77
+ }
78
+
79
+ /* The body part -- contains all the days in month. */
80
+
81
+ .calendar tbody .day { /* Cells <TD> containing month days dates */
82
+ font-family: verdana,tahoma,sans-serif;
83
+ width: 2em;
84
+ color: #000;
85
+ text-align: right;
86
+ padding: 2px 4px 2px 2px;
87
+ }
88
+ .calendar tbody .day.othermonth {
89
+ font-size: 80%;
90
+ color: #999;
91
+ }
92
+ .calendar tbody .day.othermonth.oweekend {
93
+ color: #f99;
94
+ }
95
+
96
+ .calendar table .wn {
97
+ padding: 2px 3px 2px 2px;
98
+ border-right: 1px solid #797979;
99
+ background: url("dark-bg.gif");
100
+ }
101
+
102
+ .calendar tbody .rowhilite td,
103
+ .calendar tbody .rowhilite td.wn {
104
+ background: url("rowhover-bg.gif");
105
+ }
106
+
107
+ .calendar tbody td.today { font-weight: bold; /* background: url("today-bg.gif") no-repeat 70% 50%; */ }
108
+
109
+ .calendar tbody td.hilite { /* Hovered cells <TD> */
110
+ background: url("hover-bg.gif");
111
+ padding: 1px 3px 1px 1px;
112
+ border: 1px solid #bbb;
113
+ }
114
+
115
+ .calendar tbody td.active { /* Active (pressed) cells <TD> */
116
+ padding: 2px 2px 0px 2px;
117
+ }
118
+
119
+ .calendar tbody td.weekend { /* Cells showing weekend days */
120
+ color: #c44;
121
+ }
122
+
123
+ .calendar tbody td.selected { /* Cell showing selected date */
124
+ font-weight: bold;
125
+ border: 1px solid #797979;
126
+ padding: 1px 3px 1px 1px;
127
+ background: url("active-bg.gif"); color: #fff;
128
+ }
129
+
130
+ .calendar tbody .disabled { color: #999; }
131
+
132
+ .calendar tbody .emptycell { /* Empty cells (the best is to hide them) */
133
+ visibility: hidden;
134
+ }
135
+
136
+ .calendar tbody .emptyrow { /* Empty row (some months need less than 6 rows) */
137
+ display: none;
138
+ }
139
+
140
+ /* The footer part -- status bar and "Close" button */
141
+
142
+ .calendar tfoot .footrow { /* The <TR> in footer (only one right now) */
143
+ text-align: center;
144
+ background: #565;
145
+ color: #fff;
146
+ }
147
+
148
+ .calendar tfoot .ttip { /* Tooltip (status bar) cell <TD> */
149
+ padding: 2px;
150
+ background: url("status-bg.gif") repeat-x 0 0; color: #000;
151
+ }
152
+
153
+ .calendar tfoot .hilite { /* Hover style for buttons in footer */
154
+ background: #afa;
155
+ border: 1px solid #084;
156
+ color: #000;
157
+ padding: 1px;
158
+ }
159
+
160
+ .calendar tfoot .active { /* Active (pressed) style for buttons in footer */
161
+ background: #7c7;
162
+ padding: 2px 0px 0px 2px;
163
+ }
164
+
165
+ /* Combo boxes (menus that display months/years for direct selection) */
166
+
167
+ .calendar .combo {
168
+ position: absolute;
169
+ display: none;
170
+ top: 0px;
171
+ left: 0px;
172
+ width: 4em;
173
+ cursor: default;
174
+ border-width: 0 1px 1px 1px;
175
+ border-style: solid;
176
+ border-color: #797979;
177
+ background: url("normal-bg.gif"); color: #000;
178
+ z-index: 100;
179
+ font-size: 90%;
180
+ }
181
+
182
+ .calendar .combo .label,
183
+ .calendar .combo .label-IEfix {
184
+ text-align: center;
185
+ padding: 1px;
186
+ }
187
+
188
+ .calendar .combo .label-IEfix {
189
+ width: 4em;
190
+ }
191
+
192
+ .calendar .combo .hilite {
193
+ background: url("hover-bg.gif"); color: #000;
194
+ }
195
+
196
+ .calendar .combo .active {
197
+ background: url("active-bg.gif"); color: #fff;
198
+ font-weight: bold;
199
+ }
200
+
201
+ .calendar td.time {
202
+ border-top: 1px solid #797979;
203
+ padding: 1px 0px;
204
+ text-align: center;
205
+ background: url("dark-bg.gif");
206
+ }
207
+
208
+ .calendar td.time .hour,
209
+ .calendar td.time .minute,
210
+ .calendar td.time .ampm {
211
+ padding: 0px 5px 0px 6px;
212
+ font-weight: bold;
213
+ background: url("normal-bg.gif"); color: #000;
214
+ }
215
+
216
+ .calendar td.time .hour,
217
+ .calendar td.time .minute {
218
+ font-family: monospace;
219
+ }
220
+
221
+ .calendar td.time .ampm {
222
+ text-align: center;
223
+ }
224
+
225
+ .calendar td.time .colon {
226
+ padding: 0px 2px 0px 3px;
227
+ font-weight: bold;
228
+ }
229
+
230
+ .calendar td.time span.hilite {
231
+ background: url("hover-bg.gif"); color: #000;
232
+ }
233
+
234
+ .calendar td.time span.active {
235
+ background: url("active-bg.gif"); color: #fff;
236
+ }
@@ -0,0 +1,101 @@
1
+ <div class="data_grid">
2
+ <table class="data_grid" width="99%" cellpadding="0" cellspacing="0">
3
+ <tbody>
4
+ <tr>
5
+ <% data_grid.columns.each do |col| %>
6
+ <th class="<%= col.filter_active? ? "filter" : '' %>">
7
+ <%= data_grid_header(data_grid, col) %>
8
+ </th>
9
+ <% end %>
10
+ </tr>
11
+
12
+ <% if data_grid.filters? %>
13
+ <tr class="filters">
14
+ <% data_grid.columns.each do |col| %>
15
+ <td class="<%= col.filter_active? ? "filter" : '' %>">
16
+ <%= data_grid_filter(data_grid, col) %>
17
+ </td>
18
+ <% end %>
19
+ </tr>
20
+ <% end %>
21
+
22
+ <% if data_grid.out_data.empty? %>
23
+ <tr>
24
+ <td colspan="<%= data_grid.columns.size %>" class="grid_no_data data_grid_row">
25
+ <br />
26
+ <%= t('data_grid.no_data') %>
27
+ <br />
28
+ <br />
29
+ </td>
30
+ </tr>
31
+ <% else %>
32
+ <% data_grid.out_data.each_with_index do |row, row_index| %>
33
+ <tr>
34
+ <% data_grid.columns.each_with_index do |col, col_index| %>
35
+ <% cell = row[col_index].is_a?(Array) ? row[col_index][0] : row[col_index] %>
36
+ <td class="<%= (row_index.odd? ? "odd " : '') + (col.css_class).to_s + ' data_grid_row' %>" style="<%= col.style ? "#{(data_grid.row_styles[row_index].to_s if data_grid.row_styles).to_s + ';' + col.style}" : data_grid.row_styles ? "#{data_grid.row_styles[row_index]}" : '' %>">
37
+ <%= col.formatter ? send("data_grid_formatter_#{col.formatter}", cell) : cell %>
38
+ </td>
39
+ <% end %>
40
+ </tr>
41
+ <% unless data_grid.hidden_row.nil? %>
42
+ <tr>
43
+ <td colspan="<%= data_grid.columns.size %>">
44
+ <%= data_grid.out_hidden_rows[row_index] %>
45
+ </td>
46
+ </tr>
47
+ <% end %>
48
+ <% end %>
49
+ <% end %>
50
+
51
+ <% if data_grid.summary? %>
52
+ <tr class="summary">
53
+ <% data_grid.columns.each_with_index do |col, col_index| %>
54
+ <td>
55
+ <%= col.summary_formatter ? send("data_grid_formatter_#{col.summary_formatter}", data_grid.summaries[col_index].to_s) : data_grid.summaries[col_index].to_s %>
56
+ </td>
57
+ <% end %>
58
+ </tr>
59
+ <% end %>
60
+
61
+ <% if data_grid.global_summary? %>
62
+ <tr class="summary">
63
+ <% data_grid.columns.each_with_index do |col, col_index| %>
64
+ <td>
65
+ <%= col.summary_formatter ? send("data_grid_formatter_#{col.summary_formatter}", data_grid.global_summaries[col_index].to_s) : data_grid.global_summaries[col_index].to_s %>
66
+ </td>
67
+ <% end %>
68
+ </tr>
69
+ <% end %>
70
+
71
+ <% if data_grid.footer? %>
72
+ <tfoot>
73
+ <tr>
74
+ <td colspan="<%= data_grid.columns.size + 1 %>">
75
+ <div class="data_grid_fl">
76
+ <%= t('data_grid.results') %>:
77
+ <%= data_grid.entries_from %>
78
+ -
79
+ <%= data_grid.entries_to %>
80
+ /
81
+ <%= data_grid.total %>
82
+ </div>
83
+ <% if data_grid.export_enabled %>
84
+ <div class="data_grid_fl data_grid_lmargin">
85
+ <%= data_grid_export_link(data_grid) %>
86
+ </div>
87
+ <% end %>
88
+ <div class="data_grid_fr">
89
+ <%= t('data_grid.per_page') %>:
90
+ <%= data_grid_per_page_selector(data_grid) %>
91
+ </div>
92
+ <div class="pagination data_grid_fr">
93
+ <%= data_grid_pager(data_grid) %>
94
+ </div>
95
+ </td>
96
+ </tr>
97
+ </tfoot>
98
+ <% end %>
99
+ </tbody>
100
+ </table>
101
+ </div>
@@ -0,0 +1,10 @@
1
+ en:
2
+ data_grid:
3
+ no_data: No data ...
4
+ results: Results
5
+ per_page: Per page
6
+ filter_date_from: From
7
+ filter_date_to: To
8
+ all_options: All
9
+ option_true: 'Yes'
10
+ option_false: 'No'
data/data_grid.gemspec ADDED
@@ -0,0 +1,27 @@
1
+ # -*- encoding: utf-8 -*-
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'data_grid/version'
5
+
6
+ Gem::Specification.new do |gem|
7
+ gem.name = "data_grid"
8
+ gem.version = DataGrid::VERSION
9
+ gem.authors = ["Krzysztof Kempiński"]
10
+ gem.email = ["kkempin@gmail.com"]
11
+ gem.description = %q{This gem generates configurable grids for Rails applications}
12
+ gem.summary = %q{data grid tool for Rails applications}
13
+ gem.homepage = "https://github.com/kkempin/data_grid"
14
+
15
+ gem.required_rubygems_version = ">= 1.3.6"
16
+ gem.add_dependency "rails", ">= 3.0"
17
+ gem.add_dependency "fastercsv"
18
+ gem.add_development_dependency "bundler", ">= 1.0.0"
19
+ gem.add_development_dependency "rspec", "~> 2.6"
20
+ gem.add_development_dependency "rspec-rails"
21
+ gem.add_development_dependency "sqlite3"
22
+
23
+ gem.files = `git ls-files`.split($/)
24
+ gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
25
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
26
+ gem.require_paths = ["lib"]
27
+ end
@@ -0,0 +1,38 @@
1
+ # Class Column used to define colums in DataGrid
2
+
3
+ module DataGrid
4
+ class Column
5
+
6
+ attr_accessor :field, :title, :sortable, :sort_by, :filter, :filter_data, :filter_value, :filter_by, :style, :summary, :summary_formatter, :formatter, :hide_in_export, :css_class, :global_summary, :auto_filter_hash
7
+
8
+ def initialize(column_field, attrs = {})
9
+ self.sortable = attrs[:sortable] || DataGrid.column_sortable
10
+ self.title = attrs[:title]
11
+ self.field = column_field
12
+ self.sort_by = attrs[:sort_by] || self.field
13
+ self.filter = attrs[:filter]
14
+ self.filter_data = []
15
+ self.style = attrs[:style]
16
+ self.summary = attrs[:summary]
17
+ self.global_summary = attrs[:global_summary]
18
+ self.summary_formatter = attrs[:summary_formatter] || DataGrid.column_summary_formatter
19
+ self.formatter = attrs[:formatter]
20
+ self.filter_by = attrs[:filter_by] || self.field
21
+ self.hide_in_export = attrs[:hide_in_export] || false
22
+ self.css_class = attrs[:css_class] || ''
23
+ self.auto_filter_hash = attrs[:auto_filter_hash]
24
+ end
25
+
26
+ def sort_field
27
+ if self.field.class == Symbol
28
+ return self.sort_by ? self.sort_by : self.field
29
+ else
30
+ return self.sort_by
31
+ end
32
+ end
33
+
34
+ def filter_active?
35
+ !self.filter_value.to_s.split(DataGrid.range_separator).first.blank?
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,30 @@
1
+ module DataGrid
2
+ module Controller
3
+ extend ActiveSupport::Concern
4
+
5
+ def prepare_grid(&block)
6
+ # Build logic object
7
+ data_grid = DataGrid::DataGridLogic.new(:params => params)
8
+ block.call(data_grid)
9
+
10
+ # Restore state
11
+ if data_grid.state_saver and DataGrid.state_saver_method
12
+ require "data_grid/#{DataGrid.state_saver_method}_state_saver"
13
+ self.restore_state(data_grid)
14
+ end
15
+
16
+ # Get and save data from params
17
+ data_grid.get_params_from_request
18
+ self.save_state(data_grid) if data_grid.state_saver
19
+
20
+ # Export on demand
21
+ if data_grid.export_enabled and params["export_#{data_grid.name}"]
22
+ require "data_grid/#{params["export_#{data_grid.name}"]}_exporter"
23
+ self.export(data_grid, data_grid.export_filename)
24
+ end
25
+
26
+ data_grid
27
+ end
28
+
29
+ end
30
+ end
@@ -0,0 +1,42 @@
1
+ # State consists of actual per_page, page, sort, sort direction of DataGrid
2
+
3
+ module DataGrid
4
+ module Controller
5
+
6
+ STATE_KEYS = [:per_page, :page, :sort, :sort_direction]
7
+
8
+ # Save grid state in cookies
9
+ def save_state(data_grid)
10
+ cookies["data_grid_state_#{data_grid.name}"] ||= {}
11
+
12
+ state = {}
13
+ STATE_KEYS.each do |key|
14
+ state[key] = data_grid.send(key)
15
+ end
16
+
17
+ data_grid.columns.each_with_index do |col, col_index|
18
+ state[:columns] ||= {}
19
+ state[:columns][col_index] = col.filter_value
20
+ end
21
+
22
+ cookies["data_grid_state_#{data_grid.name}"] = Marshal.dump(state)
23
+ end
24
+
25
+ # Restore state from cookies
26
+ def restore_state(data_grid)
27
+ if cookies["data_grid_state_#{data_grid.name}"]
28
+ state = Marshal.load(cookies["data_grid_state_#{data_grid.name}"])
29
+ STATE_KEYS.each do |key|
30
+ data_grid.send("#{key}=", state[key])
31
+ end
32
+
33
+ if state[:columns]
34
+ state[:columns].each_pair do |k, v|
35
+ data_grid.columns[k.to_i].filter_value = v if data_grid.columns[k.to_i]
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
42
+
@@ -0,0 +1,79 @@
1
+ # Module used to export data to CSV
2
+
3
+ class CsvContent
4
+ include ActionView::Helpers::TagHelper
5
+ include ActionView::Helpers::FormTagHelper
6
+
7
+ def image_tag name, options = nil
8
+ ''
9
+ end
10
+
11
+ def link_to name, options=nil, extra=nil
12
+ name
13
+ end
14
+
15
+ def raw s=''
16
+ s.to_s.gsub('<br />', ', ')
17
+ end
18
+ end
19
+
20
+
21
+ module DataGrid
22
+ module Controller
23
+ # Do CSV export
24
+ def export(data_grid, filename = DataGrid.export_filename)
25
+ require 'csv'
26
+
27
+ if request.env['HTTP_USER_AGENT'] =~ /msie/i
28
+ headers['Pragma'] = 'public'
29
+ headers["Content-type"] = "text/plain; charset=utf-8; header=present"
30
+ headers['Cache-Control'] = 'no-cache, must-revalidate, post-check=0, pre-check=0'
31
+ headers['Content-Disposition'] = "attachment; filename=\"#{filename}\""
32
+ headers['Expires'] = "0"
33
+ else
34
+ headers["Content-Type"] ||= 'text/csv; charset=utf-8; header=present'
35
+ headers["Content-Disposition"] = "attachment; filename=\"#{filename}\""
36
+ end
37
+ data_grid.view_context = CsvContent.new
38
+ data_grid.prepare_data
39
+
40
+ csv_string = CSV.generate(:col_sep => ';') do |csv|
41
+ hide_column_indexes = []
42
+ cols = []
43
+ data_grid.columns.each_with_index do |col, i|
44
+ if col.hide_in_export
45
+ hide_column_indexes << i
46
+ else
47
+ cols << col.title
48
+ end
49
+ end
50
+ csv << cols
51
+ data_grid.out_data.each_with_index do |row, row_index|
52
+ data_row = []
53
+ row.each_with_index do |row_col, i|
54
+ next if (!data_grid.hidden_row.nil? and i == row.size-1)
55
+ unless hide_column_indexes.include?(i)
56
+ data_row << ((row_col.class == ActiveSupport::SafeBuffer) ? row_col.to_s.gsub(/<\/?[^>]*>/, "") : (row_col.class == String) ? row_col.gsub(/<\/?[^>]*>/, "") : row_col)
57
+ end
58
+ end
59
+ unless data_grid.hidden_row.nil?
60
+ data_row << data_grid.out_hidden_rows[row_index]
61
+ end
62
+ csv << data_row
63
+ end
64
+
65
+ if data_grid.summary?
66
+ data_row = []
67
+ data_grid.columns.each_with_index {|col, i|
68
+ data_row << data_grid.summaries[i].to_s unless hide_column_indexes.include?(i)
69
+ }
70
+ csv << data_row
71
+ end
72
+
73
+ end
74
+
75
+ render :text => csv_string
76
+ end
77
+ end
78
+ end
79
+