compony 0.4.0 → 0.4.1

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.
Files changed (66) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +8 -0
  3. data/VERSION +1 -1
  4. data/compony.gemspec +3 -3
  5. data/doc/ComponentGenerator.html +1 -1
  6. data/doc/Components.html +1 -1
  7. data/doc/ComponentsGenerator.html +1 -1
  8. data/doc/Compony/Component.html +419 -159
  9. data/doc/Compony/ComponentMixins/Default/Labelling.html +1 -1
  10. data/doc/Compony/ComponentMixins/Default/Standalone/ResourcefulVerbDsl.html +1 -1
  11. data/doc/Compony/ComponentMixins/Default/Standalone/StandaloneDsl.html +1 -1
  12. data/doc/Compony/ComponentMixins/Default/Standalone/VerbDsl.html +1 -1
  13. data/doc/Compony/ComponentMixins/Default/Standalone.html +6 -6
  14. data/doc/Compony/ComponentMixins/Default.html +1 -1
  15. data/doc/Compony/ComponentMixins/Resourceful.html +5 -5
  16. data/doc/Compony/ComponentMixins.html +1 -1
  17. data/doc/Compony/Components/Button.html +6 -6
  18. data/doc/Compony/Components/Destroy.html +2 -2
  19. data/doc/Compony/Components/Edit.html +2 -2
  20. data/doc/Compony/Components/Form.html +2 -2
  21. data/doc/Compony/Components/New.html +2 -2
  22. data/doc/Compony/Components/WithForm.html +2 -2
  23. data/doc/Compony/Components.html +1 -1
  24. data/doc/Compony/ControllerMixin.html +1 -1
  25. data/doc/Compony/Engine.html +1 -1
  26. data/doc/Compony/MethodAccessibleHash.html +1 -1
  27. data/doc/Compony/ModelFields/Anchormodel.html +1 -1
  28. data/doc/Compony/ModelFields/Association.html +1 -1
  29. data/doc/Compony/ModelFields/Attachment.html +2 -2
  30. data/doc/Compony/ModelFields/Base.html +1 -1
  31. data/doc/Compony/ModelFields/Boolean.html +1 -1
  32. data/doc/Compony/ModelFields/Color.html +1 -1
  33. data/doc/Compony/ModelFields/Currency.html +1 -1
  34. data/doc/Compony/ModelFields/Date.html +1 -1
  35. data/doc/Compony/ModelFields/Datetime.html +1 -1
  36. data/doc/Compony/ModelFields/Decimal.html +1 -1
  37. data/doc/Compony/ModelFields/Email.html +1 -1
  38. data/doc/Compony/ModelFields/Float.html +1 -1
  39. data/doc/Compony/ModelFields/Integer.html +1 -1
  40. data/doc/Compony/ModelFields/Percentage.html +1 -1
  41. data/doc/Compony/ModelFields/Phone.html +1 -1
  42. data/doc/Compony/ModelFields/RichText.html +1 -1
  43. data/doc/Compony/ModelFields/String.html +1 -1
  44. data/doc/Compony/ModelFields/Text.html +1 -1
  45. data/doc/Compony/ModelFields/Time.html +1 -1
  46. data/doc/Compony/ModelFields/Url.html +1 -1
  47. data/doc/Compony/ModelFields.html +1 -1
  48. data/doc/Compony/ModelMixin.html +1 -1
  49. data/doc/Compony/NaturalOrdering.html +1 -1
  50. data/doc/Compony/RequestContext.html +1 -1
  51. data/doc/Compony/Version.html +1 -1
  52. data/doc/Compony/ViewHelpers.html +1 -1
  53. data/doc/Compony.html +152 -92
  54. data/doc/ComponyController.html +1 -1
  55. data/doc/_index.html +1 -1
  56. data/doc/file.README.html +1 -1
  57. data/doc/index.html +1 -1
  58. data/doc/method_list.html +32 -0
  59. data/doc/top-level-namespace.html +1 -1
  60. data/lib/compony/component.rb +24 -4
  61. data/lib/compony/component_mixins/default/standalone.rb +3 -3
  62. data/lib/compony/component_mixins/resourceful.rb +2 -2
  63. data/lib/compony/components/button.rb +2 -2
  64. data/lib/compony/model_fields/attachment.rb +1 -1
  65. data/lib/compony.rb +24 -11
  66. metadata +3 -3
