shimmer 0.0.20 → 0.0.21

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d8819816445402b9ba5fc3a8ffcd9e273f85b34018cd29d0e0c99b5a338e6c37
4
- data.tar.gz: 91786fdab270afb2c5cd89c3874284dd1701263eacbd309043ba35b87ae49ad5
3
+ metadata.gz: 89571a33faa2d1fd1d8c9624ab42a51f019418efc9c91af68fb3bb0385b5f602
4
+ data.tar.gz: 814bca1dbd13b0e147df173b1b41077c0c585f4bd5b8e1b9e6933051d597f231
5
5
  SHA512:
6
- metadata.gz: 0f0abe61b9c8a001df68bfd019cee02d5de58c2c582ab58ed0f6899dcad78409f9136e62cd5892be9dc5167708f19b04df66afbdaccf0f925e5b986f1e9de97b
7
- data.tar.gz: 2f8031509918cd09d64dd87158b9b119fc90f3e594c2fbdc068898bdffe29b5687cb7f6161af7d7d98061fe17ad72747388c8a01e2c381f082801d02ace39193
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,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Shimmer
4
+ module Form
5
+ class CheckboxesField < Field
6
+ self.type = :checkboxes
7
+
8
+ def render
9
+ builder.collection_check_boxes method, collection, id_method, name_method, {}, options
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Shimmer
4
+ module Form
5
+ class DateField < Field
6
+ self.type = :date
7
+
8
+ def render
9
+ builder.date_field method, options
10
+ end
11
+ end
12
+ end
13
+ 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,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Shimmer
4
+ module Form
5
+ class NumberField < Field
6
+ self.type = :number
7
+
8
+ def render
9
+ builder.number_field method, options
10
+ end
11
+ end
12
+ end
13
+ 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,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Shimmer
4
+ module Form
5
+ class RadioField < Field
6
+ self.type = :radio
7
+
8
+ def render
9
+ builder.collection_radio_buttons method, collection, id_method, name_method, {}, options
10
+ end
11
+ end
12
+ end
13
+ 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
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Shimmer
4
+ module Form
5
+ class TextAreaField < Field
6
+ self.type = :text
7
+
8
+ def render
9
+ builder.text_area method, options
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Shimmer
4
+ module Form
5
+ class TextField < Field
6
+ self.type = :string
7
+
8
+ def render
9
+ builder.text_field method, options
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Shimmer
4
+ module Form
5
+ class TimeField < Field
6
+ self.type = :time
7
+
8
+ def render
9
+ builder.time_field method, options.reverse_merge(value: object.public_send(method))
10
+ end
11
+ end
12
+ end
13
+ end
@@ -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
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Shimmer
4
- VERSION = "0.0.20"
4
+ VERSION = "0.0.21"
5
5
  end
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.20
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-07-20 00:00:00.000000000 Z
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