lifeform 0.1.0 → 0.2.0
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/CHANGELOG.md +5 -0
- data/Gemfile.lock +4 -1
- data/README.md +38 -1
- data/lib/lifeform/form.rb +11 -2
- data/lib/lifeform/libraries/default/input.rb +15 -7
- data/lib/lifeform/libraries/default.rb +3 -0
- data/lib/lifeform/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c1a951565aa5729c703d08032dc10a135d57f39be110ea7a77f1daea226ea7b5
|
4
|
+
data.tar.gz: b6411dc03979e7e69b30c51f99861565323ec39a7687148a3b4705a5ef4040f9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fb6e4f3177e0cc95c89ed7fe898ce977abbdfd755e53e6706edaf3c362508b56944f779f49bb0f82f4ce3f4f79817e4056352e15c2fbe7382defee52b2568037
|
7
|
+
data.tar.gz: 2fd2aa7715782c21847cbaa5fac8ac6e692711a944ad6fe627c2df378380677d5ddd6b62429c7f073103a8750d5af7093ef2b6664b490f8f67d6594ecc1e82d6
|
data/CHANGELOG.md
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
lifeform (0.
|
4
|
+
lifeform (0.2.0)
|
5
5
|
activesupport (>= 6.0)
|
6
6
|
papercraft (~> 0.24)
|
7
7
|
zeitwerk (~> 2.5)
|
@@ -31,6 +31,8 @@ GEM
|
|
31
31
|
minitest (5.15.0)
|
32
32
|
nokogiri (1.13.6-arm64-darwin)
|
33
33
|
racc (~> 1.4)
|
34
|
+
nokogiri (1.13.6-x86_64-linux)
|
35
|
+
racc (~> 1.4)
|
34
36
|
papercraft (0.24)
|
35
37
|
escape_utils (~> 1.2.1)
|
36
38
|
kramdown (~> 2.3.1)
|
@@ -93,6 +95,7 @@ GEM
|
|
93
95
|
|
94
96
|
PLATFORMS
|
95
97
|
arm64-darwin-21
|
98
|
+
x86_64-linux
|
96
99
|
|
97
100
|
DEPENDENCIES
|
98
101
|
lifeform!
|
data/README.md
CHANGED
@@ -12,7 +12,44 @@ $ bundle add lifeform
|
|
12
12
|
|
13
13
|
## Usage
|
14
14
|
|
15
|
-
|
15
|
+
Full documentation coming as the library begins to mature. TL;DR:
|
16
|
+
|
17
|
+
Given a form object of:
|
18
|
+
|
19
|
+
```rb
|
20
|
+
class TestForm < Lifeform::Form
|
21
|
+
field :occupation, label: "Your Job", id: "your-occupation", required: true
|
22
|
+
field :age, library: :shoelace, label: "Your Age"
|
23
|
+
end
|
24
|
+
```
|
25
|
+
|
26
|
+
And a template rendering of:
|
27
|
+
|
28
|
+
```erb
|
29
|
+
<%= render TestForm.new(url: "/path") do %>
|
30
|
+
<%= render f.field(:occupation) %>
|
31
|
+
<%= render f.field(:age, value: 47) %>
|
32
|
+
<% end %>
|
33
|
+
```
|
34
|
+
|
35
|
+
You get the following HTML output:
|
36
|
+
|
37
|
+
```html
|
38
|
+
<form method="post" accept-charset="UTF-8" action="/path">
|
39
|
+
<input type="hidden" name="authenticity_token" value="[token]" />
|
40
|
+
<form-field name="occupation">
|
41
|
+
<label for="your-occupation">Your Job</label>
|
42
|
+
<input type="text" id="your-occupation" required name="occupation" />
|
43
|
+
</form-field>
|
44
|
+
<form-field name="age">
|
45
|
+
<sl-input type="text" label="Your Age" name="age" value="47" id="age"></sl-input>
|
46
|
+
</form-field>
|
47
|
+
</form>
|
48
|
+
```
|
49
|
+
|
50
|
+
Nested names based on models (aka `profile[name]`) and inferred action paths are supported as well.
|
51
|
+
|
52
|
+
Multiple component libraries and input types—and easy customizability via [Papercraft](https://github.com/digital-fabric/papercraft) templates—are a fundamental aspect of the architecture of Lifeform.
|
16
53
|
|
17
54
|
## Development
|
18
55
|
|
data/lib/lifeform/form.rb
CHANGED
@@ -10,6 +10,11 @@ module Lifeform
|
|
10
10
|
MODEL_PATH_HELPER = :polymorphic_path
|
11
11
|
|
12
12
|
class << self
|
13
|
+
def inherited(subclass)
|
14
|
+
super
|
15
|
+
subclass.library library
|
16
|
+
end
|
17
|
+
|
13
18
|
# Helper to point to `I18n.t` method
|
14
19
|
def t(...)
|
15
20
|
I18n.t(...)
|
@@ -26,7 +31,8 @@ module Lifeform
|
|
26
31
|
end
|
27
32
|
|
28
33
|
def library(library_name = nil)
|
29
|
-
@library
|
34
|
+
@library = library_name if library_name
|
35
|
+
@library ||= :default
|
30
36
|
end
|
31
37
|
|
32
38
|
def escape_value(value)
|
@@ -112,8 +118,11 @@ module Lifeform
|
|
112
118
|
end
|
113
119
|
|
114
120
|
def field(name, **field_parameters)
|
121
|
+
# @type [FieldDefinition]
|
115
122
|
field_definition = self.class.fields[name]
|
116
|
-
|
123
|
+
# @type [Class<Libraries::Default>]
|
124
|
+
field_library = field_definition.library
|
125
|
+
field_library.object_for_field_definition(
|
117
126
|
self, field_definition, self.class.parameters_to_attributes(field_parameters)
|
118
127
|
)
|
119
128
|
end
|
@@ -22,6 +22,7 @@ module Lifeform
|
|
22
22
|
@model = attributes.delete(:model)
|
23
23
|
@model = form.model if form.model && @model.nil?
|
24
24
|
|
25
|
+
@if = attributes.delete(:if)
|
25
26
|
attributes[:value] ||= value_for_model if form.model
|
26
27
|
attributes[:name] = "#{model_name}[#{attributes[:name]}]" if @model
|
27
28
|
attributes[:id] ||= attributes[:name].parameterize(separator: "_")
|
@@ -50,16 +51,20 @@ module Lifeform
|
|
50
51
|
end
|
51
52
|
end
|
52
53
|
|
53
|
-
def render_in(view_context)
|
54
|
+
def render_in(view_context, &block)
|
54
55
|
@view_context = view_context
|
56
|
+
@content = block
|
57
|
+
return "" if !@if.nil? && !@if
|
58
|
+
|
55
59
|
template
|
56
60
|
end
|
57
61
|
|
58
|
-
def template
|
59
|
-
Papercraft.html do |wrapper_tag:, input_tag:, attributes:,
|
62
|
+
def template # rubocop:disable Metrics/AbcSize
|
63
|
+
Papercraft.html do |wrapper_tag:, input_tag:, attributes:, field_data:|
|
60
64
|
field_body = proc {
|
61
|
-
emit(
|
62
|
-
send input_tag, type:
|
65
|
+
emit(field_data[:label]) if field_data[:label]
|
66
|
+
send input_tag, type: field_data[:type], **attributes
|
67
|
+
emit(field_data[:content]) if field_data[:content]
|
63
68
|
}
|
64
69
|
next field_body.call unless wrapper_tag
|
65
70
|
|
@@ -68,8 +73,11 @@ module Lifeform
|
|
68
73
|
wrapper_tag: self.class.const_get(:WRAPPER_TAG),
|
69
74
|
input_tag: self.class.const_get(:INPUT_TAG),
|
70
75
|
attributes: attributes,
|
71
|
-
|
72
|
-
|
76
|
+
field_data: {
|
77
|
+
type: @field_type,
|
78
|
+
label: @label,
|
79
|
+
content: @content && @view_context.capture(&@content)
|
80
|
+
}
|
73
81
|
)
|
74
82
|
end
|
75
83
|
end
|
@@ -5,6 +5,9 @@ module Lifeform
|
|
5
5
|
class Default
|
6
6
|
FORM_TAG = :form
|
7
7
|
|
8
|
+
# @param form [LifeForm::Form]
|
9
|
+
# @param field_definition [LifeForm::FieldDefinition]
|
10
|
+
# @param attributes [Hash]
|
8
11
|
# @return [Input]
|
9
12
|
def self.object_for_field_definition(form, field_definition, attributes)
|
10
13
|
type_classname = field_definition[:type].to_s.classify
|
data/lib/lifeform/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: lifeform
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Bridgetown Team
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-05-
|
11
|
+
date: 2022-05-31 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|