compony 0.1.1 → 0.2.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ecb0c40f2981194e5fa6a297731c5f224f49c8d73594f016149567da28553c93
4
- data.tar.gz: 93b518bd1fd54dd04a628df57f18ee120b2be4485241b50b9143fe136eb4bb14
3
+ metadata.gz: d8c73b93a2181fc65daa7d813741776da0426bb8f17bdfee660d8e94626f1676
4
+ data.tar.gz: 70715489017a96b9fd638a75c48666fc8157971af5b6f15f80a202ce774c14e2
5
5
  SHA512:
6
- metadata.gz: d4f6f506c58e51ab3086b8a3870d05bccaefca10529869b90ed11b6ce83f0d76c6c114062c62a99ecdc3fa08dc24b8f55b825a586c640919b176ba2110eb7b7f
7
- data.tar.gz: afddee67f4c6659008704e572bee553ec6350f3fb8ad06550089e9b1954a913e5e0faf43b6d83cb35b0ae14f70c4889577cab13fda427f5a9e7d25341a442164
6
+ metadata.gz: 3f18b01d899380afbcba59880d0ef3bf827228ca410f67bcd2a8d70900cf32004442e4ae60cce6a6a2ca00801225cc8f760e0988e3a1903bda7969263ded700d
7
+ data.tar.gz: 0f9896f5d968a90f20c4c2323a41b205915a57f05b10cdb80d3968192b4af9c700635f22ed1057c5ba4850449c8d6f6c796c61f6f774418c2620a13e5fda0505
data/.ruby-version CHANGED
@@ -1 +1 @@
1
- 3.1.3
1
+ 3.2.2
data/CHANGELOG.md CHANGED
@@ -1,3 +1,26 @@
1
+ # 0.2.1
2
+
3
+ - Fix a bug where the app crashed on HEAD verb
4
+ - Show more details about failing authorization block
5
+ - Implement `submit_path` DSL call for WithForm
6
+ - Add French translation
7
+ - Implement `skip_autofocus` in Form
8
+ - Allow partial override of standalone verb configs. Example:
9
+ ```ruby
10
+ verb :get do
11
+ authorize { true }
12
+ end
13
+ verb :post do
14
+ authorize { true }
15
+ # Parent class implements more logic here, which will no longer be overwritten by calling `verb :post`.
16
+ end
17
+ ```
18
+
19
+ # 0.2.0
20
+
21
+ - Cleanup old code
22
+ - Remove `check_config!` that was barely used
23
+
1
24
  # 0.1.1
2
25
 
3
26
  - Support and force Rails 7.1.2
data/Gemfile.lock CHANGED
@@ -1,11 +1,12 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- compony (0.1.0)
4
+ compony (0.1.2.edge)
5
5
  anchormodel (~> 0.1.2)
6
6
  cancancan (~> 3.4.0)
7
7
  dslblend (>= 0.0.3)
8
8
  dyny (>= 0.0.3)
9
+ rails (>= 7.1.2)
9
10
  request_store (>= 1.5)
10
11
  schemacop (>= 3.0.17)
11
12
  simple_form (>= 5.1.0)
@@ -13,79 +14,93 @@ PATH
13
14
  GEM
14
15
  remote: https://rubygems.org/
15
16
  specs:
16
- actioncable (7.0.4.3)
17
- actionpack (= 7.0.4.3)
18
- activesupport (= 7.0.4.3)
17
+ actioncable (7.1.2)
18
+ actionpack (= 7.1.2)
19
+ activesupport (= 7.1.2)
19
20
  nio4r (~> 2.0)
20
21
  websocket-driver (>= 0.6.1)
21
- actionmailbox (7.0.4.3)
22
- actionpack (= 7.0.4.3)
23
- activejob (= 7.0.4.3)
24
- activerecord (= 7.0.4.3)
25
- activestorage (= 7.0.4.3)
26
- activesupport (= 7.0.4.3)
22
+ zeitwerk (~> 2.6)
23
+ actionmailbox (7.1.2)
24
+ actionpack (= 7.1.2)
25
+ activejob (= 7.1.2)
26
+ activerecord (= 7.1.2)
27
+ activestorage (= 7.1.2)
28
+ activesupport (= 7.1.2)
27
29
  mail (>= 2.7.1)
28
30
  net-imap
29
31
  net-pop
30
32
  net-smtp
