datagrid 0.9.3 → 1.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.
- data/Readme.markdown +6 -4
- data/VERSION +1 -1
- data/app/assets/stylesheets/datagrid.css.sass +132 -0
- data/app/views/datagrid/_form.html.erb +5 -2
- data/app/views/datagrid/_order_for.html.erb +2 -2
- data/app/views/datagrid/_table.html.erb +1 -1
- data/datagrid.gemspec +10 -3
- data/lib/datagrid.rb +1 -0
- data/lib/datagrid/column_names_attribute.rb +38 -7
- data/lib/datagrid/columns.rb +38 -4
- data/lib/datagrid/columns/column.rb +29 -1
- data/lib/datagrid/drivers/abstract_driver.rb +8 -0
- data/lib/datagrid/drivers/active_record.rb +29 -1
- data/lib/datagrid/drivers/array.rb +14 -2
- data/lib/datagrid/drivers/mongo_mapper.rb +8 -0
- data/lib/datagrid/drivers/mongoid.rb +9 -1
- data/lib/datagrid/filters.rb +24 -6
- data/lib/datagrid/filters/base_filter.rb +42 -14
- data/lib/datagrid/filters/boolean_enum_filter.rb +1 -1
- data/lib/datagrid/filters/dynamic_filter.rb +57 -0
- data/lib/datagrid/filters/enum_filter.rb +4 -21
- data/lib/datagrid/filters/select_options.rb +26 -0
- data/lib/datagrid/form_builder.rb +41 -8
- data/lib/datagrid/helper.rb +2 -1
- data/lib/datagrid/i18n.rb +0 -0
- data/lib/datagrid/locale/en.yml +28 -0
- data/lib/datagrid/ordering.rb +33 -19
- data/lib/datagrid/utils.rb +8 -9
- data/spec/datagrid/column_names_attribute_spec.rb +44 -1
- data/spec/datagrid/columns_spec.rb +16 -0
- data/spec/datagrid/filters/dynamic_filter_spec.rb +37 -0
- data/spec/datagrid/filters/integer_filter_spec.rb +18 -0
- data/spec/datagrid/filters/string_filter_spec.rb +25 -0
- data/spec/datagrid/filters_spec.rb +15 -1
- data/spec/datagrid/form_builder_spec.rb +83 -0
- data/spec/datagrid/helper_spec.rb +1 -0
- data/spec/datagrid/ordering_spec.rb +41 -1
- data/spec/datagrid/utils_spec.rb +7 -2
- metadata +11 -4
data/Readme.markdown
CHANGED
@@ -93,12 +93,12 @@ In order to create a report, you need to define:
|
|
93
93
|
### Scope
|
94
94
|
|
95
95
|
Default scope of objects to filter and display.
|
96
|
-
In common case it is `ActiveRecord::Base` (or any other supported ORM) subclass with some generic scopes like
|
96
|
+
In common case it is `ActiveRecord::Base` (or any other supported ORM) subclass with some generic scopes like:
|
97
97
|
|
98
98
|
``` ruby
|
99
|
-
|
100
|
-
|
101
|
-
|
99
|
+
scope do
|
100
|
+
User.includes(:group)
|
101
|
+
end
|
102
102
|
```
|
103
103
|
|
104
104
|
[More about scope](https://github.com/bogdan/datagrid/wiki/Scope)
|
@@ -116,11 +116,13 @@ Datagrid supports different type of filters including:
|
|
116
116
|
|
117
117
|
* text
|
118
118
|
* integer
|
119
|
+
* float
|
119
120
|
* date
|
120
121
|
* boolean
|
121
122
|
* eboolean - the select of "yes", "no" and any
|
122
123
|
* enum
|
123
124
|
* string
|
125
|
+
* dynamic
|
124
126
|
|
125
127
|
[More about filters](https://github.com/bogdan/datagrid/wiki/Filters)
|
126
128
|
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
1.0.0
|
@@ -0,0 +1,132 @@
|
|
1
|
+
$dg-form-label: 150px
|
2
|
+
|
3
|
+
= clearfix
|
4
|
+
*zoom: 1
|
5
|
+
|
6
|
+
&:before,
|
7
|
+
&:after
|
8
|
+
display: table
|
9
|
+
content: ''
|
10
|
+
|
11
|
+
&:after
|
12
|
+
clear: both
|
13
|
+
|
14
|
+
=inline-block
|
15
|
+
display: inline-block
|
16
|
+
zoom: 1
|
17
|
+
*display: inline
|
18
|
+
|
19
|
+
table.datagrid
|
20
|
+
background-color: transparent
|
21
|
+
border-collapse: collapse
|
22
|
+
max-width: 100%
|
23
|
+
|
24
|
+
th
|
25
|
+
background-color: #eee
|
26
|
+
text-align: left
|
27
|
+
|
28
|
+
td,
|
29
|
+
th
|
30
|
+
border: 1px solid #d6d6d6
|
31
|
+
padding: 5px 10px
|
32
|
+
|
33
|
+
.order
|
34
|
+
a.asc, a.desc
|
35
|
+
text-decoration: none
|
36
|
+
font-weight: normal
|
37
|
+
|
38
|
+
&.ordered
|
39
|
+
background-color: #fff7d5
|
40
|
+
|
41
|
+
&.asc
|
42
|
+
a.asc
|
43
|
+
font-weight: bold
|
44
|
+
color: #d00
|
45
|
+
|
46
|
+
&.desc
|
47
|
+
a.desc
|
48
|
+
font-weight: bold
|
49
|
+
color: #d00
|
50
|
+
.noresults
|
51
|
+
text-align: center
|
52
|
+
|
53
|
+
.datagrid-form
|
54
|
+
background-color: #f0f0f0
|
55
|
+
border-radius: 5px
|
56
|
+
padding: 20px
|
57
|
+
|
58
|
+
.datagrid-filter
|
59
|
+
margin: 10px
|
60
|
+
+clearfix
|
61
|
+
|
62
|
+
label
|
63
|
+
width: $dg-form-label
|
64
|
+
float: left
|
65
|
+
a
|
66
|
+
float: left
|
67
|
+
|
68
|
+
&.dp-choose-date
|
69
|
+
margin-left: -22px
|
70
|
+
margin-top: 7px
|
71
|
+
|
72
|
+
input[class*='filter']
|
73
|
+
border: 2px solid #ccc
|
74
|
+
border-radius: 4px
|
75
|
+
float: left
|
76
|
+
padding: 5px 12px
|
77
|
+
width: 207px
|
78
|
+
|
79
|
+
&.from, &.to
|
80
|
+
width: 83px
|
81
|
+
|
82
|
+
select
|
83
|
+
float: left
|
84
|
+
width: 235px
|
85
|
+
|
86
|
+
&[multiple]
|
87
|
+
border: 2px solid #ccc
|
88
|
+
border-radius: 5px
|
89
|
+
height: 100px
|
90
|
+
&.dynamic_filter
|
91
|
+
&.field
|
92
|
+
width: 178px
|
93
|
+
&.operation
|
94
|
+
margin-left: 7px
|
95
|
+
width: 50px
|
96
|
+
input.dynamic_filter.value
|
97
|
+
margin: 10px 0 0 $dg-form-label
|
98
|
+
clear: both
|
99
|
+
|
100
|
+
.separator
|
101
|
+
float: left
|
102
|
+
margin: 6px 4px 0
|
103
|
+
|
104
|
+
|
105
|
+
.datagrid-actions
|
106
|
+
padding-left: $dg-form-label +10
|
107
|
+
|
108
|
+
input[type='submit']
|
109
|
+
background-color: #555
|
110
|
+
border: none
|
111
|
+
border-radius: 5px
|
112
|
+
color: white
|
113
|
+
cursor: pointer
|
114
|
+
font-size: 14px
|
115
|
+
font-weight: bold
|
116
|
+
line-height: normal
|
117
|
+
padding: 7px 15px
|
118
|
+
vertical-align: middle
|
119
|
+
+inline-block
|
120
|
+
|
121
|
+
&:hover,
|
122
|
+
&:focus
|
123
|
+
background-color: #333
|
124
|
+
|
125
|
+
&:active
|
126
|
+
background-color: #000
|
127
|
+
|
128
|
+
> a
|
129
|
+
font-size: 14px
|
130
|
+
padding: 7px 15px
|
131
|
+
vertical-align: middle
|
132
|
+
+inline-block
|
@@ -1,9 +1,12 @@
|
|
1
1
|
<%= form_for grid, options do |f| -%>
|
2
2
|
<% grid.filters.each do |filter| %>
|
3
|
-
<div class="filter">
|
3
|
+
<div class="datagrid-filter filter">
|
4
4
|
<%= f.datagrid_label filter %>
|
5
5
|
<%= f.datagrid_filter filter %>
|
6
6
|
</div>
|
7
7
|
<% end %>
|
8
|
-
|
8
|
+
<div class="datagrid-actions">
|
9
|
+
<%= f.submit I18n.t("datagrid.form.search").html_safe, :class => "datagrid-submit" %>
|
10
|
+
<%= link_to I18n.t('datagrid.form.reset').html_safe, url_for(grid.to_param => {}), :class => "datagrid-reset" %>
|
11
|
+
</div>
|
9
12
|
<% end -%>
|
@@ -1,10 +1,10 @@
|
|
1
1
|
<div class="order">
|
2
2
|
<%= link_to(
|
3
|
-
I18n.t("datagrid.table.order.asc"
|
3
|
+
I18n.t("datagrid.table.order.asc").html_safe,
|
4
4
|
url_for(grid.param_name => grid.as_query.merge(:order => column.name, :descending => false)),
|
5
5
|
:class => "asc") %>
|
6
6
|
<%= link_to(
|
7
|
-
I18n.t("datagrid.table.order.desc"
|
7
|
+
I18n.t("datagrid.table.order.desc").html_safe,
|
8
8
|
url_for(grid.param_name => grid.as_query.merge(:order => column.name, :descending => true )),
|
9
9
|
:class => "desc") %>
|
10
10
|
</div>
|
@@ -10,7 +10,7 @@ Local variables:
|
|
10
10
|
</thead>
|
11
11
|
<tbody>
|
12
12
|
<% if assets.empty? %>
|
13
|
-
<tr><td class="noresults" colspan="100%"><%= I18n.t
|
13
|
+
<tr><td class="noresults" colspan="100%"><%= I18n.t('datagrid.no_results').html_safe %></td></tr>
|
14
14
|
<% else %>
|
15
15
|
<%= datagrid_rows(grid, assets, options) %>
|
16
16
|
<% end %>
|
data/datagrid.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = "datagrid"
|
8
|
-
s.version = "0.
|
8
|
+
s.version = "1.0.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Bogdan Gusiev"]
|
12
|
-
s.date = "2013-
|
12
|
+
s.date = "2013-09-19"
|
13
13
|
s.description = "This allows you to easily build datagrid aka data tables with sortable columns and filters"
|
14
14
|
s.email = "agresso@gmail.com"
|
15
15
|
s.extra_rdoc_files = [
|
@@ -23,6 +23,7 @@ Gem::Specification.new do |s|
|
|
23
23
|
"Rakefile",
|
24
24
|
"Readme.markdown",
|
25
25
|
"VERSION",
|
26
|
+
"app/assets/stylesheets/datagrid.css.sass",
|
26
27
|
"app/views/datagrid/_form.html.erb",
|
27
28
|
"app/views/datagrid/_head.html.erb",
|
28
29
|
"app/views/datagrid/_order_for.html.erb",
|
@@ -50,13 +51,17 @@ Gem::Specification.new do |s|
|
|
50
51
|
"lib/datagrid/filters/composite_filters.rb",
|
51
52
|
"lib/datagrid/filters/date_filter.rb",
|
52
53
|
"lib/datagrid/filters/default_filter.rb",
|
54
|
+
"lib/datagrid/filters/dynamic_filter.rb",
|
53
55
|
"lib/datagrid/filters/enum_filter.rb",
|
54
56
|
"lib/datagrid/filters/float_filter.rb",
|
55
57
|
"lib/datagrid/filters/integer_filter.rb",
|
56
58
|
"lib/datagrid/filters/ranged_filter.rb",
|
59
|
+
"lib/datagrid/filters/select_options.rb",
|
57
60
|
"lib/datagrid/filters/string_filter.rb",
|
58
61
|
"lib/datagrid/form_builder.rb",
|
59
62
|
"lib/datagrid/helper.rb",
|
63
|
+
"lib/datagrid/i18n.rb",
|
64
|
+
"lib/datagrid/locale/en.yml",
|
60
65
|
"lib/datagrid/ordering.rb",
|
61
66
|
"lib/datagrid/renderer.rb",
|
62
67
|
"lib/datagrid/rspec.rb",
|
@@ -74,9 +79,11 @@ Gem::Specification.new do |s|
|
|
74
79
|
"spec/datagrid/filters/boolean_enum_filter_spec.rb",
|
75
80
|
"spec/datagrid/filters/composite_filters_spec.rb",
|
76
81
|
"spec/datagrid/filters/date_filter_spec.rb",
|
82
|
+
"spec/datagrid/filters/dynamic_filter_spec.rb",
|
77
83
|
"spec/datagrid/filters/enum_filter_spec.rb",
|
78
84
|
"spec/datagrid/filters/float_filter_spec.rb",
|
79
85
|
"spec/datagrid/filters/integer_filter_spec.rb",
|
86
|
+
"spec/datagrid/filters/string_filter_spec.rb",
|
80
87
|
"spec/datagrid/filters_spec.rb",
|
81
88
|
"spec/datagrid/form_builder_spec.rb",
|
82
89
|
"spec/datagrid/helper_spec.rb",
|
@@ -99,7 +106,7 @@ Gem::Specification.new do |s|
|
|
99
106
|
s.homepage = "http://github.com/bogdan/datagrid"
|
100
107
|
s.licenses = ["MIT"]
|
101
108
|
s.require_paths = ["lib"]
|
102
|
-
s.rubygems_version = "1.8.
|
109
|
+
s.rubygems_version = "1.8.25"
|
103
110
|
s.summary = "Ruby gem to create datagrids"
|
104
111
|
|
105
112
|
if s.respond_to? :specification_version then
|
data/lib/datagrid.rb
CHANGED
@@ -9,7 +9,7 @@ module Datagrid
|
|
9
9
|
datagrid_attribute :column_names do |names|
|
10
10
|
names = Array(names).reject(&:blank?)
|
11
11
|
if names.reject(&:blank?).blank?
|
12
|
-
|
12
|
+
[]
|
13
13
|
else
|
14
14
|
names
|
15
15
|
end
|
@@ -18,10 +18,12 @@ module Datagrid
|
|
18
18
|
|
19
19
|
module ClassMethods
|
20
20
|
# Adds a filter that acts like a column selection
|
21
|
-
def column_names_filter
|
22
|
-
filter(:column_names, :enum,
|
23
|
-
|
24
|
-
|
21
|
+
def column_names_filter(options = {})
|
22
|
+
filter(:column_names, :enum, {
|
23
|
+
:select => :optional_columns_select,
|
24
|
+
:multiple => true,
|
25
|
+
:dummy => true
|
26
|
+
}.merge(options || {}))
|
25
27
|
end
|
26
28
|
end
|
27
29
|
|
@@ -32,17 +34,46 @@ module Datagrid
|
|
32
34
|
super(*column_names)
|
33
35
|
end
|
34
36
|
|
37
|
+
# Returns a list of columns with <tt>:mandatory => true</tt> option
|
38
|
+
# If no mandatory columns specified than all of them considered mandatory
|
39
|
+
def mandatory_columns
|
40
|
+
self.class.columns.select(&:mandatory?)
|
41
|
+
end
|
42
|
+
|
43
|
+
# Returns a list of columns without <tt>:mandatory => true</tt> option
|
44
|
+
def optional_columns
|
45
|
+
self.class.columns - mandatory_columns
|
46
|
+
end
|
47
|
+
|
35
48
|
protected
|
36
49
|
|
37
|
-
def
|
50
|
+
def optional_columns_select #:nodoc:
|
51
|
+
optional_columns.map {|c| [c.header, c.name] }
|
52
|
+
end
|
53
|
+
|
54
|
+
def selected_column_names(*args)
|
38
55
|
if args.any?
|
39
56
|
args.compact!
|
40
57
|
args.map!(&:to_sym)
|
41
58
|
args
|
42
59
|
else
|
43
|
-
column_names
|
60
|
+
if column_names && column_names.any?
|
61
|
+
column_names + mandatory_columns.map(&:name)
|
62
|
+
else
|
63
|
+
columns_enabled_by_default.map(&:name)
|
64
|
+
end
|
44
65
|
end
|
45
66
|
end
|
67
|
+
|
68
|
+
def columns_visibility_enabled?
|
69
|
+
self.class.columns.any? do |column|
|
70
|
+
column.options.key?(:mandatory)
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
def columns_enabled_by_default
|
75
|
+
columns_visibility_enabled? ? mandatory_columns : []
|
76
|
+
end
|
46
77
|
end
|
47
78
|
end
|
48
79
|
|
data/lib/datagrid/columns.rb
CHANGED
@@ -12,12 +12,39 @@ module Datagrid
|
|
12
12
|
|
13
13
|
include Datagrid::Core
|
14
14
|
|
15
|
+
class_attribute :default_column_options
|
16
|
+
self.default_column_options = {}
|
17
|
+
|
15
18
|
end
|
16
19
|
base.send :include, InstanceMethods
|
17
20
|
end # self.included
|
18
21
|
|
19
22
|
module ClassMethods
|
20
23
|
|
24
|
+
|
25
|
+
##
|
26
|
+
# :method: default_column_options=
|
27
|
+
#
|
28
|
+
# :call-seq: default_column_options=(options)
|
29
|
+
#
|
30
|
+
# Specifies default options for `column` method.
|
31
|
+
# They still can be overwritten at column level.
|
32
|
+
#
|
33
|
+
# # Disable default order
|
34
|
+
# self.default_column_options = { :order => false }
|
35
|
+
# # Makes entire report HTML
|
36
|
+
# self.default_column_options = { :html => true }
|
37
|
+
#
|
38
|
+
|
39
|
+
##
|
40
|
+
# :method: default_column_options
|
41
|
+
#
|
42
|
+
# :call-seq: default_column_options
|
43
|
+
#
|
44
|
+
# Returns specified default column options hash
|
45
|
+
# See <tt>default_column_options=</tt> for more information
|
46
|
+
#
|
47
|
+
|
21
48
|
# Returns a list of columns defined.
|
22
49
|
# All column definistion are returned by default
|
23
50
|
# You can limit the output with only columns you need like:
|
@@ -32,7 +59,7 @@ module Datagrid
|
|
32
59
|
args.compact!
|
33
60
|
args.map!(&:to_sym)
|
34
61
|
columns_array.select do |column|
|
35
|
-
(!options[:data] || column.data?) && (!options[:html] || column.html?)&& (args.empty? || args.include?(column.name))
|
62
|
+
(!options[:data] || column.data?) && (!options[:html] || column.html?) && (column.mandatory? || args.empty? || args.include?(column.name))
|
36
63
|
end
|
37
64
|
end
|
38
65
|
|
@@ -47,8 +74,15 @@ module Datagrid
|
|
47
74
|
# Available options:
|
48
75
|
#
|
49
76
|
# * <tt>:html</tt> - determines if current column should be present in html table and how is it formatted
|
50
|
-
# * <tt>:order</tt> - determines if this column could be sortable and how
|
51
|
-
#
|
77
|
+
# * <tt>:order</tt> - determines if this column could be sortable and how.
|
78
|
+
# The value of order is explicitly passed to ORM ordering method.
|
79
|
+
# Ex: <tt>"created_at, id"</tt> for ActiveRecord, <tt>[:created_at, :id]</tt> for Mongoid
|
80
|
+
# * <tt>:order_desc</tt> - determines a descending order for given column
|
81
|
+
# (only in case when <tt>:order</tt> can not be easily reversed by ORM)
|
82
|
+
# * <tt>:order_by_value</tt> - used in case it is easier to perform ordering at ruby level not on database level.
|
83
|
+
# Warning: using ruby to order large datasets is very unrecommended.
|
84
|
+
# If set to true - datagrid will use column value to order by this column
|
85
|
+
# If block is given - datagrid will use value returned from block
|
52
86
|
# * <tt>:url</tt> - a proc with one argument, pass this option to easily convert the value into an URL
|
53
87
|
# * <tt>:before</tt> - determines the position of this column, by adding it before the column passed here
|
54
88
|
# * <tt>:after</tt> - determines the position of this column, by adding it after the column passed here
|
@@ -60,7 +94,7 @@ module Datagrid
|
|
60
94
|
model.send(name)
|
61
95
|
end
|
62
96
|
position = Datagrid::Utils.extract_position_from_options(columns_array, options)
|
63
|
-
column = Datagrid::Columns::Column.new(self, name, options, &block)
|
97
|
+
column = Datagrid::Columns::Column.new(self, name, default_column_options.merge(options), &block)
|
64
98
|
columns_array.insert(position, column)
|
65
99
|
end
|
66
100
|
|
@@ -58,13 +58,29 @@ class Datagrid::Columns::Column
|
|
58
58
|
end
|
59
59
|
|
60
60
|
def order
|
61
|
-
if options.has_key?(:order)
|
61
|
+
if options.has_key?(:order) && options[:order] != true
|
62
62
|
self.options[:order]
|
63
63
|
else
|
64
64
|
grid_class.driver.default_order(grid_class.scope, name)
|
65
65
|
end
|
66
66
|
end
|
67
67
|
|
68
|
+
def supports_order?
|
69
|
+
order || order_by_value?
|
70
|
+
end
|
71
|
+
|
72
|
+
def order_by_value(model, grid)
|
73
|
+
if options[:order_by_value] == true
|
74
|
+
data_value(model, grid)
|
75
|
+
else
|
76
|
+
Datagrid::Utils.apply_args(model, grid, &options[:order_by_value])
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
def order_by_value?
|
81
|
+
!! options[:order_by_value]
|
82
|
+
end
|
83
|
+
|
68
84
|
def order_desc
|
69
85
|
return nil unless order
|
70
86
|
self.options[:order_desc]
|
@@ -77,6 +93,18 @@ class Datagrid::Columns::Column
|
|
77
93
|
def data?
|
78
94
|
self.data_block != nil
|
79
95
|
end
|
96
|
+
|
97
|
+
def mandatory?
|
98
|
+
!! options[:mandatory]
|
99
|
+
end
|
100
|
+
|
101
|
+
def inspect
|
102
|
+
"#<Datagird::Columns::Column #{grid_class}##{name} #{options.inspect}>"
|
103
|
+
end
|
104
|
+
|
105
|
+
def to_s
|
106
|
+
header
|
107
|
+
end
|
80
108
|
|
81
109
|
def html_value(context, asset, grid)
|
82
110
|
if html? && html_block
|