collate 0.1.1 → 0.1.2
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 +13 -0
- data/collate.gemspec +1 -1
- data/lib/app/views/collate/_checkbox_field.html.haml +5 -0
- data/lib/app/views/collate/_checkboxgroup_field.html.haml +8 -0
- data/lib/app/views/collate/_date_field.html.haml +3 -0
- data/lib/app/views/collate/_select_field.html.haml +5 -0
- data/lib/app/views/collate/_string_field.html.haml +3 -0
- data/lib/collate/action_view_extension.rb +15 -0
- data/lib/collate/active_record_extension.rb +32 -11
- data/lib/collate/engine.rb +8 -0
- data/lib/collate/filter.rb +2 -2
- data/lib/collate/version.rb +1 -1
- metadata +8 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f6b83915624fb82cd112faccebbd22f5d298f651
|
4
|
+
data.tar.gz: 959313f8d709d29499a7f8aad05e7187ee98c5e2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b3ec77b60c452a7e81c0ad455a85d5b00c91c8cec73da5ce8433ae9bce4ba0765031c5cbbad4e5c8ea1fdc80464282a5efbf0b0f7e743be1351c073686d55026
|
7
|
+
data.tar.gz: b167d550eb09ca697e0d99d373574926bf1448f360272470b3d0ca78fa013fee841660de221d43fe6241789611153e0845a9a1ea6bf9fa738d34d0e1ead19573
|
data/README.md
CHANGED
@@ -134,6 +134,7 @@ Here are the available value transformations:
|
|
134
134
|
| Transformation | Behavior |
|
135
135
|
|:-------------------------|:--------------------|
|
136
136
|
| ```:join``` | ```value = value.join(arg1)``` |
|
137
|
+
| ```:as_array``` | ```value = "{#{value}}"``` |
|
137
138
|
| ```:downcase``` | ```value = value.downcase``` |
|
138
139
|
| ```:string_part``` | ```value = "%#{value}%"``` |
|
139
140
|
|
@@ -149,6 +150,18 @@ collate_on :name, label: 'Character Name'
|
|
149
150
|
|
150
151
|
This argument will overwrite the default label for the filter, which is ```field.to_s.titleize```
|
151
152
|
|
153
|
+
#### Or
|
154
|
+
--------------
|
155
|
+
```
|
156
|
+
collate_on :name, or: true
|
157
|
+
```
|
158
|
+
|
159
|
+
This argument causes the query to use "OR" for each element of the filter value array passed in from the user. For example, if the user passed in ```["John Doe", "Jane Doe"]``` as the parameter for the above collation, this is the PostgreSQL query that would result:
|
160
|
+
|
161
|
+
```
|
162
|
+
WHERE name = "John Doe" OR name = "Jane Doe"
|
163
|
+
```
|
164
|
+
|
152
165
|
#### Not
|
153
166
|
--------------
|
154
167
|
```
|
data/collate.gemspec
CHANGED
@@ -22,7 +22,7 @@ Gem::Specification.new do |spec|
|
|
22
22
|
end
|
23
23
|
|
24
24
|
spec.files = `git ls-files -z`.split("\x0").reject do |f|
|
25
|
-
f.match(%r{^(test|spec|features|app|coverage|config|log)/})
|
25
|
+
f.match(%r{^(test|spec|features|app/controllers|app/models|app/views/actors|app/views/movies|coverage|config|log)/})
|
26
26
|
end
|
27
27
|
spec.bindir = "exe"
|
28
28
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
@@ -0,0 +1,8 @@
|
|
1
|
+
= filter.label
|
2
|
+
%br
|
3
|
+
- filter.component[:values].each do |value|
|
4
|
+
%label.custom-control.custom-checkbox
|
5
|
+
= check_box_tag "#{filter.param_key}[]", value[:id], ([] + params[filter.param_key].to_a).include?(value[:id]), class: 'custom-control-input'
|
6
|
+
%span.custom-control-indicator
|
7
|
+
%span.custom-control-description
|
8
|
+
= value[:text]
|
@@ -0,0 +1,5 @@
|
|
1
|
+
= filter.label
|
2
|
+
%br
|
3
|
+
- select_params = [{style: 'width:100%', id: "#{filter.html_id}"}]
|
4
|
+
- select_params[0].merge!({multiple: "multiple"}) if filter.component[:multiple]
|
5
|
+
= select_tag "#{filter.param_key}[]", options_for_select(filter.component[:values].map { |o| params[filter.param_key].to_a.include?(o[:id].to_s) ? [o[:text], o[:id], selected: "selected"] : [o[:text], o[:id]] } ), *select_params
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module Collate
|
2
|
+
module ActionViewExtension
|
3
|
+
def filters_for_group record, group_key
|
4
|
+
groups = record.model.collate_filters ||= {}
|
5
|
+
|
6
|
+
group = groups[group_key]
|
7
|
+
|
8
|
+
filters = group[:filters] ||= []
|
9
|
+
end
|
10
|
+
|
11
|
+
def filter_for filter
|
12
|
+
render :partial => "collate/#{filter.component[:type]}_field", locals: {filter: filter}
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -47,7 +47,13 @@ module Collate
|
|
47
47
|
self.group_options ||= {}
|
48
48
|
end
|
49
49
|
|
50
|
-
def apply_filter ar_rel, filter,
|
50
|
+
def apply_filter ar_rel, filter, param_value
|
51
|
+
filter_value = if param_value.duplicable?
|
52
|
+
param_value.dup
|
53
|
+
else
|
54
|
+
param_value
|
55
|
+
end
|
56
|
+
|
51
57
|
if filter.joins
|
52
58
|
filter.joins.each do |join|
|
53
59
|
ar_rel = if filter.joins_prefix
|
@@ -125,16 +131,26 @@ module Collate
|
|
125
131
|
transformation = vt
|
126
132
|
transformation = vt[0] if !transformation.is_a? Symbol
|
127
133
|
|
128
|
-
filter_value =
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
134
|
+
filter_value = [filter_value] unless filter.or
|
135
|
+
|
136
|
+
filter_value.each_with_index do |f, i|
|
137
|
+
filter_value[i] = case transformation
|
138
|
+
when :join
|
139
|
+
"#{f.join(vt[1])}"
|
140
|
+
when :as_array
|
141
|
+
"{#{f}}"
|
142
|
+
when :downcase
|
143
|
+
f.downcase
|
144
|
+
when :string_part
|
145
|
+
"%#{f}%"
|
146
|
+
when :to_json
|
147
|
+
"{\"#{vt[1]}\": \"#{f}\"}"
|
148
|
+
else
|
149
|
+
f
|
150
|
+
end
|
137
151
|
end
|
152
|
+
filter_value = filter_value[0] unless filter.or
|
153
|
+
|
138
154
|
end
|
139
155
|
|
140
156
|
ar_method = filter.having ? "having" : "where"
|
@@ -162,10 +178,15 @@ module Collate
|
|
162
178
|
""
|
163
179
|
end
|
164
180
|
|
181
|
+
query_string = filter_value.length.times.collect{query_string}.join(' OR ') if filter.or
|
165
182
|
query_string = "NOT(#{query_string})" if filter.not
|
166
183
|
|
167
184
|
ar_rel = if query_string.include?('?')
|
168
|
-
|
185
|
+
if filter.or
|
186
|
+
ar_rel.send(ar_method, query_string, *filter_value)
|
187
|
+
else
|
188
|
+
ar_rel.send(ar_method, query_string, filter_value)
|
189
|
+
end
|
169
190
|
else
|
170
191
|
ar_rel.send(ar_method, query_string)
|
171
192
|
end
|
data/lib/collate/engine.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require_relative 'active_record_extension'
|
2
|
+
require_relative 'action_view_extension'
|
2
3
|
require 'rails'
|
3
4
|
|
4
5
|
module Collate
|
@@ -6,9 +7,16 @@ module Collate
|
|
6
7
|
|
7
8
|
isolate_namespace Collate
|
8
9
|
|
10
|
+
ActiveSupport.on_load :action_view do
|
11
|
+
include Collate::ActionViewExtension
|
12
|
+
end
|
13
|
+
|
9
14
|
ActiveSupport.on_load :active_record do
|
10
15
|
extend Collate::ActiveRecordExtension
|
11
16
|
end
|
12
17
|
|
18
|
+
if defined? ActionController::Base
|
19
|
+
ActionController::Base.prepend_view_path File.dirname(__FILE__) + "/../app/views"
|
20
|
+
end
|
13
21
|
end
|
14
22
|
end
|
data/lib/collate/filter.rb
CHANGED
@@ -4,11 +4,11 @@ module Collate
|
|
4
4
|
|
5
5
|
FIELD_TRANSFORMATIONS = [:date_difference, :date_part, :array_agg, :downcase, :split, :array_length]
|
6
6
|
AGGREGATE_TRANSFORMATIONS = [:array_agg]
|
7
|
-
VALUE_TRANSFORMATIONS = [:join, :downcase, :string_part]
|
7
|
+
VALUE_TRANSFORMATIONS = [:join, :downcase, :string_part, :to_json]
|
8
8
|
|
9
9
|
attr_accessor :field, :operator, :base_model_table_name, :field_transformations, :label,
|
10
10
|
:component, :joins, :value_transformations, :grouping, :html_id, :having,
|
11
|
-
:joins_prefix, :not
|
11
|
+
:joins_prefix, :not, :or
|
12
12
|
|
13
13
|
def initialize(field, opt={})
|
14
14
|
opt.each do |field, value|
|
data/lib/collate/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: collate
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nicholas Page
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: exe
|
11
11
|
cert_chain: []
|
12
|
-
date: 2017-02-
|
12
|
+
date: 2017-02-07 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: bundler
|
@@ -172,7 +172,13 @@ files:
|
|
172
172
|
- circle.yml
|
173
173
|
- collate.gemspec
|
174
174
|
- deploy.sh
|
175
|
+
- lib/app/views/collate/_checkbox_field.html.haml
|
176
|
+
- lib/app/views/collate/_checkboxgroup_field.html.haml
|
177
|
+
- lib/app/views/collate/_date_field.html.haml
|
178
|
+
- lib/app/views/collate/_select_field.html.haml
|
179
|
+
- lib/app/views/collate/_string_field.html.haml
|
175
180
|
- lib/collate.rb
|
181
|
+
- lib/collate/action_view_extension.rb
|
176
182
|
- lib/collate/active_record_extension.rb
|
177
183
|
- lib/collate/engine.rb
|
178
184
|
- lib/collate/filter.rb
|