31
- actionmailer (7.0.4.3)
32
- actionpack (= 7.0.4.3)
33
- actionview (= 7.0.4.3)
34
- activejob (= 7.0.4.3)
35
- activesupport (= 7.0.4.3)
33
+ actionmailer (7.1.2)
34
+ actionpack (= 7.1.2)
35
+ actionview (= 7.1.2)
36
+ activejob (= 7.1.2)
37
+ activesupport (= 7.1.2)
36
38
  mail (~> 2.5, >= 2.5.4)
37
39
  net-imap
38
40
  net-pop
39
41
  net-smtp
40
- rails-dom-testing (~> 2.0)
41
- actionpack (7.0.4.3)
42
- actionview (= 7.0.4.3)
43
- activesupport (= 7.0.4.3)
44
- rack (~> 2.0, >= 2.2.0)
42
+ rails-dom-testing (~> 2.2)
43
+ actionpack (7.1.2)
44
+ actionview (= 7.1.2)
45
+ activesupport (= 7.1.2)
46
+ nokogiri (>= 1.8.5)
47
+ racc
48
+ rack (>= 2.2.4)
49
+ rack-session (>= 1.0.1)
45
50
  rack-test (>= 0.6.3)
46
- rails-dom-testing (~> 2.0)
47
- rails-html-sanitizer (~> 1.0, >= 1.2.0)
48
- actiontext (7.0.4.3)
49
- actionpack (= 7.0.4.3)
50
- activerecord (= 7.0.4.3)
51
- activestorage (= 7.0.4.3)
52
- activesupport (= 7.0.4.3)
51
+ rails-dom-testing (~> 2.2)
52
+ rails-html-sanitizer (~> 1.6)
53
+ actiontext (7.1.2)
54
+ actionpack (= 7.1.2)
55
+ activerecord (= 7.1.2)
56
+ activestorage (= 7.1.2)
57
+ activesupport (= 7.1.2)
53
58
  globalid (>= 0.6.0)
54
59
  nokogiri (>= 1.8.5)
55
- actionview (7.0.4.3)
56
- activesupport (= 7.0.4.3)
60
+ actionview (7.1.2)
61
+ activesupport (= 7.1.2)
57
62
  builder (~> 3.1)
58
- erubi (~> 1.4)
59
- rails-dom-testing (~> 2.0)
60
- rails-html-sanitizer (~> 1.1, >= 1.2.0)
61
- activejob (7.0.4.3)
62
- activesupport (= 7.0.4.3)
63
+ erubi (~> 1.11)
64
+ rails-dom-testing (~> 2.2)
65
+ rails-html-sanitizer (~> 1.6)
66
+ activejob (7.1.2)
67
+ activesupport (= 7.1.2)
63
68
  globalid (>= 0.3.6)
64
- activemodel (7.0.4.3)
65
- activesupport (= 7.0.4.3)
66
- activerecord (7.0.4.3)
67
- activemodel (= 7.0.4.3)
68
- activesupport (= 7.0.4.3)
69
- activestorage (7.0.4.3)
70
- actionpack (= 7.0.4.3)
71
- activejob (= 7.0.4.3)
72
- activerecord (= 7.0.4.3)
73
- activesupport (= 7.0.4.3)
69
+ activemodel (7.1.2)
70
+ activesupport (= 7.1.2)
71
+ activerecord (7.1.2)
72
+ activemodel (= 7.1.2)
73
+ activesupport (= 7.1.2)
74
+ timeout (>= 0.4.0)
75
+ activestorage (7.1.2)
76
+ actionpack (= 7.1.2)
77
+ activejob (= 7.1.2)
78
+ activerecord (= 7.1.2)
79
+ activesupport (= 7.1.2)
74
80
  marcel (~> 1.0)
75
- mini_mime (>= 1.1.0)
76
- activesupport (7.0.4.3)
81
+ activesupport (7.1.2)
82
+ base64
83
+ bigdecimal
77
84
  concurrent-ruby (~> 1.0, >= 1.0.2)
85
+ connection_pool (>= 2.2.5)
86
+ drb
78
87
  i18n (>= 1.6, < 2)
79
88
  minitest (>= 5.1)
89
+ mutex_m
80
90
  tzinfo (~> 2.0)
81
- anchormodel (0.1.2)
91
+ anchormodel (0.1.3)
82
92
  rails (~> 7.0)
83
93
  ast (2.4.2)
94
+ base64 (0.2.0)
95
+ bigdecimal (3.1.4)
84
96
  builder (3.2.4)
