compass-jquery-plugin 0.3.0.beta.21 → 0.3.0.beta.22

Sign up to get free protection for your applications and to get access to all the features.
Files changed (130) hide show
  1. data/README.textile +212 -211
  2. data/VERSION.yml +5 -5
  3. data/compass-jquery-plugin.gemspec +25 -2
  4. data/gem_tasks/jqtouch.rake +221 -201
  5. data/gem_tasks/jrails.rake +322 -311
  6. data/lib/compiler.jar +0 -0
  7. data/lib/jquery/flash_messages.rb +45 -45
  8. data/lib/jquery/gridify/grid.rb +147 -147
  9. data/lib/jquery/gridify/grid_column.rb +134 -134
  10. data/lib/jquery/gridify/grid_finder.rb +223 -211
  11. data/lib/jquery/gridify/grid_options.rb +279 -279
  12. data/lib/jquery/gridify/grid_view.rb +435 -436
  13. data/lib/jquery/gridify.rb +42 -42
  14. data/templates/dynatree/jquery.dynatree.min.js +1 -1
  15. data/templates/jqgrid/i18n/jqgrid/locale-bg.min.js +6 -15
  16. data/templates/jqgrid/i18n/jqgrid/locale-bg1251.min.js +6 -15
  17. data/templates/jqgrid/i18n/jqgrid/locale-cat.min.js +5 -6
  18. data/templates/jqgrid/i18n/jqgrid/locale-cn.min.js +5 -8
  19. data/templates/jqgrid/i18n/jqgrid/locale-cs.min.js +6 -8
  20. data/templates/jqgrid/i18n/jqgrid/locale-da.min.js +6 -6
  21. data/templates/jqgrid/i18n/jqgrid/locale-de.min.js +7 -7
  22. data/templates/jqgrid/i18n/jqgrid/locale-el.min.js +7 -13
  23. data/templates/jqgrid/i18n/jqgrid/locale-es.min.js +7 -7
  24. data/templates/jqgrid/i18n/jqgrid/locale-fa.min.js +6 -12
  25. data/templates/jqgrid/i18n/jqgrid/locale-fr.min.js +7 -7
  26. data/templates/jqgrid/i18n/jqgrid/locale-gl.min.js +7 -7
  27. data/templates/jqgrid/i18n/jqgrid/locale-he.min.js +6 -13
  28. data/templates/jqgrid/i18n/jqgrid/locale-hu.min.js +6 -8
  29. data/templates/jqgrid/i18n/jqgrid/locale-is.min.js +6 -7
  30. data/templates/jqgrid/i18n/jqgrid/locale-it.min.js +4 -4
  31. data/templates/jqgrid/i18n/jqgrid/locale-ja.min.js +5 -10
  32. data/templates/jqgrid/i18n/jqgrid/locale-no.min.js +6 -6
  33. data/templates/jqgrid/i18n/jqgrid/locale-pl.min.js +6 -7
  34. data/templates/jqgrid/i18n/jqgrid/locale-pt-br.min.js +6 -7
  35. data/templates/jqgrid/i18n/jqgrid/locale-pt.min.js +4 -5
  36. data/templates/jqgrid/i18n/jqgrid/locale-ro.min.js +7 -8
  37. data/templates/jqgrid/i18n/jqgrid/locale-ru.min.js +7 -16
  38. data/templates/jqgrid/i18n/jqgrid/locale-sk.min.js +6 -8
  39. data/templates/jqgrid/i18n/jqgrid/locale-sv.min.js +6 -7
  40. data/templates/jqgrid/i18n/jqgrid/locale-tr.min.js +6 -7
  41. data/templates/jqgrid/i18n/jqgrid/locale-ua.min.js +7 -16
  42. data/templates/jqgrid/jquery.jqGrid.js +11567 -11565
  43. data/templates/jqgrid/jquery.jqGrid.min.js +472 -472
  44. data/templates/jqical/jquery.jqical.js +5 -9
  45. data/templates/jqical/jquery.jqical.min.js +44 -44
  46. data/templates/jqical/jquery.ui/jqical.scss +1 -1
  47. data/templates/jqtouch/config/initializers/jqtouch.rb +5 -4
  48. data/templates/jqtouch/jqtouch/apple/activeButton.png +0 -0
  49. data/templates/jqtouch/jqtouch/default/backButton.png +0 -0
  50. data/templates/jqtouch/jqtouch/default/backButtonActive.png +0 -0
  51. data/templates/jqtouch/jqtouch/default/bigButton.png +0 -0
  52. data/templates/jqtouch/jqtouch/default/bigButtonActive.png +0 -0
  53. data/templates/jqtouch/jqtouch/default/button.png +0 -0
  54. data/templates/jqtouch/jqtouch/default/buttonActive.png +0 -0
  55. data/templates/jqtouch/jqtouch/default/chevron.png +0 -0
  56. data/templates/jqtouch/jqtouch/default/chevronActive.png +0 -0
  57. data/templates/jqtouch/jqtouch/default/chevronCircle.png +0 -0
  58. data/templates/jqtouch/jqtouch/default/chevronCircleActive.png +0 -0
  59. data/templates/jqtouch/jqtouch/default/loading.gif +0 -0
  60. data/templates/jqtouch/jqtouch/default/toggleSwitch.png +0 -0
  61. data/templates/jqtouch/jqtouch/default/toolbarBackground.png +0 -0
  62. data/templates/jqtouch/jqtouch/jqt/back_button_clicked.png +0 -0
  63. data/templates/jqtouch/jqtouch/jqt.apple.scss +24 -11
  64. data/templates/jqtouch/jqtouch/jqt.default.scss +537 -0
  65. data/templates/jqtouch/jqtouch/jqt.jqt.scss +20 -6
  66. data/templates/jqtouch/jqtouch/jqtouch.scss +173 -1
  67. data/templates/jqtouch/jqtouch/photo/btnBack.png +0 -0
  68. data/templates/jqtouch/jqtouch/photo/loading.gif +0 -0
  69. data/templates/jqtouch/jqtouch/photo/navNext.png +0 -0
  70. data/templates/jqtouch/jqtouch/photo/navPause.png +0 -0
  71. data/templates/jqtouch/jqtouch/photo/navPlay.png +0 -0
  72. data/templates/jqtouch/jqtouch/photo/navPrev.png +0 -0
  73. data/templates/jqtouch/jqtouch/photo/toolbar.png +0 -0
  74. data/templates/jqtouch/jquery.jqtouch.js +8219 -632
  75. data/templates/jqtouch/jquery.jqtouch.min.js +60 -1
  76. data/templates/jqtouch/manifest.rb +21 -0
  77. data/templates/jrails/config/initializers/jrails.rb +1 -0
  78. data/templates/jrails/haml.js +2 -2
  79. data/templates/jrails/i18n/jquery.ui/datepicker-ar.min.js +2 -4
  80. data/templates/jrails/i18n/jquery.ui/datepicker-az.min.js +2 -2
  81. data/templates/jrails/i18n/jquery.ui/datepicker-bg.min.js +2 -4
  82. data/templates/jrails/i18n/jquery.ui/datepicker-bs.min.js +2 -2
  83. data/templates/jrails/i18n/jquery.ui/datepicker-cs.min.js +2 -2
  84. data/templates/jrails/i18n/jquery.ui/datepicker-da.min.js +2 -2
  85. data/templates/jrails/i18n/jquery.ui/datepicker-de.min.js +2 -2
  86. data/templates/jrails/i18n/jquery.ui/datepicker-el.min.js +2 -4
  87. data/templates/jrails/i18n/jquery.ui/datepicker-eo.min.js +2 -2
  88. data/templates/jrails/i18n/jquery.ui/datepicker-et.min.js +2 -2
  89. data/templates/jrails/i18n/jquery.ui/datepicker-fa.min.js +2 -3
  90. data/templates/jrails/i18n/jquery.ui/datepicker-fo.min.js +2 -2
  91. data/templates/jrails/i18n/jquery.ui/datepicker-fr-CH.min.js +2 -2
  92. data/templates/jrails/i18n/jquery.ui/datepicker-fr.min.js +2 -2
  93. data/templates/jrails/i18n/jquery.ui/datepicker-he.min.js +2 -3
  94. data/templates/jrails/i18n/jquery.ui/datepicker-hr.min.js +2 -2
  95. data/templates/jrails/i18n/jquery.ui/datepicker-hu.min.js +2 -2
  96. data/templates/jrails/i18n/jquery.ui/datepicker-hy.min.js +2 -4
  97. data/templates/jrails/i18n/jquery.ui/datepicker-ja.min.js +2 -2
  98. data/templates/jrails/i18n/jquery.ui/datepicker-ko.min.js +2 -2
  99. data/templates/jrails/i18n/jquery.ui/datepicker-kz.min.js +2 -4
  100. data/templates/jrails/i18n/jquery.ui/datepicker-lt.min.js +2 -2
  101. data/templates/jrails/i18n/jquery.ui/datepicker-lv.min.js +2 -2
  102. data/templates/jrails/i18n/jquery.ui/datepicker-nl.min.js +2 -2
  103. data/templates/jrails/i18n/jquery.ui/datepicker-no.min.js +2 -2
  104. data/templates/jrails/i18n/jquery.ui/datepicker-pl.min.js +2 -2
  105. data/templates/jrails/i18n/jquery.ui/datepicker-ro.min.js +2 -2
  106. data/templates/jrails/i18n/jquery.ui/datepicker-ru.min.js +2 -4
  107. data/templates/jrails/i18n/jquery.ui/datepicker-sk.min.js +2 -2
  108. data/templates/jrails/i18n/jquery.ui/datepicker-sq.min.js +2 -2
  109. data/templates/jrails/i18n/jquery.ui/datepicker-sr-SR.min.js +2 -2
  110. data/templates/jrails/i18n/jquery.ui/datepicker-sr.min.js +2 -4
  111. data/templates/jrails/i18n/jquery.ui/datepicker-sv.min.js +2 -2
  112. data/templates/jrails/i18n/jquery.ui/datepicker-ta.min.js +2 -4
  113. data/templates/jrails/i18n/jquery.ui/datepicker-th.min.js +2 -4
  114. data/templates/jrails/i18n/jquery.ui/datepicker-tr.min.js +2 -2
  115. data/templates/jrails/i18n/jquery.ui/datepicker-uk.min.js +2 -4
  116. data/templates/jrails/i18n/jquery.ui/datepicker-vi.min.js +2 -2
  117. data/templates/jrails/i18n/jquery.ui/datepicker-zh-CN.min.js +2 -2
  118. data/templates/jrails/i18n/jquery.ui/datepicker-zh-HK.min.js +2 -2
  119. data/templates/jrails/i18n/jquery.ui/datepicker-zh-TW.min.js +2 -2
  120. data/templates/jrails/jquery-1.4.2.min.js +156 -156
  121. data/templates/jrails/jquery-ui-1.8.5.js +23753 -23341
  122. data/templates/jrails/jquery-ui-1.8.5.min.js +823 -808
  123. data/templates/jrails/jquery.contextMenu.min.js +1 -1
  124. data/templates/jrails/jquery.sparkline.js +1050 -0
  125. data/templates/jrails/jquery.sparkline.min.js +31 -0
  126. data/templates/jrails/jquery.ui/_theme.scss +1699 -1634
  127. data/templates/jrails/manifest.rb +13 -11
  128. data/templates/jstree/jquery.jstree.min.js +10 -10
  129. data/templates/ribbon/jquery.ribbon.min.js +6 -6
  130. metadata +27 -4
