base_editing_bootstrap 0.13.0 → 0.15.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +33 -0
- data/README.md +33 -1
- data/app/controllers/base_editing_controller.rb +15 -10
- data/app/controllers/restricted_area_controller.rb +1 -0
- data/app/helpers/base_editing_helper.rb +1 -14
- data/app/helpers/utilities/form_helper.rb +8 -2
- data/app/helpers/utilities/icon_helper.rb +19 -0
- data/app/helpers/utilities/search_helper.rb +10 -1
- data/app/views/base_editing/_form_field.html.erb +24 -4
- data/app/views/base_editing/cell_field/_boolean.html.erb +3 -0
- data/app/views/base_editing/form_field/_boolean.html.erb +2 -0
- data/base_editing_bootstrap.gemspec +2 -2
- data/config/locales/it.yml +10 -0
- data/lib/base_editing_bootstrap/VERSION +1 -1
- data/lib/base_editing_bootstrap/action_translation.rb +39 -0
- data/lib/base_editing_bootstrap/base_model.rb +3 -2
- data/lib/base_editing_bootstrap/forms/base.rb +1 -0
- data/lib/base_editing_bootstrap/resource_finder.rb +30 -0
- data/lib/generators/base_editing_bootstrap/cell_override/cell_override_generator.rb +1 -1
- data/lib/generators/base_editing_bootstrap/field_override/field_override_generator.rb +1 -1
- data/lib/generators/base_editing_bootstrap/scaffold/scaffold_generator.rb +5 -4
- data/lib/generators/base_editing_bootstrap/scaffold/templates/policy.rb.tt +6 -0
- data/spec/support/external_shared/base_editing_controller_helpers.rb +5 -2
- data/spec/support/external_shared/base_model.rb +4 -1
- data/spec/support/external_shared/pundit.rb +10 -1
- metadata +13 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6aef652b3fc0651d54b2a217bbb32a6e750135ffc1216faa82dee66ad788e5b4
|
4
|
+
data.tar.gz: b9cf8df48a6c26bb2e67b7d65d9059e4fa974defb7e58ef1863f8e065e75af7a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0d639657a9314a263c38b30e390af56f21b94071f835f4d59ccea7818f7799a3899081c534e2183349122968bd81347904ea1eb46996fa9190521039785b881d
|
7
|
+
data.tar.gz: b87959282627c61dc5b8f233503a3932cc0cb0a53ba25a192065a9ee765b95a754b55efc5998e4ec1032ca9ecdee0db334edce0f19563621c0026d97d873be2e
|
data/CHANGELOG.md
CHANGED
@@ -2,6 +2,39 @@
|
|
2
2
|
All notable changes to this project will be documented in this file. See [conventional commits](https://www.conventionalcommits.org/) for commit guidelines.
|
3
3
|
|
4
4
|
- - -
|
5
|
+
## 0.15.0 - 2024-11-11
|
6
|
+
#### Bug Fixes
|
7
|
+
- Add Password for in standard fields - (593c8c2) - Marino Bonetti
|
8
|
+
- Form helper for non ActiveRecords - (9e124de) - Marino Bonetti
|
9
|
+
- Removed old code - (cbf1cd0) - Marino Bonetti
|
10
|
+
- Add translations for actionmodel - (3be05ca) - Marino Bonetti
|
11
|
+
#### Features
|
12
|
+
- Add debug helper logger for PunditNotAuthorized - (a9b30d6) - Marino Bonetti
|
13
|
+
- Human action messages (#10) - (63f9de9) - Marino Bonetti
|
14
|
+
#### Tests
|
15
|
+
- Add check for human_action_message method - (38af466) - Marino Bonetti
|
16
|
+
- Better tests messages - (cda150e) - Marino Bonetti
|
17
|
+
|
18
|
+
- - -
|
19
|
+
|
20
|
+
## 0.14.0 - 2024-10-14
|
21
|
+
#### Bug Fixes
|
22
|
+
- Namespaced resources (#7) - (e85f926) - Marino Bonetti
|
23
|
+
#### Continuous Integration
|
24
|
+
- Start Enabling Rails 8.0 - (9c66914) - Marino Bonetti
|
25
|
+
- Fix scaffold generator questions - (0379151) - Marino Bonetti
|
26
|
+
#### Documentation
|
27
|
+
- Add more info in spec desc - (82ab3a7) - Marino Bonetti
|
28
|
+
- Add docs for Development - (616a0ea) - Marino Bonetti
|
29
|
+
- Add locals form partial - (022eb83) - Marino Bonetti
|
30
|
+
#### Features
|
31
|
+
- Boolean field - (8c7d0a2) - Marino Bonetti
|
32
|
+
- Auto remove input-group for checkboxes - (d5b13d2) - Marino Bonetti
|
33
|
+
- Add searchable columns - (9ccfb6f) - Marino Bonetti
|
34
|
+
- Add option to FullDisallowPolicy - (6468967) - Marino Bonetti
|
35
|
+
|
36
|
+
- - -
|
37
|
+
|
5
38
|
## 0.13.0 - 2024-10-02
|
6
39
|
#### Bug Fixes
|
7
40
|
- Correct generator - (c3a5e60) - Marino Bonetti
|
data/README.md
CHANGED
@@ -146,6 +146,7 @@ Utilizzo per modello base, in questo esempio prendiamo come modello Post come es
|
|
146
146
|
- Decimal => _decimal.html.erb
|
147
147
|
- DateTime => _datetime.html.erb
|
148
148
|
- Date => _date.html.erb
|
149
|
+
- Boolean => _boolean.html.erb
|
149
150
|
- Enum => _enum.html.erb
|
150
151
|
Per gli enum, le traduzioni dei labels di ogni valore provvengono da i18n
|
151
152
|
attraverso l'helper: `Utilities::EnumHelper#enum_translation`
|
@@ -220,9 +221,40 @@ RSpec.describe ServicePolicy, type: :policy do
|
|
220
221
|
end
|
221
222
|
```
|
222
223
|
|
224
|
+
## Message translations
|
225
|
+
I messaggi di generati per il flash provengono dal metodo BaseEditingBootstrap::ActionTranslation.human_action_message
|
226
|
+
e seguono una logica simile ad human_attribute_name.
|
227
|
+
Sono già presenti i messaggi di default, a cui viene passato il nome del modello,
|
228
|
+
ma è possibile fare override del messaggio con la classe:
|
229
|
+
|
230
|
+
```yaml
|
231
|
+
LANG:
|
232
|
+
activerecord:
|
233
|
+
successful:
|
234
|
+
messages:
|
235
|
+
created: "example %{model}"
|
236
|
+
updated:
|
237
|
+
destroyed:
|
238
|
+
CLASS_NAME:
|
239
|
+
created: "customized %{model} created"
|
240
|
+
unsuccessful:
|
241
|
+
messages:
|
242
|
+
created:
|
243
|
+
updated:
|
244
|
+
```
|
245
|
+
|
246
|
+
|
223
247
|
|
224
248
|
## Contributing
|
225
|
-
|
249
|
+
1. Setup env with:
|
250
|
+
```shell
|
251
|
+
docker compose run app spec/dummy/bin/setup
|
252
|
+
```
|
253
|
+
|
254
|
+
2. Start environment with:
|
255
|
+
```shell
|
256
|
+
docker compose up
|
257
|
+
```
|
226
258
|
|
227
259
|
## License
|
228
260
|
The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
|
@@ -86,12 +86,14 @@ class BaseEditingController < RestrictedAreaController
|
|
86
86
|
|
87
87
|
def base_class
|
88
88
|
return @_base_class if @_base_class
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
89
|
+
finder = BaseEditingBootstrap::ResourceFinder.new(controller_path)
|
90
|
+
if finder.model
|
91
|
+
logger.debug { "Editazione del controller:#{controller_path} per modello: #{finder.model.to_s}" }
|
92
|
+
else
|
93
|
+
raise "Non riesco a restituire la classe base per il controller #{controller_path}"
|
94
|
+
end
|
93
95
|
|
94
|
-
@_base_class =
|
96
|
+
@_base_class = finder.model
|
95
97
|
end
|
96
98
|
|
97
99
|
private
|
@@ -184,13 +186,13 @@ class BaseEditingController < RestrictedAreaController
|
|
184
186
|
format.all do
|
185
187
|
redirect_to index_custom_polymorphic_path(base_class),
|
186
188
|
status: :see_other,
|
187
|
-
notice:
|
189
|
+
notice: human_action_message(action: :destroyed)
|
188
190
|
end
|
189
191
|
end
|
190
192
|
|
191
193
|
def _failed_create(format)
|
192
194
|
format.html do
|
193
|
-
flash.now.alert =
|
195
|
+
flash.now.alert = human_action_message(action: :created, successful: false)
|
194
196
|
render action: :new, status: :unprocessable_entity
|
195
197
|
end
|
196
198
|
end
|
@@ -205,13 +207,13 @@ class BaseEditingController < RestrictedAreaController
|
|
205
207
|
end
|
206
208
|
redirect_to path,
|
207
209
|
status: :see_other,
|
208
|
-
notice:
|
210
|
+
notice: human_action_message(action: :created)
|
209
211
|
end
|
210
212
|
end
|
211
213
|
|
212
214
|
def _failed_update(format)
|
213
215
|
format.html do
|
214
|
-
flash.now.alert =
|
216
|
+
flash.now.alert = human_action_message(action: :updated, successful: false)
|
215
217
|
render action: :edit, status: :unprocessable_entity
|
216
218
|
end
|
217
219
|
end
|
@@ -226,7 +228,10 @@ class BaseEditingController < RestrictedAreaController
|
|
226
228
|
end
|
227
229
|
redirect_to path,
|
228
230
|
status: :see_other,
|
229
|
-
notice:
|
231
|
+
notice: human_action_message(action: :updated)
|
230
232
|
end
|
231
233
|
end
|
234
|
+
|
235
|
+
delegate :human_action_message, to: :base_class
|
236
|
+
|
232
237
|
end
|
@@ -18,6 +18,7 @@ class RestrictedAreaController < BaseEditingBootstrap.inherited_controller.const
|
|
18
18
|
private
|
19
19
|
|
20
20
|
def user_not_authorized(exception)
|
21
|
+
Rails.logger.debug{"Pundit::NotAuthorizedError [#{exception.message}]"}
|
21
22
|
policy_name = exception.policy.class.to_s.underscore
|
22
23
|
|
23
24
|
flash[:error] = t "#{policy_name}.#{exception.query}", scope: "pundit", default: :default
|
@@ -3,20 +3,7 @@ module BaseEditingHelper
|
|
3
3
|
include Utilities::EnumHelper
|
4
4
|
include Utilities::SearchHelper
|
5
5
|
include Utilities::FormHelper
|
6
|
+
include Utilities::IconHelper
|
6
7
|
|
7
8
|
|
8
|
-
##
|
9
|
-
# Genera le icone di Bootstrap icons
|
10
|
-
def icon( name, text = nil, html_options = {})
|
11
|
-
text, html_options = nil, text if text.is_a?(Hash)
|
12
|
-
|
13
|
-
content_class = "bi-#{name}"
|
14
|
-
content_class << " #{html_options[:class]}" if html_options.key?(:class)
|
15
|
-
html_options[:class] = content_class
|
16
|
-
html_options['aria-hidden'] ||= true
|
17
|
-
|
18
|
-
html = content_tag(:i, nil, html_options)
|
19
|
-
html << ' ' << text.to_s unless text.blank?
|
20
|
-
html
|
21
|
-
end
|
22
9
|
end
|
@@ -18,10 +18,14 @@ module Utilities
|
|
18
18
|
# @param [Symbol] field
|
19
19
|
def form_print_field(form, field)
|
20
20
|
locals = {form:, field:}
|
21
|
-
if form.object.class.defined_enums.key?(field.to_s)
|
21
|
+
if form.object.class.respond_to?(:defined_enums) && form.object.class.defined_enums.key?(field.to_s)
|
22
22
|
generic_field = "enum"
|
23
23
|
else
|
24
|
-
|
24
|
+
if form.object.class.respond_to?(:type_for_attribute)
|
25
|
+
type = form.object.class.type_for_attribute(field).type
|
26
|
+
else
|
27
|
+
type = :string
|
28
|
+
end
|
25
29
|
case type
|
26
30
|
when :datetime
|
27
31
|
generic_field = "datetime"
|
@@ -35,6 +39,8 @@ module Utilities
|
|
35
39
|
generic_field = "decimal"
|
36
40
|
when :integer
|
37
41
|
generic_field = "integer"
|
42
|
+
when :boolean
|
43
|
+
generic_field = "boolean"
|
38
44
|
else
|
39
45
|
generic_field = "base"
|
40
46
|
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Utilities::IconHelper
|
4
|
+
|
5
|
+
##
|
6
|
+
# Genera le icone di Bootstrap icons
|
7
|
+
def icon( name, text = nil, html_options = {})
|
8
|
+
text, html_options = nil, text if text.is_a?(Hash)
|
9
|
+
|
10
|
+
content_class = "bi-#{name}"
|
11
|
+
content_class += " #{html_options[:class]}" if html_options.key?(:class)
|
12
|
+
html_options[:class] = content_class
|
13
|
+
html_options['aria-hidden'] ||= true
|
14
|
+
|
15
|
+
html = content_tag(:i, nil, html_options)
|
16
|
+
html << ' ' << text.to_s unless text.blank?
|
17
|
+
html
|
18
|
+
end
|
19
|
+
end
|
@@ -1,6 +1,8 @@
|
|
1
1
|
module Utilities
|
2
2
|
module SearchHelper
|
3
3
|
include TemplateHelper
|
4
|
+
include PageHelper
|
5
|
+
include IconHelper
|
4
6
|
|
5
7
|
##
|
6
8
|
# Per aggiungere bottoni:
|
@@ -32,7 +34,14 @@ module Utilities
|
|
32
34
|
when :created_at, :updated_at
|
33
35
|
"timestamps"
|
34
36
|
else
|
35
|
-
|
37
|
+
type = obj.class.type_for_attribute(field).type
|
38
|
+
case type
|
39
|
+
when :boolean
|
40
|
+
"boolean"
|
41
|
+
else
|
42
|
+
"base"
|
43
|
+
end
|
44
|
+
|
36
45
|
end
|
37
46
|
template = find_template_with_fallbacks(
|
38
47
|
obj,
|
@@ -1,7 +1,27 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
<%
|
2
|
+
##
|
3
|
+
# Template per il rendering campo
|
4
|
+
# - form -> FormBuilder
|
5
|
+
# - form_field -> Array[String]
|
6
|
+
%>
|
7
|
+
<%# locals: (form:, form_field:) -%>
|
8
|
+
<%= form.label(form_field, class: ["form-label", "form-#{form_field}-label"]) %>
|
9
|
+
|
10
|
+
<%
|
11
|
+
button_group_classes = ["mb-2"]
|
12
|
+
|
13
|
+
content = form_print_field(form, form_field)
|
14
|
+
unless content.match "checkbox"
|
15
|
+
button_group_classes << "input-group"
|
16
|
+
end
|
17
|
+
|
18
|
+
button_group_classes << (form.object.validated? ? "has-validation" : "")
|
19
|
+
button_group_classes << "form-#{form_field}-input-group"
|
20
|
+
|
21
|
+
%>
|
22
|
+
<%= content_tag :div, class: button_group_classes.join(" ") do %>
|
3
23
|
<%= render partial: "editing_form_measure_unit", locals: {object: form.object, field: form_field} %>
|
4
|
-
<%=
|
24
|
+
<%= content %>
|
5
25
|
<%= error_messages_for(form.object, form_field) %>
|
6
|
-
|
26
|
+
<% end %>
|
7
27
|
<%= render partial: "editing_form_help_text", locals: {object: form.object, field: form_field} %>
|
@@ -29,7 +29,7 @@ Gem::Specification.new do |spec|
|
|
29
29
|
end
|
30
30
|
spec.files += Dir['spec/support/external_shared/*.rb']
|
31
31
|
|
32
|
-
spec.add_dependency "rails", [">= 7.0", "< 8.
|
32
|
+
spec.add_dependency "rails", [">= 7.0", "< 8.1"]
|
33
33
|
# Policy
|
34
34
|
spec.add_dependency "pundit", ["~> 2.3", ">= 2.3.1"]
|
35
35
|
# Search
|
@@ -42,7 +42,7 @@ Gem::Specification.new do |spec|
|
|
42
42
|
spec.add_development_dependency "factory_bot_rails", '~> 6.4'
|
43
43
|
spec.add_development_dependency 'faker', '~> 3.3'
|
44
44
|
spec.add_development_dependency "puma", '~> 6.4'
|
45
|
-
spec.add_development_dependency "sqlite3", '
|
45
|
+
spec.add_development_dependency "sqlite3", '>= 1.7.x'
|
46
46
|
spec.add_development_dependency "sprockets-rails", '~> 3.4'
|
47
47
|
spec.add_development_dependency 'rails-i18n', '~> 7.0' # For 7.0.0
|
48
48
|
spec.add_development_dependency "i18n-debug", '~> 1.2'
|
data/config/locales/it.yml
CHANGED
@@ -40,6 +40,16 @@ it:
|
|
40
40
|
# post_policy:
|
41
41
|
# update?: 'You cannot edit this post!'
|
42
42
|
# create?: 'You cannot create posts!'
|
43
|
+
activemodel:
|
44
|
+
successful:
|
45
|
+
messages:
|
46
|
+
created: "%{model} creato correttamente."
|
47
|
+
updated: "%{model} aggiornato correttamente."
|
48
|
+
destroyed: "%{model} è stato correttamente cancellato."
|
49
|
+
unsuccessful:
|
50
|
+
messages:
|
51
|
+
created: "Ci sono errori che impediscono la creazione di %{model}"
|
52
|
+
updated: "Ci sono errori che impediscono l'aggiornamento di %{model}"
|
43
53
|
activerecord:
|
44
54
|
successful:
|
45
55
|
messages:
|
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.15.0
|
@@ -0,0 +1,39 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require 'active_support/concern'
|
3
|
+
|
4
|
+
module BaseEditingBootstrap
|
5
|
+
module ActionTranslation
|
6
|
+
|
7
|
+
extend ActiveSupport::Concern
|
8
|
+
|
9
|
+
class_methods do
|
10
|
+
|
11
|
+
##
|
12
|
+
# Viene generato un messaggio rispetto all'azione nel caso di successo o fallimento
|
13
|
+
# i messaggi seguono la stessa logica del human_attribute_name con inheritance delle classi`
|
14
|
+
#
|
15
|
+
# {i18n_scope della classe}.{successful|unsuccessful}.messages.{class_name}.{action}
|
16
|
+
# {i18n_scope della classe}.{successful|unsuccessful}.messages.{class_ancestors}.{action}
|
17
|
+
# {i18n_scope della classe}.{successful|unsuccessful}.messages.{action}
|
18
|
+
def human_action_message(action:, successful: true, **options)
|
19
|
+
|
20
|
+
successful_string = successful ? "successful" : "unsuccessful"
|
21
|
+
|
22
|
+
defaults = lookup_ancestors.map do |klass|
|
23
|
+
:"#{i18n_scope}.#{successful_string}.messages.#{klass.model_name.i18n_key}.#{action}"
|
24
|
+
end
|
25
|
+
|
26
|
+
defaults << options[:default] if options[:default]
|
27
|
+
defaults << :"#{i18n_scope}.#{successful_string}.messages.#{action}"
|
28
|
+
|
29
|
+
options.reverse_merge!(model: model_name.human)
|
30
|
+
|
31
|
+
I18n.t(
|
32
|
+
defaults.shift,
|
33
|
+
default: defaults,
|
34
|
+
**options
|
35
|
+
)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -6,6 +6,7 @@ module BaseEditingBootstrap
|
|
6
6
|
|
7
7
|
included do
|
8
8
|
include IsValidated
|
9
|
+
include ActionTranslation
|
9
10
|
delegate :ransackable_attributes, :ransackable_associations, to: :@class
|
10
11
|
end
|
11
12
|
|
@@ -16,8 +17,8 @@ module BaseEditingBootstrap
|
|
16
17
|
else
|
17
18
|
Pundit.policy(User.new, self.new).permitted_attributes_for_ransack.map(&:to_s)
|
18
19
|
end
|
19
|
-
end
|
20
|
-
|
20
|
+
end
|
21
|
+
|
21
22
|
def ransackable_associations(auth_object = nil)
|
22
23
|
if auth_object
|
23
24
|
Pundit.policy(auth_object, self.new).permitted_associations_for_ransack.map(&:to_s)
|
@@ -0,0 +1,30 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module BaseEditingBootstrap
|
4
|
+
##
|
5
|
+
# PORO to find the base classe in the BaseEditingController
|
6
|
+
class ResourceFinder
|
7
|
+
def initialize(controllar_path)
|
8
|
+
@controllar_path = controllar_path
|
9
|
+
@_model_class = false
|
10
|
+
end
|
11
|
+
|
12
|
+
# @return [NilClass|Object]
|
13
|
+
def model
|
14
|
+
if @_model_class === false
|
15
|
+
@_model_class = nil
|
16
|
+
if (anything = @controllar_path.singularize.camelize.safe_constantize)
|
17
|
+
@_model_class = anything
|
18
|
+
else
|
19
|
+
if @controllar_path.include?("/")
|
20
|
+
demodulize_one_level = @controllar_path.split("/")[1..].join("/")
|
21
|
+
if demodulize_one_level != @controllar_path
|
22
|
+
@_model_class = ResourceFinder.new(demodulize_one_level).model
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
@_model_class
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -7,7 +7,7 @@ module BaseEditingBootstrap
|
|
7
7
|
argument :name, type: :string, banner: "Post", required: true
|
8
8
|
argument :attributes, type: :array, default: [], banner: "field field:type"
|
9
9
|
|
10
|
-
TYPES = [:base
|
10
|
+
TYPES = [:base, :timestamps, :boolean].freeze
|
11
11
|
|
12
12
|
desc <<-DESCRIPTION.strip_heredoc
|
13
13
|
Description:
|
@@ -7,7 +7,7 @@ module BaseEditingBootstrap
|
|
7
7
|
argument :name, type: :string, banner: "Post", required: true
|
8
8
|
argument :attributes, type: :array, default: [], banner: "field field:type"
|
9
9
|
|
10
|
-
TYPES = %i[base date datetime decimal integer enum]
|
10
|
+
TYPES = %i[base date datetime decimal integer enum boolean]
|
11
11
|
|
12
12
|
desc <<-DESCRIPTION.strip_heredoc
|
13
13
|
Description:
|
@@ -31,7 +31,8 @@ module BaseEditingBootstrap
|
|
31
31
|
|
32
32
|
def add_policy
|
33
33
|
@search_attrs = []
|
34
|
-
|
34
|
+
@permitted_attributes = []
|
35
|
+
if yes? "Vuoi poter ricercare determinati campi con form di ricerca?(y/n)"
|
35
36
|
|
36
37
|
say "Gli attributi che hai indicato sono: #{ attributes_names.join(",")}"
|
37
38
|
say <<~MESSAGE
|
@@ -52,11 +53,11 @@ module BaseEditingBootstrap
|
|
52
53
|
out << [attr, *matchers.keys.collect{|m| "#{attr}#{m}" } ]
|
53
54
|
end
|
54
55
|
|
55
|
-
puts out.inspect
|
56
|
-
|
57
56
|
print_table(out,borders:true)
|
58
57
|
@search_attrs = ask("Inserisce un elenco diviso da virgola degli attributi da ricercare").split(",")
|
59
|
-
|
58
|
+
#cerchiamo di estrapolare gli attributi da rendere disponibili a ransack per la ricerca
|
59
|
+
@permitted_attributes = out.select{|c| c[1..].intersect?(@search_attrs) }.collect(&:first)
|
60
|
+
puts @permitted_attributes.inspect
|
60
61
|
end
|
61
62
|
|
62
63
|
template "policy.rb", File.join("app/policies", "#{singular_name}_policy.rb")
|
@@ -8,4 +8,10 @@ class <%= class_name %>Policy < BaseModelPolicy
|
|
8
8
|
%i[<%= @search_attrs.join(" ") %>]
|
9
9
|
end
|
10
10
|
<%- end -%>
|
11
|
+
<%- if @permitted_attributes.any? -%>
|
12
|
+
# TODO check if correct with search_fields
|
13
|
+
def permitted_attributes_for_ransack
|
14
|
+
%w[<%= @permitted_attributes.join(" ") %>]
|
15
|
+
end
|
16
|
+
<%- end -%>
|
11
17
|
end
|
@@ -130,6 +130,7 @@ RSpec.shared_examples "base editing controller" do |factory: nil, only: [], exce
|
|
130
130
|
# edit
|
131
131
|
expect(response).to redirect_to(url_for_edit.call(assigns[:object]))
|
132
132
|
end
|
133
|
+
expect(flash.to_hash).to include("notice" => be_present)
|
133
134
|
end
|
134
135
|
|
135
136
|
unless skip_invalid_checks
|
@@ -154,6 +155,7 @@ RSpec.shared_examples "base editing controller" do |factory: nil, only: [], exce
|
|
154
155
|
# edit
|
155
156
|
expect(response).to redirect_to(url_for_edit.call(assigns[:object]))
|
156
157
|
end
|
158
|
+
expect(flash.to_hash).to include("notice" => be_present)
|
157
159
|
end
|
158
160
|
|
159
161
|
unless skip_invalid_checks
|
@@ -171,6 +173,7 @@ RSpec.shared_examples "base editing controller" do |factory: nil, only: [], exce
|
|
171
173
|
delete url_for(persisted_instance)
|
172
174
|
expect(assigns[:object]).to be_an_instance_of(model)
|
173
175
|
expect(response).to redirect_to(url_for_succ_delete)
|
176
|
+
expect(flash.to_hash).to include("notice" => be_present)
|
174
177
|
end
|
175
178
|
|
176
179
|
it "not valid" do
|
@@ -180,7 +183,7 @@ RSpec.shared_examples "base editing controller" do |factory: nil, only: [], exce
|
|
180
183
|
end
|
181
184
|
delete url_for(persisted_instance)
|
182
185
|
expect(response).to redirect_to(url_for_fail_delete)
|
183
|
-
expect(flash
|
186
|
+
expect(flash.to_hash).to include("error" => be_present)
|
184
187
|
end
|
185
188
|
end
|
186
189
|
end
|
@@ -199,7 +202,7 @@ RSpec.shared_examples "fail with unauthorized" do |request: default_unathorized_
|
|
199
202
|
|
200
203
|
instance_exec(&request)
|
201
204
|
expect(response).to redirect_to(root_path)
|
202
|
-
expect(flash
|
205
|
+
expect(flash.to_hash).to include("error" => be_present)
|
203
206
|
end
|
204
207
|
end
|
205
208
|
|
@@ -2,6 +2,10 @@ RSpec.shared_examples "a base model" do |ransack_permitted_attributes: [], ransa
|
|
2
2
|
|
3
3
|
it_behaves_like "a validated? object"
|
4
4
|
|
5
|
+
it "human_action_message" do
|
6
|
+
expect(described_class).to respond_to(:human_action_message)
|
7
|
+
end
|
8
|
+
|
5
9
|
describe "with ransackables" do
|
6
10
|
where(:base_model_method, :policy_method, :policy_output, :result) do
|
7
11
|
[
|
@@ -54,7 +58,6 @@ end
|
|
54
58
|
|
55
59
|
RSpec.shared_examples "a validated? object" do
|
56
60
|
subject {
|
57
|
-
# prendiamo un modello a caso per testare questa cosa
|
58
61
|
described_class.new
|
59
62
|
}
|
60
63
|
|
@@ -28,6 +28,14 @@ RSpec.shared_examples "a standard base model policy" do |factory, check_default_
|
|
28
28
|
create: true,
|
29
29
|
index: true
|
30
30
|
}
|
31
|
+
elsif check_default_responses == :full_disallow
|
32
|
+
checks = {
|
33
|
+
show: false,
|
34
|
+
destroy: false,
|
35
|
+
update: false,
|
36
|
+
create: false,
|
37
|
+
index: false
|
38
|
+
}
|
31
39
|
elsif check_default_responses.is_a? Hash
|
32
40
|
checks = check_default_responses
|
33
41
|
elsif check_default_responses == false
|
@@ -37,6 +45,7 @@ RSpec.shared_examples "a standard base model policy" do |factory, check_default_
|
|
37
45
|
Acceptable values for check_default_responses are:
|
38
46
|
- true
|
39
47
|
- false
|
48
|
+
- :full_disallow -> all methods to false
|
40
49
|
- Hash with:
|
41
50
|
show
|
42
51
|
destroy
|
@@ -64,7 +73,7 @@ RSpec.shared_examples "a standard base model policy" do |factory, check_default_
|
|
64
73
|
end
|
65
74
|
|
66
75
|
with_them do
|
67
|
-
it "should " do
|
76
|
+
it "should respond_to? #{params[:method]}" do
|
68
77
|
expect(instance).to respond_to(method)
|
69
78
|
end
|
70
79
|
if check_default_responses
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: base_editing_bootstrap
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.15.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Marino Bonetti
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-
|
11
|
+
date: 2024-11-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -19,7 +19,7 @@ dependencies:
|
|
19
19
|
version: '7.0'
|
20
20
|
- - "<"
|
21
21
|
- !ruby/object:Gem::Version
|
22
|
-
version: '8.
|
22
|
+
version: '8.1'
|
23
23
|
type: :runtime
|
24
24
|
prerelease: false
|
25
25
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -29,7 +29,7 @@ dependencies:
|
|
29
29
|
version: '7.0'
|
30
30
|
- - "<"
|
31
31
|
- !ruby/object:Gem::Version
|
32
|
-
version: '8.
|
32
|
+
version: '8.1'
|
33
33
|
- !ruby/object:Gem::Dependency
|
34
34
|
name: pundit
|
35
35
|
requirement: !ruby/object:Gem::Requirement
|
@@ -164,16 +164,16 @@ dependencies:
|
|
164
164
|
name: sqlite3
|
165
165
|
requirement: !ruby/object:Gem::Requirement
|
166
166
|
requirements:
|
167
|
-
- - "
|
167
|
+
- - ">="
|
168
168
|
- !ruby/object:Gem::Version
|
169
|
-
version:
|
169
|
+
version: 1.7.x
|
170
170
|
type: :development
|
171
171
|
prerelease: false
|
172
172
|
version_requirements: !ruby/object:Gem::Requirement
|
173
173
|
requirements:
|
174
|
-
- - "
|
174
|
+
- - ">="
|
175
175
|
- !ruby/object:Gem::Version
|
176
|
-
version:
|
176
|
+
version: 1.7.x
|
177
177
|
- !ruby/object:Gem::Dependency
|
178
178
|
name: sprockets-rails
|
179
179
|
requirement: !ruby/object:Gem::Requirement
|
@@ -302,6 +302,7 @@ files:
|
|
302
302
|
- app/helpers/base_editing_helper.rb
|
303
303
|
- app/helpers/utilities/enum_helper.rb
|
304
304
|
- app/helpers/utilities/form_helper.rb
|
305
|
+
- app/helpers/utilities/icon_helper.rb
|
305
306
|
- app/helpers/utilities/page_helper.rb
|
306
307
|
- app/helpers/utilities/search_helper.rb
|
307
308
|
- app/helpers/utilities/template_helper.rb
|
@@ -331,9 +332,11 @@ files:
|
|
331
332
|
- app/views/base_editing/_search_result_row.html.erb
|
332
333
|
- app/views/base_editing/_tabs.html.erb
|
333
334
|
- app/views/base_editing/cell_field/_base.html.erb
|
335
|
+
- app/views/base_editing/cell_field/_boolean.html.erb
|
334
336
|
- app/views/base_editing/cell_field/_timestamps.html.erb
|
335
337
|
- app/views/base_editing/edit.html.erb
|
336
338
|
- app/views/base_editing/form_field/_base.html.erb
|
339
|
+
- app/views/base_editing/form_field/_boolean.html.erb
|
337
340
|
- app/views/base_editing/form_field/_date.html.erb
|
338
341
|
- app/views/base_editing/form_field/_datetime.html.erb
|
339
342
|
- app/views/base_editing/form_field/_decimal.html.erb
|
@@ -355,10 +358,12 @@ files:
|
|
355
358
|
- config/routes.rb
|
356
359
|
- lib/base_editing_bootstrap.rb
|
357
360
|
- lib/base_editing_bootstrap/VERSION
|
361
|
+
- lib/base_editing_bootstrap/action_translation.rb
|
358
362
|
- lib/base_editing_bootstrap/base_model.rb
|
359
363
|
- lib/base_editing_bootstrap/engine.rb
|
360
364
|
- lib/base_editing_bootstrap/forms/base.rb
|
361
365
|
- lib/base_editing_bootstrap/is_validated.rb
|
366
|
+
- lib/base_editing_bootstrap/resource_finder.rb
|
362
367
|
- lib/base_editing_bootstrap/searches/base.rb
|
363
368
|
- lib/base_editing_bootstrap/searches/field.rb
|
364
369
|
- lib/base_editing_bootstrap/version.rb
|