sn_filterable 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,182 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "sn_filterable/version"
4
+ require_relative "sn_filterable/railtie"
5
+ require_relative "sn_filterable/filterable"
6
+ require_relative "models/filtered"
7
+ require "sn_filterable/engine"
8
+ require "view_component"
9
+ require "kaminari"
10
+
11
+ module SnFilterable
12
+ include SnFilterable::Filterable
13
+
14
+ def self.load_js
15
+ File.read(File.join(Gem.loaded_specs["sn_filterable"].full_gem_path, "app", "assets", "javascripts", "sn_filtering.js"))
16
+ end
17
+
18
+ # View helper for [Filtered].
19
+ #
20
+ # Defaults the URL of [Filtered] calls to use `url_for`.
21
+ #
22
+ # @see Filtered
23
+ module FilteredHelper
24
+ # Helper function of [Filtered#set_filter_url]
25
+ #
26
+ # @param [Filtered] filtered_instance
27
+ # @param [String] filter_key
28
+ # @param [String] value
29
+ # @return [String]
30
+ def set_filter_url(filtered_instance, filter_key, value, url: url_for)
31
+ filtered_instance.set_filter_url(url, filter_key, value)
32
+ end
33
+
34
+ # Helper function of [Filtered#add_filter_url]
35
+ #
36
+ # @param [Filtered] filtered_instance
37
+ # @param [String] filter_key
38
+ # @param [String] value
39
+ # @return [String]
40
+ def add_filter_url(filtered_instance, filter_key, value, url: url_for)
41
+ filtered_instance.add_filter_url(url, filter_key, value)
42
+ end
43
+
44
+ # Helper function of [Filtered#remove_filter_url]
45
+ #
46
+ # @param [Filtered] filtered_instance
47
+ # @param [String] filter_key
48
+ # @return [String]
49
+ def remove_filter_url(filtered_instance, filter_key, url: url_for)
50
+ filtered_instance.remove_filter_url(url, filter_key)
51
+ end
52
+
53
+ # Helper function of [Filtered#remove_sub_filter_url]
54
+ #
55
+ # @param [Filtered] filtered_instance
56
+ # @param [String] filter_key
57
+ # @param [String] filter_value
58
+ # @return [String]
59
+ def remove_sub_filter_url(filtered_instance, filter_key, filter_value, url: url_for)
60
+ filtered_instance.remove_sub_filter_url(url, filter_key, filter_value)
61
+ end
62
+
63
+ # Helper function of [Filtered#clear_filter_url]
64
+ #
65
+ # @param [Filtered] filtered_instance
66
+ # @return [String]
67
+ def clear_filter_url(filtered_instance, url: url_for)
68
+ filtered_instance.clear_filter_url(url)
69
+ end
70
+
71
+ # Helper function of [Filtered#clear_sort_url]
72
+ #
73
+ # @param [Filtered] filtered_instance
74
+ # @return [String]
75
+ def clear_sort_url(filtered_instance, url: url_for)
76
+ filtered_instance.clear_sort_url(url)
77
+ end
78
+
79
+ # Helper function of [Filtered#clear_all_url]
80
+ #
81
+ # @param [Filtered] filtered_instance
82
+ # @return [String]
83
+ def clear_all_url(filtered_instance, url: url_for)
84
+ filtered_instance.clear_all_url(url)
85
+ end
86
+
87
+ # Helper function of [Filtered#sort_url]
88
+ #
89
+ # @param [Filtered] filtered_instance
90
+ # @param [String] sort_key
91
+ # @param [Symbol, nil] order
92
+ # @return [String]
93
+ def sort_url(filtered_instance, sort_key, order: nil, url: url_for, &block)
94
+ filtered_instance.sort_url(url, sort_key, order, &block)
95
+ end
96
+
97
+ # Creates an anchor element using `sort_url` and the block.
98
+ # Additionally appends a suffix containing a triangle symbol
99
+ # representing the direction of the sort
100
+ # if we are currently sorting the items of [Filtered] using the `sort_key`.
101
+ #
102
+ # @param [Filtered] filtered_instance
103
+ # @param [String] sort_key The sorting key to toggle
104
+ # @param [Boolean] in_filterable_component If true, will add filterable component Alpine scripts
105
+ def table_header_sort_link(filtered_instance, sort_key, scope: nil, html_options: nil, url: url_for, in_filterable_component: true, &block)
106
+ url, state = filtered_instance.sort_url(url, sort_key, scope: scope)
107
+
108
+ link_html_options = in_filterable_component ? { "@click": "filtersLoading = true", "class": "whitespace-nowrap" } : {}
109
+ link_html_options = link_html_options.merge(html_options) if html_options.present?
110
+
111
+ suffix = sanitize case state
112
+ when :asc
113
+ " ▲"
114
+ when :desc
115
+ " ▼"
116
+ else
117
+ ""
118
+ end
119
+
120
+ link_to(capture(&block) + suffix, url, link_html_options)
121
+ end
122
+
123
+ # Creates hidden inputs elements representing the current filter / sort values.
124
+ # Useful for forms when we want to retain the user's current filtering parameters.
125
+ #
126
+ # When used on a form, this should be rendered first to avoid conflicts with other form inputs
127
+ # defined. Duplicate input name's may exist but can be ignored as the last duplicate parameter occurrence
128
+ # takes precedence.
129
+ #
130
+ # @param [Filtered] filtered_instance
131
+ def filtered_form_inputs(filtered_instance)
132
+ inputs = sanitize("")
133
+
134
+ filtered_instance.queries.each do |key, value|
135
+ case value
136
+ when String
137
+ inputs << content_tag(:input, "", type: :hidden, name: key, value: value)
138
+ when Hash
139
+ value.each do |subitem|
140
+ inputs << content_tag(:input, "", type: :hidden, name: "#{key}[#{subitem[0]}]", value: subitem[1])
141
+ end
142
+ end
143
+ end
144
+
145
+ inputs
146
+ end
147
+
148
+ # Creates a form tag for filtered instances. See [FilteredFormBuilder] for
149
+ # the helper methods
150
+ #
151
+ # @param [Filtered] filtered_instance
152
+ # @see FilteredFormBuilder
153
+ def filtered_form_with(filtered_instance, options = {}, &block)
154
+ options[:method] = :get
155
+ options[:builder] = FilteredFormBuilder
156
+ options[:filtered] = filtered_instance
157
+
158
+ form_with options, &block
159
+ end
160
+
161
+ # Renders a Tailwind paginated pagination section for a filtered instance.
162
+ # Uses kaminari's paginate
163
+ #
164
+ # @param [Filtered] filtered_instance
165
+ def filtered_paginate(filtered_instance)
166
+ paginate filtered_instance.items, filtered: filtered_instance
167
+ end
168
+ end
169
+ end
170
+
171
+ Kaminari.configure do |config|
172
+ config.default_per_page = 10
173
+ config.max_per_page = 50
174
+ config.window = 1
175
+ config.outer_window = 1
176
+ # config.left = 0
177
+ # config.right = 0
178
+ # config.page_method_name = :page
179
+ # config.param_name = :page
180
+ # config.max_pages = nil
181
+ # config.params_on_first_page = false
182
+ end
metadata ADDED
@@ -0,0 +1,294 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: sn_filterable
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.1
5
+ platform: ruby
6
+ authors:
7
+ - Chase McDougall
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2022-12-29 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: heroicon
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1'
27
+ - !ruby/object:Gem::Dependency
28
+ name: kaminari
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '1'
41
+ - !ruby/object:Gem::Dependency
42
+ name: pg
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '1'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '1'
55
+ - !ruby/object:Gem::Dependency
56
+ name: pg_search
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '2'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '2'
69
+ - !ruby/object:Gem::Dependency
70
+ name: tailwindcss-rails
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '2'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '2'
83
+ - !ruby/object:Gem::Dependency
84
+ name: turbo-rails
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '1'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '1'
97
+ - !ruby/object:Gem::Dependency
98
+ name: view_component
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '2'
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '2'
111
+ - !ruby/object:Gem::Dependency
112
+ name: factory_bot_rails
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: '6'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: '6'
125
+ - !ruby/object:Gem::Dependency
126
+ name: faker
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - "~>"
130
+ - !ruby/object:Gem::Version
131
+ version: '3'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - "~>"
137
+ - !ruby/object:Gem::Version
138
+ version: '3'
139
+ - !ruby/object:Gem::Dependency
140
+ name: rake
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - "~>"
144
+ - !ruby/object:Gem::Version
145
+ version: '13'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - "~>"
151
+ - !ruby/object:Gem::Version
152
+ version: '13'
153
+ - !ruby/object:Gem::Dependency
154
+ name: rspec-rails
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - "~>"
158
+ - !ruby/object:Gem::Version
159
+ version: '6'
160
+ type: :development
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - "~>"
165
+ - !ruby/object:Gem::Version
166
+ version: '6'
167
+ - !ruby/object:Gem::Dependency
168
+ name: rubocop-performance
169
+ requirement: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - "~>"
172
+ - !ruby/object:Gem::Version
173
+ version: '1'
174
+ type: :development
175
+ prerelease: false
176
+ version_requirements: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - "~>"
179
+ - !ruby/object:Gem::Version
180
+ version: '1'
181
+ - !ruby/object:Gem::Dependency
182
+ name: rubocop-github
183
+ requirement: !ruby/object:Gem::Requirement
184
+ requirements:
185
+ - - "~>"
186
+ - !ruby/object:Gem::Version
187
+ version: '0'
188
+ type: :development
189
+ prerelease: false
190
+ version_requirements: !ruby/object:Gem::Requirement
191
+ requirements:
192
+ - - "~>"
193
+ - !ruby/object:Gem::Version
194
+ version: '0'
195
+ - !ruby/object:Gem::Dependency
196
+ name: rubocop-rails
197
+ requirement: !ruby/object:Gem::Requirement
198
+ requirements:
199
+ - - "~>"
200
+ - !ruby/object:Gem::Version
201
+ version: '2'
202
+ type: :development
203
+ prerelease: false
204
+ version_requirements: !ruby/object:Gem::Requirement
205
+ requirements:
206
+ - - "~>"
207
+ - !ruby/object:Gem::Version
208
+ version: '2'
209
+ - !ruby/object:Gem::Dependency
210
+ name: rubocop-rspec
211
+ requirement: !ruby/object:Gem::Requirement
212
+ requirements:
213
+ - - "~>"
214
+ - !ruby/object:Gem::Version
215
+ version: '2'
216
+ type: :development
217
+ prerelease: false
218
+ version_requirements: !ruby/object:Gem::Requirement
219
+ requirements:
220
+ - - "~>"
221
+ - !ruby/object:Gem::Version
222
+ version: '2'
223
+ - !ruby/object:Gem::Dependency
224
+ name: with_model
225
+ requirement: !ruby/object:Gem::Requirement
226
+ requirements:
227
+ - - "~>"
228
+ - !ruby/object:Gem::Version
229
+ version: '2'
230
+ type: :development
231
+ prerelease: false
232
+ version_requirements: !ruby/object:Gem::Requirement
233
+ requirements:
234
+ - - "~>"
235
+ - !ruby/object:Gem::Version
236
+ version: '2'
237
+ description: This gem adds a ViewComponent powered filtering component for searching
238
+ and filtering your PostgreSQL data.
239
+ email:
240
+ - chasemcdougall@hotmail.com
241
+ executables: []
242
+ extensions: []
243
+ extra_rdoc_files: []
244
+ files:
245
+ - README.md
246
+ - Rakefile
247
+ - app/assets/javascripts/sn_filtering.js
248
+ - app/components/sn_filterable/base_components/base_component.rb
249
+ - app/components/sn_filterable/base_components/button_component.rb
250
+ - app/components/sn_filterable/category_component.html.erb
251
+ - app/components/sn_filterable/category_component.rb
252
+ - app/components/sn_filterable/chips_component.html.erb
253
+ - app/components/sn_filterable/chips_component.rb
254
+ - app/components/sn_filterable/filter_button_component.html.erb
255
+ - app/components/sn_filterable/filter_button_component.rb
256
+ - app/components/sn_filterable/filter_category_component.html.erb
257
+ - app/components/sn_filterable/filter_category_component.rb
258
+ - app/components/sn_filterable/main_component.html.erb
259
+ - app/components/sn_filterable/main_component.rb
260
+ - app/components/sn_filterable/search_component.html.erb
261
+ - app/components/sn_filterable/search_component.rb
262
+ - lib/models/filtered.rb
263
+ - lib/sn_filterable.rb
264
+ - lib/sn_filterable/engine.rb
265
+ - lib/sn_filterable/filterable.rb
266
+ - lib/sn_filterable/railtie.rb
267
+ - lib/sn_filterable/version.rb
268
+ homepage: https://github.com/ibm-skills-network/sn_filterable
269
+ licenses:
270
+ - MIT
271
+ metadata:
272
+ homepage_uri: https://github.com/ibm-skills-network/sn_filterable
273
+ source_code_uri: https://github.com/ibm-skills-network/sn_filterable
274
+ changelog_uri: https://github.com/ibm-skills-network/sn_filterable/releases
275
+ post_install_message:
276
+ rdoc_options: []
277
+ require_paths:
278
+ - lib
279
+ required_ruby_version: !ruby/object:Gem::Requirement
280
+ requirements:
281
+ - - ">="
282
+ - !ruby/object:Gem::Version
283
+ version: 2.7.0
284
+ required_rubygems_version: !ruby/object:Gem::Requirement
285
+ requirements:
286
+ - - ">="
287
+ - !ruby/object:Gem::Version
288
+ version: '0'
289
+ requirements: []
290
+ rubygems_version: 3.4.1
291
+ signing_key:
292
+ specification_version: 4
293
+ summary: Skills Network - Item filtering component
294
+ test_files: []