85
97
  cancancan (3.4.0)
86
98
  concurrent-ruby (1.2.2)
99
+ connection_pool (2.4.1)
87
100
  crass (1.0.6)
88
101
  date (3.3.3)
102
+ drb (2.2.0)
103
+ ruby2_keywords
89
104
  dslblend (0.0.3)
90
105
  dyny (0.0.3)
91
106
  rails
@@ -94,6 +109,10 @@ GEM
94
109
  activesupport (>= 5.0)
95
110
  i18n (1.13.0)
96
111
  concurrent-ruby (~> 1.0)
112
+ io-console (0.6.0)
113
+ irb (1.9.1)
114
+ rdoc
115
+ reline (>= 0.3.8)
97
116
  json (2.6.3)
98
117
  loofah (2.21.3)
99
118
  crass (~> 1.0.2)
@@ -104,9 +123,9 @@ GEM
104
123
  net-pop
105
124
  net-smtp
106
125
  marcel (1.0.2)
107
- method_source (1.0.0)
108
126
  mini_mime (1.1.2)
109
127
  minitest (5.18.0)
128
+ mutex_m (0.2.0)
110
129
  net-imap (0.3.4)
111
130
  date
112
131
  net-protocol
@@ -122,39 +141,53 @@ GEM
122
141
  parallel (1.23.0)
123
142
  parser (3.2.2.1)
124
143
  ast (~> 2.4.1)
144
+ psych (5.1.1.1)
145
+ stringio
125
146
  racc (1.6.2)
126
147
  rack (2.2.7)
148
+ rack-session (1.0.1)
149
+ rack (< 3)
127
150
  rack-test (2.1.0)
128
151
  rack (>= 1.3)
129
- rails (7.0.4.3)
130
- actioncable (= 7.0.4.3)
131
- actionmailbox (= 7.0.4.3)
132
- actionmailer (= 7.0.4.3)
133
- actionpack (= 7.0.4.3)
134
- actiontext (= 7.0.4.3)
135
- actionview (= 7.0.4.3)
136
- activejob (= 7.0.4.3)
137
- activemodel (= 7.0.4.3)
138
- activerecord (= 7.0.4.3)
139
- activestorage (= 7.0.4.3)
140
- activesupport (= 7.0.4.3)
152
+ rackup (1.0.0)
153
+ rack (< 3)
154
+ webrick
155
+ rails (7.1.2)
156
+ actioncable (= 7.1.2)
157
+ actionmailbox (= 7.1.2)
158
+ actionmailer (= 7.1.2)
159
+ actionpack (= 7.1.2)
160
+ actiontext (= 7.1.2)
161
+ actionview (= 7.1.2)
162
+ activejob (= 7.1.2)
163
+ activemodel (= 7.1.2)
164
+ activerecord (= 7.1.2)
165
+ activestorage (= 7.1.2)
166
+ activesupport (= 7.1.2)
141
167
  bundler (>= 1.15.0)
142
- railties (= 7.0.4.3)
143
- rails-dom-testing (2.0.3)
144
- activesupport (>= 4.2.0)
168
+ railties (= 7.1.2)
169
+ rails-dom-testing (2.2.0)
170
+ activesupport (>= 5.0.0)
171
+ minitest
145
172
  nokogiri (>= 1.6)
146
- rails-html-sanitizer (1.5.0)
147
- loofah (~> 2.19, >= 2.19.1)
148
- railties (7.0.4.3)
149
- actionpack (= 7.0.4.3)
150
- activesupport (= 7.0.4.3)
151
- method_source
173
+ rails-html-sanitizer (1.6.0)
174
+ loofah (~> 2.21)
175
+ nokogiri (~> 1.14)
176
+ railties (7.1.2)
177
+ actionpack (= 7.1.2)
178
+ activesupport (= 7.1.2)
179
+ irb
180
+ rackup (>= 1.0.0)
152
181
  rake (>= 12.2)
153
- thor (~> 1.0)
154
- zeitwerk (~> 2.5)
182
+ thor (~> 1.0, >= 1.2.2)
183
+ zeitwerk (~> 2.6)
155
184
  rainbow (3.1.1)
156
185
  rake (13.0.6)
186
+ rdoc (6.6.0)
187
+ psych (>= 4.0.0)
157
188
  regexp_parser (2.8.0)
189
+ reline (0.4.0)
190
+ io-console (~> 0.5)
158
191
  request_store (1.5.1)
159
192
  rack (>= 1.4)