data/doc/method_list.html CHANGED
@@ -221,6 +221,14 @@
221
221
 
222
222
 
223
223
  <li class="odd ">
224
+ <div class="item">
225
+ <span class='object_link'><a href="Compony/Component.html#comp_cst-class_method" title="Compony::Component.comp_cst (method)">comp_cst</a></span>
226
+ <small>Compony::Component</small>
227
+ </div>
228
+ </li>
229
+
230
+
231
+ <li class="even ">
224
232
  <div class="item">
225
233
  <span class='object_link'><a href="Compony/Component.html#comp_cst-instance_method" title="Compony::Component#comp_cst (method)">#comp_cst</a></span>
226
234
  <small>Compony::Component</small>
@@ -228,6 +236,14 @@
228
236
  </li>
229
237
 
230
238
 
239
+ <li class="odd ">
240
+ <div class="item">
241
+ <span class='object_link'><a href="Compony/Component.html#comp_name-class_method" title="Compony::Component.comp_name (method)">comp_name</a></span>
242
+ <small>Compony::Component</small>
243
+ </div>
244
+ </li>
245
+
246
+
231
247
  <li class="even ">
232
248
  <div class="item">
233
249
  <span class='object_link'><a href="Compony/Component.html#comp_name-instance_method" title="Compony::Component#comp_name (method)">#comp_name</a></span>
@@ -397,6 +413,14 @@
397
413
 
398
414
 
399
415
  <li class="odd ">
416
+ <div class="item">
417
+ <span class='object_link'><a href="Compony/Component.html#family_cst-class_method" title="Compony::Component.family_cst (method)">family_cst</a></span>
418
+ <small>Compony::Component</small>
419
+ </div>
420
+ </li>
421
+
422
+
423
+ <li class="even ">
400
424
  <div class="item">
401
425
  <span class='object_link'><a href="Compony/Component.html#family_cst-instance_method" title="Compony::Component#family_cst (method)">#family_cst</a></span>
402
426
  <small>Compony::Component</small>
@@ -404,6 +428,14 @@
404
428
  </li>
405
429
 
406
430
 
431
+ <li class="odd ">
432
+ <div class="item">
433
+ <span class='object_link'><a href="Compony/Component.html#family_name-class_method" title="Compony::Component.family_name (method)">family_name</a></span>
434
+ <small>Compony::Component</small>
435
+ </div>
436
+ </li>
437
+
438
+
407
439
  <li class="even ">
408
440
  <div class="item">
409
441
  <span class='object_link'><a href="Compony/Component.html#family_name-instance_method" title="Compony::Component#family_name (method)">#family_name</a></span>
@@ -102,7 +102,7 @@
102
102
  </div>
103
103
 
104
104
  <div id="footer">
105
- Generated on Tue Jun 11 11:15:53 2024 by
105
+ Generated on Thu Sep 12 16:31:18 2024 by
106
106
  <a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
107
107
  0.9.36 (ruby-3.2.2).
108
108
  </div>
@@ -20,6 +20,26 @@ module Compony
20
20
  setup_blocks << block
21
21
  end
22
22
 
23
+ # Returns the name of the module constant (=family) of this component. Do not override.
24
+ def self.family_cst
25
+ module_parent.to_s.demodulize.to_sym
26
+ end
27
+
28
+ # Returns the family name
29
+ def self.family_name
30
+ family_cst.to_s.underscore
31
+ end
32
+
33
+ # Returns the name of the class constant of this component. Do not override.
34
+ def self.comp_cst
35
+ name.demodulize.to_sym
36
+ end
37
+
38
+ # Returns the component name
39
+ def self.comp_name
40
+ comp_cst.to_s.underscore
41
+ end
42
+
23
43
  def initialize(parent_comp = nil, index: 0, **comp_opts)
24
44
  @parent_comp = parent_comp
25
45
  @sub_comps = []
@@ -94,22 +114,22 @@ module Compony
94
114
 
