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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c832dc26e81d2231843d90891d9ca469d5e74dfd3b0e00a588bebf1e8d1f25a2
4
- data.tar.gz: 7eb4e6953bbdf22fd67b7e6fa95d6f2ce012e2e350c1a4e3bb04bb34f3c2e9c5
3
+ metadata.gz: ffb648bd48df260288580ceae282773587e7137ecfec89c4623edf001e6e21b6
4
+ data.tar.gz: eb4f6db5431d5a783bf4140f398af1497536e896c00c61b325fb3c9b76d6a9f9
5
5
  SHA512:
6
- metadata.gz: 5fba60b56710e929ad113ddf092019330810dd26036dfd7ce6550becac5e7bfb03d534ac80296707b4613fd12483690e83ff7e224a56b127677141bbd2e8f71d
7
- data.tar.gz: 71719e23adfe9af22f347876540150b3435cd3226e5c7a409dc402368f5cc2879803341e2f213ab7f6fe920320eaec5feb1dbdde1a97fe122e4f2ea2b9281e49
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.4 ruby lib
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.4"
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-05-28"
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
@@ -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
- h.content_tag(:div, action.block.call.render(controller), class: action_class)
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
- on_destroyed do
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
- on_updated do
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.input model_field.schema_key, as: :hidden, **input_opts
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(&@on_create_failed_block)
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
- on_created do
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
- on_create_failed do
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 on_create_failed(&block)
89
- @on_create_failed_block = block
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: selected_cst&.key || anchormodel_class.all.first,
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(:proof_photo, **input_opts)
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 controller.helpers.mail_to(data.send(@name))
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
@@ -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
@@ -2,7 +2,7 @@ module Compony
2
2
  module Version
3
3
  MAJOR = 0
4
4
  MINOR = 0
5
- PATCH = 4
5
+ PATCH = 6
6
6
 
7
7
  EDGE = false
8
8
 
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('NAME must be of the form Family::ComponentName or family/component_name') if segments.size != 2
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
- template 'component.rb.erb', "app/components/#{@family}/#{@comp}.rb"
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
@@ -1,4 +1,4 @@
1
1
  class Components::<%= @family_cst %>::<%= @comp_cst %> < Compony::Component
2
2
  setup do
3
3
  end
4
- end
4
+ end
@@ -0,0 +1,2 @@
1
+ class Components::<%= @family_cst %>::<%= @comp_cst %> < Compony::Components::Destroy
2
+ end
@@ -0,0 +1,2 @@
1
+ class Components::<%= @family_cst %>::<%= @comp_cst %> < Compony::Components::Edit
2
+ end
@@ -0,0 +1,8 @@
1
+ class Components::<%= @family_cst %>::<%= @comp_cst %> < Compony::Components::Form
2
+ setup do
3
+ form_fields do
4
+ end
5
+
6
+ schema_fields
7
+ end
8
+ end
@@ -0,0 +1,2 @@
1
+ class Components::<%= @family_cst %>::<%= @comp_cst %> < Compony::Components::New
2
+ end
@@ -0,0 +1,8 @@
1
+ Description:
2
+ Generate the most used components for a family
3
+
4
+ Example:
5
+ bin/rails generate components Users
6
+
7
+ This will create and fill with the usual components:
8
+ app/components/users/
@@ -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
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-05-28 00:00:00.000000000 Z
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: {}