sn_filterable 0.1.1
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/README.md +199 -0
- data/Rakefile +12 -0
- data/app/assets/javascripts/sn_filtering.js +63 -0
- data/app/components/sn_filterable/base_components/base_component.rb +26 -0
- data/app/components/sn_filterable/base_components/button_component.rb +71 -0
- data/app/components/sn_filterable/category_component.html.erb +11 -0
- data/app/components/sn_filterable/category_component.rb +18 -0
- data/app/components/sn_filterable/chips_component.html.erb +37 -0
- data/app/components/sn_filterable/chips_component.rb +78 -0
- data/app/components/sn_filterable/filter_button_component.html.erb +1 -0
- data/app/components/sn_filterable/filter_button_component.rb +29 -0
- data/app/components/sn_filterable/filter_category_component.html.erb +32 -0
- data/app/components/sn_filterable/filter_category_component.rb +30 -0
- data/app/components/sn_filterable/main_component.html.erb +97 -0
- data/app/components/sn_filterable/main_component.rb +39 -0
- data/app/components/sn_filterable/search_component.html.erb +16 -0
- data/app/components/sn_filterable/search_component.rb +13 -0
- data/lib/models/filtered.rb +171 -0
- data/lib/sn_filterable/engine.rb +10 -0
- data/lib/sn_filterable/filterable.rb +292 -0
- data/lib/sn_filterable/railtie.rb +11 -0
- data/lib/sn_filterable/version.rb +5 -0
- data/lib/sn_filterable.rb +182 -0
- metadata +294 -0
@@ -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: []
|