95
115
  # Returns the name of the module constant (=family) of this component. Do not override.
96
116
  def family_cst
97
- self.class.module_parent.to_s.demodulize.to_sym
117
+ self.class.family_cst
98
118
  end
99
119
 
100
120
  # Returns the family name
101
121
  def family_name
102
- family_cst.to_s.underscore
122
+ self.class.family_name
103
123
  end
104
124
 
105
125
  # Returns the name of the class constant of this component. Do not override.
106
126
  def comp_cst
107
- self.class.name.demodulize.to_sym
127
+ self.class.comp_cst
108
128
  end
109
129
 
110
130
  # Returns the component name
111
131
  def comp_name
112
- comp_cst.to_s.underscore
132
+ self.class.comp_name
113
133
  end
114
134
 
115
135
  # DSL method
@@ -108,13 +108,13 @@ module Compony
108
108
  # To have a component listen to multiple paths, call standalone again and provide a name, e.g.: standalone(:autocomplete, path: 'foo/bar/autocomplete')
109
109
  # The kwarg parameter `path` is handled analog to the Rails route path
110
110
  # @param name [Symbol,nil] The name of the standalone config, defaults to nil. Only provide if you add additional configs.
111
- def standalone(name = nil, *args, **nargs, &block)
111
+ def standalone(name = nil, *, **nargs, &block)
112
112
  block = proc {} unless block_given? # If called without a block, must default to an empty block to provide a binding to the DSL.
113
113
  name = name&.to_sym # nil name is the most common case
114
114
  if @standalone_configs[name]
115
- @standalone_configs[name].deep_merge! StandaloneDsl.new(self, name, *args, provide_defaults: false, **nargs).to_conf(&block)
115
+ @standalone_configs[name].deep_merge! StandaloneDsl.new(self, name, *, provide_defaults: false, **nargs).to_conf(&block)
116
116
  else
117
- @standalone_configs[name] = Compony::MethodAccessibleHash.new(StandaloneDsl.new(self, name, *args, provide_defaults: true, **nargs).to_conf(&block))
117
+ @standalone_configs[name] = Compony::MethodAccessibleHash.new(StandaloneDsl.new(self, name, *, provide_defaults: true, **nargs).to_conf(&block))
118
118
  end
119
119
  end
120
120
 
@@ -15,14 +15,14 @@ module Compony
15
15
  attr_reader :global_after_assign_attributes_block
16
16
  attr_reader :global_store_data_block
17
17
 
18
- def initialize(*args, data: nil, data_class: nil, **nargs, &block)
18
+ def initialize(*, data: nil, data_class: nil, **nargs, &)
19
19
  @data = data
20
20
  @data_class = data_class
21
21
 
22
22
  # Provide defaults for hook blocks
23
23
  @global_load_data_block ||= proc { @data = self.data_class.find(controller.params[:id]) }
24
24
 
25
- super(*args, **nargs, &block)
25
+ super(*, **nargs, &)
26
26
  end
27
27
 
28
28
  # DSL method
@@ -7,7 +7,7 @@ module Compony
7
7
 
8
8
  # path: If given a block, it will be evaluated in the helpers context when rendering
9
9
  # enabled: If given a block, it will be evaluated in the helpers context when rendering
10
- def initialize(*args, label: nil, path: nil, method: nil, type: nil, enabled: nil, visible: nil, title: nil, **kwargs, &block)
10
+ def initialize(*, label: nil, path: nil, method: nil, type: nil, enabled: nil, visible: nil, title: nil, **, &)
11
11
  @label = label || Compony.button_defaults[:label]
12
12
  @type = type&.to_sym || Compony.button_defaults[:type] || :button
13
13
  @path = path || Compony.button_defaults[:path] || 'javascript:void(0)'
@@ -26,7 +26,7 @@ module Compony
26
26
 
27
27
  fail "Unsupported button type #{@type}, use on of: #{SUPPORTED_TYPES.inspect}" unless SUPPORTED_TYPES.include?(@type)
28
28
 
29
- super(*args, **kwargs, &block)
29
+ super(*, **, &)
30
30
  end
31
31
 
32
32
  setup do
@@ -12,7 +12,7 @@ module Compony
12
12
  end
