datagrid 1.5.3 → 1.5.4
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/.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
|