160
193
  rexml (3.2.5)
@@ -182,11 +215,13 @@ GEM
182
215
  simple_form (5.2.0)
183
216
  actionpack (>= 5.2)
184
217
  activemodel (>= 5.2)
218
+ stringio (3.0.9)
185
219
  thor (1.2.2)
186
- timeout (0.3.2)
220
+ timeout (0.4.1)
187
221
  tzinfo (2.0.6)
188
222
  concurrent-ruby (~> 1.0)
189
223
  unicode-display_width (2.4.2)
224
+ webrick (1.8.1)
190
225
  websocket-driver (0.7.5)
191
226
  websocket-extensions (>= 0.1.0)
192
227
  websocket-extensions (0.1.5)
@@ -15,7 +15,9 @@ class ComponyController < ApplicationController
15
15
 
16
16
  # Define controller action for each standalone config
17
17
  define_method(standalone_config.rails_action_name) do
18
- verb_config = standalone_config.verbs[request.raw_request_method.downcase.to_sym]
18
+ translated_verb = request.raw_request_method.downcase.to_sym
19
+ translated_verb = :get if translated_verb == :head # Rails transparently converts HEAD to GET, so we must do the same for fetching the config.
20
+ verb_config = standalone_config.verbs[translated_verb]
19
21
  Compony.comp_class_for!(comp_cst, family_cst).new.on_standalone_access(verb_config, self)
20
22
  end
21
23
 
data/compony.gemspec CHANGED
@@ -2,19 +2,19 @@
2
2
  # This file is auto-generated via: 'rake gemspec'.
3
3
 
4
4
  # -*- encoding: utf-8 -*-
5
- # stub: compony 0.1.1 ruby lib
5
+ # stub: compony 0.2.1 ruby lib
6
6
 
7
7
  Gem::Specification.new do |s|
8
8
  s.name = "compony".freeze
9
- s.version = "0.1.1".freeze
9
+ s.version = "0.2.1".freeze
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-11-23"
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/color.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/percentage.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]
14
+ s.date = "2024-01-22"
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/locales/fr.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/color.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/percentage.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
- s.rubygems_version = "3.4.21".freeze
17
+ s.rubygems_version = "3.4.22".freeze
18
18
  s.summary = "Needs summary".freeze
19
19
 
20
20
  s.specification_version = 4
@@ -0,0 +1,33 @@
1
+ fr:
2
+ compony:
3
+ cancel: 'Annuler'
4
+ filtered: '[Filtré]' # Not translated as this appears in log
5
+ boolean:
6
+ true: 'Oui'
7
+ false: 'Non'
8
+ feasibility:
9
+ has_dependent_models: 'il existe des %{dependent_class} dépendants'
10
+ model_fields:
11
+ attachment:
12
+ download: 'Télécharger'
13
+ components:
14
+ form:
15
+ submit: 'Envoyer'
16
+ cancel: 'Annuler'
17
+ edit:
18
+ label:
19
+ long: 'Modifier %{data_label}'
20
+ short: 'Modifier'
21
+ data_was_updated: '%{data_label} a été enregistré.'
22
+ new:
23
+ label:
24
+ long: 'Créer %{data_class}'
25
+ short: 'Nouveau'
26
+ data_was_created: '%{data_label} a été créé.'
27
+ destroy:
28
+ label:
29
+ long: 'Supprimer %{data_label}'
30
+ short: 'Supprimer'
31
+ confirm_question: 'Voulez-vous vraiment supprimer %{data_label} ?'
32
+ confirm_button: 'Oui, supprimer'
33
+ data_was_destroyed: '%{data_label} a été supprimé.'
@@ -37,7 +37,6 @@ module Compony
37
37
  setup_blocks.each do |setup_block|
38
38
  instance_exec(&setup_block)
39
39
  end
40
- check_config!
41
40
  end
42
41
 
43
42
  def inspect
@@ -228,9 +227,5 @@ module Compony
228
227
  def resourceful?
229
228
  return false
230
229
  end
231
-
232
- protected
233
-
234
- def check_config!; end
235
230
  end
236
231
  end
@@ -14,7 +14,7 @@ module Compony
14
14
  end
15
15
 
16
16
  # For internal usage only, processes the block and returns a config hash.
