compony 0.4.0 → 0.4.1

Sign up to get free protection for your applications and to get access to all the features.
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