shimmer 0.0.20 → 0.0.21
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/lib/shimmer/form/builder.rb +88 -0
- data/lib/shimmer/form/checkboxes_field.rb +13 -0
- data/lib/shimmer/form/date_field.rb +13 -0
- data/lib/shimmer/form/email_field.rb +19 -0
- data/lib/shimmer/form/field.rb +26 -0
- data/lib/shimmer/form/number_field.rb +13 -0
- data/lib/shimmer/form/password_field.rb +19 -0
- data/lib/shimmer/form/pdf_field.rb +19 -0
- data/lib/shimmer/form/radio_field.rb +13 -0
- data/lib/shimmer/form/select_field.rb +19 -0
- data/lib/shimmer/form/text_area_field.rb +13 -0
- data/lib/shimmer/form/text_field.rb +13 -0
- data/lib/shimmer/form/time_field.rb +13 -0
- data/lib/shimmer/form.rb +16 -0
- data/lib/shimmer/version.rb +1 -1
- data/lib/shimmer.rb +1 -0
- metadata +16 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 89571a33faa2d1fd1d8c9624ab42a51f019418efc9c91af68fb3bb0385b5f602
|
|
4
|
+
data.tar.gz: 814bca1dbd13b0e147df173b1b41077c0c585f4bd5b8e1b9e6933051d597f231
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 6d1c9bfa6f442914ca03747cf391ebf52086cb2c92d334641715031539cef826f09e171d3510e20866780ed87a1829182872485f6cd143c833ddebab97e1abf8
|
|
7
|
+
data.tar.gz: 5db21bb6096a9a4a555b17c05d2ba128379f049ed87bae1e9fd9cddf824a05214c9858d8760924ea948d11645f9052b3d503167a098ece2ba97fb5ca498db754
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Shimmer
|
|
4
|
+
module Form
|
|
5
|
+
class Builder < ActionView::Helpers::FormBuilder
|
|
6
|
+
class << self
|
|
7
|
+
def input_registry
|
|
8
|
+
@input_registry ||= {}
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def register(klass)
|
|
12
|
+
input_registry[klass.type] = klass
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def input(method, as: guess_type(method), **options)
|
|
17
|
+
as ||= guess_type(method)
|
|
18
|
+
options[:class] ||= "input__input"
|
|
19
|
+
collection = options.delete :collection
|
|
20
|
+
collection_based = !collection.nil? || as == :select
|
|
21
|
+
collection ||= guess_collection(method) if collection_based
|
|
22
|
+
name_method ||= guess_name_method(method) if collection_based
|
|
23
|
+
id_method ||= :id if collection_based
|
|
24
|
+
classes = []
|
|
25
|
+
options[:required] ||= true if options[:required].nil? && required_attributes.include?(method)
|
|
26
|
+
options[:data] ||= {}
|
|
27
|
+
options[:data][:controller] = options.delete(:controller) if options[:controller]
|
|
28
|
+
wrapper_data = {}
|
|
29
|
+
extra = []
|
|
30
|
+
input_class = self.class.input_registry[as]
|
|
31
|
+
raise "Unknown type #{as}" unless input_class
|
|
32
|
+
input = input_class.new(builder: self, method: method, options: options, id_method: id_method, collection: collection, name_method: name_method)
|
|
33
|
+
wrap method: method, content: input.render, classes: classes + ["input--#{as}"], label: options[:label], data: wrapper_data, extra: extra
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
private
|
|
37
|
+
|
|
38
|
+
def required_attributes
|
|
39
|
+
[]
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def guess_type(method)
|
|
43
|
+
self.class.input_registry.values.find { |e| e.can_handle?(method) }&.type || :string
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def guess_collection(method)
|
|
47
|
+
association_for(method)&.klass&.all || enum_for(method).map { |e| OpenStruct.new(id: e, name: e) } || []
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def guess_name_method(method)
|
|
51
|
+
klass = association_for(method)&.klass
|
|
52
|
+
return :name unless klass
|
|
53
|
+
|
|
54
|
+
[:display_name, :name, :title].each do |key|
|
|
55
|
+
return key if klass.instance_methods.include?(key)
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def association_for(method)
|
|
60
|
+
collection_method = method.to_s.delete_suffix("_id")
|
|
61
|
+
object.class.reflect_on_association(collection_method) if object.respond_to?(collection_method)
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def enum_for(method)
|
|
65
|
+
object.class.types.keys if object.class.respond_to?(method.to_s.pluralize)
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def wrap(method:, content:, classes:, label:, data: nil, extra: nil)
|
|
69
|
+
if object&.errors&.[](method)&.any?
|
|
70
|
+
classes << "input--error"
|
|
71
|
+
errors = safe_join(object.errors[method].map { |e| content_tag :div, e, class: "input__error" })
|
|
72
|
+
end
|
|
73
|
+
label = label == false ? nil : self.label(method, label, class: "input__label")
|
|
74
|
+
content_tag(:div, safe_join([label, content, errors, extra].compact), class: ["input"] + classes, data: data)
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def helper
|
|
78
|
+
@template
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
def value_for(method)
|
|
82
|
+
object.public_send(method)
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
delegate :content_tag, :t, :safe_join, :icon, :tag, to: :helper
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Shimmer
|
|
4
|
+
module Form
|
|
5
|
+
class EmailField < Field
|
|
6
|
+
self.type = :email
|
|
7
|
+
|
|
8
|
+
class << self
|
|
9
|
+
def can_handle?(method)
|
|
10
|
+
method.to_s.end_with?("email")
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def render
|
|
15
|
+
builder.email_field method, options
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Shimmer
|
|
4
|
+
module Form
|
|
5
|
+
class Field
|
|
6
|
+
class_attribute :type
|
|
7
|
+
|
|
8
|
+
attr_reader :builder, :method, :collection, :id_method, :name_method, :options
|
|
9
|
+
|
|
10
|
+
class << self
|
|
11
|
+
def can_handle?(method)
|
|
12
|
+
false
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def initialize(builder:, method:, collection:, id_method:, name_method:, options: {})
|
|
17
|
+
@builder = builder
|
|
18
|
+
@method = method
|
|
19
|
+
@collection = collection
|
|
20
|
+
@id_method = id_method
|
|
21
|
+
@name_method = name_method
|
|
22
|
+
@options = options
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Shimmer
|
|
4
|
+
module Form
|
|
5
|
+
class PasswordField < Field
|
|
6
|
+
self.type = :password
|
|
7
|
+
|
|
8
|
+
class << self
|
|
9
|
+
def can_handle?(method)
|
|
10
|
+
method.to_s.end_with?("password")
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def render
|
|
15
|
+
builder.password_field method, options
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Shimmer
|
|
4
|
+
module Form
|
|
5
|
+
class PdfField < Field
|
|
6
|
+
self.type = :pdf
|
|
7
|
+
|
|
8
|
+
class << self
|
|
9
|
+
def can_handle?(method)
|
|
10
|
+
method.to_s.end_with?("pdf")
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def render
|
|
15
|
+
builder.file_field method, options.reverse_merge(accept: "application/pdf")
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Shimmer
|
|
4
|
+
module Form
|
|
5
|
+
class SelectField < Field
|
|
6
|
+
self.type = :select
|
|
7
|
+
|
|
8
|
+
class << self
|
|
9
|
+
def can_handle?(method)
|
|
10
|
+
method.to_s.end_with?("_id")
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def render
|
|
15
|
+
builder.collection_select method, collection, id_method, name_method, {}, options
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
data/lib/shimmer/form.rb
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Shimmer
|
|
4
|
+
module Form
|
|
5
|
+
end
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
require_relative "./form/builder"
|
|
9
|
+
require_relative "./form/field"
|
|
10
|
+
|
|
11
|
+
Dir["#{File.expand_path("./form", __dir__)}/*"].sort.each do |e|
|
|
12
|
+
require e
|
|
13
|
+
name = e.split("/").last.delete_suffix(".rb")
|
|
14
|
+
next unless name.end_with?("_field")
|
|
15
|
+
Shimmer::Form::Builder.register("Shimmer::Form::#{name.classify}".constantize)
|
|
16
|
+
end
|
data/lib/shimmer/version.rb
CHANGED
data/lib/shimmer.rb
CHANGED
|
@@ -7,6 +7,7 @@ Dir["#{File.expand_path("../lib/shimmer/controllers", __dir__)}/*"].sort.each {
|
|
|
7
7
|
Dir["#{File.expand_path("../lib/shimmer/jobs", __dir__)}/*"].sort.each { |e| require e }
|
|
8
8
|
Dir["#{File.expand_path("../lib/shimmer/utils", __dir__)}/*"].sort.each { |e| require e }
|
|
9
9
|
require_relative "shimmer/auth"
|
|
10
|
+
require_relative "shimmer/form"
|
|
10
11
|
|
|
11
12
|
module Shimmer
|
|
12
13
|
class Error < StandardError; end
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: shimmer
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.0.
|
|
4
|
+
version: 0.0.21
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Jens Ravens
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: exe
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2022-
|
|
11
|
+
date: 2022-08-08 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: rake
|
|
@@ -145,6 +145,20 @@ files:
|
|
|
145
145
|
- lib/shimmer/auth/user.rb
|
|
146
146
|
- lib/shimmer/controllers/files_controller.rb
|
|
147
147
|
- lib/shimmer/controllers/sitemaps_controller.rb
|
|
148
|
+
- lib/shimmer/form.rb
|
|
149
|
+
- lib/shimmer/form/builder.rb
|
|
150
|
+
- lib/shimmer/form/checkboxes_field.rb
|
|
151
|
+
- lib/shimmer/form/date_field.rb
|
|
152
|
+
- lib/shimmer/form/email_field.rb
|
|
153
|
+
- lib/shimmer/form/field.rb
|
|
154
|
+
- lib/shimmer/form/number_field.rb
|
|
155
|
+
- lib/shimmer/form/password_field.rb
|
|
156
|
+
- lib/shimmer/form/pdf_field.rb
|
|
157
|
+
- lib/shimmer/form/radio_field.rb
|
|
158
|
+
- lib/shimmer/form/select_field.rb
|
|
159
|
+
- lib/shimmer/form/text_area_field.rb
|
|
160
|
+
- lib/shimmer/form/text_field.rb
|
|
161
|
+
- lib/shimmer/form/time_field.rb
|
|
148
162
|
- lib/shimmer/helpers/meta_helper.rb
|
|
149
163
|
- lib/shimmer/jobs/sitemap_job.rb
|
|
150
164
|
- lib/shimmer/middlewares/cloudflare.rb
|