dynamic_scope 0.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 +7 -0
- data/.gitignore +5 -0
- data/.rspec +2 -0
- data/Gemfile +4 -0
- data/README.md +3 -0
- data/Rakefile +4 -0
- data/app/assets/images/dynamic_scope/fieldset-remove.png +0 -0
- data/app/assets/javascripts/angular-dynamic-scope.coffee +201 -0
- data/app/assets/javascripts/angular-multiple-dynamic-scope.coffee +249 -0
- data/app/assets/javascripts/dynamic_scope.coffee +110 -0
- data/app/assets/stylesheets/dynamic_scope.sass +104 -0
- data/config/locales/dynamic_scope.de.yml +24 -0
- data/config/locales/dynamic_scope.en.yml +24 -0
- data/config/locales/dynamic_scope.fr.yml +24 -0
- data/config/locales/dynamic_scope.it.yml +24 -0
- data/dynamic_scope.gemspec +29 -0
- data/lib/dynamic_scope/acts_as_dynamically_scopable.rb +17 -0
- data/lib/dynamic_scope/class_methods.rb +71 -0
- data/lib/dynamic_scope/concerns/active_record.rb +19 -0
- data/lib/dynamic_scope/concerns.rb +2 -0
- data/lib/dynamic_scope/engine.rb +7 -0
- data/lib/dynamic_scope/processor.rb +89 -0
- data/lib/dynamic_scope/query.rb +205 -0
- data/lib/dynamic_scope/query_helpers.rb +11 -0
- data/lib/dynamic_scope/version.rb +5 -0
- data/lib/dynamic_scope/view_helpers.rb +192 -0
- data/lib/dynamic_scope.rb +14 -0
- metadata +135 -0
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
module DynamicScope
|
|
2
|
+
module ViewHelpers
|
|
3
|
+
def dynamic_scope_for(model, old_scope = nil, options={}, &block)
|
|
4
|
+
columns = model.send(:dynamic_scope_columns)
|
|
5
|
+
old_scope = nil if model.send(:dynamic_scope_is_empty?, old_scope)
|
|
6
|
+
dynamic_scope(columns, old_scope, options, block)
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def dynamic_scope(columns, options = {}, &block)
|
|
10
|
+
options[:method] ||= :get
|
|
11
|
+
options[:param_name] ||= :dynamic_scope
|
|
12
|
+
options[:clear_scope_link] = true if options[:clear_scope_link].nil?
|
|
13
|
+
old_scope = params[options[:param_name]]&.to_unsafe_h || {}
|
|
14
|
+
content_tag(:div, class: :dynamic_scope) do
|
|
15
|
+
concat(content_tag(:div, class: :templates) { dynamic_scope_input_templates(columns, options) } )
|
|
16
|
+
concat(form_tag({}, options) do
|
|
17
|
+
generate_dynamic_scope_controls(columns, old_scope, options)
|
|
18
|
+
if block_given?
|
|
19
|
+
concat(content_tag(:div, class: :dynamic_scope_content) do
|
|
20
|
+
concat capture(&block)
|
|
21
|
+
end)
|
|
22
|
+
else
|
|
23
|
+
concat(dynamic_scope_controls)
|
|
24
|
+
end
|
|
25
|
+
end)
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def link_to_add_dynamic_scope_field
|
|
30
|
+
link_to('javascript:void(0);', :class => 'dynamic_scope_add') do
|
|
31
|
+
concat( content_tag(:span) { t('dynamic_scope.add_criteria') } )
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def dynamic_scope_controls
|
|
36
|
+
@dynamic_scope_controls
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
private
|
|
40
|
+
def generate_dynamic_scope_controls(columns, old_scope, options = {})
|
|
41
|
+
@dynamic_scope_controls =
|
|
42
|
+
capture do
|
|
43
|
+
concat(content_tag(:div, class: :dynamic_scope_fieldsets) do
|
|
44
|
+
concat(dynamic_scope_inputs(columns, old_scope, options))
|
|
45
|
+
end)
|
|
46
|
+
concat(content_tag(:div, class: :dynamic_scope_add_and_submit) do
|
|
47
|
+
concat(link_to_add_dynamic_scope_field )
|
|
48
|
+
concat(submit_tag t('dynamic_scope.submit'), class: 'btn')
|
|
49
|
+
if options[:clear_scope_link]
|
|
50
|
+
concat(content_tag(:div) do
|
|
51
|
+
concat( link_to t('dynamic_scope.clear'), "#", class: [:dynamic_scope_clear]) if old_scope.present?
|
|
52
|
+
end)
|
|
53
|
+
end
|
|
54
|
+
end)
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def dynamic_scope_input_templates(columns, options = {})
|
|
59
|
+
return nil if columns.nil?
|
|
60
|
+
capture do
|
|
61
|
+
columns.each_pair do |col_name, col_options|
|
|
62
|
+
template_column(col_name, col_options, columns, options)
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
def dynamic_scope_inputs(columns, old_scope, options = {})
|
|
68
|
+
counter = 0
|
|
69
|
+
capture do
|
|
70
|
+
if old_scope
|
|
71
|
+
old_scope.sort.map(&:last).each do |item|
|
|
72
|
+
if item.size == 1
|
|
73
|
+
item = item.values.first
|
|
74
|
+
end
|
|
75
|
+
if item.present? and col_name = item['key'] and col_options = columns[col_name.to_sym]
|
|
76
|
+
scope_column(col_name, col_options, columns, options.merge({index: counter, operator: item['operator'], value: item['value'], old_scope: true}))
|
|
77
|
+
counter = counter + 1
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
scope_column(columns.first[0], columns.first[1], columns, options.merge({index: 0})) if counter == 0
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
def template_column(col_name, col_options, columns, options = {})
|
|
86
|
+
scope_column(col_name, col_options, columns, options.merge({template: true}))
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
def scope_column(col_name, col_options, columns, options = {})
|
|
90
|
+
options = options.dup
|
|
91
|
+
options[:index] ||= 'INDEX'
|
|
92
|
+
options[:template] ||= false
|
|
93
|
+
|
|
94
|
+
fieldset_id = options[:template] ? "dynamic_scope_template_#{col_name}" : "dynamic_scope_#{options[:index]}"
|
|
95
|
+
fieldset_style = options[:template] ? 'display:none' : ''
|
|
96
|
+
fieldset_class = options[:template] ? 'dynamic_scope_template' : 'dynamic_scope_active'
|
|
97
|
+
|
|
98
|
+
content_tag(:fieldset, id: fieldset_id, style: fieldset_style, class: fieldset_class) do
|
|
99
|
+
concat name_input_for_column(col_name, col_options, columns, options)
|
|
100
|
+
concat operator_input_for_column(col_name, col_options, columns, options)
|
|
101
|
+
concat value_input_for_column(col_name, col_options, columns, options)
|
|
102
|
+
concat link_to('', 'javascript:void(0);', class: 'dynamic_scope_remove', style: 'display:none')
|
|
103
|
+
end
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
def operators_for_column(col_name, col_options)
|
|
107
|
+
if col_options[:values] && col_options[:type] != :enum
|
|
108
|
+
[
|
|
109
|
+
[t('dynamic_scope.operator.matches'), :matches],
|
|
110
|
+
[t('dynamic_scope.operator.does_not_match'), :does_not_match]
|
|
111
|
+
]
|
|
112
|
+
else
|
|
113
|
+
case col_options[:type]
|
|
114
|
+
when :integer, :age
|
|
115
|
+
[
|
|
116
|
+
[t('dynamic_scope.operator.eq'), :eq],
|
|
117
|
+
[t('dynamic_scope.operator.gteq'), :gteq],
|
|
118
|
+
[t('dynamic_scope.operator.lteq'), :lteq]
|
|
119
|
+
]
|
|
120
|
+
when :string
|
|
121
|
+
if col_name == :any_field
|
|
122
|
+
[[t('dynamic_scope.operator.contains'), :matches]]
|
|
123
|
+
else
|
|
124
|
+
[
|
|
125
|
+
[t('dynamic_scope.operator.begins_with'), :begins_with],
|
|
126
|
+
[t('dynamic_scope.operator.ends_with'), :ends_with],
|
|
127
|
+
[t('dynamic_scope.operator.eq'), :eq],
|
|
128
|
+
[t('dynamic_scope.operator.contains'), :matches],
|
|
129
|
+
[t('dynamic_scope.operator.does_not_contain'), :does_not_match],
|
|
130
|
+
]
|
|
131
|
+
end
|
|
132
|
+
when :datetime
|
|
133
|
+
[
|
|
134
|
+
[t('dynamic_scope.operator.before'), :lteq],
|
|
135
|
+
[t('dynamic_scope.operator.after'), :gteq]
|
|
136
|
+
]
|
|
137
|
+
when :date, :date_future
|
|
138
|
+
[
|
|
139
|
+
[t('dynamic_scope.operator.eq'), :eq],
|
|
140
|
+
[t('dynamic_scope.operator.before'), :lteq],
|
|
141
|
+
[t('dynamic_scope.operator.after'), :gteq]
|
|
142
|
+
]
|
|
143
|
+
when :boolean
|
|
144
|
+
[
|
|
145
|
+
[t('dynamic_scope.operator.yes'), :eq],
|
|
146
|
+
[t('dynamic_scope.operator.no'), :not_eq],
|
|
147
|
+
]
|
|
148
|
+
when :enum
|
|
149
|
+
[
|
|
150
|
+
[t('dynamic_scope.operator.eq'), :eq],
|
|
151
|
+
[t('dynamic_scope.operator.not_eq'), :not_eq],
|
|
152
|
+
]
|
|
153
|
+
else
|
|
154
|
+
[col_options[:type]]
|
|
155
|
+
end
|
|
156
|
+
end
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
def name_input_for_column(col_name, col_options, columns, options = {})
|
|
160
|
+
input_name = "#{options[:param_name]}[#{options[:index]}][key]"
|
|
161
|
+
select_tag(input_name, options_for_select(columns.map{|c| [ t("dynamic_scope.column.#{c[0]}"), c[0]] }, col_name), class: 'dynamic_scope_column')
|
|
162
|
+
end
|
|
163
|
+
|
|
164
|
+
def operator_input_for_column(col_name, col_options, columns, options = {})
|
|
165
|
+
operators = operators_for_column(col_name, col_options)
|
|
166
|
+
input_name = "#{options[:param_name]}[#{options[:index]}][operator]"
|
|
167
|
+
select_tag(input_name, options_for_select(operators, options[:operator]), class: 'dynamic_scope_operator')
|
|
168
|
+
end
|
|
169
|
+
|
|
170
|
+
def value_input_for_column(col_name, col_options, columns, options = {})
|
|
171
|
+
input_name = "#{options[:param_name]}[#{options[:index]}][value]"
|
|
172
|
+
input_class = ['dynamic_scope_value', col_options[:type]]
|
|
173
|
+
if col_options[:values]
|
|
174
|
+
option_tags = options_for_select(col_options[:values].map{|v| [ t("dynamic_scope.value.#{v}"), v] }, options[:value])
|
|
175
|
+
select_tag(input_name, option_tags, class: input_class)
|
|
176
|
+
else
|
|
177
|
+
case col_options[:type]
|
|
178
|
+
when :date, :date_future
|
|
179
|
+
format = 'yyyy-mm-dd'
|
|
180
|
+
text_field_tag(input_name, options[:value], class: input_class, 'data-format' => format, 'data-date-format' => format, placeholder: format.upcase)
|
|
181
|
+
when :datetime
|
|
182
|
+
format = 'yyyy-mm-dd'
|
|
183
|
+
text_field_tag(input_name, options[:value], class: input_class, 'data-format' => format, 'data-date-format' => format, placeholder: format.upcase)
|
|
184
|
+
when :boolean
|
|
185
|
+
hidden_field_tag(input_name, true)
|
|
186
|
+
else
|
|
187
|
+
text_field_tag(input_name, options[:value], class: input_class)
|
|
188
|
+
end
|
|
189
|
+
end
|
|
190
|
+
end
|
|
191
|
+
end
|
|
192
|
+
end
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
require 'dynamic_scope/version'
|
|
2
|
+
require 'dynamic_scope/engine'
|
|
3
|
+
require 'dynamic_scope/processor'
|
|
4
|
+
require 'dynamic_scope/concerns'
|
|
5
|
+
|
|
6
|
+
if defined?(ActionView::Base)
|
|
7
|
+
require 'dynamic_scope/view_helpers'
|
|
8
|
+
ActionView::Base.send(:include, DynamicScope::ViewHelpers)
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
if defined?(ActiveRecord::Base)
|
|
12
|
+
require 'dynamic_scope/concerns/active_record'
|
|
13
|
+
ActiveRecord::Base.send(:include, DynamicScope::Concerns::ActiveRecord)
|
|
14
|
+
end
|
metadata
ADDED
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: dynamic_scope
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 0.5.4
|
|
5
|
+
platform: ruby
|
|
6
|
+
authors:
|
|
7
|
+
- Aleksandr Balakiriev
|
|
8
|
+
bindir: exe
|
|
9
|
+
cert_chain: []
|
|
10
|
+
date: 1980-01-02 00:00:00.000000000 Z
|
|
11
|
+
dependencies:
|
|
12
|
+
- !ruby/object:Gem::Dependency
|
|
13
|
+
name: sass-rails
|
|
14
|
+
requirement: !ruby/object:Gem::Requirement
|
|
15
|
+
requirements:
|
|
16
|
+
- - ">="
|
|
17
|
+
- !ruby/object:Gem::Version
|
|
18
|
+
version: '6.0'
|
|
19
|
+
type: :runtime
|
|
20
|
+
prerelease: false
|
|
21
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
22
|
+
requirements:
|
|
23
|
+
- - ">="
|
|
24
|
+
- !ruby/object:Gem::Version
|
|
25
|
+
version: '6.0'
|
|
26
|
+
- !ruby/object:Gem::Dependency
|
|
27
|
+
name: coffee-rails
|
|
28
|
+
requirement: !ruby/object:Gem::Requirement
|
|
29
|
+
requirements:
|
|
30
|
+
- - ">="
|
|
31
|
+
- !ruby/object:Gem::Version
|
|
32
|
+
version: '5.0'
|
|
33
|
+
type: :runtime
|
|
34
|
+
prerelease: false
|
|
35
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
36
|
+
requirements:
|
|
37
|
+
- - ">="
|
|
38
|
+
- !ruby/object:Gem::Version
|
|
39
|
+
version: '5.0'
|
|
40
|
+
- !ruby/object:Gem::Dependency
|
|
41
|
+
name: i18n-js
|
|
42
|
+
requirement: !ruby/object:Gem::Requirement
|
|
43
|
+
requirements:
|
|
44
|
+
- - "~>"
|
|
45
|
+
- !ruby/object:Gem::Version
|
|
46
|
+
version: 3.9.2
|
|
47
|
+
type: :runtime
|
|
48
|
+
prerelease: false
|
|
49
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
50
|
+
requirements:
|
|
51
|
+
- - "~>"
|
|
52
|
+
- !ruby/object:Gem::Version
|
|
53
|
+
version: 3.9.2
|
|
54
|
+
- !ruby/object:Gem::Dependency
|
|
55
|
+
name: rspec
|
|
56
|
+
requirement: !ruby/object:Gem::Requirement
|
|
57
|
+
requirements:
|
|
58
|
+
- - "~>"
|
|
59
|
+
- !ruby/object:Gem::Version
|
|
60
|
+
version: '3.13'
|
|
61
|
+
type: :development
|
|
62
|
+
prerelease: false
|
|
63
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
64
|
+
requirements:
|
|
65
|
+
- - "~>"
|
|
66
|
+
- !ruby/object:Gem::Version
|
|
67
|
+
version: '3.13'
|
|
68
|
+
- !ruby/object:Gem::Dependency
|
|
69
|
+
name: rails
|
|
70
|
+
requirement: !ruby/object:Gem::Requirement
|
|
71
|
+
requirements:
|
|
72
|
+
- - ">="
|
|
73
|
+
- !ruby/object:Gem::Version
|
|
74
|
+
version: '8.0'
|
|
75
|
+
type: :development
|
|
76
|
+
prerelease: false
|
|
77
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
78
|
+
requirements:
|
|
79
|
+
- - ">="
|
|
80
|
+
- !ruby/object:Gem::Version
|
|
81
|
+
version: '8.0'
|
|
82
|
+
description: Helpers and angular module to make fancy dynamic scopes with arel.
|
|
83
|
+
email:
|
|
84
|
+
- balakirevs@i.ua
|
|
85
|
+
executables: []
|
|
86
|
+
extensions: []
|
|
87
|
+
extra_rdoc_files: []
|
|
88
|
+
files:
|
|
89
|
+
- ".gitignore"
|
|
90
|
+
- ".rspec"
|
|
91
|
+
- Gemfile
|
|
92
|
+
- README.md
|
|
93
|
+
- Rakefile
|
|
94
|
+
- app/assets/images/dynamic_scope/fieldset-remove.png
|
|
95
|
+
- app/assets/javascripts/angular-dynamic-scope.coffee
|
|
96
|
+
- app/assets/javascripts/angular-multiple-dynamic-scope.coffee
|
|
97
|
+
- app/assets/javascripts/dynamic_scope.coffee
|
|
98
|
+
- app/assets/stylesheets/dynamic_scope.sass
|
|
99
|
+
- config/locales/dynamic_scope.de.yml
|
|
100
|
+
- config/locales/dynamic_scope.en.yml
|
|
101
|
+
- config/locales/dynamic_scope.fr.yml
|
|
102
|
+
- config/locales/dynamic_scope.it.yml
|
|
103
|
+
- dynamic_scope.gemspec
|
|
104
|
+
- lib/dynamic_scope.rb
|
|
105
|
+
- lib/dynamic_scope/acts_as_dynamically_scopable.rb
|
|
106
|
+
- lib/dynamic_scope/class_methods.rb
|
|
107
|
+
- lib/dynamic_scope/concerns.rb
|
|
108
|
+
- lib/dynamic_scope/concerns/active_record.rb
|
|
109
|
+
- lib/dynamic_scope/engine.rb
|
|
110
|
+
- lib/dynamic_scope/processor.rb
|
|
111
|
+
- lib/dynamic_scope/query.rb
|
|
112
|
+
- lib/dynamic_scope/query_helpers.rb
|
|
113
|
+
- lib/dynamic_scope/version.rb
|
|
114
|
+
- lib/dynamic_scope/view_helpers.rb
|
|
115
|
+
homepage: ''
|
|
116
|
+
licenses: []
|
|
117
|
+
metadata: {}
|
|
118
|
+
rdoc_options: []
|
|
119
|
+
require_paths:
|
|
120
|
+
- lib
|
|
121
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
122
|
+
requirements:
|
|
123
|
+
- - ">="
|
|
124
|
+
- !ruby/object:Gem::Version
|
|
125
|
+
version: 3.2.0
|
|
126
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
127
|
+
requirements:
|
|
128
|
+
- - ">="
|
|
129
|
+
- !ruby/object:Gem::Version
|
|
130
|
+
version: '0'
|
|
131
|
+
requirements: []
|
|
132
|
+
rubygems_version: 4.0.2
|
|
133
|
+
specification_version: 4
|
|
134
|
+
summary: Dynamic scope for rails
|
|
135
|
+
test_files: []
|