13
13
 
14
14
  def simpleform_input(form, _component, name: nil, accept: nil, **input_opts)
15
- input_opts.merge!(input_html: { accept: }) if accept
15
+ input_opts.deep_merge!(input_html: { accept: }) if accept
16
16
  return form.input(name || @name, **input_opts)
17
17
  end
18
18
  end
data/lib/compony.rb CHANGED
@@ -96,17 +96,19 @@ module Compony
96
96
 
97
97
  # Generates a Rails path to a component. Examples: `Compony.path(:index, :users)`, `Compony.path(:show, User.first)`
98
98
  # @param comp_name_or_cst [String,Symbol] The component that should be loaded, for instance `ShowForAll`, `'ShowForAll'` or `:show_for_all`
99
+ # or can also pass a component class (such as Components::Users::Show)
99
100
  # @param model_or_family_name_or_cst [String,Symbol,ApplicationRecord] Either the family that contains the requested component,
100
101
  # or an instance implementing `model_name` from which the family name is auto-generated. Examples:
101
102
  # `Users`, `'Users'`, `:users`, `User.first`
103
+ # @param standalone_name [Symbol,nil] Name of the standalone config to point to (defaults to nil the default standalone config).
102
104
  # @param args_for_path_helper [Array] Positional arguments passed to the Rails helper
103
105
  # @param kwargs_for_path_helper [Hash] Named arguments passed to the Rails helper. If a model is given to `model_or_family_name_or_cst`,
104
106
  # the param `id` defaults to the passed model's ID.
105
- def self.path(comp_name_or_cst, model_or_family_name_or_cst, *args_for_path_helper, **kwargs_for_path_helper)
107
+ def self.path(comp_name_or_cst, model_or_family_name_or_cst = nil, *args_for_path_helper, standalone_name: nil, **kwargs_for_path_helper)
106
108
  # Extract model if any, to get the ID
107
109
  kwargs_for_path_helper.merge!(id: model_or_family_name_or_cst.id) if model_or_family_name_or_cst.respond_to?(:model_name)
108
110
  return Rails.application.routes.url_helpers.send(
109
- "#{path_helper_name(comp_name_or_cst, model_or_family_name_or_cst)}_path",
111
+ "#{path_helper_name(comp_name_or_cst, model_or_family_name_or_cst, standalone_name&.to_sym)}_path",
110
112
  *args_for_path_helper,
111
113
  **kwargs_for_path_helper
112
114
  )
@@ -143,18 +145,23 @@ module Compony
143
145
  "#{rails_action_name(...)}_comp"
144
146
  end
145
147
 
146
- # Given a component and a family, this returns the name of the ComponyController action for this component.<br>
148
+ # Given a component and a family or a component class, this returns the name of the ComponyController action for this component.<br>
147
149
  # Optionally can pass a name for extra standalone configs.
148
150
  # @param comp_name_or_cst [String,Symbol] Name of the component the action points to.
149
151
  # @param model_or_family_name_or_cst [String,Symbol] Name of the family the action points to.
150
152
  # @param name [String,Symbol] If referring to an extra standalone entrypoint, specify its name using this param.
151
153
  # @see Compony#path
152
- def self.rails_action_name(comp_name_or_cst, model_or_family_name_or_cst, name = nil)
153
- [name.presence, comp_name_or_cst.to_s.underscore, family_name_for(model_or_family_name_or_cst)].compact.join('_')
154
+ def self.rails_action_name(comp_name_or_cst_or_class, model_or_family_name_or_cst, name = nil)
155
+ if comp_name_or_cst_or_class.is_a?(Class) && (comp_name_or_cst_or_class <= Compony::Component)
156
+ comp_class = comp_name_or_cst_or_class
157
+ comp_name_or_cst_or_class = comp_class.comp_name
158
+ model_or_family_name_or_cst = comp_class.family_name
159
+ end
160
+ [name.presence, comp_name_or_cst_or_class.to_s.underscore, family_name_for(model_or_family_name_or_cst)].compact.join('_')
154
161
  end
155
162
 
156
163
  # Given a component and a family/model, this instanciates and returns a button component.
