compony 0.0.4 → 0.0.6
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 +26 -0
- data/compony.gemspec +4 -4
- data/lib/compony/component.rb +3 -1
- data/lib/compony/components/destroy.rb +9 -2
- data/lib/compony/components/edit.rb +9 -2
- data/lib/compony/components/form.rb +6 -1
- data/lib/compony/components/new.rb +13 -6
- data/lib/compony/model_fields/anchormodel.rb +20 -4
- data/lib/compony/model_fields/association.rb +6 -2
- data/lib/compony/model_fields/attachment.rb +2 -2
- data/lib/compony/model_fields/base.rb +9 -3
- data/lib/compony/model_fields/boolean.rb +1 -1
- data/lib/compony/model_fields/email.rb +2 -1
- data/lib/compony/model_fields/rich_text.rb +2 -2
- data/lib/compony/model_fields/url.rb +13 -0
- data/lib/compony/model_mixin.rb +12 -0
- data/lib/compony/version.rb +1 -1
- data/lib/compony.rb +1 -0
- data/lib/generators/component/component_generator.rb +13 -2
- data/lib/generators/component/templates/component.rb.erb +1 -1
- data/lib/generators/component/templates/destroy.rb.erb +2 -0
- data/lib/generators/component/templates/edit.rb.erb +2 -0
- data/lib/generators/component/templates/form.rb.erb +8 -0
- data/lib/generators/component/templates/new.rb.erb +2 -0
- data/lib/generators/components/USAGE +8 -0
- data/lib/generators/components/components_generator.rb +12 -0
- metadata +9 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: ffb648bd48df260288580ceae282773587e7137ecfec89c4623edf001e6e21b6
|
|
4
|
+
data.tar.gz: eb4f6db5431d5a783bf4140f398af1497536e896c00c61b325fb3c9b76d6a9f9
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: e1c67fc5e79e5c6aa6f3059044d4d21be882e829e67426528ad10f0291347a961c934a8ef914849bedabd1cb175bb206e9f896d483427e5097a9c6dcd6ce3c8e
|
|
7
|
+
data.tar.gz: 6b270d52f19654332dc22a43795a00c691e189d57015826e6bcdfb1dc7e637e0ba8aca5060dc7be1663e606ce86b9f70d93866297b22d2a4236b5556bd8092da
|
data/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,29 @@
|
|
|
1
|
+
# 0.0.6
|
|
2
|
+
|
|
3
|
+
- Fix a bug that breaks hidden fields of type reference
|
|
4
|
+
- Add dynamic method "field" to model mixin
|
|
5
|
+
- Tolerate and skip actions that do not define buttons, allows for dynamic action skipping
|
|
6
|
+
- Fix `value_for` for boolean fields when they are nil
|
|
7
|
+
- BREAKING: Rename `on_created` to `on_created_respond`, `on_updated` to `on_updated_respond`, and `on_destroyed` to `on_destroyed_respond`
|
|
8
|
+
- New hooks `on_created`, `on_updated`, and `on_destroyed` are called before their `_respond` counterpart
|
|
9
|
+
- Fix a bug in Attachment Field
|
|
10
|
+
- Support overriding simpleform name by providing `name:` as an argument to field.simpleform_input
|
|
11
|
+
- In ModelField Anchormodel, tolerate "value" as input_html key and infer correct constant, allow form.object to be missing
|
|
12
|
+
|
|
13
|
+
# 0.0.5
|
|
14
|
+
|
|
15
|
+
- Fix row bug for Email field type
|
|
16
|
+
- Auto-focus first non-hidden element in forms
|
|
17
|
+
- Add field type :url
|
|
18
|
+
- Automatically set the correct class when generating known components
|
|
19
|
+
- Add generator `components` that is able to mass-produce the most used components
|
|
20
|
+
- Make fields point to the correct `model_class` in case of STI
|
|
21
|
+
- Support hidden Anchormodel fields
|
|
22
|
+
|
|
23
|
+
## KNOWN BUGS
|
|
24
|
+
|
|
25
|
+
- Breaks hidden fields of type reference
|
|
26
|
+
|
|
1
27
|
# 0.0.4
|
|
2
28
|
|
|
3
29
|
- Unscope the namespace of resourceful components
|
data/compony.gemspec
CHANGED
|
@@ -2,17 +2,17 @@
|
|
|
2
2
|
# This file is auto-generated via: 'rake gemspec'.
|
|
3
3
|
|
|
4
4
|
# -*- encoding: utf-8 -*-
|
|
5
|
-
# stub: compony 0.0.
|
|
5
|
+
# stub: compony 0.0.6 ruby lib
|
|
6
6
|
|
|
7
7
|
Gem::Specification.new do |s|
|
|
8
8
|
s.name = "compony".freeze
|
|
9
|
-
s.version = "0.0.
|
|
9
|
+
s.version = "0.0.6"
|
|
10
10
|
|
|
11
11
|
s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
|
|
12
12
|
s.require_paths = ["lib".freeze]
|
|
13
13
|
s.authors = ["Sandro Kalbermatter".freeze, "contributors".freeze]
|
|
14
|
-
s.date = "2023-
|
|
15
|
-
s.files = [".gitignore".freeze, ".ruby-version".freeze, ".yardopts".freeze, "CHANGELOG.md".freeze, "Gemfile".freeze, "Gemfile.lock".freeze, "LICENSE".freeze, "README.md".freeze, "Rakefile".freeze, "app/controllers/compony_controller.rb".freeze, "compony.gemspec".freeze, "config/locales/de.yml".freeze, "config/locales/en.yml".freeze, "config/routes.rb".freeze, "doc/resourceful_lifecycle.graphml".freeze, "doc/resourceful_lifecycle.pdf".freeze, "lib/compony.rb".freeze, "lib/compony/component.rb".freeze, "lib/compony/component_mixins/default/labelling.rb".freeze, "lib/compony/component_mixins/default/standalone.rb".freeze, "lib/compony/component_mixins/default/standalone/resourceful_verb_dsl.rb".freeze, "lib/compony/component_mixins/default/standalone/standalone_dsl.rb".freeze, "lib/compony/component_mixins/default/standalone/verb_dsl.rb".freeze, "lib/compony/component_mixins/resourceful.rb".freeze, "lib/compony/components/button.rb".freeze, "lib/compony/components/destroy.rb".freeze, "lib/compony/components/edit.rb".freeze, "lib/compony/components/form.rb".freeze, "lib/compony/components/new.rb".freeze, "lib/compony/components/with_form.rb".freeze, "lib/compony/controller_mixin.rb".freeze, "lib/compony/engine.rb".freeze, "lib/compony/method_accessible_hash.rb".freeze, "lib/compony/model_fields/anchormodel.rb".freeze, "lib/compony/model_fields/association.rb".freeze, "lib/compony/model_fields/attachment.rb".freeze, "lib/compony/model_fields/base.rb".freeze, "lib/compony/model_fields/boolean.rb".freeze, "lib/compony/model_fields/currency.rb".freeze, "lib/compony/model_fields/date.rb".freeze, "lib/compony/model_fields/datetime.rb".freeze, "lib/compony/model_fields/decimal.rb".freeze, "lib/compony/model_fields/email.rb".freeze, "lib/compony/model_fields/float.rb".freeze, "lib/compony/model_fields/integer.rb".freeze, "lib/compony/model_fields/phone.rb".freeze, "lib/compony/model_fields/rich_text.rb".freeze, "lib/compony/model_fields/string.rb".freeze, "lib/compony/model_fields/text.rb".freeze, "lib/compony/model_fields/time.rb".freeze, "lib/compony/model_mixin.rb".freeze, "lib/compony/request_context.rb".freeze, "lib/compony/version.rb".freeze, "lib/compony/view_helpers.rb".freeze, "lib/generators/component/USAGE".freeze, "lib/generators/component/component_generator.rb".freeze, "lib/generators/component/templates/component.rb.erb".freeze]
|
|
14
|
+
s.date = "2023-08-08"
|
|
15
|
+
s.files = [".gitignore".freeze, ".ruby-version".freeze, ".yardopts".freeze, "CHANGELOG.md".freeze, "Gemfile".freeze, "Gemfile.lock".freeze, "LICENSE".freeze, "README.md".freeze, "Rakefile".freeze, "app/controllers/compony_controller.rb".freeze, "compony.gemspec".freeze, "config/locales/de.yml".freeze, "config/locales/en.yml".freeze, "config/routes.rb".freeze, "doc/resourceful_lifecycle.graphml".freeze, "doc/resourceful_lifecycle.pdf".freeze, "lib/compony.rb".freeze, "lib/compony/component.rb".freeze, "lib/compony/component_mixins/default/labelling.rb".freeze, "lib/compony/component_mixins/default/standalone.rb".freeze, "lib/compony/component_mixins/default/standalone/resourceful_verb_dsl.rb".freeze, "lib/compony/component_mixins/default/standalone/standalone_dsl.rb".freeze, "lib/compony/component_mixins/default/standalone/verb_dsl.rb".freeze, "lib/compony/component_mixins/resourceful.rb".freeze, "lib/compony/components/button.rb".freeze, "lib/compony/components/destroy.rb".freeze, "lib/compony/components/edit.rb".freeze, "lib/compony/components/form.rb".freeze, "lib/compony/components/new.rb".freeze, "lib/compony/components/with_form.rb".freeze, "lib/compony/controller_mixin.rb".freeze, "lib/compony/engine.rb".freeze, "lib/compony/method_accessible_hash.rb".freeze, "lib/compony/model_fields/anchormodel.rb".freeze, "lib/compony/model_fields/association.rb".freeze, "lib/compony/model_fields/attachment.rb".freeze, "lib/compony/model_fields/base.rb".freeze, "lib/compony/model_fields/boolean.rb".freeze, "lib/compony/model_fields/currency.rb".freeze, "lib/compony/model_fields/date.rb".freeze, "lib/compony/model_fields/datetime.rb".freeze, "lib/compony/model_fields/decimal.rb".freeze, "lib/compony/model_fields/email.rb".freeze, "lib/compony/model_fields/float.rb".freeze, "lib/compony/model_fields/integer.rb".freeze, "lib/compony/model_fields/phone.rb".freeze, "lib/compony/model_fields/rich_text.rb".freeze, "lib/compony/model_fields/string.rb".freeze, "lib/compony/model_fields/text.rb".freeze, "lib/compony/model_fields/time.rb".freeze, "lib/compony/model_fields/url.rb".freeze, "lib/compony/model_mixin.rb".freeze, "lib/compony/request_context.rb".freeze, "lib/compony/version.rb".freeze, "lib/compony/view_helpers.rb".freeze, "lib/generators/component/USAGE".freeze, "lib/generators/component/component_generator.rb".freeze, "lib/generators/component/templates/component.rb.erb".freeze, "lib/generators/component/templates/destroy.rb.erb".freeze, "lib/generators/component/templates/edit.rb.erb".freeze, "lib/generators/component/templates/form.rb.erb".freeze, "lib/generators/component/templates/new.rb.erb".freeze, "lib/generators/components/USAGE".freeze, "lib/generators/components/components_generator.rb".freeze]
|
|
16
16
|
s.required_ruby_version = Gem::Requirement.new(">= 3.0.0".freeze)
|
|
17
17
|
s.rubygems_version = "3.4.13".freeze
|
|
18
18
|
s.summary = "Needs summary".freeze
|
data/lib/compony/component.rb
CHANGED
|
@@ -206,7 +206,9 @@ module Compony
|
|
|
206
206
|
button_htmls = @actions.map do |action|
|
|
207
207
|
next if @skipped_actions.include?(action.name)
|
|
208
208
|
Compony.with_button_defaults(feasibility_action: action.name.to_sym) do
|
|
209
|
-
|
|
209
|
+
action_button = action.block.call
|
|
210
|
+
next unless action_button
|
|
211
|
+
h.content_tag(:div, action_button.render(controller), class: action_class)
|
|
210
212
|
end
|
|
211
213
|
end
|
|
212
214
|
next h.safe_join button_htmls
|
|
@@ -15,7 +15,8 @@ module Compony
|
|
|
15
15
|
authorize { can?(:destroy, @data) }
|
|
16
16
|
store_data # This enables the global store_data block defined below for this path and verb.
|
|
17
17
|
respond do
|
|
18
|
-
evaluate_with_backfire(&@on_destroyed_block)
|
|
18
|
+
evaluate_with_backfire(&@on_destroyed_block) if @on_destroyed_block
|
|
19
|
+
evaluate_with_backfire(&@on_destroyed_respond_block)
|
|
19
20
|
end
|
|
20
21
|
end
|
|
21
22
|
end
|
|
@@ -51,7 +52,7 @@ module Compony
|
|
|
51
52
|
@data.destroy!
|
|
52
53
|
end
|
|
53
54
|
|
|
54
|
-
|
|
55
|
+
on_destroyed_respond do
|
|
55
56
|
flash.notice = I18n.t('compony.components.destroy.data_was_destroyed', data_label: @data.label)
|
|
56
57
|
redirect_to evaluate_with_backfire(&@on_destroyed_redirect_path_block), status: :see_other # 303: force GET
|
|
57
58
|
end
|
|
@@ -62,10 +63,16 @@ module Compony
|
|
|
62
63
|
end
|
|
63
64
|
|
|
64
65
|
# DSL method
|
|
66
|
+
# Sets a block that is evaluated with backfire in the successful case after storing, but before responding.
|
|
65
67
|
def on_destroyed(&block)
|
|
66
68
|
@on_destroyed_block = block
|
|
67
69
|
end
|
|
68
70
|
|
|
71
|
+
# DSL method
|
|
72
|
+
def on_destroyed_respond(&block)
|
|
73
|
+
@on_destroyed_respond_block = block
|
|
74
|
+
end
|
|
75
|
+
|
|
69
76
|
# DSL method
|
|
70
77
|
def on_destroyed_redirect_path(&block)
|
|
71
78
|
@on_destroyed_redirect_path_block = block
|
|
@@ -17,7 +17,8 @@ module Compony
|
|
|
17
17
|
store_data # This enables the global store_data block defined below for this path and verb.
|
|
18
18
|
respond do
|
|
19
19
|
if @update_succeeded
|
|
20
|
-
evaluate_with_backfire(&@on_updated_block)
|
|
20
|
+
evaluate_with_backfire(&@on_updated_block) if @on_updated_block
|
|
21
|
+
evaluate_with_backfire(&@on_updated_respond_block)
|
|
21
22
|
else
|
|
22
23
|
evaluate_with_backfire(&@on_update_failed_block)
|
|
23
24
|
end
|
|
@@ -56,7 +57,7 @@ module Compony
|
|
|
56
57
|
@update_succeeded = @data.save
|
|
57
58
|
end
|
|
58
59
|
|
|
59
|
-
|
|
60
|
+
on_updated_respond do
|
|
60
61
|
flash.notice = I18n.t('compony.components.edit.data_was_updated', data_label: data.label)
|
|
61
62
|
redirect_to evaluate_with_backfire(&@on_updated_redirect_path_block)
|
|
62
63
|
end
|
|
@@ -76,10 +77,16 @@ module Compony
|
|
|
76
77
|
end
|
|
77
78
|
|
|
78
79
|
# DSL method
|
|
80
|
+
# Sets a block that is evaluated with backfire in the successful case after storing, but before responding.
|
|
79
81
|
def on_updated(&block)
|
|
80
82
|
@on_updated_block = block
|
|
81
83
|
end
|
|
82
84
|
|
|
85
|
+
# DSL method
|
|
86
|
+
def on_updated_respond(&block)
|
|
87
|
+
@on_updated_respond_block = block
|
|
88
|
+
end
|
|
89
|
+
|
|
83
90
|
# DSL method
|
|
84
91
|
def on_updated_redirect_path(&block)
|
|
85
92
|
@on_updated_redirect_path_block = block
|
|
@@ -71,6 +71,7 @@ module Compony
|
|
|
71
71
|
# @todo Refactor? Could this be greatly simplified by having `form_field to |f|` ?
|
|
72
72
|
def with_simpleform(simpleform)
|
|
73
73
|
@simpleform = simpleform
|
|
74
|
+
@focus_given = false
|
|
74
75
|
yield
|
|
75
76
|
@simpleform = nil
|
|
76
77
|
end
|
|
@@ -85,8 +86,12 @@ module Compony
|
|
|
85
86
|
fail("Field #{name.to_sym.inspect} is not defined on #{@simpleform.object.inspect} but was requested in #{inspect}.") unless model_field
|
|
86
87
|
|
|
87
88
|
if hidden
|
|
88
|
-
return @simpleform
|
|
89
|
+
return model_field.simpleform_input_hidden(@simpleform, self, **input_opts)
|
|
89
90
|
else
|
|
91
|
+
unless @focus_given
|
|
92
|
+
input_opts[:autofocus] = true unless input_opts.key? :autofocus
|
|
93
|
+
@focus_given = true
|
|
94
|
+
end
|
|
90
95
|
return model_field.simpleform_input(@simpleform, self, **input_opts)
|
|
91
96
|
end
|
|
92
97
|
end
|
|
@@ -19,9 +19,10 @@ module Compony
|
|
|
19
19
|
store_data # This enables the global store_data block defined below for this path and verb.
|
|
20
20
|
respond do
|
|
21
21
|
if @create_succeeded
|
|
22
|
-
evaluate_with_backfire(&@on_created_block)
|
|
22
|
+
evaluate_with_backfire(&@on_created_block) if @on_created_block
|
|
23
|
+
evaluate_with_backfire(&@on_created_respond_block)
|
|
23
24
|
else
|
|
24
|
-
evaluate_with_backfire(&@
|
|
25
|
+
evaluate_with_backfire(&@on_create_failed_respond_block)
|
|
25
26
|
end
|
|
26
27
|
end
|
|
27
28
|
end
|
|
@@ -55,7 +56,7 @@ module Compony
|
|
|
55
56
|
@create_succeeded = @data.save
|
|
56
57
|
end
|
|
57
58
|
|
|
58
|
-
|
|
59
|
+
on_created_respond do
|
|
59
60
|
flash.notice = I18n.t('compony.components.new.data_was_created', data_label: data.label)
|
|
60
61
|
redirect_to evaluate_with_backfire(&@on_created_redirect_path_block)
|
|
61
62
|
end
|
|
@@ -68,25 +69,31 @@ module Compony
|
|
|
68
69
|
end
|
|
69
70
|
end
|
|
70
71
|
|
|
71
|
-
|
|
72
|
+
on_create_failed_respond do
|
|
72
73
|
Rails.logger.warn(@data&.errors&.full_messages)
|
|
73
74
|
render_standalone(controller, status: :unprocessable_entity)
|
|
74
75
|
end
|
|
75
76
|
end
|
|
76
77
|
|
|
77
78
|
# DSL method
|
|
79
|
+
# Sets a block that is evaluated with backfire in the successful case after storing, but before responding.
|
|
78
80
|
def on_created(&block)
|
|
79
81
|
@on_created_block = block
|
|
80
82
|
end
|
|
81
83
|
|
|
84
|
+
# DSL method
|
|
85
|
+
def on_created_respond(&block)
|
|
86
|
+
@on_created_respond_block = block
|
|
87
|
+
end
|
|
88
|
+
|
|
82
89
|
# DSL method
|
|
83
90
|
def on_created_redirect_path(&block)
|
|
84
91
|
@on_created_redirect_path_block = block
|
|
85
92
|
end
|
|
86
93
|
|
|
87
94
|
# DSL method
|
|
88
|
-
def
|
|
89
|
-
@
|
|
95
|
+
def on_create_failed_respond(&block)
|
|
96
|
+
@on_create_failed_respond_block = block
|
|
90
97
|
end
|
|
91
98
|
end
|
|
92
99
|
end
|
|
@@ -10,18 +10,34 @@ module Compony
|
|
|
10
10
|
return transform_and_join(data.send(@name), controller:) { |el| el&.label }
|
|
11
11
|
end
|
|
12
12
|
|
|
13
|
-
def simpleform_input(form, _component, **input_opts)
|
|
14
|
-
selected_cst = form.object.send(@name)
|
|
13
|
+
def simpleform_input(form, _component, name: nil, **input_opts)
|
|
15
14
|
anchormodel_attribute = @model_class.anchormodel_attributes[@name]
|
|
16
15
|
anchormodel_class = anchormodel_attribute.anchormodel_class
|
|
16
|
+
input_opts[:input_html] ||= {}
|
|
17
|
+
# Attempt to read selected key from html input options "value", as the caller might not know that this is a select.
|
|
18
|
+
selected_key = input_opts[:input_html].delete(:value) # can also be both nil or blank
|
|
19
|
+
if selected_key.blank? && form.object
|
|
20
|
+
# No selected key override present and a model is present, use the model to find out what to select
|
|
21
|
+
selected_cst = form.object.send(@name)
|
|
22
|
+
selected_key = selected_cst&.key || anchormodel_class.all.first
|
|
23
|
+
end
|
|
17
24
|
opts = {
|
|
18
25
|
collection: self.class.collect(anchormodel_class.all),
|
|
19
26
|
label_method: :first,
|
|
20
27
|
value_method: :second,
|
|
21
|
-
selected:
|
|
28
|
+
selected: selected_key,
|
|
22
29
|
include_blank: anchormodel_attribute.optional
|
|
23
30
|
}.merge(input_opts)
|
|
24
|
-
return form.input @name, **opts
|
|
31
|
+
return form.input name || @name, **opts
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def simpleform_input_hidden(form, _component, name: nil, **input_opts)
|
|
35
|
+
if form.object
|
|
36
|
+
selected_cst = form.object.send(@name)
|
|
37
|
+
input_opts[:input_html] ||= {}
|
|
38
|
+
input_opts[:input_html][:value] = selected_cst.is_a?(::Anchormodel) ? selected_cst.key : selected_cst
|
|
39
|
+
end
|
|
40
|
+
return form.input name || @name, as: :hidden, **input_opts
|
|
25
41
|
end
|
|
26
42
|
end
|
|
27
43
|
end
|
|
@@ -32,8 +32,12 @@ module Compony
|
|
|
32
32
|
end
|
|
33
33
|
end
|
|
34
34
|
|
|
35
|
-
def simpleform_input(form, _component, **input_opts)
|
|
36
|
-
return form.association @name, **input_opts
|
|
35
|
+
def simpleform_input(form, _component, name: nil, **input_opts)
|
|
36
|
+
return form.association name || @name, **input_opts
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def simpleform_input_hidden(form, _component, name: nil, **input_opts)
|
|
40
|
+
return form.input name || @schema_key, as: :hidden, **input_opts
|
|
37
41
|
end
|
|
38
42
|
|
|
39
43
|
protected
|
|
@@ -11,9 +11,9 @@ module Compony
|
|
|
11
11
|
end
|
|
12
12
|
end
|
|
13
13
|
|
|
14
|
-
def simpleform_input(form, _component, accept: nil, **input_opts)
|
|
14
|
+
def simpleform_input(form, _component, name: nil, accept: nil, **input_opts)
|
|
15
15
|
input_opts.merge!(input_html: { accept: }) if accept
|
|
16
|
-
return form.input(
|
|
16
|
+
return form.input(name || @name, **input_opts)
|
|
17
17
|
end
|
|
18
18
|
end
|
|
19
19
|
end
|
|
@@ -17,7 +17,7 @@ module Compony
|
|
|
17
17
|
def initialize(name, model_class, **extra_attrs)
|
|
18
18
|
@name = name.to_sym
|
|
19
19
|
@model_class = model_class
|
|
20
|
-
@schema_key = name
|
|
20
|
+
@schema_key = name.to_sym
|
|
21
21
|
@extra_attrs = extra_attrs
|
|
22
22
|
end
|
|
23
23
|
|
|
@@ -42,8 +42,14 @@ module Compony
|
|
|
42
42
|
|
|
43
43
|
# Used in form helper.
|
|
44
44
|
# Given a simpleform instance, returns the corresponding input to be supplied to the view.
|
|
45
|
-
def simpleform_input(form, _component, **input_opts)
|
|
46
|
-
return form.input @name, **input_opts
|
|
45
|
+
def simpleform_input(form, _component, name: nil, **input_opts)
|
|
46
|
+
return form.input name || @name, **input_opts
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
# Used in form helper
|
|
50
|
+
# Given a simpleform instance, returns a suitable hidden input for thetype
|
|
51
|
+
def simpleform_input_hidden(form, _component, name: nil, **input_opts)
|
|
52
|
+
return form.input name || @name, as: :hidden, **input_opts
|
|
47
53
|
end
|
|
48
54
|
|
|
49
55
|
protected
|
|
@@ -2,7 +2,7 @@ module Compony
|
|
|
2
2
|
module ModelFields
|
|
3
3
|
class Boolean < Base
|
|
4
4
|
def value_for(data, controller: nil, **_)
|
|
5
|
-
return transform_and_join(data.send(@name), controller:) { |el| I18n.t("compony.boolean.#{el}") }
|
|
5
|
+
return transform_and_join(data.send(@name), controller:) { |el| el.nil? ? nil : I18n.t("compony.boolean.#{el}") }
|
|
6
6
|
end
|
|
7
7
|
end
|
|
8
8
|
end
|
|
@@ -4,7 +4,8 @@ module Compony
|
|
|
4
4
|
def value_for(data, controller: nil, **_)
|
|
5
5
|
return transform_and_join(data.send(@name), controller:) do |el|
|
|
6
6
|
fail('Must pass controller to generate the link to the email.') unless controller
|
|
7
|
-
return
|
|
7
|
+
return nil unless el
|
|
8
|
+
return controller.helpers.mail_to(el)
|
|
8
9
|
end
|
|
9
10
|
end
|
|
10
11
|
end
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
module Compony
|
|
2
2
|
module ModelFields
|
|
3
3
|
class RichText < Base
|
|
4
|
-
def simpleform_input(form, _component, **input_opts)
|
|
5
|
-
return form.input @name, **input_opts.merge(as: :rich_text_area)
|
|
4
|
+
def simpleform_input(form, _component, name: nil, **input_opts)
|
|
5
|
+
return form.input name || @name, **input_opts.merge(as: :rich_text_area)
|
|
6
6
|
end
|
|
7
7
|
end
|
|
8
8
|
end
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
module Compony
|
|
2
|
+
module ModelFields
|
|
3
|
+
class Url < Base
|
|
4
|
+
def value_for(data, controller: nil, **_)
|
|
5
|
+
return transform_and_join(data.send(@name), controller:) do |el|
|
|
6
|
+
fail('Must pass controller to generate the link to the link.') unless controller
|
|
7
|
+
return nil unless el
|
|
8
|
+
return controller.helpers.link_to(el, el, target: '_blank', rel: 'noopener')
|
|
9
|
+
end
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
end
|
data/lib/compony/model_mixin.rb
CHANGED
|
@@ -11,6 +11,13 @@ module Compony
|
|
|
11
11
|
end
|
|
12
12
|
|
|
13
13
|
class_methods do
|
|
14
|
+
# This hook updates all fields from a subclass, making sure that fields point to correct model classes even in STI
|
|
15
|
+
# e.g. in Parent: field :foo, ... omitted in child -> child.fields[:foo] should point to Child and not Parent.
|
|
16
|
+
def inherited(subclass)
|
|
17
|
+
super
|
|
18
|
+
subclass.fields = subclass.fields.transform_values { |f| f.class.new(f.name, subclass, **f.extra_attrs) }
|
|
19
|
+
end
|
|
20
|
+
|
|
14
21
|
# DSL method, defines a new field which will be translated and can be added to field groups
|
|
15
22
|
# For virtual attributes, you must pass a type explicitely, otherwise it's auto-infered.
|
|
16
23
|
def field(name, type, **extra_attrs)
|
|
@@ -84,5 +91,10 @@ module Compony
|
|
|
84
91
|
text += '.' if text.present?
|
|
85
92
|
return text
|
|
86
93
|
end
|
|
94
|
+
|
|
95
|
+
# Calls value_for on the desired field. Do not confuse with the static method field.
|
|
96
|
+
def field(field_name, controller)
|
|
97
|
+
fields[field_name.to_sym].value_for(self, controller:)
|
|
98
|
+
end
|
|
87
99
|
end
|
|
88
100
|
end
|
data/lib/compony/version.rb
CHANGED
data/lib/compony.rb
CHANGED
|
@@ -255,6 +255,7 @@ require 'compony/model_fields/rich_text'
|
|
|
255
255
|
require 'compony/model_fields/string'
|
|
256
256
|
require 'compony/model_fields/text'
|
|
257
257
|
require 'compony/model_fields/time'
|
|
258
|
+
require 'compony/model_fields/url'
|
|
258
259
|
require 'compony/component_mixins/default/standalone'
|
|
259
260
|
require 'compony/component_mixins/default/standalone/standalone_dsl'
|
|
260
261
|
require 'compony/component_mixins/default/standalone/verb_dsl'
|
|
@@ -3,12 +3,23 @@ class ComponentGenerator < Rails::Generators::NamedBase
|
|
|
3
3
|
|
|
4
4
|
def add_component
|
|
5
5
|
segments = name.underscore.split('/')
|
|
6
|
-
fail(
|
|
6
|
+
fail("NAME must be of the form Family::ComponentName or family/component_name but got #{name.inspect}") if segments.size != 2
|
|
7
7
|
@family, @comp = segments
|
|
8
8
|
@family = @family.pluralize # Force plural
|
|
9
9
|
@family_cst = @family.camelize.pluralize # Force plural
|
|
10
10
|
@comp_cst = @comp.camelize # Tolerate singular and plural
|
|
11
11
|
|
|
12
|
-
|
|
12
|
+
case @comp_cst
|
|
13
|
+
when 'Destroy'
|
|
14
|
+
template 'destroy.rb.erb', "app/components/#{@family}/#{@comp}.rb"
|
|
15
|
+
when 'Edit'
|
|
16
|
+
template 'edit.rb.erb', "app/components/#{@family}/#{@comp}.rb"
|
|
17
|
+
when 'Form'
|
|
18
|
+
template 'form.rb.erb', "app/components/#{@family}/#{@comp}.rb"
|
|
19
|
+
when 'New'
|
|
20
|
+
template 'new.rb.erb', "app/components/#{@family}/#{@comp}.rb"
|
|
21
|
+
else
|
|
22
|
+
template 'component.rb.erb', "app/components/#{@family}/#{@comp}.rb"
|
|
23
|
+
end
|
|
13
24
|
end
|
|
14
25
|
end
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
class ComponentsGenerator < Rails::Generators::NamedBase
|
|
2
|
+
source_root File.expand_path('templates', __dir__)
|
|
3
|
+
|
|
4
|
+
def add_component
|
|
5
|
+
@family = name.underscore.pluralize # Force plural
|
|
6
|
+
@family_cst = @family.camelize.pluralize # Force plural
|
|
7
|
+
|
|
8
|
+
%w[Destroy Edit Form New].each do |comp_cst|
|
|
9
|
+
generate "component #{name}::#{comp_cst}"
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
end
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: compony
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.0.
|
|
4
|
+
version: 0.0.6
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Sandro Kalbermatter
|
|
@@ -9,7 +9,7 @@ authors:
|
|
|
9
9
|
autorequire:
|
|
10
10
|
bindir: bin
|
|
11
11
|
cert_chain: []
|
|
12
|
-
date: 2023-
|
|
12
|
+
date: 2023-08-08 00:00:00.000000000 Z
|
|
13
13
|
dependencies:
|
|
14
14
|
- !ruby/object:Gem::Dependency
|
|
15
15
|
name: yard
|
|
@@ -207,6 +207,7 @@ files:
|
|
|
207
207
|
- lib/compony/model_fields/string.rb
|
|
208
208
|
- lib/compony/model_fields/text.rb
|
|
209
209
|
- lib/compony/model_fields/time.rb
|
|
210
|
+
- lib/compony/model_fields/url.rb
|
|
210
211
|
- lib/compony/model_mixin.rb
|
|
211
212
|
- lib/compony/request_context.rb
|
|
212
213
|
- lib/compony/version.rb
|
|
@@ -214,6 +215,12 @@ files:
|
|
|
214
215
|
- lib/generators/component/USAGE
|
|
215
216
|
- lib/generators/component/component_generator.rb
|
|
216
217
|
- lib/generators/component/templates/component.rb.erb
|
|
218
|
+
- lib/generators/component/templates/destroy.rb.erb
|
|
219
|
+
- lib/generators/component/templates/edit.rb.erb
|
|
220
|
+
- lib/generators/component/templates/form.rb.erb
|
|
221
|
+
- lib/generators/component/templates/new.rb.erb
|
|
222
|
+
- lib/generators/components/USAGE
|
|
223
|
+
- lib/generators/components/components_generator.rb
|
|
217
224
|
homepage:
|
|
218
225
|
licenses: []
|
|
219
226
|
metadata: {}
|