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

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