157
- # @param comp_name_or_cst [String,Symbol] The component that should be loaded, for instance `ShowForAll`, `'ShowForAll'` or `:show_for_all`
164
+ # @param comp_name_or_cst_or_class [String,Symbol,Class] The component that should be loaded, for instance `ShowForAll`, `'ShowForAll'` or `:show_for_all`
158
165
  # @param model_or_family_name_or_cst [String,Symbol,ApplicationRecord] Either the family that contains the requested component,
159
166
  # or an instance implementing `model_name` from which the family name is auto-generated. Examples:
160
167
  # `Users`, `'Users'`, `:users`, `User.first`
@@ -162,28 +169,34 @@ module Compony
162
169
  # @param params [Hash] GET parameters to be inclued into the path this button points to. Special case: e.g. format: :pdf -> some.url/foo/bar.pdf
163
170
  # @param feasibility_action [Symbol] Name of the feasibility action that should be checked for this button, defaults to the component name
164
171
  # @param feasibility_target [Symbol] Name of the feasibility target (subject) that the feasibility should be checked on, defaults to the model if given
172
+ # @param standalone_name [Symbol,nil] Name of the standalone config to point to (defaults to nil the default standalone config).
165
173
  # @param override_kwargs [Hash] Override button options, see options for {Compony::Components::Button}
166
174
  # @see Compony::ViewHelpers#compony_button View helper providing a wrapper for this method that immediately renders a button.
167
175
  # @see Compony::Components::Button Compony::Components::Button: the default underlying implementation
168
- def self.button(comp_name_or_cst,
169
- model_or_family_name_or_cst,
176
+ def self.button(comp_name_or_cst_or_class,
177
+ model_or_family_name_or_cst = nil,
170
178
  label_opts: nil,
171
179
  params: nil,
172
180
  feasibility_action: nil,
173
181
  feasibility_target: nil,
174
182
  method: nil,
183
+ standalone_name: nil,
175
184
  **override_kwargs)
176
185
  label_opts ||= button_defaults[:label_opts] || {}
177
186
  params ||= button_defaults[:params] || {}
178
187
  model = model_or_family_name_or_cst.respond_to?(:model_name) ? model_or_family_name_or_cst : nil
179
- target_comp_instance = Compony.comp_class_for!(comp_name_or_cst, model_or_family_name_or_cst).new(data: model)
180
- feasibility_action ||= button_defaults[:feasibility_action] || comp_name_or_cst.to_s.underscore.to_sym
188
+ if comp_name_or_cst_or_class.is_a?(Class) && (comp_name_or_cst_or_class <= Compony::Component)
189
+ target_comp_instance = comp_name_or_cst_or_class.new(data: model)
190
+ else
191
+ target_comp_instance = Compony.comp_class_for!(comp_name_or_cst_or_class, model_or_family_name_or_cst).new(data: model)
192
+ end
193
+ feasibility_action ||= button_defaults[:feasibility_action] || comp_name_or_cst_or_class.to_s.underscore.to_sym
181
194
  feasibility_target ||= button_defaults[:feasibility_target] || model
182
195
  options = {
183
196
  label: target_comp_instance.label(model, **label_opts),
184
197
  icon: target_comp_instance.icon,
185
198
  color: target_comp_instance.color,
186
- path: Compony.path(target_comp_instance.comp_name, target_comp_instance.family_name, model, **params),
199
+ path: Compony.path(target_comp_instance.comp_name, target_comp_instance.family_name, model, standalone_name:, **params),
187
200
  method:,
188
201
  visible: ->(controller) { target_comp_instance.standalone_access_permitted_for?(controller, verb: method) }
189
202
  }
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.4.0
4
+ version: 0.4.1
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: 2024-06-11 00:00:00.000000000 Z
12
+ date: 2024-09-12 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: yard
@@ -330,7 +330,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
330
330
  - !ruby/object:Gem::Version
331
331
  version: '0'
332
332
  requirements: []
333
- rubygems_version: 3.5.11
333
+ rubygems_version: 3.5.16
334
334
  signing_key:
335
335
  specification_version: 4
336
336
  summary: Compony is a Gem that allows you to write your Rails application in component-style