mongoid_wice_grid 4.0.0

Sign up to get free protection for your applications and to get access to all the features.
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,165 @@
1
+ # encoding: UTF-8
2
+ module Wice
3
+ module Controller
4
+
5
+ def self.included(base) #:nodoc:
6
+ base.extend(ClassMethods)
7
+ end
8
+
9
+ module ClassMethods
10
+
11
+ # Used to add query processing action methods into a controller.
12
+ # Read section "Saving Queries How-To" in README for more details.
13
+ def save_wice_grid_queries
14
+ include Wice::SerializedQueriesControllerMixin
15
+ end
16
+ end
17
+
18
+ protected
19
+
20
+ attr_accessor :wice_grid_instances
21
+
22
+ # Creates a grid object to be used in the view. This is the <i>main</i> model, and the underlying table is the default table -
23
+ # if in other parameters a column name is mentioned without the name of the table, this table is implied.
24
+ # Just like in an ordinary ActiveRecord <tt>find</tt> you can use <tt>:joins</tt>, <tt>:include</tt>, and <tt>:conditions</tt>.
25
+ #
26
+ # The first parameter is an ActiveRecord class name. The generated ActiveRecord call will use it as the
27
+ # receiver of the <tt>paginate</tt> method: <tt>klass.paginate(...)</tt>
28
+ #
29
+ # The second parameters is a hash of parameters:
30
+ # * <tt>:joins</tt> - ActiveRecord <tt>:joins</tt> option.
31
+ # * <tt>:include</tt> - ActiveRecord <tt>:include</tt> option.
32
+ # * <tt>:conditions</tt> - ActiveRecord <tt>:conditions</tt> option.
33
+ # * <tt>:per_page</tt> - Number of rows per one page. The default is 10.
34
+ # * <tt>:page</tt> - The page to show when rendering the grid for the first time. The default is one, naturally.
35
+ # * <tt>:order</tt> - Name of the column to sort by. Can be of a short form (just the name of the column) if this
36
+ # is a column of the main table (the table of the main ActiveRecord model, the first parameter of <tt>initialize_grid</tt>),
37
+ # or a fully qualified name with the name of the table.
38
+ # * <tt>:order_direction</tt> - <tt>:asc</tt> for ascending or <tt>:desc</tt> for descending. The default is <tt>:asc</tt>.
39
+ # * <tt>:name</tt> - name of the grid. Only needed if there is a second grid on a page. The name serves as the base name for
40
+ # HTTP parametes, DOM IDs, etc. The shorter the name, the shorter the GET request is. The name can only contain alphanumeruc characters.
41
+ # * <tt>:enable_export_to_csv</tt> - <Enable export of the table to CSV. Read the How-To to learn what else is needed to enable CSV export.
42
+ # * <tt>:csv_file_name</tt> - Name of the exported CSV file. If the parameter is missing, the name of the grid will be used instead.
43
+ # * <tt>:custom_order</tt> - used for overriding the ORDER BY clause with custom sql code (for example, including a function).
44
+ # The value of the parameter is a hash where keys are fully qualified names
45
+ # of database columns, and values the required chunks of SQL to use in the ORDER BY clause, either as strings or Proc object
46
+ # evaluating to string. See section 'Custom Ordering' in the README.
47
+ # * <tt>:saved_query</tt> - id of the saved query or the query object itself to load initially.
48
+ # Read section "Saving Queries How-To" in README for more details.
49
+ # * <tt>:after</tt> - defined a name of a controller method which would be called by the grid after all user input has been processed,
50
+ # with a single parameter which is a Proc object. Once called, the object returns a list of all records of the current selection
51
+ # throughout all pages. See section "Integration With The Application" in the README.
52
+ # * <tt>:total_entries</tt> - If not specified, <tt>will_paginate</tt> will run a <tt>select count</tt>
53
+ # * <tt>:select</tt> - ActiveRecord <tt>:select</tt> option. Please do not forget that <tt>:select</tt> is ignored
54
+ # when <tt>:include</tt> is present. It is unlikely you would need <tt>:select</tt> with WiceGrid, but if you do,
55
+ # use it with care :)
56
+ # * <tt>:group</tt> - ActiveRecord <tt>:group</tt> option. Use it if you are sure you know what you are doing :)
57
+ # * <tt>:with_paginated_resultset</tt> - a callback executed from within the plugin to process records of the current page.
58
+ # Can be a lambda object or a controller method name (symbol). The argument to the callback is the array of the records.
59
+ # * <tt>:with_resultset</tt> - a callback executed from within the plugin to process all records browsable through
60
+ # all pages with the current filters. Can be a lambda object or a controller method name (symbol). The argument to
61
+ # the callback is a lambda object which returns the list of records when called. See the README for the explanation.
62
+ #
63
+ # Defaults for parameters <tt>:per_page</tt>, <tt>:order_direction</tt>, <tt>:name</tt>, and <tt>:erb_mode</tt>
64
+ # can be changed in <tt>lib/wice_grid_config.rb</tt>, this is convenient if you want to set a project wide setting
65
+ # without having to repeat it for every grid instance.
66
+
67
+
68
+ def initialize_grid(klass, opts = {})
69
+ Wice::JsAdaptor.init
70
+ @__wice_grid_on_page = true
71
+ wg = WiceGrid.new(klass, self, opts)
72
+ self.wice_grid_instances = [] if self.wice_grid_instances.nil?
73
+ self.wice_grid_instances << wg
74
+ wg
75
+ end
76
+
77
+ # +export_grid_if_requested+ is a controller method which should be called at the end of each action containing grids with enabled
78
+ # CSV export.
79
+ #
80
+ # CSV export will only work if each WiceGrid helper is placed in a partial of its own (requiring it from the master template
81
+ # of course for the usual flow).
82
+ # +export_grid_if_requested+ intercepts CSV export requests and evaluates the corresponding partial with the required grid helper.
83
+ # By default for each grid +export_grid_if_requested+ will look for a partial
84
+ # whose name follows the following pattern:
85
+ #
86
+ # _GRID_NAME_grid.html.erb
87
+ #
88
+ # For example, a grid named +orders+ is supposed to be found in a template called <tt>_orders_grid.html.erb</tt>,
89
+ # Remember that the default name of grids is +grid+.
90
+ #
91
+ # This convention can be easily overridden by supplying a hash parameter to +export_grid_if_requested+ where each key is the name of
92
+ # a grid, and the value is the name of the template (like it is specified for +render+, i.e. without '_' and extensions):
93
+ #
94
+ # export_grid_if_requested(:grid => 'orders', 'grid2' => 'invoices')
95
+ #
96
+ # If the request is not a CSV export request, the method does nothing and returns +false+, if it is a CSV export request,
97
+ # the method returns +true+.
98
+ #
99
+ # If the action has no explicit +render+ call, it's OK to just place +export_grid_if_requested+ as the last line of the action. Otherwise,
100
+ # to avoid double rendering, use the return value of the method to conditionally call your +render+ :
101
+ #
102
+ # export_grid_if_requested || render(:action => 'index')
103
+ #
104
+ # It's also possible to supply a block which will be called if no CSV export is requested:
105
+ #
106
+ # export_grid_if_requested do
107
+ # render(:action => 'index')
108
+ # end
109
+
110
+ def export_grid_if_requested(opts = {})
111
+ grid = self.wice_grid_instances.detect(&:output_csv?)
112
+
113
+ if grid
114
+ template_name = opts[grid.name] || opts[grid.name.intern]
115
+ template_name ||= grid.name + '_grid'
116
+ temp_filename = render_to_string(:partial => template_name)
117
+ temp_filename.strip!
118
+ filename = (grid.csv_file_name || grid.name ) + '.csv'
119
+ grid.csv_tempfile.close
120
+ send_file temp_filename, :filename => filename, :type => 'text/csv'
121
+ grid.csv_tempfile = nil
122
+ true
123
+ else
124
+ yield if block_given?
125
+ false
126
+ end
127
+ end
128
+
129
+ # +wice_grid_custom_filter_params+ generates HTTP parameters understood by WiceGrid custom filters.
130
+ # Combined with Rails route helpers it allows to generate links leading to
131
+ # grids with pre-selected custom filters.
132
+ #
133
+ # Parameters:
134
+ # * <tt>:grid_name</tt> - The name of the grid. Just like parameter <tt>:name</tt> of
135
+ # <tt>initialize_grid</tt>, the parameter is optional, and when absent, the name
136
+ # <tt>'grid'</tt> is assumed
137
+ # * <tt>:attribute_name</tt> and <tt>:model_class</tt> - should be the same as <tt>:attribute_name</tt> and
138
+ # <tt>:model_class</tt> of the column declaration with the target custom filter.
139
+ # * <tt>:value</tt> - the value of the column filter.
140
+ def wice_grid_custom_filter_params(opts = {})
141
+ options = {:grid_name => 'grid',
142
+ :attribute_name => nil,
143
+ :model_class => nil,
144
+ :value => nil}
145
+ options.merge!(opts)
146
+
147
+ [:attribute_name, :value].each do |key|
148
+ raise ::Wice::WiceGridArgumentError.new("wice_grid_custom_filter_params: :#{key} is a mandatory argument") unless options[key]
149
+ end
150
+
151
+ attr_name = if options[:model_class]
152
+ unless options[:model_class].nil?
153
+ options[:model_class] = options[:model_class].constantize if options[:model_class].is_a? String
154
+ raise Wice::WiceGridArgumentError.new("Option :model_class can be either a class or a string instance") unless options[:model_class].is_a? Class
155
+ end
156
+ options[:model_class].table_name + '.' + options[:attribute_name]
157
+ else
158
+ options[:attribute_name]
159
+ end
160
+
161
+ {"#{options[:grid_name]}[f][#{attr_name}][]" => options[:value]}
162
+ end
163
+
164
+ end
165
+ end
@@ -0,0 +1,179 @@
1
+ # encoding: UTF-8
2
+ module WGHashExtensions #:nodoc:
3
+
4
+ def self.included(base) #:nodoc:
5
+ base.extend(ClassMethods)
6
+ end
7
+
8
+
9
+ # if there's a hash of hashes, the original structure and the
10
+ # returned structure should not contain any shared deep hashes
11
+ def deep_clone_yl #:nodoc:
12
+ cloned = self.clone
13
+ cloned.keys.each do |k|
14
+ if cloned[k].kind_of?(Hash)
15
+ cloned[k] = cloned[k].deep_clone_yl
16
+ end
17
+ end
18
+ cloned
19
+ end
20
+
21
+ # Used to modify options submitted to view helpers. If there is no :klass option,
22
+ # it will be added, if there is, the css class name will be appended to the existing
23
+ # class name(s)
24
+ def add_or_append_class_value!(klass_value, prepend = false) #:nodoc:
25
+ if self.has_key?('class')
26
+ self[:class] = self['class']
27
+ self.delete('class')
28
+ end
29
+
30
+ self[:class] = if self.has_key?(:class)
31
+ if prepend
32
+ "#{klass_value} #{self[:class]}"
33
+ else
34
+ "#{self[:class]} #{klass_value}"
35
+ end
36
+ else
37
+ klass_value
38
+ end
39
+
40
+ return self
41
+ end
42
+
43
+
44
+ # Used to transform a traditional params hash
45
+ # into an array of two element arrays where element zero is a parameter name as it appears in HTTP requests,
46
+ # and the first element is the value:
47
+ # { :a => { :b => 3, :c => 4, :d => { :e => 5 }} }.parameter_names_and_values #=> [["a[d][e]", 5], ["a[b]", 3], ["a[c]", 4]]
48
+ # The parameter is an optional array of parameter names to prepend:
49
+ # { :a => { :b => 3, :c => 4, :d => { :e => 5 }} }.parameter_names_and_values(['foo', 'baz']) #=>
50
+ # [["foo[baz][a][d][e]", 5], ["foo[baz][a][b]", 3], ["foo[baz][a][c]", 4]]
51
+ def parameter_names_and_values(initial = []) #:nodoc:
52
+ res = []
53
+ recursively_gather_finite_non_hash_values_with_key_path(res, [])
54
+ res.collect do |parameter_struct|
55
+ parameter_struct[0] = initial + parameter_struct[0]
56
+ [parameter_struct[0].to_parameter_name, parameter_struct[1]]
57
+ end
58
+ end
59
+
60
+
61
+ # A deep merge of two hashes.
62
+ # That is, if both hashes have the same key and the values are hashes, these two hashes should also be merged.
63
+ # Used for merging two sets of params.
64
+ def rec_merge(other) #:nodoc:
65
+ res = self.clone
66
+ other.each do |key, other_value|
67
+ value = res[key]
68
+ if value.is_a?(Hash) && other_value.is_a?(Hash)
69
+ res[key] = value.rec_merge other_value
70
+ else
71
+ res[key] = other_value
72
+ end
73
+ end
74
+ res
75
+ end
76
+
77
+
78
+ module ClassMethods #:nodoc:
79
+
80
+ # Used mostly for submitting options to view helpers, that is, like this:
81
+ # content_tag(:th, col_link, Hash.make_hash(:class, css_class))
82
+ # In some it is important that if the value is empty, no option
83
+ # is submitted at all. Thus, there's a check for an empty value
84
+ def make_hash(key, value) #:nodoc:
85
+ value.blank? ? {} : {key => value}
86
+ end
87
+
88
+
89
+ end
90
+
91
+ protected
92
+
93
+ def recursively_gather_finite_non_hash_values_with_key_path(res, stack = []) #:nodoc:
94
+ self.each do |key, value|
95
+ if value.kind_of?(Hash)
96
+ value.recursively_gather_finite_non_hash_values_with_key_path(res, stack + [key])
97
+ else
98
+ res << [stack + [key], value]
99
+ end
100
+ end
101
+ end
102
+
103
+ end
104
+
105
+
106
+ class Hash #:nodoc:
107
+ include WGHashExtensions
108
+ end
109
+
110
+ # tag_options is a Rails views private method that takes a hash op options for
111
+ # an HTM hash and produces a string ready to be added to the tag.
112
+ # Here we are changing its visibility in order to be able to use it.
113
+ module ActionView #:nodoc:
114
+ module Helpers #:nodoc:
115
+ module TagHelper #:nodoc:
116
+ public :tag_options
117
+ end
118
+ end
119
+ end
120
+
121
+
122
+
123
+ module Enumerable #:nodoc:
124
+
125
+ # Used to check the validity of :custom_filter parameter of column
126
+ def all_items_are_of_class(klass) #:nodoc:
127
+ return false if self.empty?
128
+ self.inject(true){|memo, o| (o.is_a? klass) && memo}
129
+ end
130
+
131
+ end
132
+
133
+ module WGObjectExtensions #:nodoc:
134
+
135
+ # takes a list of messages, sends message 1 to self, then message 2 is sent to the result of the first message, ans so on
136
+ # returns nil as soon as the current receiver does not respond to such a message
137
+ def deep_send(*messages) #:nodoc:
138
+ obj = self
139
+ messages.each do |message|
140
+ if obj.respond_to? message
141
+ obj = obj.send(message)
142
+ else
143
+ return nil
144
+ end
145
+ # return obj if obj.nil?
146
+ end
147
+ return obj
148
+ end
149
+ end
150
+
151
+ class Object #:nodoc:
152
+ include WGObjectExtensions
153
+ end
154
+
155
+ module WGArrayExtensions #:nodoc:
156
+ # Only used by Hash#parameter_names_and_values
157
+ # Transforms ['foo', 'bar', 'baz'] to 'foo[bar][baz]'
158
+ def to_parameter_name #:nodoc:
159
+ self[0].to_s + (self[1..-1] || []).collect{|k| '[' + k.to_s + ']'}.join('')
160
+ end
161
+ end
162
+
163
+ class Array #:nodoc:
164
+ include WGArrayExtensions
165
+ end
166
+
167
+ module StringExt #:nodoc:
168
+ def html_safe_if_necessary #:nodoc:
169
+ if respond_to?(:html_safe)
170
+ html_safe
171
+ else
172
+ self
173
+ end
174
+ end
175
+ end
176
+
177
+ class String #:nodoc:
178
+ include StringExt
179
+ end
@@ -0,0 +1,99 @@
1
+ # encoding: UTF-8
2
+ module Wice
3
+
4
+ class << self
5
+
6
+ @@model_validated = false
7
+
8
+ # checks whether the class is a valid storage for saved queries
9
+ def validate_query_model(query_store_model) #:nodoc:
10
+ unless query_store_model.respond_to?(:list)
11
+ raise ::Wice::WiceGridArgumentError.new("Model for saving queries #{query_store_model.class.name} is invalid - there is no class method #list defined")
12
+ end
13
+ arit = query_store_model.method(:list).arity
14
+ unless arit == 2
15
+ raise ::Wice::WiceGridArgumentError.new("Method list in the model for saving queries #{query_store_model.class.name} has wrong arity - it should be 2 instead of #{arit}")
16
+ end
17
+ @@model_validated = true
18
+ end
19
+
20
+ # Retrieves and constantizes (if needed ) the Query Store model
21
+ def get_query_store_model #:nodoc:
22
+
23
+ query_store_model = ::Wice::Defaults::QUERY_STORE_MODEL
24
+ query_store_model = query_store_model.constantize if query_store_model.is_a? String
25
+ raise ::Wice::WiceGridArgumentError.new("Defaults::QUERY_STORE_MODEL must be an ActiveRecord class or a string which can be constantized to an ActiveRecord class") unless query_store_model.kind_of? Class
26
+ validate_query_model(query_store_model) unless @@model_validated
27
+ query_store_model
28
+ end
29
+
30
+ def get_string_matching_operators(model) #:nodoc:
31
+ if defined?(Wice::Defaults::STRING_MATCHING_OPERATORS) && Wice::Defaults::STRING_MATCHING_OPERATORS.is_a?(Hash) &&
32
+ str_matching_operator =(Wice::Defaults::STRING_MATCHING_OPERATORS[model.connection.class.to_s] rescue nil)
33
+ str_matching_operator
34
+ else
35
+ Wice::Defaults::STRING_MATCHING_OPERATOR
36
+ end
37
+ end
38
+
39
+ def deprecated_call(old_name, new_name, opts) #:nodoc:
40
+ if opts[old_name] && ! opts[new_name]
41
+ opts[new_name] = opts[old_name]
42
+ opts.delete(old_name)
43
+ STDERR.puts "WiceGrid: Parameter :#{old_name} is deprecated, use :#{new_name} instead!"
44
+ end
45
+ end
46
+
47
+ def log(message) #:nodoc:
48
+ ActionController::Base.logger.info('WiceGrid: ' + message)
49
+ end
50
+ end
51
+
52
+
53
+ # The point of this module is to provide a thin layer between
54
+ # Rails Internationalization API and WiceGrid, enabling a fallback
55
+ # to the old hardcoded messages if no translations are available
56
+ # or I18n is not present (Rails 2.1.0 and older).
57
+ module WiceGridNlMessageProvider #:nodoc:
58
+ class << self
59
+
60
+ def get_from_hardcoded_constants(key) #:nodoc:
61
+ if Wice::Defaults.const_defined?(key)
62
+ Wice::Defaults.const_get(key)
63
+ else
64
+ return "message for key #{key} not found!"
65
+ end
66
+ end
67
+
68
+ if Object.const_defined?(:I18n) # Rails with :I18n
69
+
70
+ def get_message(key) #:nodoc:
71
+ translated = I18n.t(key.to_s.downcase, :scope => 'wice_grid', :default => '_')
72
+ if translated == '_'
73
+ get_from_hardcoded_constants(key)
74
+ else
75
+ translated
76
+ end
77
+ end
78
+
79
+ else # Rails without :I18n
80
+ alias_method :get_message, :get_from_hardcoded_constants
81
+ end
82
+ end
83
+ end
84
+
85
+ module Defaults #:nodoc:
86
+ end
87
+
88
+ module ExceptionsMixin #:nodoc:
89
+ def initialize(str) #:nodoc:
90
+ super("WiceGrid: " + str)
91
+ end
92
+ end
93
+ class WiceGridArgumentError < ArgumentError #:nodoc:
94
+ include ExceptionsMixin
95
+ end
96
+ class WiceGridException < Exception #:nodoc:
97
+ include ExceptionsMixin
98
+ end
99
+ end
@@ -0,0 +1,77 @@
1
+ # encoding: UTF-8
2
+ module Wice
3
+ class <<self
4
+ # Used in routes.rb to define routes to the query processing controller.
5
+ # Parameters:
6
+ # * map - the mapper object used in routes.rb to defined routes (instance of <tt>ActionController::Routing::RouteSet::Mapper</tt>)
7
+ # * controller - name of the query processing controller, i.e. <tt>'queries'</tt> if the controller is +QueriesController+ .
8
+ # Read section "Saving Queries How-To" in README for more details.
9
+ def define_routes(map, controller)
10
+ controller = controller.to_s
11
+ map.create_serialized_query '/wice_grid_serialized_queries/:grid_name',
12
+ :controller => controller,
13
+ :action => 'create',
14
+ :conditions => {:method => :post}
15
+ map.delete_serialized_query '/wice_grid_serialized_query/:grid_name/:id',
16
+ :controller => controller,
17
+ :action => 'delete',
18
+ :conditions => {:method => :post}
19
+ end
20
+ end
21
+
22
+ module SerializedQueriesControllerMixin #:nodoc:
23
+
24
+ def delete #:nodoc:
25
+ init
26
+ if sq = @query_store_model.find_by_id_and_grid_name(params[:id], @grid_name)
27
+ if sq.destroy
28
+ if params[:current]
29
+ @current = @query_store_model.find_by_id_and_grid_name(params[:current], @grid_name)
30
+ end
31
+ @notification_messages = WiceGridNlMessageProvider.get_message(:QUERY_DELETED_MESSAGE)
32
+ else
33
+ @error_messages = sq.errors.full_raw_messages.join(' ')
34
+ end
35
+ end
36
+ render :file => "#{RAILS_ROOT}/vendor/plugins/wice_grid/lib/views/delete.rjs"
37
+ end
38
+
39
+ def create #:nodoc:
40
+ init
41
+ query_params = if params[@grid_name]
42
+ params[@grid_name]
43
+ else
44
+ {}
45
+ end
46
+ query_params.delete(:page)
47
+
48
+ @saved_query = @query_store_model.new(:grid_name => @grid_name, :name => params[:query_name], :query => query_params)
49
+
50
+ @saved_query.attributes = params[:extra] unless params[:extra].blank?
51
+
52
+ if @saved_query.save
53
+ @grid_title_id = "#{@grid_name}_title"
54
+ @notification_messages = WiceGridNlMessageProvider.get_message(:QUERY_SAVED_MESSAGE)
55
+ else
56
+ @error_messages = @saved_query.errors.map{ |_, msg| msg }.join(' ')
57
+ end
58
+
59
+ render :file => "#{RAILS_ROOT}/vendor/plugins/wice_grid/lib/views/create.rjs"
60
+ end
61
+
62
+ def extra
63
+ params[:extra]
64
+ end
65
+
66
+ protected
67
+
68
+ def init #:nodoc:
69
+ @query_store_model = ::Wice::get_query_store_model
70
+
71
+ @grid_name = params[:grid_name]
72
+ @notification_messages_dom_id = "#{@grid_name}_notification_messages"
73
+ @query_list_dom_id = "#{@grid_name}_query_list"
74
+
75
+ end
76
+ end
77
+ end