@@ -1,436 +1,435 @@
1
- # reference: http://github.com/ahe/2dc_jqgrid
2
-
3
- module Gridify
4
- class Grid
5
-
6
- # ----------------------
7
- # generate the grid javascript for a view
8
- # options:
9
- # :script => true generates <script> tag (true)
10
- # :ready => true generates jquery ready function (true)
11
- def to_javascript( options={} )
12
- options = { :script => true, :ready => true }.merge(options)
13
-
14
- s = ''
15
- if options[:script]
16
- s << %Q^
17
- <script type="text/javascript">
18
- var lastsel_#{dom_id};
19
- ^
20
- end
21
-
22
- s << js_helpers
23
-
24
- if options[:ready]
25
- s << %Q^
26
- jQuery(document).ready(function(){
27
- ^
28
- end
29
-
30
- s << jqgrid_javascript(options)
31
-
32
- if options[:ready]
33
- s << %Q^
34
- });
35
- ^
36
- end
37
- if options[:script]
38
- s << %Q^
39
- </script>
40
- ^
41
- end
42
- s
43
- end
44
-
45
- def to_json
46
- jqgrid_properties.to_json_with_js
47
- end
48
-
49
- # alias :to_s, :to_javascript
50
- def to_s( options={} )
51
- to_javascript( options )
52
- end
53
-
54
- # ------------------
55
- protected
56
- # ------------------
57
-
58
- # //{ url: '/notes/{id}', mtype: 'PUT', reloadAfterSubmit: false, closeAfterEdit: true }, // edit settings
59
- # //{ url: '/notes', mtype: 'POST', reloadAfterSubmit: false, closeAfterEdit: true }, // add settings
60
- # //{ url: '/notes/{id}', mtype: 'DELETE', reloadAfterSubmit: false }, // delete settings
61
-
62
- # get the button options
63
- def edit_button_options
64
- # 'url' => '/notes/{id}', 'mtype' => 'PUT'
65
- # {afterSubmit:function(r,data){return #{options[:error_handler_return_value]}(r,data,'edit');}},
66
-
67
- # note, closeAfterEdit will not close if response returns a non-empty string (even if "success" message)
68
- merge_options_defaults( edit_button || inline_edit,
69
- 'reloadAfterSubmit' => true,
70
- 'closeAfterEdit' => true,
71
- 'afterSubmit' => "javascript: function(r,data){return #{error_handler_return_value}(r,data,'edit');}"
72
- )
73
- end
74
-
75
- def add_button_options
76
- # 'url' => '/notes', 'mtype' => 'POST'
77
- merge_options_defaults( add_button,
78
- 'reloadAfterSubmit' => true,
79
- 'closeAfterAdd' => true,
80
- 'afterSubmit' => "javascript: function(r,data){return #{error_handler_return_value}(r,data,'add');}"
81
- )
82
- end
83
-
84
- def delete_button_options
85
- # 'url' => '/notes/{id}', 'mtype' => 'DELETE'
86
- merge_options_defaults( delete_button,
87
- 'reloadAfterSubmit' => true,
88
- 'afterSubmit' => "javascript: function(r,data){return #{error_handler_return_value}(r,data,'delete');}"
89
- )
90
- end
91
-
92
- def search_button_options
93
- if search_advanced
94
- merge_options_defaults( search_advanced, 'multipleSearch' => true)
95
- else
96
- merge_options_defaults( search_button)
97
- end
98
- end
99
-
100
- def view_button_options
101
- merge_options_defaults( view_button)
102
- end
103
-
104
- # generate the jqGrid initial values in json
105
- # maps our attributes to jqGrid options; omit values when same as jqGrid defaults
106
- def jqgrid_properties
107
- vals = {}
108
- vals[:ajaxGridOptions] = ajax_grid_options if ajax_grid_options
109
-
110
- # data and request options
111
- vals[:url] = url if url
112
- vals[:editurl] = url if editable
113
- vals[:restful] = true if restful
114
- vals[:inline_edit] = inline_edit if inline_edit.present?
115
- vals[:postData] = { :grid => name, :datatype => data_type } #identify which grid making the request
116
- vals[:colNames] = colNames if colNames.present?
117
- vals[:colModel] = column_model if colModel.present?
118
- #vals[:colModel] = colModel if colModel.present?
119
- vals[:datatype] = data_type if data_type
120
- if data_format.present?
121
- case data_type
122
- when :xml
123
- vals[:xmlReader] = data_format
124
- when :json
125
- vals[:jsonReader] = data_format
126
- end
127
- end
128
-
129
- vals[:loadonce] = load_once if load_once
130
-
131
- vals[:sortname] = sort_by if sort_by
132
- vals[:sortorder] = sort_order if sort_order && sort_by
133
- vals[:rowNum] = rows_per_page if rows_per_page
134
- vals[:rowTotal] = total_rows if total_rows
135
- vals[:page] = current_page if current_page
136
-
137
- # grid options
138
- vals[:height] = height if height
139
- vals[:gridview] = grid_view # faster views, NOTE theres cases when this needs to be disabled
140
-
141
- case width_fit
142
- when :fitted
143
- #vals[:autowidth] = false #default
144
- #vals[:shrinkToFit] = true #default
145
- vals[:forceFit] = true
146
- vals[:width] = width if width
147
-
148
- when :scroll
149
- #vals[:autowidth] = false #default
150
- vals[:shrinkToFit] = false
151
- #vals[:forceFit] = #ignored by jqGrid
152
- vals[:width] = width if width
153
-
154
- else #when :fluid
155
- vals[:autowidth] = true
156
- #vals[:shrinkToFit] = true #default
157
- vals[:forceFit] = true
158
- #vals[:width] = is ignored
159
- vals[:resizeStop] = 'javascript: gridify_fluid_recalc_width'
160
- end
161
-
162
- vals[:sortable] = true if arranger_type.include?(:sortable)
163
-
164
- # header layer
165
- vals[:caption] = title if title
166
- vals[:hidegrid] = false unless collapsible
167
- vals[:hiddengrid] = true if collapsed
168
-
169
- # row formatting
170
- vals[:altrows] = true if alt_rows
171
- vals[:altclass] = alt_rows if alt_rows.is_a?(String)
172
-
173
- vals[:rownumbers] = true if row_numbers
174
- vals[:rownumWidth] = row_numbers if row_numbers.is_a?(Numeric)
175
-
176
- if inline_edit
177
- vals[:scrollrows] = true
178
- vals[:multiselect] = true if multi_select
179
- vals[:onSelectRow] = "javascript: function(id, status) { if(id && id!==lastsel_#{dom_id}) { jQuery('##{dom_id}').jqGrid('restoreRow', lastsel_#{dom_id}); jQuery('##{dom_id}').jqGrid('editRow', id, true, #{inline_edit_handler}, #{error_handler}); lastsel_#{dom_id}=id}}"
180
- elsif select_rows #.present?
181
- vals[:scrollrows] = true
182
- vals[:onSelectRow] = select_rows
183
- vals[:multiselect] = true if multi_select
184
- else
185
- vals[:hoverrows] = false
186
- vals[:beforeSelectRow] = "javascript: function(){ false; }"
187
- end
188
-
189
- # pager layer
190
- if pager
191
- vals[:pager] = "##{pager}"
192
- vals[:viewrecords] = true # display total records in the query (eg "1 - 10 of 25")
193
- vals[:rowList] = paging_choices
194
- if paging_controls.is_a?(Hash)
195
- # allow override of jqGrid pager options
196
- vals.merge!(paging_controls)
197
- elsif !paging_controls
198
- vals[:rowList] = []
199
- vals[:pgbuttons] = false
200
- vals[:pginput] = false
201
- vals[:recordtext] = "{2} records"
202
- end
203
- end
204
-
205
- #subgrid
206
- if sub_grid
207
- vals[:subGrid] = sub_grid
208
- vals[:subGridUrl] = sub_grid_url
209
- vals[:subGridModel] = sub_grid_model
210
- vals[:gridview] = false
211
- end
212
-
213
- #events
214
- #vals[:serializeGridData] = serialize_grid_data if serialize_grid_data
215
-
216
- vals[:loadonce] = load_once if load_once
217
-
218
- # allow override of native jqGrid options
219
- vals.merge(jqgrid_options)
220
-
221
-
222
- end
223
-
224
- # -----------------
225
- def jqgrid_javascript( options={} )
226
- s = ''
227
-
228
- if table_to_grid
229
- s << %Q^
230
- tableToGrid("##{dom_id}", #{to_json});
231
- ^
232
- s << %Q^
233
- grid_#{dom_id} = jQuery("##{dom_id}")
234
- ^
235
- else
236
- s << %Q^
237
- grid_#{dom_id} = jQuery("##{dom_id}").jqGrid(#{to_json})
238
- ^
239
- end
240
-
241
- s << ';'
242
-
243
- # tag the grid as fluid so we can find it on resize events
244
- if width_fit == :fluid
245
- s << %Q^
246
- jQuery("##{dom_id}").addClass("fluid");
247
- ^
248
- end
249
-
250
- # override tableToGrid colmodel options as needed (sortable)
251
- #s << %Q^ .jqGrid('setColProp','Title',{sortable: false})^
252
-
253
- # resize method
254
- if resizable
255
- s << %Q^
256
- jQuery("##{dom_id}").jqGrid('gridResize', #{resizable.to_json});
257
- ^
258
- end
259
-
260
- # pager buttons (navGrid)
261
- if pager
262
- nav_params = {
263
- 'edit' => edit_button.present?,
264
- 'add' => add_button.present?,
265
- 'del' => delete_button.present?,
266
- 'search' => search_button.present? || search_advanced.present?,
267
- 'view' => view_button.present?,
268
- 'refresh' => refresh_button.present?
269
- }.merge(jqgrid_nav_options||{})
270
-
271
- s << %Q^
272
- jQuery("##{dom_id}").jqGrid('navGrid', '##{pager}',
273
- #{nav_params.to_json},
274
- #{edit_button_options.to_json_with_js},
275
- #{add_button_options.to_json_with_js},
276
- #{delete_button_options.to_json_with_js},
277
- #{search_button_options.to_json_with_js},
278
- #{view_button_options.to_json_with_js}
279
- );
280
- ^
281
- end
282
-
283
- if arranger_type.include?(:hide_show)
284
- s << %Q^
285
- jQuery("##{dom_id}").jqGrid('navButtonAdd','##{pager}',{
286
- caption: "Columns",
287
- title: "Hide/Show Columns",
288
- onClickButton : function (){ jQuery("##{dom_id}").jqGrid('setColumns',
289
- #{arranger_options(:hide_show).to_json_with_js} );
290
- }
291
- });
292
- ^
293
- end
294
- if arranger_type.include?(:chooser)
295
- # hackey way to build the string but gets it done
296
- chooser_code = %Q^ function (){ jQuery('##{dom_id}').jqGrid('columnChooser', {
297
- done : function (perm) {
298
- if (perm) {
299
- this.jqGrid('remapColumns', perm, true);
300
- var gwdth = this.jqGrid('getGridParam','width');
301
- this.jqGrid('setGridWidth',gwdth);
302
- }
303
- } })}^
304
- chooser_opts = {
305
- 'caption' => 'Columns',
306
- 'title' => 'Arrange Columns',
307
- 'onClickButton' => 'chooser_code'
308
- }.merge(arranger_options(:chooser))
309
- s << %Q^
310
- jQuery("##{dom_id}").jqGrid('navButtonAdd','##{pager}', #{chooser_opts.to_json.gsub('"chooser_code"', chooser_code)} );
311
- ^
312
- end
313
-
314
- if search_toolbar
315
- # I wish we could put this in the header rather than the pager
316
- s << %Q^
317
- jQuery("##{dom_id}").jqGrid('navButtonAdd',"##{pager}", { caption:"Toggle", title:"Toggle Search Toolbar", buttonicon: 'ui-icon-pin-s', onClickButton: function(){ grid_#{dom_id}[0].toggleToolbar() } });
318
- jQuery("##{dom_id}").jqGrid('navButtonAdd',"##{pager}", { caption:"Clear", title:"Clear Search", buttonicon: 'ui-icon-refresh', onClickButton: function(){ grid_#{dom_id}[0].clearToolbar() } });
319
- jQuery("##{dom_id}").jqGrid('filterToolbar');
320
- ^
321
- end
322
-
323
- if sortable_rows
324
- # I wish we could put this in the header rather than the pager
325
- s << %Q^
326
- jQuery("##{dom_id}").jqGrid('sortableRows');
327
- ^
328
- end
329
-
330
- # TODO: built in event handlers, eg
331
- # loadError
332
- # onSelectRow, onDblClickRow, onRightClickRow etc
333
-
334
- #unless search_toolbar == :visible
335
- # s << %Q^
336
- # grid_#{dom_id}[0].toggleToolbar();
337
- # ^
338
- #end
339
-
340
- # # keep page controls centered (jqgrid bug) [eg appears when :width_fit => :scroll]
341
- # s << %Q^ $("##{pager}_left").css("width", "auto"); ^
342
-
343
- s
344
- end
345
-
346
- # ------------------
347
- def js_helpers
348
- # just move this into appliaction.js?
349
-
350
- # gridify_fluid_recalc_width: allow grid resize on window resize events
351
- # recalculate width of grid based on parent container; handles multiple grids
352
- # ref: http://www.trirand.com/blog/?page_id=393/feature-request/Resizable%20grid/
353
-
354
- # afterSubmit: display error message in response
355
-
356
- %Q^
357
- function gridify_fluid_recalc_width(){
358
- if (grids = jQuery('.fluid.ui-jqgrid-btable:visible')) {
359
- grids.each(function(index) {
360
- gridId = jQuery(this).attr('id');
361
- gridParentWidth = jQuery('#gbox_' + gridId).parent().width();
362
- jQuery('#' + gridId).jqGrid('setGridWidth', gridParentWidth);
363
- });
364
- }
365
- };
366
-
367
- jQuery(window).live('resize', gridify_fluid_recalc_width);
368
- function gridify_action_error_handler(r, data, action){
369
- if (r.responseText != '') {
370
- return [false, r.responseText];
371
- } else {
372
- return true;
373
- }
374
- }
375
- ^
376
- end
377
-
378
-
379
- # if(r.responseText != "") {
380
- # $('#{error_container}').html(r.responseText);
381
- # $('#{error_container}').slideDown();
382
- # //window.setTimeout(function() { // Hide error div after 6 seconds
383
- # // $('#{error_container}').slideUp();
384
- # //}, 6000);
385
- # return false;
386
- # }
387
- # return true;
388
-
389
- # lets options be true or a hash, merges into defaults and returns a hash
390
- def merge_options_defaults( options, defaults={} )
391
- if options
392
- defaults.merge( options==true ? {} : options)
393
- else
394
- {}
395
- end
396
- end
397
-
398
- end
399
- end
400
-
401
- class Hash
402
- # replace embedded '"javascript: foo"' with 'foo'
403
- def to_json_with_js
404
- self.to_json.gsub(/\"javascript: ([^"]*)\"/) {|string| string[1..-2].gsub('javascript:','') }
405
- end
406
- end
407
-
408
- module JqgridJson
409
- include ActionView::Helpers::JavaScriptHelper
410
- include HandleAttributes
411
-
412
- def to_subgrid_json(attributes)
413
- json = %Q({)
414
- if self.empty?
415
- json << "}"
416
- else
417
- json <<= %Q("rows":[)
418
- each do |elem|
419
- elem.id ||= index(elem)
420
- json << %Q({"id":"#{elem.id}","cell":[)
421
- couples = elem.attributes.symbolize_keys
422
- attributes.each do |atr|
423
- value = get_atr_value(elem, atr, couples)
424
- value = escape_javascript(value) if value and value.is_a? String
425
- json << %Q("#{value}",)
426
- end
427
- json.chop! << "]},"
428
- end
429
- json.chop! << "]}"
430
- end
431
- end
432
- end
433
-
434
- class Array
435
- include JqgridJson
436
- end
1
+ # reference: http://github.com/ahe/2dc_jqgrid
2
+
3
+ module Gridify
4
+ class Grid
5
+
6
+ # ----------------------
7
+ # generate the grid javascript for a view
8
+ # options:
9
+ # :script => true generates <script> tag (true)
10
+ # :ready => true generates jquery ready function (true)
11
+ def to_javascript( options={} )
12
+ options = { :script => true, :ready => true }.merge(options)
13
+
14
+ s = ''
15
+ if options[:script]
16
+ s << %Q^
17
+ <script type="text/javascript">
18
+ var lastsel_#{dom_id};
19
+ ^
20
+ end
21
+
22
+ s << js_helpers
23
+
24
+ if options[:ready]
25
+ s << %Q^
26
+ jQuery(document).ready(function(){
27
+ ^
28
+ end
29
+
30
+ s << jqgrid_javascript(options)
31
+
32
+ if options[:ready]
33
+ s << %Q^
34
+ });
35
+ ^
36
+ end
37
+ if options[:script]
38
+ s << %Q^
39
+ </script>
40
+ ^
41
+ end
42
+ s
43
+ end
44
+
45
+ def to_json
46
+ jqgrid_properties.to_json_with_js
47
+ end
48
+
49
+ # alias :to_s, :to_javascript
50
+ def to_s( options={} )
51
+ to_javascript( options )
52
+ end
53
+
54
+ # ------------------
55
+ protected
56
+ # ------------------
57
+
58
+ # //{ url: '/notes/{id}', mtype: 'PUT', reloadAfterSubmit: false, closeAfterEdit: true }, // edit settings
59
+ # //{ url: '/notes', mtype: 'POST', reloadAfterSubmit: false, closeAfterEdit: true }, // add settings
60
+ # //{ url: '/notes/{id}', mtype: 'DELETE', reloadAfterSubmit: false }, // delete settings
61
+
62
+ # get the button options
63
+ def edit_button_options
64
+ # 'url' => '/notes/{id}', 'mtype' => 'PUT'
65
+ # {afterSubmit:function(r,data){return #{options[:error_handler_return_value]}(r,data,'edit');}},
66
+
67
+ # note, closeAfterEdit will not close if response returns a non-empty string (even if "success" message)
68
+ merge_options_defaults( edit_button || inline_edit,
69
+ 'reloadAfterSubmit' => true,
70
+ 'closeAfterEdit' => true,
71
+ 'afterSubmit' => "javascript: function(r,data){return #{error_handler_return_value}(r,data,'edit');}"
72
+ )
73
+ end
74
+
75
+ def add_button_options
76
+ # 'url' => '/notes', 'mtype' => 'POST'
77
+ merge_options_defaults( add_button,
78
+ 'reloadAfterSubmit' => true,
79
+ 'closeAfterAdd' => true,
80
+ 'afterSubmit' => "javascript: function(r,data){return #{error_handler_return_value}(r,data,'add');}"
81
+ )
82
+ end
83
+
84
+ def delete_button_options
85
+ # 'url' => '/notes/{id}', 'mtype' => 'DELETE'
86
+ merge_options_defaults( delete_button,
87
+ 'reloadAfterSubmit' => true,
88
+ 'afterSubmit' => "javascript: function(r,data){return #{error_handler_return_value}(r,data,'delete');}"
89
+ )
90
+ end
91
+
92
+ def search_button_options
93
+ if search_advanced
94
+ merge_options_defaults( search_advanced, 'multipleSearch' => true)
95
+ else
96
+ merge_options_defaults( search_button)
97
+ end
98
+ end
99
+
100
+ def view_button_options
101
+ merge_options_defaults( view_button)
102
+ end
103
+
104
+ # generate the jqGrid initial values in json
105
+ # maps our attributes to jqGrid options; omit values when same as jqGrid defaults
106
+ def jqgrid_properties
107
+ vals = {}
108
+ vals[:ajaxGridOptions] = ajax_grid_options if ajax_grid_options
109
+
110
+ # data and request options
111
+ vals[:url] = url if url
112
+ vals[:editurl] = url if editable
113
+ vals[:restful] = true if restful
114
+ vals[:inline_edit] = inline_edit if inline_edit.present?
115
+ vals[:postData] = { :grid => name, :datatype => data_type } #identify which grid making the request
116
+ vals[:colNames] = colNames if colNames.present?
117
+ vals[:colModel] = column_model if colModel.present?
118
+ vals[:datatype] = data_type if data_type
119
+ if data_format.present?
120
+ case data_type
121
+ when :xml
122
+ vals[:xmlReader] = data_format
123
+ when :json
124
+ vals[:jsonReader] = data_format
125
+ end
126
+ end
127
+
128
+ vals[:loadonce] = load_once if load_once
129
+
130
+ vals[:sortname] = sort_by if sort_by
131
+ vals[:sortorder] = sort_order if sort_order && sort_by
132
+ vals[:rowNum] = rows_per_page if rows_per_page
133
+ vals[:rowTotal] = total_rows if total_rows
134
+ vals[:page] = current_page if current_page
135
+
136
+ # grid options
137
+ vals[:height] = height if height
138
+ vals[:gridview] = grid_view # faster views, NOTE theres cases when this needs to be disabled
139
+
140
+ case width_fit
141
+ when :fitted
142
+ #vals[:autowidth] = false #default
143
+ #vals[:shrinkToFit] = true #default
144
+ vals[:forceFit] = true
145
+ vals[:width] = width if width
146
+
147
+ when :scroll
148
+ #vals[:autowidth] = false #default
149
+ vals[:shrinkToFit] = false
150
+ #vals[:forceFit] = #ignored by jqGrid
151
+ vals[:width] = width if width
152
+
153
+ else #when :fluid
154
+ vals[:autowidth] = true
155
+ #vals[:shrinkToFit] = true #default
156
+ vals[:forceFit] = true
157
+ #vals[:width] = is ignored
158
+ vals[:resizeStop] = 'javascript: gridify_fluid_recalc_width'
159
+ end
160
+
161
+ vals[:sortable] = true if arranger_type.include?(:sortable)
162
+
163
+ # header layer
164
+ vals[:caption] = title if title
165
+ vals[:hidegrid] = false unless collapsible
166
+ vals[:hiddengrid] = true if collapsed
167
+
168
+ # row formatting
169
+ vals[:altrows] = true if alt_rows
170
+ vals[:altclass] = alt_rows if alt_rows.is_a?(String)
171
+
172
+ vals[:rownumbers] = true if row_numbers
173
+ vals[:rownumWidth] = row_numbers if row_numbers.is_a?(Numeric)
174
+
175
+ if inline_edit
176
+ vals[:scrollrows] = true
177
+ vals[:multiselect] = true if multi_select
178
+ vals[:onSelectRow] = "javascript: function(id, status) { if(id && id!==lastsel_#{dom_id}) { jQuery('##{dom_id}').jqGrid('restoreRow', lastsel_#{dom_id}); jQuery('##{dom_id}').jqGrid('editRow', id, true, #{inline_edit_handler}, #{error_handler}); lastsel_#{dom_id}=id}}"
179
+ elsif select_rows #.present?
180
+ vals[:scrollrows] = true
181
+ vals[:onSelectRow] = select_rows
182
+ vals[:multiselect] = true if multi_select
183
+ else
184
+ vals[:hoverrows] = false
185
+ vals[:beforeSelectRow] = "javascript: function(){ false; }"
186
+ end
187
+
188
+ # pager layer
189
+ if pager
190
+ vals[:pager] = "##{pager}"
191
+ vals[:viewrecords] = true # display total records in the query (eg "1 - 10 of 25")
192
+ vals[:rowList] = paging_choices
193
+ if paging_controls.is_a?(Hash)
194
+ # allow override of jqGrid pager options
195
+ vals.merge!(paging_controls)
196
+ elsif !paging_controls
197
+ vals[:rowList] = []
198
+ vals[:pgbuttons] = false
199
+ vals[:pginput] = false
200
+ vals[:recordtext] = "{2} records"
201
+ end
202
+ end
203
+
204
+ #subgrid
205
+ if sub_grid
206
+ vals[:subGrid] = sub_grid
207
+ vals[:subGridUrl] = sub_grid_url
208
+ vals[:subGridModel] = sub_grid_model
209
+ vals[:gridview] = false
210
+ end
211
+
212
+ #events
213
+ #vals[:serializeGridData] = serialize_grid_data if serialize_grid_data
214
+
215
+ vals[:loadonce] = load_once if load_once
216
+
217
+ # allow override of native jqGrid options
218
+ vals.merge(jqgrid_options)
219
+
220
+
221
+ end
222
+
223
+ # -----------------
224
+ def jqgrid_javascript( options={} )
225
+ s = ''
226
+
227
+ if table_to_grid
228
+ s << %Q^
229
+ tableToGrid("##{dom_id}", #{to_json});
230
+ ^
231
+ s << %Q^
232
+ grid_#{dom_id} = jQuery("##{dom_id}")
233
+ ^
234
+ else
235
+ s << %Q^
236
+ grid_#{dom_id} = jQuery("##{dom_id}").jqGrid(#{to_json})
237
+ ^
238
+ end
239
+
240
+ s << ';'
241
+
242
+ # tag the grid as fluid so we can find it on resize events
243
+ if width_fit == :fluid
244
+ s << %Q^
245
+ jQuery("##{dom_id}").addClass("fluid");
246
+ ^
247
+ end
248
+
249
+ # override tableToGrid colmodel options as needed (sortable)
250
+ #s << %Q^ .jqGrid('setColProp','Title',{sortable: false})^
251
+
252
+ # resize method
253
+ if resizable
254
+ s << %Q^
255
+ jQuery("##{dom_id}").jqGrid('gridResize', #{resizable.to_json});
256
+ ^
257
+ end
258
+
259
+ # pager buttons (navGrid)
260
+ if pager
261
+ nav_params = {
262
+ 'edit' => edit_button.present?,
263
+ 'add' => add_button.present?,
264
+ 'del' => delete_button.present?,
265
+ 'search' => search_button.present? || search_advanced.present?,
266
+ 'view' => view_button.present?,
267
+ 'refresh' => refresh_button.present?
268
+ }.merge(jqgrid_nav_options||{})
269
+
270
+ s << %Q^
271
+ jQuery("##{dom_id}").jqGrid('navGrid', '##{pager}',
272
+ #{nav_params.to_json},
273
+ #{edit_button_options.to_json_with_js},
274
+ #{add_button_options.to_json_with_js},
275
+ #{delete_button_options.to_json_with_js},
276
+ #{search_button_options.to_json_with_js},
277
+ #{view_button_options.to_json_with_js}
278
+ );
279
+ ^
280
+ end
281
+
282
+ if arranger_type.include?(:hide_show)
283
+ s << %Q^
284
+ jQuery("##{dom_id}").jqGrid('navButtonAdd','##{pager}',{
285
+ caption: "Columns",
286
+ title: "Hide/Show Columns",
287
+ onClickButton : function (){ jQuery("##{dom_id}").jqGrid('setColumns',
288
+ #{arranger_options(:hide_show).to_json_with_js} );
289
+ }
290
+ });
291
+ ^
292
+ end
293
+ if arranger_type.include?(:chooser)
294
+ # hackey way to build the string but gets it done
295
+ chooser_code = %Q^ function (){ jQuery('##{dom_id}').jqGrid('columnChooser', {
296
+ done : function (perm) {
297
+ if (perm) {
298
+ this.jqGrid('remapColumns', perm, true);
299
+ var gwdth = this.jqGrid('getGridParam','width');
300
+ this.jqGrid('setGridWidth',gwdth);
301
+ }
302
+ } })}^
303
+ chooser_opts = {
304
+ 'caption' => 'Columns',
305
+ 'title' => 'Arrange Columns',
306
+ 'onClickButton' => 'chooser_code'
307
+ }.merge(arranger_options(:chooser))
308
+ s << %Q^
309
+ jQuery("##{dom_id}").jqGrid('navButtonAdd','##{pager}', #{chooser_opts.to_json.gsub('"chooser_code"', chooser_code)} );
310
+ ^
311
+ end
312
+
313
+ if search_toolbar
314
+ # I wish we could put this in the header rather than the pager
315
+ s << %Q^
316
+ jQuery("##{dom_id}").jqGrid('navButtonAdd',"##{pager}", { caption:"Toggle", title:"Toggle Search Toolbar", buttonicon: 'ui-icon-pin-s', onClickButton: function(){ grid_#{dom_id}[0].toggleToolbar() } });
317
+ jQuery("##{dom_id}").jqGrid('navButtonAdd',"##{pager}", { caption:"Clear", title:"Clear Search", buttonicon: 'ui-icon-refresh', onClickButton: function(){ grid_#{dom_id}[0].clearToolbar() } });
318
+ jQuery("##{dom_id}").jqGrid('filterToolbar');
319
+ ^
320
+ end
321
+
322
+ if sortable_rows
323
+ # I wish we could put this in the header rather than the pager
324
+ s << %Q^
325
+ jQuery("##{dom_id}").jqGrid('sortableRows');
326
+ ^
327
+ end
328
+
329
+ # TODO: built in event handlers, eg
330
+ # loadError
331
+ # onSelectRow, onDblClickRow, onRightClickRow etc
332
+
333
+ #unless search_toolbar == :visible
334
+ # s << %Q^
335
+ # grid_#{dom_id}[0].toggleToolbar();
336
+ # ^
337
+ #end
338
+
339
+ # # keep page controls centered (jqgrid bug) [eg appears when :width_fit => :scroll]
340
+ # s << %Q^ $("##{pager}_left").css("width", "auto"); ^
341
+
342
+ s
343
+ end
344
+
345
+ # ------------------
346
+ def js_helpers
347
+ # just move this into appliaction.js?
348
+
349
+ # gridify_fluid_recalc_width: allow grid resize on window resize events
350
+ # recalculate width of grid based on parent container; handles multiple grids
351
+ # ref: http://www.trirand.com/blog/?page_id=393/feature-request/Resizable%20grid/
352
+
353
+ # afterSubmit: display error message in response
354
+
355
+ %Q^
356
+ function gridify_fluid_recalc_width(){
357
+ if (grids = jQuery('.fluid.ui-jqgrid-btable:visible')) {
358
+ grids.each(function(index) {
359
+ gridId = jQuery(this).attr('id');
360
+ gridParentWidth = jQuery('#gbox_' + gridId).parent().width();
361
+ jQuery('#' + gridId).jqGrid('setGridWidth', gridParentWidth);
362
+ });
363
+ }
364
+ };
365
+
366
+ jQuery(window).live('resize', gridify_fluid_recalc_width);
367
+ function gridify_action_error_handler(r, data, action){
368
+ if (r.responseText != '') {
369
+ return [false, r.responseText];
370
+ } else {
371
+ return true;
372
+ }
373
+ }
374
+ ^
375
+ end
376
+
377
+
378
+ # if(r.responseText != "") {
379
+ # $('#{error_container}').html(r.responseText);
380
+ # $('#{error_container}').slideDown();
381
+ # //window.setTimeout(function() { // Hide error div after 6 seconds
382
+ # // $('#{error_container}').slideUp();
383
+ # //}, 6000);
384
+ # return false;
385
+ # }
386
+ # return true;
387
+
388
+ # lets options be true or a hash, merges into defaults and returns a hash
389
+ def merge_options_defaults( options, defaults={} )
390
+ if options
391
+ defaults.merge( options==true ? {} : options)
392
+ else
393
+ {}
394
+ end
395
+ end
396
+
397
+ end
398
+ end
399
+
400
+ class Hash
401
+ # replace embedded '"javascript: foo"' with 'foo'
402
+ def to_json_with_js
403
+ self.to_json.gsub(/\"javascript: ([^"]*)\"/) {|string| string[1..-2].gsub('javascript:','') }
404
+ end
405
+ end
406
+
407
+ module JqgridJson
408
+ include ActionView::Helpers::JavaScriptHelper
409
+ include HandleAttributes
410
+
411
+ def to_subgrid_json(attributes)
412
+ json = %Q({)
413
+ if self.empty?
414
+ json << "}"
415
+ else
416
+ json <<= %Q("rows":[)
417
+ each do |elem|
418
+ elem.id ||= index(elem)
419
+ json << %Q({"id":"#{elem.id}","cell":[)
420
+ couples = elem.attributes.symbolize_keys
421
+ attributes.each do |atr|
422
+ value = get_atr_value(elem, atr, couples)
423
+ value = escape_javascript(value) if value and value.is_a? String
424
+ json << %Q("#{value}",)
425
+ end
426
+ json.chop! << "]},"
427
+ end
428
+ json.chop! << "]}"
429
+ end
430
+ end
431
+ end
432
+
433
+ class Array
434
+ include JqgridJson
435
+ end