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.
@@ -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: []