mongoid_wice_grid 4.0.0

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 (72) hide show
  1. data/.gitignore +9 -0
  2. data/CHANGELOG +409 -0
  3. data/Gemfile +17 -0
  4. data/Gemfile.lock +140 -0
  5. data/MIT-LICENSE +20 -0
  6. data/README.rdoc +1188 -0
  7. data/Rakefile +40 -0
  8. data/SAVED_QUERIES_HOWTO.rdoc +123 -0
  9. data/VERSION +1 -0
  10. data/lib/filter_conditions_generators.rb +126 -0
  11. data/lib/generators/wice_grid/templates/calendarview.css +107 -0
  12. data/lib/generators/wice_grid/templates/calendarview.js +1168 -0
  13. data/lib/generators/wice_grid/templates/icons/arrow_down.gif +0 -0
  14. data/lib/generators/wice_grid/templates/icons/arrow_up.gif +0 -0
  15. data/lib/generators/wice_grid/templates/icons/calendar_view_month.png +0 -0
  16. data/lib/generators/wice_grid/templates/icons/delete.png +0 -0
  17. data/lib/generators/wice_grid/templates/icons/expand.png +0 -0
  18. data/lib/generators/wice_grid/templates/icons/page_white_excel.png +0 -0
  19. data/lib/generators/wice_grid/templates/icons/page_white_find.png +0 -0
  20. data/lib/generators/wice_grid/templates/icons/table.png +0 -0
  21. data/lib/generators/wice_grid/templates/icons/table_refresh.png +0 -0
  22. data/lib/generators/wice_grid/templates/icons/tick_all.png +0 -0
  23. data/lib/generators/wice_grid/templates/icons/untick_all.png +0 -0
  24. data/lib/generators/wice_grid/templates/wice_grid.css +173 -0
  25. data/lib/generators/wice_grid/templates/wice_grid.yml +269 -0
  26. data/lib/generators/wice_grid/templates/wice_grid_config.rb +215 -0
  27. data/lib/generators/wice_grid/templates/wice_grid_jquery.js +161 -0
  28. data/lib/generators/wice_grid/templates/wice_grid_prototype.js +153 -0
  29. data/lib/generators/wice_grid/wice_grid_assets_jquery_generator.rb +32 -0
  30. data/lib/generators/wice_grid/wice_grid_assets_prototype_generator.rb +34 -0
  31. data/lib/grid_output_buffer.rb +52 -0
  32. data/lib/grid_renderer.rb +547 -0
  33. data/lib/helpers/js_calendar_helpers.rb +183 -0
  34. data/lib/helpers/wice_grid_misc_view_helpers.rb +113 -0
  35. data/lib/helpers/wice_grid_serialized_queries_view_helpers.rb +82 -0
  36. data/lib/helpers/wice_grid_view_helpers.rb +761 -0
  37. data/lib/js_adaptors/jquery_adaptor.rb +145 -0
  38. data/lib/js_adaptors/js_adaptor.rb +12 -0
  39. data/lib/js_adaptors/prototype_adaptor.rb +168 -0
  40. data/lib/mongoid_field.rb +50 -0
  41. data/lib/tasks/wice_grid_tasks.rake +28 -0
  42. data/lib/view_columns.rb +464 -0
  43. data/lib/views/create.rjs +13 -0
  44. data/lib/views/delete.rjs +12 -0
  45. data/lib/wice_grid.rb +521 -0
  46. data/lib/wice_grid_controller.rb +165 -0
  47. data/lib/wice_grid_core_ext.rb +179 -0
  48. data/lib/wice_grid_misc.rb +99 -0
  49. data/lib/wice_grid_serialized_queries_controller.rb +77 -0
  50. data/lib/wice_grid_serialized_query.rb +14 -0
  51. data/lib/wice_grid_spreadsheet.rb +33 -0
  52. data/test/.gitignore +2 -0
  53. data/test/blueprint.rb +17 -0
  54. data/test/database.yml +21 -0
  55. data/test/public/javascripts/jquery-1.4.2.min.js +154 -0
  56. data/test/public/javascripts/wice_grid.js +163 -0
  57. data/test/rails_mongoid_test.rb +104 -0
  58. data/test/rails_test_app.rb +71 -0
  59. data/test/require_gems.rb +19 -0
  60. data/test/schema.rb +33 -0
  61. data/test/spec_helper.rb +22 -0
  62. data/test/test_helper.rb +89 -0
  63. data/test/views/projects_and_people_grid.html.erb +12 -0
  64. data/test/views/projects_and_people_grid_invalid.html.erb +12 -0
  65. data/test/views/simple_projects_grid.html.erb +9 -0
  66. data/test/wice_grid_core_ext_test.rb +183 -0
  67. data/test/wice_grid_functional_test.rb +68 -0
  68. data/test/wice_grid_initializer.rb +215 -0
  69. data/test/wice_grid_misc_test.rb +41 -0
  70. data/test/wice_grid_test.rb +42 -0
  71. data/test/wice_grid_view_helper_test.rb +12 -0
  72. metadata +150 -0