17
- def to_conf(&)
17
+ def to_conf(provide_defaults:, &)
18
18
  return super.deep_merge({
19
19
  load_data_block: @load_data_block,
20
20
  assign_attributes_block: @assign_attributes_block,
@@ -4,11 +4,13 @@ module Compony
4
4
  module Standalone
5
5
  # @api description
6
6
  # Wrapper and DSL helper for component's standalone config
7
+ # Pass `provide_defaults` true if this is the first standalone DSL of a component. Pass false if it is a subsequent one (e.g. if subclassed comp)
7
8
  class StandaloneDsl < Dslblend::Base
8
- def initialize(component, name = nil, path: nil)
9
+ def initialize(component, name = nil, provide_defaults:, path: nil)
9
10
  super()
10
11
  @component = component
11
12
  @name = name&.to_sym
13
+ @provide_defaults = provide_defaults
12
14
  @path = path
13
15
  @verbs = {}
14
16
  @skip_authentication = false
@@ -38,8 +40,17 @@ module Compony
38
40
  def verb(verb, *args, **nargs, &)
39
41
  verb = verb.to_sym
40
42
  verb_dsl_class = @component.resourceful? ? ResourcefulVerbDsl : VerbDsl
41
- @verbs[verb] ||= Compony::MethodAccessibleHash.new
42
- @verbs[verb].deep_merge! verb_dsl_class.new(@component, verb, *args, **nargs).to_conf(&)
43
+ if @verbs[verb]
44
+ @verbs[verb].deep_merge! verb_dsl_class.new(@component, verb, *args, **nargs).to_conf(provide_defaults: false, &)
45
+ else
46
+ # Note about provide_defaults:
47
+ # - We must pass false if this is the second time `standalone` was called for this component -> see @provide_defaults
48
+ # - We musst pass false if this is the second time `verb` was called for this component -> handled by the if statement (other branch)
49
+ # - We must pass true otherwise (handled by this branch)
50
+ @verbs[verb] = Compony::MethodAccessibleHash.new(
51
+ verb_dsl_class.new(@component, verb, *args, **nargs).to_conf(provide_defaults: @provide_defaults, &)
52
+ )
53
+ end
43
54
  end
44
55
 
45
56
  # DSL
@@ -17,18 +17,19 @@ module Compony
17
17
 
18
18
  @component = component
19
19
  @verb = verb
20
- @respond_blocks = { nil => proc { render_standalone(controller) } } # default format
20
+ @respond_blocks = {}
21
21
  @authorize_block = nil
22
22
  end
23
23
 
24
24
  # For internal usage only, processes the block and returns a config hash.
25
- def to_conf(&)
25
+ def to_conf(provide_defaults:, &)
26
26
  evaluate(&) if block_given?
27
- return {
27
+ base_config = provide_defaults ? default_config : {}
28
+ return base_config.deep_merge({
28
29
  verb: @verb,
29
- authorize_block: @authorize_block || proc { can?(comp_name.to_sym, family_name.to_sym) },
30
+ authorize_block: @authorize_block,
30
31
  respond_blocks: @respond_blocks
31
- }.compact
32
+ }.compact)
32
33
  end
33
34
 
34
35
  protected
@@ -45,6 +46,14 @@ module Compony
45
46
  def respond(format = nil, &block)
46
47
  @respond_blocks[format&.to_sym] = block
47
48
  end
49
+
50
+ # Internal, do not use
51
+ def default_config
52
+ return {
53
+ authorize_block: proc { can?(comp_name.to_sym, family_name.to_sym) },
54
+ respond_blocks: { nil => proc { render_standalone(controller) } }
55
+ }
56
+ end
48
57
  end
49
58
  end
50
59
  end
@@ -57,7 +57,7 @@ module Compony
57
57
  end
58
58
 
59
59
  # TODO: Make much prettier, providing message, action, subject and conditions
60
- fail CanCan::AccessDenied, inspect unless request_context.evaluate(&verb_config.authorize_block)
60
+ fail CanCan::AccessDenied, [inspect, verb_config.authorize_block.inspect].join(', ') unless request_context.evaluate(&verb_config.authorize_block)
61
61
 
62
62
  if verb_config.store_data_block
63
63
  request_context.evaluate_with_backfire(&verb_config.store_data_block)
@@ -107,8 +107,11 @@ module Compony
107
107
  def standalone(name = nil, *args, **nargs, &block)
108
108
  block = proc {} unless block_given? # If called without a block, must default to an empty block to provide a binding to the DSL.
109
109
  name = name&.to_sym # nil name is the most common case
110
- @standalone_configs[name] ||= Compony::MethodAccessibleHash.new
111
- @standalone_configs[name].deep_merge! StandaloneDsl.new(self, name, *args, **nargs).to_conf(&block)
110
+ if @standalone_configs[name]
111
+ @standalone_configs[name].deep_merge! StandaloneDsl.new(self, name, *args, provide_defaults: false, **nargs).to_conf(&block)
112
+ else
113
+ @standalone_configs[name] = Compony::MethodAccessibleHash.new(StandaloneDsl.new(self, name, *args, provide_defaults: true, **nargs).to_conf(&block))
114
+ end
112
115
  end
113
116
 
114
117
  # Undoes previous standalone calls
@@ -8,13 +8,11 @@ module Compony
8
8
  super
9
9
  end
10
10
 
11
- def check_config!
12
- super
13
- fail "#{inspect} requires config.form_fields do ..." if @form_fields.blank?
14
- end
15
-
16
11
  setup do
17
12
  before_render do
13
+ # Make sure the error message is going to be nice if form_fields were not implemented
14
+ fail "#{component.inspect} requires config.form_fields do ..." if @form_fields.nil?
15
+
18
16
  # Must render the buttons now as the rendering within simple form breaks the form
19
17
  @submit_button = Compony.button_component_class.new(
20
18
  label: @submit_label || I18n.t('compony.components.form.submit'), icon: 'arrow-right', type: :submit
@@ -88,7 +86,7 @@ module Compony
88
86
  if hidden
89
87
  return model_field.simpleform_input_hidden(@simpleform, self, **input_opts)
90
88
  else
91
- unless @focus_given
89
+ unless @focus_given || @skip_autofocus
92
90
  input_opts[:autofocus] = true unless input_opts.key? :autofocus
93
91
  @focus_given = true
94
92
  end
@@ -138,6 +136,11 @@ module Compony
138
136
  fail 'schema requires a block to be given'
139
137
  end
140
138
  end
139
+
140
+ # DSL method, skips adding autofocus to the first field
141
+ def skip_autofocus
142
+ @skip_autofocus = true
143
+ end
141
144
  end
142
145
  end
143
146
  end
@@ -4,6 +4,11 @@ module Compony
4
4
  # This component is destined to take a sub-component that is a form component.
5
5
  # It can be called via :get or via `submit_verb` depending on whether its form should be shown or submitted.
6
6
  class WithForm < Component
7
+ def initialize(...)
8
+ @submit_path_block = ->(controller) { controller.helpers.send("#{Compony.path_helper_name(comp_name, family_name)}_path") }
9
+ super
10
+ end
11
+
7
12
  # Returns an instance of the form component responsible for rendering the form.
8
13
  # Feel free to override this in subclasses.
9
14
  def form_comp
@@ -11,7 +16,7 @@ module Compony
11
16
  self,
12
17
  submit_verb:,
13
18
  # If applicable, Rails adds the route keys automatically, thus, e.g. :id does not need to be passed here, as it comes from the request.
14
- submit_path: ->(controller) { controller.helpers.send("#{Compony.path_helper_name(comp_name, family_name)}_path") }
19
+ submit_path: @submit_path_block
15
20
  )
16
21
  end
17
22
 
@@ -32,6 +37,13 @@ module Compony
32
37
  def form_comp_class(new_form_comp_class = nil)
33
38
  @form_comp_class ||= new_form_comp_class
34
39
  end
40
+
41
+ # DSL method
42
+ # Overrides the submit path which would otherwise default to this component
43
+ # This takes a block that will be called and given a controller
44
+ def submit_path(&new_submit_path_block)
45
+ @submit_path_block = new_submit_path_block
46
+ end
35
47
  end
36
48
  end
37
49
  end
@@ -1,7 +1,7 @@
1
1
  module Compony
2
2
  module Version
3
3
  MAJOR = 0
4
- MINOR = 1
4
+ MINOR = 2
5
5
  PATCH = 1
6
6
 
7
7
  EDGE = false
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.1.1
4
+ version: 0.2.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: 2023-11-23 00:00:00.000000000 Z
12
+ date: 2024-01-22 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: yard
@@ -184,6 +184,7 @@ files:
184
184
  - compony.gemspec
185
185
  - config/locales/de.yml
186
186
  - config/locales/en.yml
187
+ - config/locales/fr.yml
187
188
  - config/routes.rb
188
189
  - doc/resourceful_lifecycle.graphml
189
190
  - doc/resourceful_lifecycle.pdf