datagrid 1.5.3 → 1.5.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +1 -1
- data/VERSION +1 -1
- data/datagrid.gemspec +3 -3
- data/lib/datagrid/active_model.rb +9 -10
- data/lib/datagrid/core.rb +9 -5
- data/lib/datagrid/drivers/sequel.rb +3 -3
- data/lib/datagrid/form_builder.rb +14 -2
- data/lib/datagrid/utils.rb +11 -10
- data/spec/datagrid/columns_spec.rb +16 -10
- data/spec/datagrid/filters_spec.rb +15 -7
- data/spec/datagrid/form_builder_spec.rb +19 -10
- data/spec/spec_helper.rb +1 -1
- data/spec/support/i18n_helpers.rb +0 -1
- 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: 2e27c90403d5aa7a2c924c000961747a6f8aad08
|
4
|
+
data.tar.gz: dc805468469c8c967b06f69b33e875038d606ae2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 033dd01f968f8af3360e92623c2921d6b08cc5032eac39d46e948bc9fc14b6f5d988c21e9c3aea4493aebfb59c30f986770b2cee35beb2a1aa0423fd51f91004
|
7
|
+
data.tar.gz: 609622339821f30c85f9d8abcb603ee592763ac0a57c78f0d0e0e00d9691292d224ab443d369ef4672336debb5bab9cf2392e0c83ce2854d2019c4affbb2bcb4
|
data/.travis.yml
CHANGED
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.5.
|
1
|
+
1.5.4
|
data/datagrid.gemspec
CHANGED
@@ -2,16 +2,16 @@
|
|
2
2
|
# DO NOT EDIT THIS FILE DIRECTLY
|
3
3
|
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
4
4
|
# -*- encoding: utf-8 -*-
|
5
|
-
# stub: datagrid 1.5.
|
5
|
+
# stub: datagrid 1.5.4 ruby lib
|
6
6
|
|
7
7
|
Gem::Specification.new do |s|
|
8
8
|
s.name = "datagrid".freeze
|
9
|
-
s.version = "1.5.
|
9
|
+
s.version = "1.5.4"
|
10
10
|
|
11
11
|
s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
|
12
12
|
s.require_paths = ["lib".freeze]
|
13
13
|
s.authors = ["Bogdan Gusiev".freeze]
|
14
|
-
s.date = "2017-
|
14
|
+
s.date = "2017-06-16"
|
15
15
|
s.description = "This allows you to easily build datagrid aka data tables with sortable columns and filters".freeze
|
16
16
|
s.email = "agresso@gmail.com".freeze
|
17
17
|
s.extra_rdoc_files = [
|
@@ -4,7 +4,7 @@ module Datagrid
|
|
4
4
|
# Required to be ActiveModel compatible
|
5
5
|
# @private
|
6
6
|
module ActiveModel #:nodoc:
|
7
|
-
|
7
|
+
|
8
8
|
def self.included(base)
|
9
9
|
base.extend ClassMethods
|
10
10
|
base.class_eval do
|
@@ -13,21 +13,23 @@ module Datagrid
|
|
13
13
|
extend ::ActiveModel::Naming
|
14
14
|
rescue LoadError
|
15
15
|
end
|
16
|
+
begin
|
17
|
+
require 'active_model/attributes_assignment'
|
18
|
+
extend ::ActiveModel::AttributesAssignment
|
19
|
+
rescue LoadError
|
20
|
+
end
|
21
|
+
|
16
22
|
end
|
17
23
|
base.send :include, InstanceMethods
|
18
24
|
end # self.included
|
19
|
-
|
25
|
+
|
20
26
|
module ClassMethods
|
21
|
-
|
22
27
|
def param_name
|
23
28
|
self.to_s.underscore.tr('/', '_')
|
24
29
|
end
|
25
|
-
|
26
|
-
|
27
30
|
end # ClassMethods
|
28
|
-
|
31
|
+
|
29
32
|
module InstanceMethods
|
30
|
-
|
31
33
|
def param_name
|
32
34
|
self.class.param_name
|
33
35
|
end
|
@@ -52,8 +54,5 @@ module Datagrid
|
|
52
54
|
self.param_name
|
53
55
|
end
|
54
56
|
end # InstanceMethods
|
55
|
-
|
56
57
|
end
|
57
|
-
|
58
|
-
|
59
58
|
end
|
data/lib/datagrid/core.rb
CHANGED
@@ -103,14 +103,18 @@ module Datagrid
|
|
103
103
|
|
104
104
|
|
105
105
|
# Updates datagrid attributes with a passed hash argument
|
106
|
-
def
|
107
|
-
|
108
|
-
|
106
|
+
def attributes=(attributes)
|
107
|
+
if respond_to?(:assign_attributes)
|
108
|
+
assign_attributes(attributes)
|
109
|
+
else
|
110
|
+
attributes.each do |name, value|
|
111
|
+
self[name] = value
|
112
|
+
end
|
113
|
+
self
|
109
114
|
end
|
110
|
-
self
|
111
115
|
end
|
112
|
-
alias attributes= assign_attributes
|
113
116
|
|
117
|
+
# Returns serializable query arguments skipping all nil values
|
114
118
|
def as_query
|
115
119
|
attributes = self.attributes.clone
|
116
120
|
attributes.each do |key, value|
|
@@ -13,7 +13,7 @@ module Datagrid
|
|
13
13
|
|
14
14
|
def to_scope(scope)
|
15
15
|
return scope if scope.is_a?(::Sequel::Dataset)
|
16
|
-
scope.where
|
16
|
+
scope.where({})
|
17
17
|
end
|
18
18
|
|
19
19
|
def append_column_queries(assets, columns)
|
@@ -41,11 +41,11 @@ module Datagrid
|
|
41
41
|
end
|
42
42
|
|
43
43
|
def greater_equal(scope, field, value)
|
44
|
-
scope.where(
|
44
|
+
scope.where(::Sequel.lit("#{prefix_table_name(scope, field)} >= ?", value))
|
45
45
|
end
|
46
46
|
|
47
47
|
def less_equal(scope, field, value)
|
48
|
-
scope.where(
|
48
|
+
scope.where(::Sequel.lit("#{prefix_table_name(scope, field)} <= ?", value))
|
49
49
|
end
|
50
50
|
|
51
51
|
def has_column?(scope, column_name)
|
@@ -103,7 +103,7 @@ module Datagrid
|
|
103
103
|
input_name = "#{object_name}[#{filter.name.to_s}][]"
|
104
104
|
field, operation, value = object.filter_value(filter)
|
105
105
|
options = options.merge(:name => input_name)
|
106
|
-
field_input =
|
106
|
+
field_input = dynamic_filter_select(
|
107
107
|
filter.name,
|
108
108
|
object.select_options(filter) || [],
|
109
109
|
{
|
@@ -114,7 +114,7 @@ module Datagrid
|
|
114
114
|
},
|
115
115
|
add_html_classes(options, "field")
|
116
116
|
)
|
117
|
-
operation_input =
|
117
|
+
operation_input = dynamic_filter_select(
|
118
118
|
filter.name, filter.operations_select,
|
119
119
|
{:include_blank => false, :include_hidden => false, :prompt => false, :selected => operation },
|
120
120
|
add_html_classes(options, "operation")
|
@@ -123,6 +123,18 @@ module Datagrid
|
|
123
123
|
[field_input, operation_input, value_input].join("\n").html_safe
|
124
124
|
end
|
125
125
|
|
126
|
+
def dynamic_filter_select(name, variants, select_options, html_options)
|
127
|
+
if variants.size <= 1
|
128
|
+
value = variants.first
|
129
|
+
# select options format may vary
|
130
|
+
value = value.last if value.is_a?(Array)
|
131
|
+
# don't render any visible input when there is nothing to choose from
|
132
|
+
hidden_field(name, html_options.merge(value: value))
|
133
|
+
else
|
134
|
+
select(name, variants, select_options, html_options)
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
126
138
|
def datagrid_range_filter(type, attribute_or_filter, options = {})
|
127
139
|
filter = datagrid_get_filter(attribute_or_filter)
|
128
140
|
if filter.range?
|
data/lib/datagrid/utils.rb
CHANGED
@@ -13,17 +13,18 @@ module Datagrid
|
|
13
13
|
end
|
14
14
|
|
15
15
|
def translate_from_namespace(namespace, grid_class, key)
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
return I18n.t(deprecated_key)
|
16
|
+
|
17
|
+
lookups = []
|
18
|
+
namespaced_key = "#{namespace}.#{key}"
|
19
|
+
|
20
|
+
grid_class.ancestors.each do |ancestor|
|
21
|
+
if ancestor.respond_to?(:model_name)
|
22
|
+
lookups << :"datagrid.#{ancestor.model_name.i18n_key}.#{namespaced_key}"
|
23
|
+
end
|
25
24
|
end
|
26
|
-
|
25
|
+
lookups << :"datagrid.defaults.#{namespaced_key}"
|
26
|
+
lookups << key.to_s.humanize
|
27
|
+
I18n.t(lookups.shift, default: lookups).presence
|
27
28
|
end
|
28
29
|
|
29
30
|
def warn_once(message, delay = 5)
|
@@ -63,30 +63,36 @@ describe Datagrid::Columns do
|
|
63
63
|
column(:name)
|
64
64
|
end
|
65
65
|
end
|
66
|
-
it "translates column with
|
67
|
-
silence_warnings do
|
68
|
-
store_translations(:en, datagrid: {ns45_translated_report: {columns: {name: "Navn"}}}) do
|
69
|
-
expect(Ns45::TranslatedReport.new.header.first).to eq("Navn")
|
70
|
-
end
|
71
|
-
end
|
72
|
-
end
|
73
|
-
|
74
|
-
it "translates column with namespace" do
|
66
|
+
it "translates column-header with namespace" do
|
75
67
|
store_translations(:en, datagrid: {:"ns45/translated_report" => {columns: {name: "Navn"}}}) do
|
76
68
|
expect(Ns45::TranslatedReport.new.header.first).to eq("Navn")
|
77
69
|
end
|
78
70
|
end
|
79
71
|
|
80
|
-
it "translates column without namespace" do
|
72
|
+
it "translates column-header without namespace" do
|
81
73
|
class Report27
|
82
74
|
include Datagrid
|
83
75
|
scope {Entry}
|
84
76
|
column(:name)
|
85
77
|
end
|
78
|
+
|
86
79
|
store_translations(:en, datagrid: {:"report27" => {columns: {name: "Nombre"}}}) do
|
87
80
|
expect(Report27.new.header.first).to eq("Nombre")
|
88
81
|
end
|
89
82
|
end
|
83
|
+
|
84
|
+
it "translates column-header in using defaults namespace" do
|
85
|
+
class Report27
|
86
|
+
include Datagrid
|
87
|
+
scope {Entry}
|
88
|
+
column(:name)
|
89
|
+
end
|
90
|
+
|
91
|
+
store_translations(:en, datagrid: {defaults: {columns: {name: "Nombre"}}}) do
|
92
|
+
expect(Report27.new.header.first).to eq("Nombre")
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
90
96
|
end
|
91
97
|
|
92
98
|
it "should return html_columns" do
|
@@ -207,13 +207,8 @@ describe Datagrid::Filters do
|
|
207
207
|
scope { Entry }
|
208
208
|
filter(:name)
|
209
209
|
end
|
210
|
-
|
211
|
-
|
212
|
-
grid = Ns46::TranslatedReport.new
|
213
|
-
silence_warnings do
|
214
|
-
store_translations(:en, datagrid: {ns46_translated_report: {filters: {name: "Navn"}}}) do
|
215
|
-
expect(grid.filters.map(&:header)).to eq(["Navn"])
|
216
|
-
end
|
210
|
+
|
211
|
+
class InheritedReport < TranslatedReport
|
217
212
|
end
|
218
213
|
end
|
219
214
|
|
@@ -224,6 +219,19 @@ describe Datagrid::Filters do
|
|
224
219
|
end
|
225
220
|
end
|
226
221
|
|
222
|
+
it "translates filter using defaults namespace" do
|
223
|
+
grid = Ns46::TranslatedReport.new
|
224
|
+
store_translations(:en, datagrid: {defaults: {filters: {name: "Navn"}}}) do
|
225
|
+
expect(grid.filters.map(&:header)).to eq(["Navn"])
|
226
|
+
end
|
227
|
+
end
|
228
|
+
|
229
|
+
it "translates filter using parent report" do
|
230
|
+
grid = Ns46::InheritedReport.new
|
231
|
+
store_translations(:en, datagrid: {:"ns46/translated_report" => {filters: {name: "Navn"}}}) do
|
232
|
+
expect(grid.filters.map(&:header)).to eq(["Navn"])
|
233
|
+
end
|
234
|
+
end
|
227
235
|
end
|
228
236
|
|
229
237
|
|
@@ -567,35 +567,44 @@ DOM
|
|
567
567
|
it {should equal_to_dom(expected_html)}
|
568
568
|
|
569
569
|
end
|
570
|
-
|
570
|
+
|
571
|
+
context "when operations and options are defined" do
|
571
572
|
let(:filter_options) do
|
572
|
-
{:select => [:id, :name]}
|
573
|
+
{:operations => %w(>= <=), :select => [:id, :name]}
|
573
574
|
end
|
574
575
|
let(:expected_html) do
|
575
576
|
<<-HTML
|
576
|
-
|
577
|
-
<option value="
|
578
|
-
<option value="=~">≈</option>
|
579
|
-
<option value=">=">≥</option>
|
580
|
-
<option value="<=">≤</option></select><input class="condition dynamic_filter value" name="report[condition][]" type="text" id="report_condition">
|
577
|
+
<select class="condition dynamic_filter field" name="report[condition][]" id="report_condition"><option value="id">id</option><option value="name">name</option></select><select class="condition dynamic_filter operation" name="report[condition][]" id="report_condition"><option value=">=">≥</option>
|
578
|
+
<option value="<=">≤</option></select><input class="condition dynamic_filter value" name="report[condition][]" type="text" id="report_condition">
|
581
579
|
HTML
|
582
580
|
end
|
583
581
|
it {should equal_to_dom(expected_html)}
|
584
|
-
|
585
582
|
end
|
586
583
|
|
587
|
-
context "when
|
584
|
+
context "when the field is predefined" do
|
588
585
|
let(:filter_options) do
|
589
586
|
{:operations => %w(>= <=), :select => [:id]}
|
590
587
|
end
|
591
588
|
let(:expected_html) do
|
592
589
|
<<-HTML
|
593
|
-
<
|
590
|
+
<input class="condition dynamic_filter field" name="report[condition][]" value="id" type="hidden" id="report_condition"><select class="condition dynamic_filter operation" name="report[condition][]" id="report_condition"><option value=">=">≥</option>
|
594
591
|
<option value="<=">≤</option></select><input class="condition dynamic_filter value" name="report[condition][]" type="text" id="report_condition">
|
595
592
|
HTML
|
596
593
|
end
|
597
594
|
it {should equal_to_dom(expected_html)}
|
598
595
|
end
|
596
|
+
context "when operation is predefined" do
|
597
|
+
let(:filter_options) do
|
598
|
+
{:operations => %w(=), :select => [:id, :name]}
|
599
|
+
end
|
600
|
+
let(:expected_html) do
|
601
|
+
<<-HTML
|
602
|
+
<select class="condition dynamic_filter field" name="report[condition][]" id="report_condition"><option value="id">id</option><option value="name">name</option></select><input class="condition dynamic_filter operation" name="report[condition][]" value="=" type="hidden" id="report_condition"><input class="condition dynamic_filter value" name="report[condition][]" type="text" id="report_condition">
|
603
|
+
HTML
|
604
|
+
end
|
605
|
+
it {should equal_to_dom(expected_html)}
|
606
|
+
end
|
607
|
+
|
599
608
|
end
|
600
609
|
end
|
601
610
|
|
data/spec/spec_helper.rb
CHANGED
@@ -86,7 +86,7 @@ RSpec.configure do |config|
|
|
86
86
|
#TODO better database truncation
|
87
87
|
Group.delete_all
|
88
88
|
Entry.delete_all
|
89
|
-
SequelEntry.where.delete
|
89
|
+
SequelEntry.where({}).delete
|
90
90
|
unless NO_MONGO
|
91
91
|
MongoidEntry.delete_all
|
92
92
|
MongoMapperEntry.delete_all if defined?(MongoMapperEntry)
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: datagrid
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.5.
|
4
|
+
version: 1.5.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Bogdan Gusiev
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-06-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|