acts_as_data_table 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (33) hide show
  1. data/.gitignore +18 -0
  2. data/Gemfile +4 -0
  3. data/LICENSE.txt +22 -0
  4. data/README.md +55 -0
  5. data/Rakefile +11 -0
  6. data/acts_as_data_table.gemspec +25 -0
  7. data/app/coffeescripts/acts_as_data_table.coffee +47 -0
  8. data/app/helpers/acts_as_data_table_helper.rb +170 -0
  9. data/config/locales/acts_as_data_table.en.yml +11 -0
  10. data/generators/acts_as_data_table/acts_as_data_table_generator.rb +13 -0
  11. data/generators/acts_as_data_table/templates/assets/js/acts_as_data_table.js +37 -0
  12. data/init.rb +1 -0
  13. data/lib/acts_as_data_table/multi_column_scopes.rb +116 -0
  14. data/lib/acts_as_data_table/scope_filters/action_controller.rb +139 -0
  15. data/lib/acts_as_data_table/scope_filters/active_record.rb +264 -0
  16. data/lib/acts_as_data_table/scope_filters/form_helper.rb +67 -0
  17. data/lib/acts_as_data_table/scope_filters/validator.rb +144 -0
  18. data/lib/acts_as_data_table/session_helper.rb +193 -0
  19. data/lib/acts_as_data_table/shared/action_controller.rb +25 -0
  20. data/lib/acts_as_data_table/shared/session.rb +312 -0
  21. data/lib/acts_as_data_table/sortable_columns/action_controller.rb +111 -0
  22. data/lib/acts_as_data_table/sortable_columns/active_record.rb +34 -0
  23. data/lib/acts_as_data_table/sortable_columns/renderers/bootstrap2.rb +17 -0
  24. data/lib/acts_as_data_table/sortable_columns/renderers/default.rb +82 -0
  25. data/lib/acts_as_data_table/version.rb +3 -0
  26. data/lib/acts_as_data_table.rb +71 -0
  27. data/lib/acts_as_data_table_helper.rb.bak +165 -0
  28. data/lib/named_scope_filters.rb +273 -0
  29. data/lib/tasks/acts_as_data_table.rake +4 -0
  30. data/rails/init.rb +4 -0
  31. data/test/acts_as_searchable_test.rb +8 -0
  32. data/test/test_helper.rb +4 -0
  33. metadata +142 -0
