mighty_grid 0.3.3 → 0.4.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.
- checksums.yaml +4 -4
- data/README.md +2 -0
- data/lib/mighty_grid/base.rb +43 -19
- data/lib/mighty_grid/column.rb +7 -2
- data/lib/mighty_grid/filter_renderer.rb +38 -15
- data/lib/mighty_grid/helpers/mighty_grid_view_helpers.rb +1 -1
- data/lib/mighty_grid/version.rb +1 -1
- data/spec/fake_app/views/index.html.erb +1 -0
- data/spec/lib/base_spec.rb +11 -3
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: db143f79e6b1f6002945861e8da4884867dda3b8
|
4
|
+
data.tar.gz: c2164ac042c84c00515e03dd41dcb5ddddd3c2f3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8a36b57f6971bb4e3437555f56cccfe0dde9349d5cf5ef809ebcb29dd6db09899ab85e23b78d1fc4ecc7c5aa21bb20f3e2540318de0b78b52db2eb9b8c00ee18
|
7
|
+
data.tar.gz: 753d836d4737f542a101362b177c6d0762e260a9851b868ecc04bc830c22594e70d3df890428ffe1c8683b65ee2f3d83eb02ba33ab64a67cbc9b8bb364e14430
|
data/README.md
CHANGED
@@ -21,6 +21,7 @@ Or install it yourself as:
|
|
21
21
|
### Controller
|
22
22
|
|
23
23
|
You can define class or relation in <tt>init_grid</tt> method.
|
24
|
+
|
24
25
|
```
|
25
26
|
def index
|
26
27
|
@products_grid = init_grid(Product)
|
@@ -42,6 +43,7 @@ end
|
|
42
43
|
### General configuration options
|
43
44
|
|
44
45
|
You can configure the following default values by overriding these values using <tt>MightyGrid.configure</tt> method.
|
46
|
+
|
45
47
|
```
|
46
48
|
per_page # 15 by default
|
47
49
|
order_direction # 'asc' by default
|
data/lib/mighty_grid/base.rb
CHANGED
@@ -11,11 +11,13 @@ module MightyGrid
|
|
11
11
|
@filters = {}
|
12
12
|
|
13
13
|
@options = {
|
14
|
-
:page
|
15
|
-
:per_page
|
16
|
-
:name
|
17
|
-
:include
|
18
|
-
:joins
|
14
|
+
:page => 1,
|
15
|
+
:per_page => MightyGrid.config.per_page,
|
16
|
+
:name => MightyGrid.config.grid_name,
|
17
|
+
:include => nil,
|
18
|
+
:joins => nil,
|
19
|
+
:conditions => nil,
|
20
|
+
:group => nil
|
19
21
|
}
|
20
22
|
|
21
23
|
opts.assert_valid_keys(@options.keys)
|
@@ -23,37 +25,54 @@ module MightyGrid
|
|
23
25
|
|
24
26
|
@name = @options[:name].to_s
|
25
27
|
|
26
|
-
load_grid_params
|
27
|
-
|
28
28
|
@relation = klass_or_relation
|
29
29
|
|
30
30
|
@klass = klass_or_relation.is_a?(ActiveRecord::Relation) ? klass_or_relation.klass : klass_or_relation
|
31
31
|
|
32
|
+
load_grid_params
|
32
33
|
end
|
33
34
|
|
34
35
|
def read
|
35
36
|
apply_filters
|
36
|
-
@relation = @relation.order(@mg_params[:order]
|
37
|
+
@relation = @relation.order("#{@mg_params[:order]} #{current_order_direction.to_sym}") if @mg_params[:order].present? && current_order_direction.present?
|
37
38
|
@relation = @relation.
|
38
39
|
page(@mg_params[:page]).
|
39
40
|
per(@mg_params[:per_page]).
|
40
41
|
includes(@options[:include]).
|
41
|
-
joins(@options[:joins])
|
42
|
+
joins(@options[:joins]).
|
43
|
+
where(@options[:conditions]).
|
44
|
+
group(@options[:group])
|
42
45
|
end
|
43
46
|
|
44
47
|
# Apply filters
|
45
48
|
def apply_filters
|
46
49
|
filter_params.each do |filter_name, filter_value|
|
47
|
-
|
48
|
-
|
50
|
+
name, table_name = filter_name.split('.').reverse
|
51
|
+
|
52
|
+
if table_name && Object.const_defined?(table_name.classify)
|
53
|
+
model = table_name.classify.constantize
|
54
|
+
else
|
55
|
+
model = klass
|
56
|
+
end
|
57
|
+
|
58
|
+
next if filter_value.blank? || !model.column_names.include?(name)
|
59
|
+
|
60
|
+
if model && model.superclass == ActiveRecord::Base
|
61
|
+
filter_type = model.columns_hash[name].type
|
62
|
+
else
|
63
|
+
next
|
64
|
+
end
|
65
|
+
|
66
|
+
field_type ||= model.columns_hash[name].type
|
67
|
+
table_name = model.table_name
|
49
68
|
|
50
69
|
if @filters.has_key?(filter_name.to_sym) && @filters[filter_name.to_sym].is_a?(Array)
|
51
|
-
@relation = @relation.where(filter_name => filter_value)
|
70
|
+
@relation = @relation.where(table_name => { filter_name => filter_value })
|
52
71
|
elsif field_type == :boolean
|
53
72
|
value = ['true', '1', 't'].include?(filter_value) ? true : false
|
54
|
-
@relation = @relation.where(filter_name => value)
|
73
|
+
@relation = @relation.where(table_name => {filter_name => value})
|
55
74
|
elsif [:string, :text].include?(field_type)
|
56
|
-
@relation = @relation.where("#{
|
75
|
+
@relation = @relation.where("#{table_name}.#{name} #{like_operator} ?", "%#{filter_value}%")
|
57
76
|
end
|
58
77
|
end
|
59
78
|
end
|
@@ -69,6 +88,9 @@ module MightyGrid
|
|
69
88
|
@mg_params.merge!(@options)
|
70
89
|
if current_grid_params
|
71
90
|
@mg_params.merge!(current_grid_params.symbolize_keys)
|
91
|
+
if @mg_params[:order].present? && !@mg_params[:order].to_s.include?('.')
|
92
|
+
@mg_params[:order] = "#{klass.table_name}.#{@mg_params[:order]}"
|
93
|
+
end
|
72
94
|
end
|
73
95
|
end
|
74
96
|
|
@@ -86,8 +108,9 @@ module MightyGrid
|
|
86
108
|
def filter_param_name; 'f' end
|
87
109
|
|
88
110
|
# Get filter name by field
|
89
|
-
def get_filter_name(
|
90
|
-
"#{
|
111
|
+
def get_filter_name(field, model = nil)
|
112
|
+
field_name = model.present? ? "#{model.table_name}.#{field}" : field
|
113
|
+
"#{name}[#{filter_param_name}][#{field_name}]"
|
91
114
|
end
|
92
115
|
|
93
116
|
# Get current grid parameters
|
@@ -96,9 +119,10 @@ module MightyGrid
|
|
96
119
|
end
|
97
120
|
|
98
121
|
# Get order parameters
|
99
|
-
def order_params(attribute)
|
100
|
-
|
101
|
-
|
122
|
+
def order_params(attribute, model = nil)
|
123
|
+
order = model.present? ? "#{model.table_name}.#{attribute}" : attribute.to_s
|
124
|
+
direction = order == current_grid_params['order'] ? another_order_direction : 'asc'
|
125
|
+
{@name => {order: order, order_direction: direction}}
|
102
126
|
end
|
103
127
|
|
104
128
|
# Get current order direction
|
data/lib/mighty_grid/column.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
module MightyGrid
|
2
2
|
class Column
|
3
3
|
|
4
|
-
attr_reader :attribute, :attrs, :th_attrs, :options, :title
|
4
|
+
attr_reader :attribute, :attrs, :th_attrs, :options, :title, :model
|
5
5
|
attr_accessor :render_value
|
6
6
|
|
7
7
|
def initialize(attr_or_options=nil, options=nil, &block)
|
@@ -15,6 +15,10 @@ module MightyGrid
|
|
15
15
|
@attribute = attr_or_options
|
16
16
|
@render_value = @attribute
|
17
17
|
end
|
18
|
+
|
19
|
+
@model = @options[:model]
|
20
|
+
raise MightyGridArgumentError.new("Model of field for filtering should have type ActiveRecord") if @model && @model.superclass != ActiveRecord::Base
|
21
|
+
|
18
22
|
@attrs = @options[:html] if @options.has_key?(:html)
|
19
23
|
@th_attrs = @options[:th_html] if @options.has_key?(:th_html)
|
20
24
|
@title = @options.has_key?(:title) && @options[:title] || ''
|
@@ -23,7 +27,8 @@ module MightyGrid
|
|
23
27
|
def render(record)
|
24
28
|
case @render_value
|
25
29
|
when String, Symbol
|
26
|
-
|
30
|
+
rec = @model ? record.send(@model.to_s.underscore) : record
|
31
|
+
return rec[@render_value]
|
27
32
|
when Proc
|
28
33
|
value = @render_value.call(record)
|
29
34
|
return ERB::Util.h(value).to_s.html_safe
|
@@ -6,46 +6,53 @@ module MightyGrid
|
|
6
6
|
@grid = grid
|
7
7
|
end
|
8
8
|
|
9
|
+
# Get <tt>label</tt> HTML tag
|
9
10
|
def label(name, content_or_options = nil, options = nil, &block)
|
10
|
-
|
11
|
+
options = content_or_options if content_or_options.is_a?(Hash)
|
12
|
+
human_name = (content_or_options.is_a?(Hash) || content_or_options.nil?) ? @grid.klass.human_attribute_name(name) : content_or_options
|
11
13
|
|
12
|
-
|
13
|
-
options = content_or_options
|
14
|
-
else
|
15
|
-
name ||= content_or_options
|
16
|
-
end
|
17
|
-
|
18
|
-
name = @grid.klass.human_attribute_name(name)
|
14
|
+
f_options = filter_options(name, options, false)
|
19
15
|
|
20
|
-
label_tag(
|
16
|
+
label_tag(get_filter_id(f_options), human_name, options, &block)
|
21
17
|
end
|
22
18
|
|
19
|
+
# Get <tt>input</tt> HTML tag
|
23
20
|
def text_field(name, options={})
|
24
|
-
|
21
|
+
f_options = filter_options(name, options)
|
22
|
+
text_field_tag(@grid.get_filter_name(name, f_options[:model]), get_filter_param(name, f_options[:model]), options)
|
25
23
|
end
|
26
24
|
|
25
|
+
# Get <tt>select</tt> HTML tag
|
27
26
|
def select(name, option_tags=nil, options={})
|
28
27
|
@grid.filters[name] = option_tags
|
29
28
|
selected = nil
|
30
29
|
selected = options.delete(:selected) if options.has_key?(:selected)
|
31
|
-
|
30
|
+
|
31
|
+
f_options = filter_options(name, options)
|
32
|
+
|
33
|
+
selected = get_filter_param(name, f_options[:model]) if get_filter_param(name, f_options[:model])
|
32
34
|
opts = options_for_select(option_tags, selected)
|
33
35
|
|
34
|
-
select_tag(@grid.get_filter_name(name), opts, options)
|
36
|
+
select_tag(@grid.get_filter_name(name, f_options[:model]), opts, options)
|
35
37
|
end
|
36
38
|
|
39
|
+
# Get <tt>checkbox</tt>
|
37
40
|
def check_box(name, value = '1', checked = false, options = {})
|
38
41
|
checked = true if get_filter_param(name)
|
42
|
+
|
43
|
+
f_options = filter_options(name, options)
|
39
44
|
|
40
|
-
check_box_tag(@grid.get_filter_name(name), value, checked, options)
|
45
|
+
check_box_tag(@grid.get_filter_name(name, f_options[:model]), value, checked, options)
|
41
46
|
end
|
42
47
|
|
48
|
+
# Get button for Apply filter changes
|
43
49
|
def submit(content = nil, options = {})
|
44
50
|
content = I18n.t("mighty_grid.filters.submit", default: 'Apply changes') if content.blank?
|
45
51
|
options.merge!(type: :submit)
|
46
52
|
content_tag(:button, content, options)
|
47
53
|
end
|
48
54
|
|
55
|
+
# Get button for Reset filter changes
|
49
56
|
def reset(content = nil, options = {})
|
50
57
|
content = I18n.t("mighty_grid.filters.reset", default: 'Reset changes') if content.blank?
|
51
58
|
options.merge!(type: :reset)
|
@@ -54,8 +61,24 @@ module MightyGrid
|
|
54
61
|
|
55
62
|
private
|
56
63
|
|
57
|
-
def get_filter_param(name)
|
58
|
-
|
64
|
+
def get_filter_param(name, model = nil)
|
65
|
+
filter_name = model ? "#{model.table_name}.#{name}" : name
|
66
|
+
@grid.filter_params.has_key?(filter_name) ? @grid.filter_params[filter_name] : nil
|
67
|
+
end
|
68
|
+
|
69
|
+
def get_filter_id(name: nil, model: nil)
|
70
|
+
@grid.get_filter_name(name, model).parameterize('_')
|
71
|
+
end
|
72
|
+
|
73
|
+
def filter_options(name, options, with_id = true)
|
74
|
+
opts = {name: name}
|
75
|
+
if options.is_a?(Hash) && options.has_key?(:model)
|
76
|
+
model = options.delete(:model)
|
77
|
+
raise MightyGridArgumentError.new("Model of field for filtering should have type ActiveRecord") if model.present? && model.superclass != ActiveRecord::Base
|
78
|
+
opts.merge!(model: model)
|
79
|
+
options.merge!(id: get_filter_id(opts)) if with_id
|
80
|
+
end
|
81
|
+
opts
|
59
82
|
end
|
60
83
|
end
|
61
84
|
end
|
@@ -58,7 +58,7 @@ module MightyGrid
|
|
58
58
|
rendering.columns.map { |column|
|
59
59
|
content_tag :th, column.th_attrs do
|
60
60
|
if column.options[:ordering] && column.attribute.present?
|
61
|
-
link_to(column.title, "?#{MightyGrid::MgHash.rec_merge(grid.params, grid.order_params(column.attribute)).except('controller', 'action').to_query}").html_safe
|
61
|
+
link_to(column.title, "?#{MightyGrid::MgHash.rec_merge(grid.params, grid.order_params(column.attribute, column.model)).except('controller', 'action').to_query}").html_safe
|
62
62
|
else
|
63
63
|
column.title.html_safe
|
64
64
|
end
|
data/lib/mighty_grid/version.rb
CHANGED
data/spec/lib/base_spec.rb
CHANGED
@@ -5,7 +5,15 @@ describe MightyGrid::Base do
|
|
5
5
|
before(:all) do
|
6
6
|
@controller = ActionView::TestCase::TestController.new
|
7
7
|
|
8
|
-
@default_options = {
|
8
|
+
@default_options = {
|
9
|
+
page: 1,
|
10
|
+
per_page: 15,
|
11
|
+
name: 'grid',
|
12
|
+
:include => nil,
|
13
|
+
joins: nil,
|
14
|
+
conditions: nil,
|
15
|
+
group: nil
|
16
|
+
}
|
9
17
|
end
|
10
18
|
|
11
19
|
describe '#new' do
|
@@ -102,10 +110,10 @@ describe MightyGrid::Base do
|
|
102
110
|
before(:all){ @controller.params = {'grid'=>{'order' => 'name', 'order_direction' => 'asc'}} }
|
103
111
|
subject { MightyGrid::Base.new(User, @controller) }
|
104
112
|
context 'with current order attribute' do
|
105
|
-
it { subject.order_params(:name).should == {'grid'=>{order:
|
113
|
+
it { subject.order_params(:name).should == {'grid'=>{order: 'name', order_direction: 'desc'}} }
|
106
114
|
end
|
107
115
|
context 'with other order attribute' do
|
108
|
-
it { subject.order_params(:description).should == {'grid'=>{order:
|
116
|
+
it { subject.order_params(:description).should == {'grid'=>{order: 'description', order_direction: 'asc'}} }
|
109
117
|
end
|
110
118
|
after(:all){ @controller.params = {} }
|
111
119
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mighty_grid
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- jurrick
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-06-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|