compony 0.0.4 → 0.0.6

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: 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: {}