@@ -0,0 +1,145 @@
1
+ # encoding: UTF-8
2
+ module Wice::JsAdaptor #:nodoc:
3
+
4
+ module Jquery #:nodoc:
5
+
6
+ def self.included(base) #:nodoc:
7
+ base.extend(ClassMethods)
8
+ end
9
+
10
+ module ClassMethods #:nodoc:
11
+
12
+ def init #:nodoc:
13
+ end
14
+
15
+ def dom_loaded #:nodoc:
16
+ %/$(document).ready(function(){\n/
17
+ end
18
+
19
+ def reset_button_initialization(grid_name, reset_grid_javascript) #:nodoc:
20
+ %/ $('div##{grid_name}.wice_grid_container .reset').click(function(e){\n/+
21
+ %/ #{reset_grid_javascript};\n/+
22
+ %/ });\n/
23
+ end
24
+
25
+ def submit_button_initialization(grid_name, submit_grid_javascript) #:nodoc:
26
+ %/ $('div##{grid_name}.wice_grid_container .submit').click(function(e){\n/+
27
+ %/ #{submit_grid_javascript};\n/+
28
+ %/ });\n/
29
+ end
30
+
31
+ def show_hide_button_initialization(grid_name, filter_row_id) #:nodoc:
32
+ %/ $('##{grid_name}_show_icon').click(function(){\n/+
33
+ %/ $('##{grid_name}_show_icon').hide();\n/+
34
+ %/ $('##{grid_name}_hide_icon').show();\n/+
35
+ %/ $('##{filter_row_id}').show();\n/+
36
+ %/ })\n/+
37
+ %/ $('##{grid_name}_hide_icon').click(function(){\n/+
38
+ %/ $('##{grid_name}_show_icon').show();\n/+
39
+ %/ $('##{grid_name}_hide_icon').hide();\n/+
40
+ %/ $('##{filter_row_id}').hide();\n/+
41
+ %/ });\n/
42
+ end
43
+
44
+ def enter_key_event_registration(grid_name) #:nodoc:
45
+ %! $('div##{grid_name}.wice_grid_container .wice_grid_filter_row input[type=text]').keydown(function(event){\n! +
46
+ %! if (event.keyCode == 13) {#{grid_name}.process()}\n! +
47
+ %! });\n!
48
+ end
49
+
50
+ def csv_export_icon_initialization(grid_name) #:nodoc:
51
+ %! $('div##{grid_name}.wice_grid_container .export_to_csv_button').click(function(e){\n! +
52
+ %! #{grid_name}.export_to_csv()\n! +
53
+ %! });\n!
54
+ end
55
+
56
+ def auto_reloading_selects_event_initialization(grid_name) #:nodoc:
57
+ %! $('div##{grid_name}.wice_grid_container select.auto_reload, .#{grid_name}_detached_filter select.auto_reload').change(function(e){\n! +
58
+ %! #{grid_name}.process()\n! +
59
+ %! });\n!
60
+ end
61
+
62
+ def auto_reloading_inputs_event_initialization(grid_name) #:nodoc:
63
+ %! $('div##{grid_name}.wice_grid_container input.auto_reload, .#{grid_name}_detached_filter input.auto_reload').keyup(function(event, element){\n! +
64
+ %! #{grid_name}.process(this.id);\n! +
65
+ %! });\n!
66
+ end
67
+
68
+ def auto_reloading_inputs_with_negation_checkboxes_event_initialization(grid_name) #:nodoc:
69
+ %! $('div##{grid_name}.wice_grid_container input.negation_checkbox, .#{grid_name}_detached_filter input.negation_checkbox').click(function(event, element){\n! +
70
+ %! #{grid_name}.process(this.id);\n! +
71
+ %! });\n!
72
+ end
73
+
74
+
75
+ def auto_reloading_calendar_event_initialization(grid_name) #:nodoc:
76
+ %! $(document).bind('wg:calendarChanged', function(event){\n! +
77
+ %! #{grid_name}.process()\n! +
78
+ %! });\n!
79
+ end
80
+
81
+ def show_all_link_initialization(grid_name, confirmation, parameters_json) #:nodoc:
82
+ %/ $('div##{grid_name}.wice_grid_container .show_all_link').click(function(e){ \n/ +
83
+ %/ #{confirmation} #{grid_name}.reload_page_for_given_grid_state(#{parameters_json}) \n/ +
84
+ %/})\n/
85
+ end
86
+
87
+ def back_to_pagination_link_initialization(grid_name, parameters_json) #:nodoc:
88
+ %/ $('div##{grid_name}.wice_grid_container .show_all_link').click(function(e){\n/ +
89
+ %/ #{grid_name}.reload_page_for_given_grid_state(#{parameters_json})\n/ +
90
+ %/ })\n/
91
+ end
92
+
93
+ def call_to_save_query_and_key_event_initialization_for_saving_queries(
94
+ id_and_name, grid_name, base_path_to_query_controller, parameters_json, ids_json) #:nodoc:
95
+ %/ function #{grid_name}_save_query(){\n/ +
96
+ %` if ( typeof(#{grid_name}) != "undefined")\n` +
97
+ %! #{grid_name}.save_query($('##{id_and_name}')[0].value, '#{base_path_to_query_controller}', #{parameters_json}, #{ids_json})\n! +
98
+ %/}\n/ +
99
+ %/ $('##{id_and_name}').keydown(function(event){\n/ +
100
+ %/ if (event.keyCode == 13) #{grid_name}_save_query();\n/ +
101
+ %/ })\n/
102
+ end
103
+
104
+ def js_framework_specific_calendar_assets(view) #:nodoc:
105
+ ''
106
+ end
107
+
108
+ def js_framework_specific_calendar_js_name #:nodoc:
109
+ nil
110
+ end
111
+
112
+ def js_framework_specific_calendar_css_name #:nodoc:
113
+ nil
114
+ end
115
+
116
+ def action_column_initialization(grid_name) #:nodoc:
117
+ %! $('div##{grid_name}.wice_grid_container .select_all').click(function(e){\n! +
118
+ %! $('div##{grid_name}.wice_grid_container .sel input').each(function(i, checkbox){\n! +
119
+ %! checkbox.checked = true;\n! +
120
+ %! })\n! +
121
+ %! })\n! +
122
+ %! $('div##{grid_name}.wice_grid_container .deselect_all').click(function(e){\n! +
123
+ %! $('div##{grid_name}.wice_grid_container .sel input').each(function(i, checkbox){\n! +
124
+ %! checkbox.checked = false;\n! +
125
+ %! })\n! +
126
+ %! })\n!
127
+ end
128
+
129
+ def fade_this #:nodoc:
130
+ 'jQuery([]).pushStack(this).fadeOut()'
131
+ end
132
+
133
+ def focus_element(element_to_focus) #:nodoc:
134
+ %! var elements = $('##{element_to_focus}');\n! +
135
+ %! if (elements[0]){\n! +
136
+ %! var elToFocus = elements[0];\n! +
137
+ %! elToFocus.value = elToFocus.value;\n! + # this will just place the cursor at the end of the text input
138
+ %! elToFocus.focus();\n! +
139
+ %! }\n!
140
+ end
141
+
142
+ end
143
+
144
+ end
145
+ end
@@ -0,0 +1,12 @@
1
+ # encoding: UTF-8
2
+
3
+ module Wice::JsAdaptor #:nodoc:
4
+ mattr_accessor :calendar_module
5
+ def self.init #:nodoc:
6
+ if Wice::Defaults::JS_FRAMEWORK == :prototype
7
+ include Wice::JsAdaptor::Prototype
8
+ else
9
+ include Wice::JsAdaptor::Jquery
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,168 @@
1
+ # encoding: UTF-8
2
+ module Wice::JsAdaptor #:nodoc:
3
+
4
+ module Prototype #:nodoc:
5
+
6
+ def self.included(base) #:nodoc:
7
+ base.extend(ClassMethods)
8
+ end
9
+
10
+ module ClassMethods #:nodoc:
11
+ def init #:nodoc:
12
+ end
13
+
14
+ def dom_loaded #:nodoc:
15
+ %/ document.observe("dom:loaded", function() {\n/
16
+ end
17
+
18
+ def reset_button_initialization(grid_name, reset_grid_javascript) #:nodoc:
19
+ %/ $$('div##{grid_name}.wice_grid_container .reset').each(function(e){\n/+
20
+ %/ e.observe('click', function(){\n/+
21
+ %/ #{reset_grid_javascript};\n/+
22
+ %/ })\n/+
23
+ %/ });\n/
24
+ end
25
+
26
+ def submit_button_initialization(grid_name, submit_grid_javascript) #:nodoc:
27
+ %/ $$('div##{grid_name}.wice_grid_container .submit').each(function(e){\n/+
28
+ %/ e.observe('click', function(){\n/+
29
+ %/ #{submit_grid_javascript};\n/+
30
+ %/ })\n/+
31
+ %/ });\n/
32
+ end
33
+
34
+ def show_hide_button_initialization(grid_name, filter_row_id) #:nodoc:
35
+ %/ $('#{grid_name}_show_icon').observe('click', function(){\n/+
36
+ %/ Element.toggle('#{grid_name}_show_icon');\n/+
37
+ %/ Element.toggle('#{grid_name}_hide_icon');\n/+
38
+ %/ $('#{filter_row_id}').show();\n/+
39
+ %/ })\n/+
40
+ %/ $('#{grid_name}_hide_icon').observe('click', function(){\n/+
41
+ %/ Element.toggle('#{grid_name}_show_icon');\n/+
42
+ %/ Element.toggle('#{grid_name}_hide_icon');\n/+
43
+ %/ $('#{filter_row_id}').hide();\n/+
44
+ %/ });\n/
45
+ end
46
+
47
+ def enter_key_event_registration(grid_name) #:nodoc:
48
+ %! $$('div##{grid_name}.wice_grid_container .wice_grid_filter_row input[type=text]').each(function(e){\n! +
49
+ %! e.observe('keydown', function(event){\n! +
50
+ %! if (event.keyCode == 13) {#{grid_name}.process()}\n! +
51
+ %! })\n! +
52
+ %! });\n!
53
+ end
54
+
55
+ def csv_export_icon_initialization(grid_name) #:nodoc:
56
+ %! $$('div##{grid_name}.wice_grid_container .export_to_csv_button').each(function(e){\n! +
57
+ %! e.observe('click', function(event){\n! +
58
+ %! #{grid_name}.export_to_csv()\n! +
59
+ %! })\n! +
60
+ %! });\n!
61
+ end
62
+
63
+ def auto_reloading_selects_event_initialization(grid_name) #:nodoc:
64
+ %! $$('div##{grid_name}.wice_grid_container select.auto_reload', '.#{grid_name}_detached_filter select.auto_reload').each(function(e){\n! +
65
+ %! e.observe('change', function(event){\n! +
66
+ %! #{grid_name}.process()\n! +
67
+ %! })\n! +
68
+ %! });\n!
69
+ end
70
+
71
+ def auto_reloading_inputs_event_initialization(grid_name) #:nodoc:
72
+ %! $$('div##{grid_name}.wice_grid_container input.auto_reload', '.#{grid_name}_detached_filter input.auto_reload').each(function(e){\n! +
73
+ %! e.observe('keyup', function(event){\n! +
74
+ %! #{grid_name}.process(event.element().id)\n! +
75
+ %! })\n! +
76
+ %! });\n!
77
+ end
78
+
79
+ def auto_reloading_inputs_with_negation_checkboxes_event_initialization(grid_name) #:nodoc:
80
+ %! $$('div##{grid_name}.wice_grid_container input.negation_checkbox', '.#{grid_name}_detached_filter input.negation_checkbox').each(function(e){\n! +
81
+ %! e.observe('click', function(event){\n! +
82
+ %! #{grid_name}.process(event.element().id)\n! +
83
+ %! })\n! +
84
+ %! });\n!
85
+ end
86
+
87
+
88
+ def auto_reloading_calendar_event_initialization(grid_name) #:nodoc:
89
+ %! document.observe('wg:calendarChanged', function(event){\n! +
90
+ %! #{grid_name}.process()\n! +
91
+ %! });\n!
92
+ end
93
+
94
+
95
+ def show_all_link_initialization(grid_name, confirmation, parameters_json) #:nodoc:
96
+ %/ $$('div##{grid_name}.wice_grid_container .show_all_link').each(function(e){\n/ +
97
+ %/ e.observe('click', function(){\n/ +
98
+ %/ #{confirmation} #{grid_name}.reload_page_for_given_grid_state(#{parameters_json})\n/ +
99
+ %/ })\n/ +
100
+ %/ })\n/
101
+ end
102
+
103
+
104
+ def back_to_pagination_link_initialization(grid_name, parameters_json) #:nodoc:
105
+ %/ $$('div##{grid_name}.wice_grid_container .show_all_link').each(function(e){\n/ +
106
+ %/ e.observe('click', function(){\n/ +
107
+ %/ #{grid_name}.reload_page_for_given_grid_state(#{parameters_json})\n/ +
108
+ %/ })\n/ +
109
+ %/ })\n/
110
+ end
111
+
112
+ def call_to_save_query_and_key_event_initialization_for_saving_queries(
113
+ id_and_name, grid_name, base_path_to_query_controller, parameters_json, ids_json) #:nodoc:
114
+ %/ function #{grid_name}_save_query(){\n/ +
115
+ %` if ( typeof(#{grid_name}) != "undefined")\n` +
116
+ %/ #{grid_name}.save_query($F('#{id_and_name}'), '#{base_path_to_query_controller}', #{parameters_json}, #{ids_json})\n/ +
117
+ %/ }\n/ +
118
+ %/ $('#{id_and_name}').observe('keydown', function(event){\n/ +
119
+ %/ if (event.keyCode == 13) #{grid_name}_save_query();\n/ +
120
+ %/ })\n/
121
+ end
122
+
123
+
124
+ def js_framework_specific_calendar_assets(view) #:nodoc:
125
+ view.stylesheet_link_tag("calendarview.css") + view.javascript_include_tag("calendarview.js")
126
+ end
127
+
128
+ def js_framework_specific_calendar_js_name #:nodoc:
129
+ 'calendarview.js'
130
+ end
131
+
132
+ def js_framework_specific_calendar_css_name #:nodoc:
133
+ 'calendarview.css'
134
+ end
135
+
136
+
137
+ def action_column_initialization(grid_name) #:nodoc:
138
+ %! $$('div##{grid_name}.wice_grid_container .select_all').each(function(e){\n! +
139
+ %! e.observe('click', function(){\n! +
140
+ %! $$('div##{grid_name}.wice_grid_container .sel input').each(function(checkbox){\n! +
141
+ %! checkbox.checked = true;\n! +
142
+ %! })\n! +
143
+ %! })\n! +
144
+ %! })\n! +
145
+ %! $$('div##{grid_name}.wice_grid_container .deselect_all').each(function(e){\n! +
146
+ %! e.observe('click', function(){\n! +
147
+ %! $$('div##{grid_name}.wice_grid_container .sel input').each(function(checkbox){\n! +
148
+ %! checkbox.checked = false;\n! +
149
+ %! })\n! +
150
+ %! })\n! +
151
+ %! })\n!
152
+ end
153
+
154
+ def fade_this #:nodoc:
155
+ 'new Effect.Fade(this)'
156
+ end
157
+
158
+ def focus_element(element_to_focus) #:nodoc:
159
+ %! var elToFocus = $('#{element_to_focus}');\n! +
160
+ %! elToFocus.focus();\n! +
161
+ %! elToFocus.value = elToFocus.value;\n! # this will just place the cursor at the end of the text input
162
+ end
163
+
164
+ end
165
+
166
+ end
167
+
168
+ end
@@ -0,0 +1,50 @@
1
+ require 'filter_conditions_generators'
2
+
3
+ module Wice
4
+ # to be mixed in into Mongoid::Field
5
+ module MongoidField
6
+ def wice_add_filter_criteria(all_filter_params, criteria, custom_filter_active) #:nodoc:
7
+ request_params = all_filter_params ? all_filter_params[name] : nil
8
+ return nil unless request_params
9
+
10
+ # Preprocess incoming parameters for datetime, if what's coming in is
11
+ # a datetime (with custom_filter it can be anything else, and not
12
+ # the datetime hash {"fr" => ..., "to" => ...})
13
+ if (self.type == Time) && request_params.is_a?(Hash)
14
+ ["fr", "to"].each do |sym|
15
+ if request_params[sym]
16
+ if request_params[sym].is_a?(String)
17
+ request_params[sym] = Time.parse(Wice::Defaults::DATETIME_PARSER.call(request_params[sym]).to_s)
18
+ elsif request_params[sym].is_a?(Hash)
19
+ request_params[sym] = Time.parse(::Wice::GridTools.params_2_datetime(request_params[sym]).to_s)
20
+ end
21
+ end
22
+ end
23
+ end
24
+
25
+ # Preprocess incoming parameters for date, if what's coming in is
26
+ # a date (with custom_filter it can be anything else, and not
27
+ # the date hash {"fr" => ..., "to" => ...})
28
+ if self.type == Date && request_params.is_a?(Hash)
29
+ ["fr", "to"].each do |sym|
30
+ if request_params[sym]
31
+ if request_params[sym].is_a?(String)
32
+ request_params[sym] = Wice::Defaults::DATE_PARSER.call(request_params[sym]).to_time
33
+ elsif request_params[sym].is_a?(Hash)
34
+ request_params[sym] = ::Wice::GridTools.params_2_date(request_params[sym]).to_time
35
+ end
36
+ end
37
+ end
38
+ end
39
+
40
+ processor_klass = ::Wice::FilterConditionsGeneratorCustomFilter if custom_filter_active
41
+ processor_klass = ::Wice::FilterConditionsGenerator.handled_type[self.type] unless processor_klass
42
+ unless processor_klass
43
+ Wice.log("No processor for database type #{self.type}!!!")
44
+ return nil
45
+ end
46
+ processor_klass.new(self, criteria).generate_conditions(request_params)
47
+ end
48
+
49
+ end
50
+ end
@@ -0,0 +1,28 @@
1
+ namespace "wice_grid" do
2
+
3
+ desc "Create a table to store saved queries"
4
+ task :create_queries_table => :environment do
5
+
6
+ class CreateWiceGridSerializedQueriesTable < ::ActiveRecord::Migration
7
+ def self.up
8
+ create_table :wice_grid_serialized_queries do |t|
9
+ t.column :name, :string
10
+ t.column :grid_name, :string
11
+ t.column :query, :text
12
+
13
+ t.timestamps
14
+ end
15
+ add_index :wice_grid_serialized_queries, :grid_name
16
+ add_index :wice_grid_serialized_queries, [:grid_name, :id]
17
+ end
18
+
19
+ def self.down
20
+ drop_table :wice_grid_serialized_queries
21
+ end
22
+ end
23
+
24
+ CreateWiceGridSerializedQueriesTable.up
25
+ end
26
+
27
+
28
+ end
@@ -0,0 +1,464 @@
1
+ # encoding: UTF-8
2
+ module Wice
3
+
4
+ class ViewColumn
5
+ include ActionView::Helpers::FormTagHelper
6
+ include ActionView::Helpers::TagHelper
7
+ include ActionView::Helpers::JavaScriptHelper
8
+ include ActionView::Helpers::AssetTagHelper
9
+
10
+ # fields defined from the options parameter
11
+ FIELDS = [:attribute_name, :column_name, :icon, :td_html_attrs, :no_filter, :model_class, :allow_multiple_selection,
12
+ :in_html, :in_csv, :helper_style, :table_alias, :custom_order, :detach_with_id, :allow_ordering, :auto_reload]
13
+
14
+ attr_accessor *FIELDS
15
+
16
+ attr_accessor :cell_rendering_block, :grid, :css_class, :table_name, :main_table, :model_class, :custom_filter
17
+
18
+ attr_reader :contains_a_text_input
19
+
20
+ def initialize(block, options, grid_obj, tname, mtable, cfilter, view) #:nodoc:
21
+ self.cell_rendering_block = block
22
+ self.grid = grid_obj
23
+ self.table_name = tname
24
+ self.main_table = mtable
25
+ self.custom_filter = cfilter
26
+ @view = view
27
+
28
+ FIELDS.each do |field|
29
+ self.send("#{field}=", options[field])
30
+ end
31
+ end
32
+
33
+ cattr_accessor :handled_type
34
+ @@handled_type = Hash.new
35
+
36
+ def css_class #:nodoc:
37
+ @css_class || ''
38
+ end
39
+
40
+ def yield_declaration_of_column_filter #:nodoc:
41
+ nil
42
+ end
43
+
44
+ def detachness #:nodoc:
45
+ (! detach_with_id.blank?).to_s
46
+ end
47
+
48
+ def yield_javascript #:nodoc:
49
+ declaration = yield_declaration_of_column_filter
50
+ if declaration
51
+ %!#{@grid.name}.register( {
52
+ filter_name : "#{self.column_name}",
53
+ detached : #{detachness},
54
+ #{declaration}
55
+ } ); !
56
+ else
57
+ ''
58
+ end
59
+ end
60
+
61
+
62
+ def config
63
+ @view.config
64
+ end
65
+
66
+ def controller
67
+ @view.controller
68
+ end
69
+
70
+
71
+ def render_filter #:nodoc:
72
+ params = @grid.filter_params(self)
73
+ res = render_filter_internal(params)
74
+ return (res.is_a?(Array)) ? res : [res, nil]
75
+ end
76
+
77
+ def render_filter_internal(params) #:nodoc:
78
+ '<!-- implement me! -->'
79
+ end
80
+
81
+ def form_parameter_name_id_and_query(v) #:nodoc:
82
+ query = form_parameter_template(v)
83
+ query_without_equals_sign = query.sub(/=$/,'')
84
+ parameter_name = CGI.unescape(query_without_equals_sign)
85
+ dom_id = id_out_of_name(parameter_name)
86
+ return query, query_without_equals_sign, parameter_name, dom_id.tr('.', '_')
87
+ end
88
+
89
+ def filter_shown? #:nodoc:
90
+ self.attribute_name && ! self.no_filter
91
+ end
92
+
93
+ def filter_shown_in_main_table? #:nodoc:
94
+ filter_shown? && ! self.detach_with_id
95
+ end
96
+
97
+ def capable_of_hosting_filter_related_icons? #:nodoc:
98
+ self.attribute_name.blank? && self.column_name.blank? && ! self.filter_shown?
99
+ end
100
+
101
+ def has_auto_reloading_input? #:nodoc:
102
+ false
103
+ end
104
+
105
+ def auto_reloading_input_with_negation_checkbox? #:nodoc:
106
+ false
107
+ end
108
+
109
+ def has_auto_reloading_select? #:nodoc:
110
+ false
111
+ end
112
+
113
+ def has_auto_reloading_calendar? #:nodoc:
114
+ false
115
+ end
116
+
117
+ protected
118
+
119
+ def form_parameter_template(v) #:nodoc:
120
+ {@grid.name => {:f => {self.attribute_name => v}}}.to_query
121
+ end
122
+
123
+ def form_parameter_name(v) #:nodoc:
124
+ form_parameter_template_hash(v).to_query
125
+ end
126
+
127
+ def name_out_of_template(s) #:nodoc:
128
+ CGI.unescape(s).sub(/=$/,'')
129
+ end
130
+
131
+ def id_out_of_name(s) #:nodoc:
132
+ s.gsub(/[\[\]]+/,'_').sub(/_+$/, '')
133
+ end
134
+
135
+ end
136
+
137
+ class ActionViewColumn < ViewColumn #:nodoc:
138
+ def initialize(grid_obj, td_html_attrs, param_name, select_all_buttons, object_property, view) #:nodoc:
139
+ @view = view
140
+ @select_all_buttons = select_all_buttons
141
+ self.grid = grid_obj
142
+ self.td_html_attrs = td_html_attrs
143
+ self.td_html_attrs.add_or_append_class_value!('sel')
144
+ grid_name = self.grid.name
145
+ @param_name = param_name
146
+ @cell_rendering_block = lambda do |object, params|
147
+ selected = if params[grid_name] && params[grid_name][param_name] &&
148
+ params[grid_name][param_name].index(object.send(object_property).to_s)
149
+ true
150
+ else
151
+ false
152
+ end
153
+ check_box_tag("#{grid_name}[#{param_name}][]", object.send(object_property), selected, :id => nil)
154
+ end
155
+ end
156
+
157
+ def in_html #:nodoc:
158
+ true
159
+ end
160
+
161
+ def capable_of_hosting_filter_related_icons? #:nodoc:
162
+ false
163
+ end
164
+
165
+ def column_name #:nodoc:
166
+ return '' unless @select_all_buttons
167
+ select_all_tootip = WiceGridNlMessageProvider.get_message(:SELECT_ALL)
168
+ deselect_all_tootip = WiceGridNlMessageProvider.get_message(:DESELECT_ALL)
169
+
170
+ html = content_tag(:span, image_tag(Defaults::TICK_ALL_ICON, :alt => select_all_tootip),
171
+ :class => 'clickable select_all', :title => select_all_tootip) + ' ' +
172
+ content_tag(:span, image_tag(Defaults::UNTICK_ALL_ICON, :alt => deselect_all_tootip),
173
+ :class => 'clickable deselect_all', :title => deselect_all_tootip)
174
+
175
+ js = JsAdaptor.action_column_initialization(grid.name)
176
+
177
+ [html, js]
178
+ end
179
+
180
+ end
181
+
182
+ class ViewColumnInteger < ViewColumn #:nodoc:
183
+ @@handled_type[Integer] = self
184
+
185
+ def render_filter_internal(params) #:nodoc:
186
+ @contains_a_text_input = true
187
+
188
+ @query, _, parameter_name, @dom_id = form_parameter_name_id_and_query(:fr => '')
189
+ @query2, _, parameter_name2, @dom_id2 = form_parameter_name_id_and_query(:to => '')
190
+
191
+ opts1 = {:size => 3, :id => @dom_id}
192
+ opts2 = {:size => 3, :id => @dom_id2}
193
+
194
+ if auto_reload
195
+ opts1[:class] = ' auto_reload'
196
+ opts2[:class] = ' auto_reload'
197
+ end
198
+
199
+ text_field_tag(parameter_name, params[:fr], opts1) + text_field_tag(parameter_name2, params[:to], opts2)
200
+ end
201
+
202
+ def yield_declaration_of_column_filter #:nodoc:
203
+ %$templates : ['#{@query}', '#{@query2}'],
204
+ ids : ['#{@dom_id}', '#{@dom_id2}'] $
205
+ end
206
+
207
+ def has_auto_reloading_input? #:nodoc:
208
+ auto_reload
209
+ end
210
+
211
+ end
212
+
213
+ class ViewColumnFloat < ViewColumnInteger #:nodoc:
214
+ @@handled_type[BigDecimal] = self
215
+ @@handled_type[Float] = self
216
+ end
217
+
218
+ class ViewColumnCustomDropdown < ViewColumn #:nodoc:
219
+ include ActionView::Helpers::FormOptionsHelper
220
+
221
+ attr_accessor :filter_all_label
222
+ attr_accessor :custom_filter
223
+
224
+ def render_filter_internal(params) #:nodoc:
225
+ @query, @query_without_equals_sign, @parameter_name, @dom_id = form_parameter_name_id_and_query('')
226
+ @query_without_equals_sign += '%5B%5D='
227
+
228
+ @custom_filter = @custom_filter.call if @custom_filter.kind_of? Proc
229
+
230
+ if @custom_filter.kind_of? Array
231
+
232
+ @custom_filter = [[@filter_all_label, nil]] + @custom_filter.map{|label, value|
233
+ [label.to_s, value.to_s]
234
+ }
235
+
236
+ end
237
+
238
+ select_options = {:name => @parameter_name, :id => @dom_id, :class => 'custom_dropdown'}
239
+
240
+ if @turn_off_select_toggling
241
+ select_toggle = ''
242
+ else
243
+ if self.allow_multiple_selection
244
+ select_options[:multiple] = params.is_a?(Array) && params.size > 1
245
+ select_toggle = content_tag(:a,
246
+ tag(:img, :alt => 'Expand/Collapse', :src => Defaults::TOGGLE_MULTI_SELECT_ICON),
247
+ :href => "javascript: toggle_multi_select('#{@dom_id}', this, 'Expand', 'Collapse');", # TO DO: to locales
248
+ :class => 'toggle_multi_select_icon', :title => 'Expand')
249
+ else
250
+ select_options[:multiple] = false
251
+ select_toggle = ''
252
+ end
253
+ end
254
+
255
+ if auto_reload
256
+ select_options[:class] += ' auto_reload'
257
+ end
258
+
259
+ '<span class="custom_dropdown_container">'.html_safe_if_necessary +
260
+ content_tag(:select, options_for_select(@custom_filter, params), select_options) +
261
+ select_toggle.html_safe_if_necessary + '</span>'.html_safe_if_necessary
262
+ end
263
+
264
+ def yield_declaration_of_column_filter #:nodoc:
265
+ %$templates : ['#{@query_without_equals_sign}'],
266
+ ids : ['#{@dom_id}'] $
267
+ end
268
+
269
+ def has_auto_reloading_select? #:nodoc:
270
+ auto_reload
271
+ end
272
+ end
273
+
274
+ class ViewColumnBoolean < ViewColumnCustomDropdown #:nodoc:
275
+ @@handled_type[Boolean] = self
276
+ include ActionView::Helpers::FormOptionsHelper
277
+
278
+ attr_accessor :boolean_filter_true_label, :boolean_filter_false_label
279
+
280
+ def render_filter_internal(params) #:nodoc:
281
+ @custom_filter = {@filter_all_label => nil,
282
+ @boolean_filter_true_label => 't',
283
+ @boolean_filter_false_label => 'f' }
284
+ @turn_off_select_toggling = true
285
+ super(params)
286
+ end
287
+ end
288
+
289
+ class ViewColumnDatetime < ViewColumn #:nodoc:
290
+ @@handled_type[DateTime] = self
291
+ @@handled_type[Time] = self
292
+ include ActionView::Helpers::DateHelper
293
+ include Wice::JsCalendarHelpers
294
+
295
+
296
+ # name_and_id_from_options in Rails Date helper does not substitute '.' with '_'
297
+ # like all other simpler form helpers do. Thus, overriding it here.
298
+ def name_and_id_from_options(options, type) #:nodoc:
299
+ options[:name] = (options[:prefix] || DEFAULT_PREFIX) + (options[:discard_type] ? '' : "[#{type}]")
300
+ options[:id] = options[:name].gsub(/([\[\(])|(\]\[)/, '_').gsub(/[\]\)]/, '').gsub(/\./, '_').gsub(/_+/, '_')
301
+ end
302
+
303
+ @@datetime_chunk_names = %w(year month day hour minute)
304
+
305
+ def prepare_for_standard_filter #:nodoc:
306
+ x = lambda{|sym|
307
+ @@datetime_chunk_names.collect{|datetime_chunk_name|
308
+ triple = form_parameter_name_id_and_query(sym => {datetime_chunk_name => ''})
309
+ [triple[0], triple[3]]
310
+ }
311
+ }
312
+
313
+ @queris_ids = x.call(:fr) + x.call(:to)
314
+
315
+ _, _, @name1, _ = form_parameter_name_id_and_query({:fr => ''})
316
+ _, _, @name2, _ = form_parameter_name_id_and_query({:to => ''})
317
+ end
318
+
319
+
320
+ def prepare_for_calendar_filter #:nodoc:
321
+ query, _, @name1, @dom_id = form_parameter_name_id_and_query(:fr => '')
322
+ query2, _, @name2, @dom_id2 = form_parameter_name_id_and_query(:to => '')
323
+
324
+ @queris_ids = [[query, @dom_id], [query2, @dom_id2] ]
325
+ end
326
+
327
+
328
+ def render_standard_filter_internal(params) #:nodoc:
329
+ '<div class="date-filter">' +
330
+ select_datetime(params[:fr], {:include_blank => true, :prefix => @name1}) + '<br/>' +
331
+ select_datetime(params[:to], {:include_blank => true, :prefix => @name2}) +
332
+ '</div>'
333
+ end
334
+
335
+ def render_calendar_filter_internal(params) #:nodoc:
336
+ html1, js1 = datetime_calendar_prototype(params[:fr], @view,
337
+ {:include_blank => true, :prefix => @name1, :id => @dom_id, :fire_event => auto_reload},
338
+ :title => WiceGridNlMessageProvider.get_message(:DATE_SELECTOR_TOOLTIP_FROM))
339
+ html2, js2 = datetime_calendar_prototype(params[:to], @view,
340
+ {:include_blank => true, :prefix => @name2, :id => @dom_id2, :fire_event => auto_reload},
341
+ :title => WiceGridNlMessageProvider.get_message(:DATE_SELECTOR_TOOLTIP_TO))
342
+ [%!<div class="date-filter">#{html1}<br/>#{html2}</div>!, js1 + js2]
343
+ end
344
+
345
+
346
+ def render_filter_internal(params) #:nodoc:
347
+ # falling back to the Rails helpers for Datetime
348
+ if helper_style == :standard || Defaults::JS_FRAMEWORK == :jquery
349
+ prepare_for_standard_filter
350
+ render_standard_filter_internal(params)
351
+ else
352
+ prepare_for_calendar_filter
353
+ render_calendar_filter_internal(params)
354
+ end
355
+ end
356
+
357
+ def yield_declaration_of_column_filter #:nodoc:
358
+ %$templates : [ #{@queris_ids.collect{|tuple| "'" + tuple[0] + "'"}.join(', ')} ],
359
+ ids : [ #{@queris_ids.collect{|tuple| "'" + tuple[1] + "'"}.join(', ')} ] $
360
+ end
361
+
362
+ def has_auto_reloading_calendar? #:nodoc:
363
+ auto_reload && helper_style == :calendar
364
+ end
365
+
366
+ end
367
+
368
+ class ViewColumnDate < ViewColumnDatetime #:nodoc:
369
+ @@handled_type[Date] = self
370
+
371
+ @@datetime_chunk_names = %w(year month day)
372
+
373
+ def render_standard_filter_internal(params) #:nodoc:
374
+ '<div class="date-filter">' +
375
+ select_date(params[:fr], {:include_blank => true, :prefix => @name1, :id => @dom_id}) + '<br/>' +
376
+ select_date(params[:to], {:include_blank => true, :prefix => @name2, :id => @dom_id2}) +
377
+ '</div>'
378
+ end
379
+
380
+ def render_calendar_filter_internal(params) #:nodoc:
381
+
382
+ calendar_helper_method = if Wice::Defaults::JS_FRAMEWORK == :prototype
383
+ :date_calendar_prototype
384
+ else
385
+ :date_calendar_jquery
386
+ end
387
+
388
+ html1, js1 = send(calendar_helper_method, params[:fr], @view,
389
+ {:include_blank => true, :prefix => @name1, :fire_event => auto_reload},
390
+ :title => WiceGridNlMessageProvider.get_message(:DATE_SELECTOR_TOOLTIP_FROM))
391
+ html2, js2 = send(calendar_helper_method, params[:to], @view,
392
+ {:include_blank => true, :prefix => @name2, :fire_event => auto_reload},
393
+ :title => WiceGridNlMessageProvider.get_message(:DATE_SELECTOR_TOOLTIP_TO))
394
+
395
+ [%!<div class="date-filter">#{html1}<br/>#{html2}</div>!, js1 + js2]
396
+ end
397
+
398
+ def render_filter_internal(params) #:nodoc:
399
+
400
+ if helper_style == :standard
401
+ prepare_for_standard_filter
402
+ render_standard_filter_internal(params)
403
+ else
404
+ prepare_for_calendar_filter
405
+ render_calendar_filter_internal(params)
406
+ end
407
+ end
408
+ end
409
+
410
+ class ViewColumnString < ViewColumn #:nodoc:
411
+ @@handled_type[String] = self
412
+ # @@handled_type[:text] = self
413
+
414
+ attr_accessor :negation, :auto_reloading_input_with_negation_checkbox
415
+
416
+ def render_filter_internal(params) #:nodoc:
417
+ @contains_a_text_input = true
418
+ css_class = auto_reload ? 'auto_reload' : nil
419
+
420
+ if negation
421
+ self.auto_reloading_input_with_negation_checkbox = true if auto_reload
422
+
423
+ @query, _, parameter_name, @dom_id = form_parameter_name_id_and_query(:v => '')
424
+ @query2, _, parameter_name2, @dom_id2 = form_parameter_name_id_and_query(:n => '')
425
+
426
+ '<div class="text_filter_container">' +
427
+ text_field_tag(parameter_name, params[:v], :size => 8, :id => @dom_id, :class => css_class) +
428
+ if defined?(::Wice::Defaults::NEGATION_CHECKBOX_LABEL) && ! ::Wice::Defaults::NEGATION_CHECKBOX_LABEL.blank?
429
+ ::Wice::Defaults::NEGATION_CHECKBOX_LABEL
430
+ else
431
+ ''
432
+ end +
433
+ check_box_tag(parameter_name2, '1', (params[:n] == '1'),
434
+ :id => @dom_id2,
435
+ :title => WiceGridNlMessageProvider.get_message(:NEGATION_CHECKBOX_TITLE),
436
+ :class => 'negation_checkbox') +
437
+ '</div>'
438
+ else
439
+ @query, _, parameter_name, @dom_id = form_parameter_name_id_and_query('')
440
+ text_field_tag(parameter_name, (params.blank? ? '' : params), :size => 8, :id => @dom_id, :class => css_class)
441
+ end
442
+ end
443
+
444
+ def yield_declaration_of_column_filter #:nodoc:
445
+ if negation
446
+ %$templates : ['#{@query}', '#{@query2}'],
447
+ ids : ['#{@dom_id}', '#{@dom_id2}'] $
448
+ else
449
+ %$templates : ['#{@query}'],
450
+ ids : ['#{@dom_id}'] $
451
+ end
452
+ end
453
+
454
+ def has_auto_reloading_input? #:nodoc:
455
+ auto_reload
456
+ end
457
+
458
+ def auto_reloading_input_with_negation_checkbox? #:nodoc:
459
+ self.auto_reloading_input_with_negation_checkbox
460
+ end
461
+
462
+ end
463
+
464
+ end