mighty_grid 1.0.0 → 2.0.0.rc1
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.
- checksums.yaml +4 -4
- data/Gemfile +2 -0
- data/README.md +20 -12
- data/features/support/env.rb +1 -0
- data/lib/generators/mighty_grid/install_generator.rb +1 -1
- data/lib/generators/mighty_grid/templates/{mighty_grid_config.rb → mighty_grid.rb} +1 -1
- data/lib/mighty_grid/base.rb +31 -111
- data/lib/mighty_grid/column.rb +1 -1
- data/lib/mighty_grid/engine.rb +11 -8
- data/lib/mighty_grid/exceptions.rb +9 -0
- data/lib/mighty_grid/filter_renderer.rb +18 -34
- data/lib/mighty_grid/filters/base.rb +27 -0
- data/lib/mighty_grid/filters/boolean_filter.rb +6 -0
- data/lib/mighty_grid/filters/custom_filter.rb +19 -0
- data/lib/mighty_grid/filters/enum_filter.rb +15 -0
- data/lib/mighty_grid/filters/string_filter.rb +6 -0
- data/lib/mighty_grid/filters/text_filter.rb +6 -0
- data/lib/mighty_grid/filters.rb +113 -0
- data/lib/mighty_grid/grid_renderer.rb +1 -1
- data/lib/mighty_grid/helpers/{mighty_grid_view_helpers.rb → view_helpers.rb} +13 -11
- data/lib/mighty_grid/map_type.rb +16 -0
- data/lib/mighty_grid/parameters.rb +58 -0
- data/lib/mighty_grid/version.rb +12 -1
- data/lib/mighty_grid.rb +64 -15
- data/spec/dummy/app/controllers/users_controller.rb +1 -1
- data/spec/dummy/app/grids/users_grid.rb +7 -0
- data/spec/dummy/app/views/users/index.html +1 -1
- data/spec/dummy/config/database.yml +29 -0
- data/spec/dummy/db/mg_test.sqlite3 +0 -0
- data/spec/dummy/log/development.log +119680 -0
- data/spec/dummy/log/test.log +101833 -0
- data/spec/dummy/tmp/cache/assets/CCA/5E0/sprockets%2F48d34122dd1905305a6e63e3acb7c042 +0 -0
- data/spec/dummy/tmp/cache/assets/CD8/370/sprockets%2F357970feca3ac29060c1e3861e2c0953 +0 -0
- data/spec/dummy/tmp/cache/assets/CF9/100/sprockets%2F3d8f5e96de4712db63b98083f75739c3 +0 -0
- data/spec/dummy/tmp/cache/assets/D32/A10/sprockets%2F13fe41fee1fe35b49d145bcc06610705 +0 -0
- data/spec/dummy/tmp/cache/assets/D3C/EE0/sprockets%2Fccfd910338b6dcf575467d3009b46a0d +0 -0
- data/spec/dummy/tmp/cache/assets/D4E/1B0/sprockets%2Ff7cbd26ba1d28d48de824f0e94586655 +0 -0
- data/spec/dummy/tmp/cache/assets/D5A/EA0/sprockets%2Fd771ace226fc8215a3572e0aa35bb0d6 +0 -0
- data/spec/dummy/tmp/cache/assets/D60/BE0/sprockets%2F37b5ab8193eccd1a29a0c61374c6b51e +0 -0
- data/spec/dummy/tmp/cache/assets/D82/820/sprockets%2Ff7c8a51f7f95d66a9d5112f898bc1fd0 +0 -0
- data/spec/dummy/tmp/cache/assets/DDC/400/sprockets%2Fcffd775d018f68ce5dba1ee0d951a994 +0 -0
- data/spec/dummy/tmp/cache/assets/DF2/A80/sprockets%2F14a708b3bb2a924afdebae773e4ba5d8 +0 -0
- data/spec/dummy/tmp/cache/assets/E04/890/sprockets%2F2f5173deea6c795b8fdde723bb4b63af +0 -0
- data/spec/dummy/tmp/cache/assets/E0C/4E0/sprockets%2Fed4e3dbab857786229b1bdf7bbd289fe +0 -0
- data/spec/dummy/tmp/cache/assets/E14/600/sprockets%2F34cd0de2e0cd2c01e1c91b0ece565deb +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/0e57c0129c0245eab3972d87efc6a9b9 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/13fe41fee1fe35b49d145bcc06610705 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/14a708b3bb2a924afdebae773e4ba5d8 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/1f8135a48e7ccbcb5361bb9e1f993929 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/2479f30262de64213c228dc752440fd1 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/2f5173deea6c795b8fdde723bb4b63af +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/34cd0de2e0cd2c01e1c91b0ece565deb +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/357970feca3ac29060c1e3861e2c0953 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/37b5ab8193eccd1a29a0c61374c6b51e +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/3cbb6c28c7bbcc7c9b547346a59b4e7f +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/3d8f5e96de4712db63b98083f75739c3 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/422d4d422d090c103e6b198600a90dac +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/48d34122dd1905305a6e63e3acb7c042 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/a8c1ee1faf09397765710724fe3ee140 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/bbd98f4797053ba2accbbca7b81cbbaf +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/cc03506b8188f839058f41aa8a4e19da +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/cccf51971e81f175e527083a6ef4624d +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/ccfd910338b6dcf575467d3009b46a0d +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/cffd775d018f68ce5dba1ee0d951a994 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/d771ace226fc8215a3572e0aa35bb0d6 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/d77d41650e5528f12146c728566cbf33 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/ed4e3dbab857786229b1bdf7bbd289fe +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/f7c8a51f7f95d66a9d5112f898bc1fd0 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/f7cbd26ba1d28d48de824f0e94586655 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/13fe41fee1fe35b49d145bcc06610705 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/14a708b3bb2a924afdebae773e4ba5d8 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/2f5173deea6c795b8fdde723bb4b63af +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/34cd0de2e0cd2c01e1c91b0ece565deb +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/357970feca3ac29060c1e3861e2c0953 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/37b5ab8193eccd1a29a0c61374c6b51e +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/3d8f5e96de4712db63b98083f75739c3 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/422d4d422d090c103e6b198600a90dac +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/48d34122dd1905305a6e63e3acb7c042 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/a8c1ee1faf09397765710724fe3ee140 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/cccf51971e81f175e527083a6ef4624d +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/ccfd910338b6dcf575467d3009b46a0d +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/cffd775d018f68ce5dba1ee0d951a994 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/d771ace226fc8215a3572e0aa35bb0d6 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/ed4e3dbab857786229b1bdf7bbd289fe +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/f7c8a51f7f95d66a9d5112f898bc1fd0 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/f7cbd26ba1d28d48de824f0e94586655 +0 -0
- data/spec/lib/base_spec.rb +24 -15
- data/spec/lib/generators/install_generator_spec.rb +5 -3
- data/spec/lib/tmp/config/initializers/mighty_grid.rb +15 -0
- data/spec/lib/tmp/config/locales/mighty_grid.en.yml +6 -0
- data/spec/mighty_grid_spec.rb +17 -0
- data/spec/support/models.rb +1 -0
- metadata +154 -41
- data/.gitignore +0 -26
- data/.rspec +0 -2
- data/.travis.yml +0 -33
- data/Appraisals +0 -17
- data/gemfiles/rails_32.gemfile +0 -26
- data/gemfiles/rails_40.gemfile +0 -26
- data/gemfiles/rails_41.gemfile +0 -26
- data/lib/mighty_grid/config.rb +0 -49
- data/lib/mighty_grid/mighty_grid_controller.rb +0 -14
- data/lib/mighty_grid/mighty_grid_misc.rb +0 -11
- data/mighty_grid.gemspec +0 -27
- data/spec/config_spec.rb +0 -148
- data/spec/dummy/app/assets/images/.keep +0 -0
- data/spec/dummy/app/controllers/concerns/.keep +0 -0
- data/spec/dummy/app/mailers/.keep +0 -0
- data/spec/dummy/app/models/.keep +0 -0
- data/spec/dummy/app/models/concerns/.keep +0 -0
- data/spec/dummy/lib/assets/.keep +0 -0
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: ae66ac068670599398526077c090a43897244668
|
|
4
|
+
data.tar.gz: 599f7821d5b8c9c008313738d1b3ccb19e10aa0a
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 4a41aaade69e5ad4e51d84c46291288064f997abcd9a5d97a1c30a053bf9c5a8ba1b3e0e767195b3b089022075ce4f457999235b9124c072d26b1be2b972fd57
|
|
7
|
+
data.tar.gz: ae204f9bac3fb47080dc7c21a96f325121c44919f1ea86d98bb98c28c21b6b51d9d5058fff02e7e970e0ac348ab1a35fd7518d1ebf61099f7613babaa1a4181d
|
data/Gemfile
CHANGED
data/README.md
CHANGED
|
@@ -8,23 +8,34 @@ Add this line to your application's Gemfile:
|
|
|
8
8
|
|
|
9
9
|
gem 'mighty_grid'
|
|
10
10
|
|
|
11
|
-
|
|
11
|
+
Then run the following generator command in order to generate files for gem customization:
|
|
12
12
|
|
|
13
|
-
$
|
|
13
|
+
$ rails g mighty_grid:install
|
|
14
14
|
|
|
15
|
-
|
|
15
|
+
After generation you will see the following files:
|
|
16
16
|
|
|
17
|
-
|
|
17
|
+
* `config/initializers/mighty_grid.rb`
|
|
18
|
+
* `config/locales/mighty_grid.en.yml`
|
|
18
19
|
|
|
19
20
|
## Quick Start
|
|
20
21
|
|
|
22
|
+
### Grid
|
|
23
|
+
|
|
24
|
+
Any grid can be defined in a folder `app/grids` for example as follows:
|
|
25
|
+
|
|
26
|
+
```
|
|
27
|
+
Class ProductsGrid < MightyGrid::Base
|
|
28
|
+
scope { Product }
|
|
29
|
+
end
|
|
30
|
+
```
|
|
31
|
+
|
|
21
32
|
### Controller
|
|
22
33
|
|
|
23
|
-
You can
|
|
34
|
+
You can initialize grid like this:
|
|
24
35
|
|
|
25
36
|
```
|
|
26
37
|
def index
|
|
27
|
-
@products_grid =
|
|
38
|
+
@products_grid = ProductsGrid.new(params)
|
|
28
39
|
end
|
|
29
40
|
```
|
|
30
41
|
|
|
@@ -42,7 +53,7 @@ end
|
|
|
42
53
|
|
|
43
54
|
### General configuration options
|
|
44
55
|
|
|
45
|
-
You can configure the following default values by overriding these values using <tt>MightyGrid.
|
|
56
|
+
You can configure the following default values by overriding these values using <tt>MightyGrid.setup</tt> method.
|
|
46
57
|
|
|
47
58
|
```
|
|
48
59
|
per_page # 15 by default
|
|
@@ -61,20 +72,17 @@ pagination_theme # 'mighty_grid' by default
|
|
|
61
72
|
```
|
|
62
73
|
|
|
63
74
|
There's a handy generator that generates the default configuration file into config/initializers directory.
|
|
64
|
-
Run the following generator command, then edit the generated file.
|
|
65
|
-
|
|
66
|
-
$ rails g mighty_grid:install
|
|
67
75
|
|
|
68
76
|
## Running tests
|
|
69
77
|
|
|
70
78
|
To run the tests you need specify database and Rails version.
|
|
71
79
|
|
|
72
|
-
* List of available Rails versions:
|
|
80
|
+
* List of available Rails versions: 4.0, 4.1, 4.2.
|
|
73
81
|
* List of DB: sqlite, postgresql, mysql.
|
|
74
82
|
|
|
75
83
|
Example run:
|
|
76
84
|
|
|
77
|
-
$ DB=postgresql appraisal
|
|
85
|
+
$ DB=postgresql appraisal rails_41 rake spec cucumber
|
|
78
86
|
|
|
79
87
|
## Contributing
|
|
80
88
|
|
data/features/support/env.rb
CHANGED
|
@@ -8,7 +8,7 @@ module MightyGrid
|
|
|
8
8
|
desc 'Copies MightyGrid configuration and locale files to your application.'
|
|
9
9
|
|
|
10
10
|
def copy_config_file
|
|
11
|
-
template '
|
|
11
|
+
template 'mighty_grid.rb', 'config/initializers/mighty_grid.rb'
|
|
12
12
|
end
|
|
13
13
|
|
|
14
14
|
def copy_locale_file
|
data/lib/mighty_grid/base.rb
CHANGED
|
@@ -1,17 +1,25 @@
|
|
|
1
1
|
module MightyGrid
|
|
2
2
|
class Base
|
|
3
|
-
|
|
3
|
+
include MightyGrid::Filters
|
|
4
|
+
include MightyGrid::Parameters
|
|
5
|
+
|
|
6
|
+
attr_reader :klass, :name, :relation, :options, :mg_params, :params, :controller
|
|
4
7
|
attr_accessor :output_buffer, :filters
|
|
5
8
|
|
|
6
|
-
def initialize(
|
|
7
|
-
@
|
|
9
|
+
def initialize(params, opts = {}) #:nodoc:
|
|
10
|
+
@controller_params = params
|
|
11
|
+
|
|
12
|
+
# Get active controller through params
|
|
13
|
+
if controller = "#{params[:controller].camelize}Controller".safe_constantize
|
|
14
|
+
@controller = ObjectSpace.each_object(controller).first
|
|
15
|
+
end
|
|
8
16
|
|
|
9
|
-
@filters =
|
|
17
|
+
@filters = self.class.filters.dup
|
|
10
18
|
|
|
11
19
|
@options = {
|
|
12
20
|
page: 1,
|
|
13
|
-
per_page: MightyGrid.
|
|
14
|
-
name: MightyGrid.
|
|
21
|
+
per_page: MightyGrid.per_page,
|
|
22
|
+
name: MightyGrid.grid_name,
|
|
15
23
|
include: nil,
|
|
16
24
|
joins: nil,
|
|
17
25
|
conditions: nil,
|
|
@@ -22,15 +30,28 @@ module MightyGrid
|
|
|
22
30
|
opts.assert_valid_keys(@options.keys)
|
|
23
31
|
@options.merge!(opts)
|
|
24
32
|
|
|
25
|
-
@
|
|
33
|
+
@klass = self.class.klass
|
|
34
|
+
@relation = self.class.relation
|
|
26
35
|
|
|
27
|
-
@relation =
|
|
36
|
+
@relation = yield(@relation) if block_given?
|
|
28
37
|
|
|
29
|
-
@
|
|
38
|
+
@name = @options[:name].to_s
|
|
30
39
|
|
|
31
40
|
load_grid_params
|
|
32
41
|
end
|
|
33
42
|
|
|
43
|
+
class << self
|
|
44
|
+
attr_reader :klass, :relation
|
|
45
|
+
|
|
46
|
+
def scope(&block)
|
|
47
|
+
if block_given?
|
|
48
|
+
klass_or_relation = yield
|
|
49
|
+
@relation = klass_or_relation
|
|
50
|
+
@klass = klass_or_relation.is_a?(ActiveRecord::Relation) ? klass_or_relation.klass : klass_or_relation
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
|
|
34
55
|
def read
|
|
35
56
|
apply_filters
|
|
36
57
|
if @mg_params[:order].present? && current_order_direction.present?
|
|
@@ -48,110 +69,9 @@ module MightyGrid
|
|
|
48
69
|
.group(@options[:group])
|
|
49
70
|
end
|
|
50
71
|
|
|
51
|
-
# Apply filters
|
|
52
|
-
def apply_filters
|
|
53
|
-
filter_params.each do |filter_name, filter_value|
|
|
54
|
-
name, table_name = filter_name.split('.').reverse
|
|
55
|
-
|
|
56
|
-
if table_name && Object.const_defined?(table_name.classify)
|
|
57
|
-
model = table_name.classify.constantize
|
|
58
|
-
else
|
|
59
|
-
model = klass
|
|
60
|
-
end
|
|
61
|
-
|
|
62
|
-
next if filter_value.blank? || !model.column_names.include?(name)
|
|
63
|
-
|
|
64
|
-
if model && model.superclass == ActiveRecord::Base
|
|
65
|
-
field_type = model.columns_hash[name].type
|
|
66
|
-
else
|
|
67
|
-
next
|
|
68
|
-
end
|
|
69
|
-
|
|
70
|
-
table_name = model.table_name
|
|
71
|
-
if @filters.key?(filter_name.to_sym) && @filters[filter_name.to_sym].is_a?(Array)
|
|
72
|
-
@relation = @relation.where(table_name => { filter_name => filter_value })
|
|
73
|
-
elsif field_type == :boolean
|
|
74
|
-
value = %w(true 1 t).include?(filter_value) ? true : false
|
|
75
|
-
@relation = @relation.where(table_name => { filter_name => value })
|
|
76
|
-
elsif [:string, :text].include?(field_type)
|
|
77
|
-
@relation = @relation.where("#{table_name}.#{name} #{like_operator} ?", "%#{filter_value}%")
|
|
78
|
-
end
|
|
79
|
-
end
|
|
80
|
-
end
|
|
81
|
-
|
|
82
72
|
# Get controller parameters
|
|
83
73
|
def params
|
|
84
|
-
@
|
|
85
|
-
end
|
|
86
|
-
|
|
87
|
-
# Load grid parameters
|
|
88
|
-
def load_grid_params
|
|
89
|
-
@mg_params = {}
|
|
90
|
-
@mg_params[filter_param_name.to_sym] = {}
|
|
91
|
-
@mg_params.merge!(@options)
|
|
92
|
-
if current_grid_params
|
|
93
|
-
@mg_params.merge!(current_grid_params.symbolize_keys)
|
|
94
|
-
if @mg_params[:order].present? && !@mg_params[:order].to_s.include?('.')
|
|
95
|
-
@mg_params[:order] = "#{klass.table_name}.#{@mg_params[:order]}"
|
|
96
|
-
end
|
|
97
|
-
end
|
|
98
|
-
end
|
|
99
|
-
|
|
100
|
-
# Get current grid parameter by name
|
|
101
|
-
def get_current_grid_param(name)
|
|
102
|
-
current_grid_params.key?(name) ? current_grid_params[name] : nil
|
|
103
|
-
end
|
|
104
|
-
|
|
105
|
-
# Get filter parameters
|
|
106
|
-
def filter_params
|
|
107
|
-
@mg_params[filter_param_name.to_sym] || {}
|
|
108
|
-
end
|
|
109
|
-
|
|
110
|
-
# Get filter parameter name
|
|
111
|
-
def filter_param_name
|
|
112
|
-
'f'
|
|
113
|
-
end
|
|
114
|
-
|
|
115
|
-
# Add param in filters
|
|
116
|
-
def add_filter_param(param, value)
|
|
117
|
-
@mg_params[filter_param_name.to_sym][param] = value unless @mg_params[filter_param_name.to_sym].key?(param)
|
|
118
|
-
end
|
|
119
|
-
|
|
120
|
-
# Get filter name by field
|
|
121
|
-
def get_filter_name(field, model = nil)
|
|
122
|
-
field_name = model.present? ? "#{model.table_name}.#{field}" : field
|
|
123
|
-
"#{name}[#{filter_param_name}][#{field_name}]"
|
|
124
|
-
end
|
|
125
|
-
|
|
126
|
-
# Get current grid parameters
|
|
127
|
-
def current_grid_params
|
|
128
|
-
params[name] || {}
|
|
129
|
-
end
|
|
130
|
-
|
|
131
|
-
# Get order parameters
|
|
132
|
-
def order_params(attribute, model = nil, direction = nil)
|
|
133
|
-
order = model.present? ? "#{model.table_name}.#{attribute}" : attribute.to_s
|
|
134
|
-
direction ||= order == current_grid_params['order'] ? another_order_direction : 'asc'
|
|
135
|
-
{ @name => { order: order, order_direction: direction } }
|
|
136
|
-
end
|
|
137
|
-
|
|
138
|
-
# Get current order direction if current order parameter coincides with the received parameter
|
|
139
|
-
def get_active_order_direction(parameters)
|
|
140
|
-
parameters[@name]['order'] == current_grid_params['order'] ? current_order_direction : nil
|
|
141
|
-
end
|
|
142
|
-
|
|
143
|
-
# Get current order direction
|
|
144
|
-
def current_order_direction
|
|
145
|
-
direction = nil
|
|
146
|
-
if current_grid_params.key?('order_direction') && %w(asc desc).include?(current_grid_params['order_direction'].downcase)
|
|
147
|
-
direction = current_grid_params['order_direction'].downcase
|
|
148
|
-
end
|
|
149
|
-
direction
|
|
150
|
-
end
|
|
151
|
-
|
|
152
|
-
# Get another order direction
|
|
153
|
-
def another_order_direction
|
|
154
|
-
current_grid_params.key?('order_direction') ? (%w(asc desc) - [current_grid_params['order_direction'].to_s]).first : MightyGrid.config.order_direction
|
|
74
|
+
@controller_params
|
|
155
75
|
end
|
|
156
76
|
|
|
157
77
|
# Get <tt>like</tt> or <tt>ilike</tt> operator depending on the database adapter
|
data/lib/mighty_grid/column.rb
CHANGED
|
@@ -18,7 +18,7 @@ module MightyGrid
|
|
|
18
18
|
end
|
|
19
19
|
|
|
20
20
|
@model = @options[:model]
|
|
21
|
-
fail
|
|
21
|
+
fail MightyGrid::Exceptions::ArgumentError.new('Model of field for filtering should have type ActiveRecord') if @model && @model.superclass != ActiveRecord::Base
|
|
22
22
|
|
|
23
23
|
@attrs = @options[:html] if @options.key?(:html)
|
|
24
24
|
@th_attrs = @options[:th_html] if @options.key?(:th_html)
|
data/lib/mighty_grid/engine.rb
CHANGED
|
@@ -1,18 +1,21 @@
|
|
|
1
1
|
module MightyGrid
|
|
2
|
-
class
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
ActiveSupport.on_load :action_controller do
|
|
6
|
-
ActionController::Base.send(:include, MightyGrid::Controller)
|
|
7
|
-
end
|
|
2
|
+
class Engine < ::Rails::Engine
|
|
3
|
+
config.eager_load_namespaces << MightyGrid
|
|
8
4
|
|
|
5
|
+
initializer 'mighty_grid.helpers' do |app|
|
|
9
6
|
ActiveSupport.on_load :action_view do
|
|
10
|
-
::ActionView::Base.class_eval { include MightyGrid::GridViewHelper }
|
|
11
|
-
|
|
12
7
|
# It is here only until this pull request is pulled: https://github.com/amatsuda/kaminari/pull/267
|
|
13
8
|
require 'mighty_grid/kaminari_monkey_patching'
|
|
14
9
|
end
|
|
10
|
+
end
|
|
15
11
|
|
|
12
|
+
config.after_initialize do
|
|
13
|
+
unless MightyGrid.configured?
|
|
14
|
+
warn """
|
|
15
|
+
[Mighty Grid] Mighty Grid is not configured in the application and will use the default values.
|
|
16
|
+
Use `rails generate mighty_grid:install` to generate the Mighty Grid configuration.
|
|
17
|
+
"""
|
|
18
|
+
end
|
|
16
19
|
end
|
|
17
20
|
end
|
|
18
21
|
end
|
|
@@ -11,41 +11,35 @@ module MightyGrid
|
|
|
11
11
|
options = content_or_options if content_or_options.is_a?(Hash)
|
|
12
12
|
human_name = (content_or_options.is_a?(Hash) || content_or_options.nil?) ? @grid.klass.human_attribute_name(name) : content_or_options
|
|
13
13
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
label_tag(get_filter_id(f_options), human_name, options, &block)
|
|
14
|
+
label_tag(get_filter_id(name), human_name, options, &block)
|
|
17
15
|
end
|
|
18
16
|
|
|
19
17
|
# Get <tt>input</tt> HTML tag
|
|
20
18
|
def text_field(name, options = {})
|
|
21
|
-
|
|
22
|
-
text_field_tag(@grid.get_filter_name(name, f_options[:model]), get_filter_param(name, f_options[:model]), options)
|
|
19
|
+
text_field_tag(@grid.get_filter_name(name), get_filter_param(name), options)
|
|
23
20
|
end
|
|
24
21
|
|
|
25
22
|
# Get <tt>select</tt> HTML tag
|
|
26
|
-
def select(name,
|
|
27
|
-
@grid.filters[name]
|
|
28
|
-
f_options = filter_options(name, options)
|
|
23
|
+
def select(name, options = {})
|
|
24
|
+
option_tags = @grid.filters[name].collection
|
|
29
25
|
|
|
30
26
|
selected = nil
|
|
31
27
|
if options.key?(:selected)
|
|
32
28
|
selected = options.delete(:selected)
|
|
33
|
-
@grid.add_filter_param(
|
|
29
|
+
@grid.add_filter_param(name, selected)
|
|
34
30
|
end
|
|
35
31
|
|
|
36
|
-
selected = get_filter_param(name
|
|
32
|
+
selected = get_filter_param(name) if get_filter_param(name)
|
|
37
33
|
opts = options_for_select(option_tags, selected)
|
|
38
34
|
|
|
39
|
-
select_tag(@grid.get_filter_name(name
|
|
35
|
+
select_tag(@grid.get_filter_name(name), opts, options)
|
|
40
36
|
end
|
|
41
37
|
|
|
42
38
|
# Get <tt>checkbox</tt>
|
|
43
39
|
def check_box(name, value = '1', checked = false, options = {})
|
|
44
40
|
checked = true if get_filter_param(name)
|
|
45
41
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
check_box_tag(@grid.get_filter_name(name, f_options[:model]), value, checked, options)
|
|
42
|
+
check_box_tag(@grid.get_filter_name(name), value, checked, options)
|
|
49
43
|
end
|
|
50
44
|
|
|
51
45
|
# Get button for Apply filter changes
|
|
@@ -64,28 +58,18 @@ module MightyGrid
|
|
|
64
58
|
|
|
65
59
|
private
|
|
66
60
|
|
|
67
|
-
def
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
def get_filter_id(name: nil, model: nil)
|
|
77
|
-
@grid.get_filter_name(name, model).parameterize('_')
|
|
61
|
+
def get_filter_param(name)
|
|
62
|
+
if @grid.filter_params.key?(name.to_s)
|
|
63
|
+
@grid.filter_params[name.to_s]
|
|
64
|
+
elsif @grid.filter_params.blank? && @grid.filters[name.to_sym].default.present?
|
|
65
|
+
@grid.filters[name.to_sym].default
|
|
66
|
+
else
|
|
67
|
+
nil
|
|
68
|
+
end
|
|
78
69
|
end
|
|
79
70
|
|
|
80
|
-
def
|
|
81
|
-
|
|
82
|
-
if options.is_a?(Hash) && options.key?(:model)
|
|
83
|
-
model = options.delete(:model)
|
|
84
|
-
fail MightyGridArgumentError.new('Model of field for filtering should have type ActiveRecord') if model.present? && model.superclass != ActiveRecord::Base
|
|
85
|
-
opts.merge!(model: model)
|
|
86
|
-
options.merge!(id: get_filter_id(opts)) if with_id
|
|
87
|
-
end
|
|
88
|
-
opts
|
|
71
|
+
def get_filter_id(name)
|
|
72
|
+
@grid.get_filter_name(name).parameterize('_')
|
|
89
73
|
end
|
|
90
74
|
end
|
|
91
75
|
end
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
module MightyGrid
|
|
2
|
+
module Filters
|
|
3
|
+
class Base
|
|
4
|
+
attr_reader :options, :attribute, :model, :default
|
|
5
|
+
|
|
6
|
+
class_attribute :default_options
|
|
7
|
+
self.default_options = {
|
|
8
|
+
name: nil,
|
|
9
|
+
attribute: nil,
|
|
10
|
+
model: nil,
|
|
11
|
+
default: nil
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def initialize(options = {})
|
|
16
|
+
options = options.clone
|
|
17
|
+
|
|
18
|
+
options.assert_valid_keys(self.class.default_options.keys)
|
|
19
|
+
|
|
20
|
+
@options = options.reverse_merge!(self.class.default_options)
|
|
21
|
+
@attribute = @options.delete(:attribute) || @options[:name]
|
|
22
|
+
@model = @options.delete(:model)
|
|
23
|
+
@default = @options.delete(:default)
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
module MightyGrid
|
|
2
|
+
module Filters
|
|
3
|
+
class CustomFilter < Base
|
|
4
|
+
attr_reader :scope
|
|
5
|
+
|
|
6
|
+
def initialize(options = {}, &block)
|
|
7
|
+
self.class.default_options.merge!(scope: nil)
|
|
8
|
+
|
|
9
|
+
super(options)
|
|
10
|
+
|
|
11
|
+
if block_given?
|
|
12
|
+
@scope = block
|
|
13
|
+
else
|
|
14
|
+
@scope = @options.delete(:scope)
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
module MightyGrid
|
|
2
|
+
module Filters
|
|
3
|
+
class EnumFilter < Base
|
|
4
|
+
attr_reader :collection
|
|
5
|
+
|
|
6
|
+
def initialize(options = {})
|
|
7
|
+
self.class.default_options.merge!(collection: nil)
|
|
8
|
+
|
|
9
|
+
super(options)
|
|
10
|
+
|
|
11
|
+
@collection = @options[:collection]
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
require 'active_support/core_ext/class/attribute'
|
|
2
|
+
require 'mighty_grid/map_type'
|
|
3
|
+
|
|
4
|
+
module MightyGrid
|
|
5
|
+
module Filters
|
|
6
|
+
extend ActiveSupport::Autoload
|
|
7
|
+
|
|
8
|
+
autoload :Base
|
|
9
|
+
autoload :StringFilter
|
|
10
|
+
autoload :TextFilter
|
|
11
|
+
autoload :EnumFilter
|
|
12
|
+
autoload :BooleanFilter
|
|
13
|
+
autoload :CustomFilter
|
|
14
|
+
|
|
15
|
+
def self.included(base)
|
|
16
|
+
base.class_eval do
|
|
17
|
+
class_attribute :filters
|
|
18
|
+
self.filters = {}
|
|
19
|
+
|
|
20
|
+
extend MapType
|
|
21
|
+
map_type :string, to: MightyGrid::Filters::StringFilter
|
|
22
|
+
map_type :text, to: MightyGrid::Filters::TextFilter
|
|
23
|
+
map_type :enum, to: MightyGrid::Filters::EnumFilter
|
|
24
|
+
map_type :boolean, to: MightyGrid::Filters::BooleanFilter
|
|
25
|
+
map_type :custom, to: MightyGrid::Filters::CustomFilter
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
base.send :extend, ClassMethods
|
|
29
|
+
base.send :include, InstanceMethods
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
module InstanceMethods
|
|
33
|
+
# Get filter parameter name
|
|
34
|
+
def filter_param_name
|
|
35
|
+
'f'
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
# Get filter parameters
|
|
39
|
+
def filter_params
|
|
40
|
+
@mg_params[filter_param_name.to_sym] || {}
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
# Add param to filters
|
|
44
|
+
def add_filter_param(param, value)
|
|
45
|
+
@mg_params[filter_param_name.to_sym][param] = value unless @mg_params[filter_param_name.to_sym].key?(param)
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
# Get filter name by field
|
|
49
|
+
def get_filter_name(field, model = nil)
|
|
50
|
+
field_name = model.present? ? "#{model.table_name}.#{field}" : field
|
|
51
|
+
"#{name}[#{filter_param_name}][#{field_name}]"
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
# Apply filters
|
|
55
|
+
def apply_filters
|
|
56
|
+
@filters.each_pair do |filter_name, filter|
|
|
57
|
+
next if (filter_params.blank? && filter.default.blank? ||
|
|
58
|
+
filter_params.present? && filter_params[filter_name.to_s].blank?)
|
|
59
|
+
|
|
60
|
+
filter_value =
|
|
61
|
+
if filter_params.present?
|
|
62
|
+
filter_params[filter_name.to_s]
|
|
63
|
+
else
|
|
64
|
+
filter.default.to_s
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
table_name = filter.model.table_name
|
|
68
|
+
|
|
69
|
+
case filter
|
|
70
|
+
when EnumFilter
|
|
71
|
+
@relation = @relation.where(table_name => { filter.attribute => filter_value })
|
|
72
|
+
when BooleanFilter
|
|
73
|
+
value = %w(true 1 t).include?(filter_value) ? true : false
|
|
74
|
+
@relation = @relation.where(table_name => { filter.attribute => value })
|
|
75
|
+
when StringFilter, TextFilter
|
|
76
|
+
@relation = @relation.where("#{table_name}.#{filter.attribute} #{like_operator} ?", "%#{filter_value}%")
|
|
77
|
+
when CustomFilter
|
|
78
|
+
if filter.scope.kind_of?(Proc)
|
|
79
|
+
@relation = filter.scope.call(@relation, filter_value)
|
|
80
|
+
else
|
|
81
|
+
@relation = @relation.send(filter.scope, filter_value)
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
module ClassMethods
|
|
89
|
+
def filter(name, type = :string, options = {}, &block)
|
|
90
|
+
name = name.to_sym
|
|
91
|
+
|
|
92
|
+
unless self.mappings.key?(type)
|
|
93
|
+
fail MightyGrid::Exceptions::ArgumentError.new("filter for the specified type isn't supported.")
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
if name.present? && self.filters.key?(name)
|
|
97
|
+
fail MightyGrid::Exceptions::ArgumentError.new("filter with the specified name already exists.")
|
|
98
|
+
else
|
|
99
|
+
options.merge!(name: name)
|
|
100
|
+
options.merge!(model: @klass) unless options.key?(:model)
|
|
101
|
+
self.filters[name] = self.mappings[type].new(options, &block)
|
|
102
|
+
end
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
protected
|
|
106
|
+
|
|
107
|
+
def inherited(child_class)
|
|
108
|
+
super(child_class)
|
|
109
|
+
child_class.filters = self.filters.clone
|
|
110
|
+
end
|
|
111
|
+
end
|
|
112
|
+
end
|
|
113
|
+
end
|
|
@@ -55,7 +55,7 @@ module MightyGrid
|
|
|
55
55
|
elsif html_or_opts.nil? && block_given?
|
|
56
56
|
@blank_slate_handler = block
|
|
57
57
|
else
|
|
58
|
-
fail
|
|
58
|
+
fail MightyGrid::Exceptions::ArgumentError.new("blank_slate accepts only a string, a block, or :partial => 'path_to_partial' ")
|
|
59
59
|
end
|
|
60
60
|
end
|
|
61
61
|
|