@@ -0,0 +1,165 @@
1
+ module ActsAsDataTableHelper
2
+
3
+ def scope_filter_link(group, filter, options = {})
4
+
5
+ end
6
+ #
7
+ # #----------------------------------------------------------------
8
+ # # Filters
9
+ # #----------------------------------------------------------------
10
+ #
11
+ # # Generates a link to to add or remove a certain filter to the
12
+ # # current controller/action.
13
+ # # Parameters:
14
+ # # +group+:: The group name the filter belongs to
15
+ # #
16
+ # # ===Options
17
+ # # +:filter+:: The filter name to be applied
18
+ # # +:caption+:: The link caption, defaults to a localization
19
+ # # +:remove+:: If set to +true+, the filter will be removed instead of (re-)added
20
+ # # +:args+:: Args to be used when applying the filter
21
+ # # +:auto_remove+:: If set to true, a click on an active filter will remove it again.
22
+ # #
23
+ # # All other options will be used as html_options for the resulting link
24
+ # #--------------------------------------------------------------
25
+ # def scope_filter_link(group, options = {})
26
+ # filter_name = options.delete(:filter)
27
+ # caption = options.delete(:caption) || t("activerecord.scopes.#{searchable_session.model.table_name}.#{filter_name}")
28
+ # args = options.delete(:args)
29
+ # surrounding_tag = options.delete(:surrounding)
30
+ # auto_remove = options.delete(:auto_remove) && searchable_session.active_filter?(group, filter_name, args)
31
+ # remove = options.delete(:remove)
32
+ #
33
+ # if remove || auto_remove
34
+ # url = {:scope_filters => {:remove => group}}
35
+ # else
36
+ # url = {:scope_filters => {:group => group, :name => filter_name, :args => args}}
37
+ # end
38
+ #
39
+ # classes = options[:class].try(:split, ' ') || []
40
+ # classes << 'active' if searchable_session.active_filter?(group, filter_name, args)
41
+ # options[:class] = classes.join(' ')
42
+ # link = link_to_remote caption, :url => url, :method => :get, :html => options
43
+ # surrounding_tag ? content_tag(surrounding_tag, link, :class => options[:class]) : link
44
+ # end
45
+ #
46
+ # # Generates the URL to remove all filters from the current action
47
+ # #--------------------------------------------------------------
48
+ # def remove_all_scope_filters_url
49
+ # {:scope_filters => {:remove_all => true}}
50
+ # end
51
+ #
52
+ # # Generates the URL to be used as form action to add a new filter
53
+ # #--------------------------------------------------------------
54
+ # def scope_filter_form_url(group, filter_name)
55
+ # {:scope_filters => {:group => group, :name => filter_name}}
56
+ # end
57
+ #
58
+ # # Generates the form element name for filter args inside
59
+ # # a form
60
+ # #--------------------------------------------------------------
61
+ # def scope_filter_field_name(arg_name)
62
+ # "scope_filters[args][#{arg_name}]"
63
+ # end
64
+ #
65
+ # # Generates a form field id for the given scope and arg
66
+ # #--------------------------------------------------------------
67
+ # def scope_filter_field_id(scope, arg_name)
68
+ # [scope, arg_name].join('_')
69
+ # end
70
+ #
71
+ # # Builds the caption for an active filter
72
+ # #--------------------------------------------------------------
73
+ # def scope_filter_caption(active_filter)
74
+ # searchable_session.model.scope_caption(active_filter[:filter], active_filter[:args])
75
+ # end
76
+ #
77
+ # # Returns the arguments for a currently active filter or nil
78
+ # # if the given filter is currently not active.
79
+ # #-------------------------------------------------------------
80
+ # def scope_filter_arg(filter_name, arg_name)
81
+ # @filter_args ||= {}
82
+ # @filter_args[filter_name.to_s] ||= {}
83
+ #
84
+ # unless @filter_args[filter_name.to_s].has_key? arg_name.to_s
85
+ # filter = active_scope_filters.select{|f| f[:filter].to_s == filter_name.to_s}.first
86
+ # if filter
87
+ # @filter_args[filter_name.to_s] = filter[:args]
88
+ # else
89
+ # #If the filter is currently not active, cache the argument anyway with nil
90
+ # @filter_args[filter_name.to_s] ||= {}
91
+ # @filter_args[filter_name.to_s][arg_name.to_s] = nil
92
+ # end
93
+ # end
94
+ #
95
+ # @filter_args[filter_name.to_s][arg_name.to_s]
96
+ # end
97
+ #
98
+ # # Returns all active filters in a format which is easier to
99
+ # # process than the original hash structure. Each element of the
100
+ # # returned array contains the following properties:
101
+ # #
102
+ # # +:delete_url+:: A url hash which contains the necessary parameters to
103
+ # # remove the current filter from the active list
104
+ # #
105
+ # # +:group+:: The filter group this filter is in (in case you want to
106
+ # # user the +filter_link+ helper method)
107
+ # #
108
+ # # +:filter+:: The filter name
109
+ # #
110
+ # # +:args+:: The arguments the filter was applied to (for display reasons)
111
+ # #--------------------------------------------------------------
112
+ # def active_scope_filters
113
+ # return @active_filters if @active_filters
114
+ #
115
+ # @active_filters = []
116
+ # searchable_session.active_filters.each do |group, filters|
117
+ # filters.each do |filter, args|
118
+ # @active_filters << {:delete_url => {:scope_filters => {:remove => group}},
119
+ # :group => group,
120
+ # :filter => filter,
121
+ # :args => HashWithIndifferentAccess.new(args)}
122
+ # end
123
+ # end
124
+ # @active_filters
125
+ # end
126
+ #
127
+ # # Returns the active scope filter for a given filter group
128
+ # # If you hand in a block, the filter will be available inside
129
+ # # If there is no active filter for the given group,
130
+ # # the block is not executed.
131
+ # #--------------------------------------------------------------
132
+ # def active_scope_filter(group, &proc)
133
+ # filter = active_scope_filters.select {|sf| sf[:group].to_s == group.to_s}.first
134
+ # if block_given?
135
+ # yield filter if filter
136
+ # else
137
+ # filter
138
+ # end
139
+ # end
140
+ #
141
+ # #----------------------------------------------------------------
142
+ # # Sorting Columns
143
+ # #----------------------------------------------------------------
144
+ #
145
+ # def sortable_column(model_name, column_name, caption = nil, &proc)
146
+ # sortable = Struct.new(:caption, :direction, :active, :url_replace, :url_add_toggle, :url_remove).new
147
+ #
148
+ # sortable.direction = searchable_session.sorting_direction(model_name, column_name)
149
+ # sortable.active = sortable.direction.present?
150
+ #
151
+ # sortable.url_replace = {:sorting_columns => {:replace => true, :model_name => model_name, :column_name => column_name}}
152
+ # sortable.url_add_toggle = {:sorting_columns => {:add => true, :model_name => model_name, :column_name => column_name}}
153
+ # sortable.url_remove = {:sorting_columns => {:remove => true, :model_name => model_name, :column_name => column_name}}
154
+ # sortable.caption = caption
155
+ #
156
+ #
157
+ # #If a block is given, we let the user handle the content of the table
158
+ # #header himself. Otherwise, we'll generate the default links.
159
+ # if block_given?
160
+ # yield sortable
161
+ # else
162
+ # render :partial => 'shared/sortable_column', :object => sortable
163
+ # end
164
+ # end
165
+ end
@@ -0,0 +1,273 @@
1
+ module Stex
2
+ module Acts
3
+ module DataTable
4
+ module NamedScopeFilters
5
+ module ActiveRecord
6
+ def self.included(base)
7
+ base.send :extend, ClassMethods
8
+ end
9
+
10
+ module ClassMethods
11
+ # Generates methods to automatically combine named scopes
12
+ # based on the given input
13
+ # Arguments are all named scopes you'd like to include into
14
+ # The parameter includes all filters which may be used by the automatic
15
+ # data filtering later.
16
+ # {:group_name => [scope1, scope2, [scope_with_arguments, arg1, arg2], scope4]}
17
+ #--------------------------------------------------------------
18
+ def has_named_scope_filters(filter_groups = {})
19
+ if filter_groups.empty? #No groups given, no filters created
20
+ throw 'is_named_scope_filterable needs arguments to run.'
21
+ end
22
+
23
+ #Convert filters
24
+ filter_groups.each do |group_name, filters|
25
+ filters = Array(filters)
26
+ filters.map! {|f| Array(f)}
27
+
28
+ #Check if all given named scopes actually exist
29
+ filters.each do |ns|
30
+ scope_name = ns.first
31
+ logger.warn "The scope '#{scope_name}' in group '#{group_name}' does not exist." unless scopes.has_key?(scope_name)
32
+ end
33
+ end
34
+
35
+ #Create a method to test if a given filter is valid
36
+ define_singleton_method 'named_scope_filter?' do |group, name, args|
37
+ filter_groups[group] && filter_groups[group].assoc(name).present?
38
+ end
39
+
40
+ #Generate a method to actually apply the various filters to the current
41
+ #model.
42
+ define_singleton_method(:apply_scope_filters) do |scope_filter_groups|
43
+ result = self
44
+ scope_filter_groups.each do |group_name, scope_filters|
45
+ set_scopes = filter_groups[group_name.to_sym]
46
+ scope_filters.each do |filter, args|
47
+ set_filter = set_scopes.assoc(filter.to_sym)
48
+ arg_names = set_filter.drop(1)
49
+ scope_args = arg_names.map {|a| args[a.to_s]}
50
+ result = result.send(set_filter.first, *scope_args)
51
+ end
52
+ end
53
+ result
54
+ end
55
+
56
+ #Generate a method to label applied filters.
57
+ #This method only does default labelling and will most likely be
58
+ #overridden in the actual model
59
+ define_singleton_method(:scope_caption) do |scope_name, args|
60
+ options = {:scope => "activerecord.scopes.#{table_name}", :default => scope_name}
61
+ symbol_args = {}
62
+ args.each do |k,v|
63
+ symbol_args[k.to_sym] = v
64
+ end
65
+ I18n.t(scope_name, options.merge(symbol_args))
66
+ end
67
+ end
68
+
69
+ #def is_named_scope_sortable(*args)
70
+ # options = args.pop if args.last.is_a?(Hash)
71
+ # processed_args = args.map {|a| generate_sortable_columns_and_includes(a)}.flatten
72
+ #
73
+ # column_names = []
74
+ # unfiltered_includes = []
75
+ #
76
+ # processed_args.each do |arg|
77
+ # column_names += arg[:columns]
78
+ # unfiltered_includes += arg[:includes]
79
+ # end
80
+ #
81
+ # #TODO: filter longer include chains, have to get a real example first.
82
+ #
83
+ #
84
+ # 1
85
+ #end
86
+
87
+
88
+ ## Processes arguments for the sortable generator
89
+ ## Returns column names and necessary includes
90
+ ##--------------------------------------------------------------
91
+ #def generate_sortable_columns_and_includes(arg, model = self)
92
+ # columns = []
93
+ # includes = []
94
+ # #Associations from the current model
95
+ # if arg.is_a?(Hash)
96
+ # arg.each do |association_name, columns_and_associations|
97
+ # association_endpoint = Stex::Acts::Searchable::DataHolder.graph.associations_for(model)[association_name.to_s]
98
+ # Array(columns_and_associations).each do |new_arg|
99
+ # processed_arg = generate_sortable_columns_and_includes(new_arg, association_endpoint)
100
+ # columns += processed_arg[:columns]
101
+ # if processed_arg[:includes].any?
102
+ # includes << {association_name => processed_arg[:includes]}
103
+ # else
104
+ # includes << association_name if processed_arg[:columns].any?
105
+ # end
106
+ # end
107
+ # end
108
+ # else
109
+ # columns << "#{model.table_name}.#{arg}" if model.column_names.include?(arg.to_s)
110
+ # end
111
+ #
112
+ # {:columns => columns, :includes => includes}
113
+ #end
114
+ end
115
+ end
116
+
117
+ module ActionController
118
+ def self.included(base)
119
+ base.send :extend, ClassMethods
120
+ end
121
+
122
+ module ClassMethods
123
+ # Generates the necessary controller methods to add and remove filters
124
+ # Expects the model name and a list of methods the filters will be used for
125
+ # Important: Do not use the model constant (e.g. User), it might break
126
+ # your database setup.
127
+ #
128
+ # == Examples
129
+ # scope_filters :user, :index
130
+ #--------------------------------------------------------------
131
+ def scope_filters(model_name, *args)
132
+ helper_method :searchable_session
133
+
134
+ before_filter :add_scope_filter, :only => args
135
+ before_filter :remove_scope_filter, :only => args
136
+ before_filter :remove_all_scope_filters, :only => args
137
+ before_filter :load_active_scope_filters, :only => args
138
+
139
+ helper :acts_as_data_table
140
+
141
+ # Adds a filter to the current data table. Works with the
142
+ # named scope filterable plugin.
143
+ # Expects the following params to be set:
144
+ # :scope_filters =>
145
+ # :group -- The group the named scope belongs to
146
+ # :name -- The named scope name inside the group
147
+ # :args -- Array of arguments to be passed to the named scope
148
+ # If any of these params (except filter_args which is optional)
149
+ # is not set, the filter will not be added.
150
+ #--------------------------------------------------------------
151
+ define_method(:add_scope_filter) do
152
+ return if params[:scope_filters].blank?
153
+ return if [:group, :name].any? { |p| params[:scope_filters][p].blank? }
154
+
155
+ group = params[:scope_filters][:group].to_sym
156
+ name = params[:scope_filters][:name].to_sym
157
+ args = params[:scope_filters][:args]
158
+ args = nil if args.blank? #No empty string here
159
+
160
+ model = model_name.to_s.classify.constantize
161
+
162
+ #If the given filter is not valid, do not add it to the filters list
163
+ return unless model.named_scope_filter?(group, name, args)
164
+ searchable_session.add_filter(group, name, args)
165
+ end
166
+
167
+ # Removes a filter from the current data table.
168
+ # Expects the following params to be set:
169
+ # :scope_filters =>
170
+ # :group -- The group the named scope belongs to
171
+ # :remove => true
172
+ #--------------------------------------------------------------
173
+ define_method(:remove_scope_filter) do
174
+ return if params[:scope_filters].blank?
175
+ return if params[:scope_filters][:remove].blank?
176
+ searchable_session.remove_filter(params[:scope_filters][:remove])
177
+ end
178
+
179
+ # Removes all filters from the current controller and action
180
+ #--------------------------------------------------------------
181
+ define_method(:remove_all_scope_filters) do
182
+ return if params[:scope_filters].blank?
183
+ return if params[:scope_filters][:remove_all].blank?
184
+ searchable_session.remove_all_filters
185
+ end
186
+
187
+ # Session Helper instance accessor
188
+ #--------------------------------------------------------------
189
+ define_method(:searchable_session) do
190
+ @searchable_session = Stex::Acts::DataTable::SessionHelper.new(session, controller_path, action_name, model_name)
191
+ end
192
+
193
+ # Loads the active filters into an instance variable, just in case
194
+ # that naming changes later
195
+ #--------------------------------------------------------------
196
+ define_method(:load_active_scope_filters) do
197
+ @loaded_scope_filters = searchable_session.active_filters
198
+ end
199
+
200
+ #Make the helper methods private so rails does not handle them as actions
201
+ private :add_scope_filter, :remove_scope_filter, :searchable_session, :load_active_scope_filters
202
+ end
203
+
204
+ # Adds methods for automatic column sorting to the controller
205
+ # Parameters:
206
+ # actions_and_defaults:: Hash of actions which will be used to
207
+ # display sortable content and their initial sorting
208
+ # columns.
209
+ #
210
+ # == Example
211
+ # column_sorting :index => [['users.last_name', 'ASC'], ['users.first_name', 'ASC']]
212
+ #--------------------------------------------------------------
213
+ def column_sorting(actions_and_defaults = {})
214
+
215
+ before_filter :add_or_toggle_sorting_column, :only => actions_and_defaults.keys
216
+ before_filter :replace_sorting_column, :only => actions_and_defaults.keys
217
+ before_filter :remove_sorting_column, :only => actions_and_defaults.keys
218
+ before_filter :load_sorting_columns, :only => actions_and_defaults.keys
219
+
220
+ param_namespace = :sorting_columns
221
+
222
+ # Adds a sorting column to the current sorting columns or
223
+ # toggles its direction if it is already part of the
224
+ # active sorting.
225
+ #
226
+ # Parameters
227
+ # :sorting_columns => {
228
+ # :model_name => 'sale',
229
+ # :column_name => 'reference'
230
+ # }
231
+ #--------------------------------------------------------------
232
+ define_method(:add_or_toggle_sorting_column) do
233
+ return if params[param_namespace].blank?
234
+ return if [:add, :model_name, :column_name].select {|p| params[param_namespace][p].blank?}.any?
235
+ searchable_session.add_or_toggle_sorting_column(params[param_namespace][:model_name], params[param_namespace][:column_name])
236
+ end
237
+
238
+ # Replaces all current sorting columsn with the given one
239
+ #--------------------------------------------------------------
240
+ define_method(:replace_sorting_column) do
241
+ return if params[param_namespace].blank?
242
+ return if [:replace, :model_name, :column_name].select {|p| params[param_namespace][p].blank?}.any?
243
+ searchable_session.replace_sorting_column(params[param_namespace][:model_name], params[param_namespace][:column_name])
244
+ end
245
+
246
+ # Removes a column from the current sorting columns
247
+ #--------------------------------------------------------------
248
+ define_method(:remove_sorting_column) do
249
+ return if params[param_namespace].blank?
250
+ return if [:remove, :model_name, :column_name].select {|p| params[param_namespace][p].blank?}.any?
251
+ searchable_session.remove_sorting_column(params[param_namespace][:model_name], params[param_namespace][:column_name])
252
+ end
253
+
254
+ # Loads the current sorting string into an instance variable
255
+ #--------------------------------------------------------------
256
+ define_method(:load_sorting_columns) do
257
+ @current_sorting_string = searchable_session.sorting_columns_string
258
+
259
+ #If there is no user-set sorting, load the default sorting into the session.
260
+ if @current_sorting_string.blank?
261
+ searchable_session.load_sorting_defaults(actions_and_defaults[action_name.to_sym])
262
+ end
263
+
264
+ @current_sorting_string = searchable_session.sorting_columns_string
265
+ end
266
+
267
+ end
268
+ end
269
+ end
270
+ end
271
+ end
272
+ end
273
+ end
@@ -0,0 +1,4 @@
1
+ # desc "Explaining what the task does"
2
+ # task :acts_as_searchable do
3
+ # # Task goes here
4
+ # end
data/rails/init.rb ADDED
@@ -0,0 +1,4 @@
1
+ #Automatically include the js_erb helper in each controller
2
+ # ActionController::Base.class_eval do
3
+ # helper :rjs
4
+ # end
@@ -0,0 +1,8 @@
1
+ require 'test_helper'
2
+
3
+ class ActsAsSearchableTest < ActiveSupport::TestCase
4
+ # Replace this with your real tests.
5
+ test "the truth" do
6
+ assert true
7
+ end
8
+ end
@@ -0,0 +1,4 @@
1
+ require 'rubygems'
2
+ require 'test/unit'
3
+ require 'active_support'
4
+ require 'active_support/test_case'
metadata ADDED
@@ -0,0 +1,142 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: acts_as_data_table
3
+ version: !ruby/object:Gem::Version
4
+ hash: 29
5
+ prerelease:
6
+ segments:
7
+ - 0
8
+ - 0
9
+ - 1
10
+ version: 0.0.1
11
+ platform: ruby
12
+ authors:
13
+ - Stefan Exner
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2015-04-30 00:00:00 Z
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
21
+ name: bundler
22
+ prerelease: false
23
+ requirement: &id001 !ruby/object:Gem::Requirement
24
+ none: false
25
+ requirements:
26
+ - - ~>
27
+ - !ruby/object:Gem::Version
28
+ hash: 1
29
+ segments:
30
+ - 1
31
+ - 7
32
+ version: "1.7"
33
+ type: :development
34
+ version_requirements: *id001
35
+ - !ruby/object:Gem::Dependency
36
+ name: rake
37
+ prerelease: false
38
+ requirement: &id002 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ~>
42
+ - !ruby/object:Gem::Version
43
+ hash: 35
44
+ segments:
45
+ - 10
46
+ - 0
47
+ version: "10.0"
48
+ type: :development
49
+ version_requirements: *id002
50
+ - !ruby/object:Gem::Dependency
51
+ name: rails
52
+ prerelease: false
53
+ requirement: &id003 !ruby/object:Gem::Requirement
54
+ none: false
55
+ requirements:
56
+ - - ~>
57
+ - !ruby/object:Gem::Version
58
+ hash: 5
59
+ segments:
60
+ - 2
61
+ - 3
62
+ version: "2.3"
63
+ type: :runtime
64
+ version_requirements: *id003
65
+ description: Adds methods to models and controllers to perform automatic filtering, sorting and multi-column-queries without having to worry about the implementation.
66
+ email:
67
+ - stex@sterex.de
68
+ executables: []
69
+
70
+ extensions: []
71
+
72
+ extra_rdoc_files: []
73
+
74
+ files:
75
+ - .gitignore
76
+ - Gemfile
77
+ - LICENSE.txt
78
+ - README.md
79
+ - Rakefile
80
+ - acts_as_data_table.gemspec
81
+ - app/coffeescripts/acts_as_data_table.coffee
82
+ - app/helpers/acts_as_data_table_helper.rb
83
+ - config/locales/acts_as_data_table.en.yml
84
+ - generators/acts_as_data_table/acts_as_data_table_generator.rb
85
+ - generators/acts_as_data_table/templates/assets/js/acts_as_data_table.js
86
+ - init.rb
87
+ - lib/acts_as_data_table.rb
88
+ - lib/acts_as_data_table/multi_column_scopes.rb
89
+ - lib/acts_as_data_table/scope_filters/action_controller.rb
90
+ - lib/acts_as_data_table/scope_filters/active_record.rb
91
+ - lib/acts_as_data_table/scope_filters/form_helper.rb
92
+ - lib/acts_as_data_table/scope_filters/validator.rb
93
+ - lib/acts_as_data_table/session_helper.rb
94
+ - lib/acts_as_data_table/shared/action_controller.rb
95
+ - lib/acts_as_data_table/shared/session.rb
96
+ - lib/acts_as_data_table/sortable_columns/action_controller.rb
97
+ - lib/acts_as_data_table/sortable_columns/active_record.rb
98
+ - lib/acts_as_data_table/sortable_columns/renderers/bootstrap2.rb
99
+ - lib/acts_as_data_table/sortable_columns/renderers/default.rb
100
+ - lib/acts_as_data_table/version.rb
101
+ - lib/acts_as_data_table_helper.rb.bak
102
+ - lib/named_scope_filters.rb
103
+ - lib/tasks/acts_as_data_table.rake
104
+ - rails/init.rb
105
+ - test/acts_as_searchable_test.rb
106
+ - test/test_helper.rb
107
+ homepage: https://www.github.com/stex/acts_as_data_table
108
+ licenses:
109
+ - MIT
110
+ post_install_message:
111
+ rdoc_options: []
112
+
113
+ require_paths:
114
+ - lib
115
+ required_ruby_version: !ruby/object:Gem::Requirement
116
+ none: false
117
+ requirements:
118
+ - - ">="
119
+ - !ruby/object:Gem::Version
120
+ hash: 3
121
+ segments:
122
+ - 0
123
+ version: "0"
124
+ required_rubygems_version: !ruby/object:Gem::Requirement
125
+ none: false
126
+ requirements:
127
+ - - ">="
128
+ - !ruby/object:Gem::Version
129
+ hash: 3
130
+ segments:
131
+ - 0
132
+ version: "0"
133
+ requirements: []
134
+
135
+ rubyforge_project:
136
+ rubygems_version: 1.8.22
137
+ signing_key:
138
+ specification_version: 3
139
+ summary: Adds automatic scope based filtering and column sorting to controllers and models.
140
+ test_files:
141
+ - test/acts_as_searchable_test.rb
142
+ - test/test_helper.rb