kono_utils 0.15.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/MIT-LICENSE +20 -0
- data/README.rdoc +442 -0
- data/Rakefile +23 -0
- data/app/assets/javascripts/kono_utils/utilities.coffee +456 -0
- data/app/assets/stylesheets/kono_utils/utils.css.scss +43 -0
- data/app/controllers/kono_utils/change_log_controller.rb +6 -0
- data/app/input/bs_aceeditor_input.rb +53 -0
- data/app/input/bs_autocomplete_input.rb +60 -0
- data/app/input/bs_datepicker_input.rb +16 -0
- data/app/input/bs_datetimepicker_input.rb +80 -0
- data/app/input/bs_file_download_input.rb +35 -0
- data/app/input/bs_image_input.rb +35 -0
- data/app/input/bs_label_with_container_input.rb +22 -0
- data/app/input/bs_location_picker_input.rb +95 -0
- data/app/input/bs_readonly_input.rb +52 -0
- data/app/input/bs_timepicker_input.rb +14 -0
- data/app/policies/kono_utils/base_editing_policy_concern.rb +27 -0
- data/app/views/kono_utils/base_editing/_edit.html.erb +3 -0
- data/app/views/kono_utils/base_editing/_edit_page_side_title_header.html.erb +3 -0
- data/app/views/kono_utils/base_editing/_edit_page_title_header.html.erb +3 -0
- data/app/views/kono_utils/base_editing/_form.html.erb +15 -0
- data/app/views/kono_utils/base_editing/_index_buttons.html.erb +2 -0
- data/app/views/kono_utils/base_editing/_index_page_side_title_header.html.erb +3 -0
- data/app/views/kono_utils/base_editing/_index_page_title_header.html.erb +3 -0
- data/app/views/kono_utils/base_editing/_index_tfoot.html.erb +0 -0
- data/app/views/kono_utils/base_editing/_new.html.erb +3 -0
- data/app/views/kono_utils/base_editing/_new_page_side_title_header.html.erb +3 -0
- data/app/views/kono_utils/base_editing/_new_page_title_header.html.erb +3 -0
- data/app/views/kono_utils/base_editing/_search_form.html.erb +1 -0
- data/app/views/kono_utils/base_editing/application/_edit_page_side_title_header.html.erb +1 -0
- data/app/views/kono_utils/base_editing/application/_edit_page_title_header.html.erb +1 -0
- data/app/views/kono_utils/base_editing/application/_index_page_side_title_header.html.erb +1 -0
- data/app/views/kono_utils/base_editing/application/_index_page_title_header.html.erb +1 -0
- data/app/views/kono_utils/base_editing/application/_new_page_side_title_header.html.erb +1 -0
- data/app/views/kono_utils/base_editing/application/_new_page_title_header.html.erb +1 -0
- data/app/views/kono_utils/base_editing/application/edit.html.erb +1 -0
- data/app/views/kono_utils/base_editing/application/new.html.erb +1 -0
- data/app/views/kono_utils/base_editing/edit.html.erb +1 -0
- data/app/views/kono_utils/base_editing/index.html.erb +36 -0
- data/app/views/kono_utils/base_editing/new.html.erb +1 -0
- data/app/views/kono_utils/change_log/index.html.erb +3 -0
- data/config/initializers/mysql.rb +12 -0
- data/config/initializers/time.rb +12 -0
- data/config/locales/it.yml +18 -0
- data/lib/generators/kono_utils/install/install_generator.rb +24 -0
- data/lib/generators/templates/initializer.rb +3 -0
- data/lib/kono_utils.rb +41 -0
- data/lib/kono_utils/application_helper.rb +625 -0
- data/lib/kono_utils/base_editing_helper.rb +194 -0
- data/lib/kono_utils/base_search.rb +173 -0
- data/lib/kono_utils/concerns.rb +10 -0
- data/lib/kono_utils/concerns/active_record_translation.rb +47 -0
- data/lib/kono_utils/concerns/base_editing.rb +195 -0
- data/lib/kono_utils/concerns/base_modals.rb +97 -0
- data/lib/kono_utils/concerns/success_message.rb +25 -0
- data/lib/kono_utils/encoder.rb +55 -0
- data/lib/kono_utils/engine.rb +13 -0
- data/lib/kono_utils/fiscal_code.rb +47 -0
- data/lib/kono_utils/params_hash_array.rb +37 -0
- data/lib/kono_utils/percentage.rb +60 -0
- data/lib/kono_utils/search_attribute.rb +57 -0
- data/lib/kono_utils/tmp_file.rb +81 -0
- data/lib/kono_utils/version.rb +3 -0
- data/lib/kono_utils/virtual_model.rb +22 -0
- data/lib/tasks/kono_utils_tasks.rake +4 -0
- data/spec/dummy/README.rdoc +28 -0
- data/spec/dummy/Rakefile +6 -0
- data/spec/dummy/app/assets/images/.keep +0 -0
- data/spec/dummy/app/assets/javascripts/application.js +13 -0
- data/spec/dummy/app/assets/stylesheets/application.css +15 -0
- data/spec/dummy/app/controllers/application_controller.rb +5 -0
- data/spec/dummy/app/controllers/concerns/.keep +0 -0
- data/spec/dummy/app/helpers/application_helper.rb +2 -0
- data/spec/dummy/app/mailers/.keep +0 -0
- data/spec/dummy/app/models/.keep +0 -0
- data/spec/dummy/app/models/concerns/.keep +0 -0
- data/spec/dummy/app/views/layouts/application.html.erb +14 -0
- data/spec/dummy/bin/bundle +3 -0
- data/spec/dummy/bin/rails +4 -0
- data/spec/dummy/bin/rake +4 -0
- data/spec/dummy/bin/setup +29 -0
- data/spec/dummy/config.ru +4 -0
- data/spec/dummy/config/application.rb +32 -0
- data/spec/dummy/config/boot.rb +5 -0
- data/spec/dummy/config/database.yml +25 -0
- data/spec/dummy/config/environment.rb +5 -0
- data/spec/dummy/config/environments/development.rb +41 -0
- data/spec/dummy/config/environments/production.rb +79 -0
- data/spec/dummy/config/environments/test.rb +42 -0
- data/spec/dummy/config/initializers/assets.rb +11 -0
- data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/spec/dummy/config/initializers/cookies_serializer.rb +3 -0
- data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
- data/spec/dummy/config/initializers/inflections.rb +16 -0
- data/spec/dummy/config/initializers/mime_types.rb +4 -0
- data/spec/dummy/config/initializers/session_store.rb +3 -0
- data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/spec/dummy/config/locales/en.yml +23 -0
- data/spec/dummy/config/routes.rb +56 -0
- data/spec/dummy/config/secrets.yml +22 -0
- data/spec/dummy/lib/assets/.keep +0 -0
- data/spec/dummy/log/.keep +0 -0
- data/spec/dummy/public/404.html +67 -0
- data/spec/dummy/public/422.html +67 -0
- data/spec/dummy/public/500.html +66 -0
- data/spec/dummy/public/favicon.ico +0 -0
- data/spec/lib/kono_utils/fiscal_code_spec.rb +56 -0
- data/spec/rails_helper.rb +53 -0
- data/spec/spec_helper.rb +92 -0
- data/vendor/assets/javascripts/EventEmitter.js +473 -0
- metadata +425 -0
@@ -0,0 +1,194 @@
|
|
1
|
+
module KonoUtils
|
2
|
+
module BaseEditingHelper
|
3
|
+
|
4
|
+
def BaseEditingHelper.included(mod)
|
5
|
+
if ::Rails.application.config.action_controller.include_all_helpers!=false
|
6
|
+
raise "Devi definire in config/application.rb config.action_controller.include_all_helpers=false
|
7
|
+
in modo da far funzionare correttamente l'override degli helper come per i controller"
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
##
|
12
|
+
# Serie di metodi che identificano i titoli generati automaticamente
|
13
|
+
# Viene utilizzato i18n per identificare se un determinato modello è di tipo F o M
|
14
|
+
# é presente quindi una chiave in YML che identifica ogni modello(default M)
|
15
|
+
def title_mod_g(model)
|
16
|
+
"#{t("edit_title_#{model_gender(model)}", default: 'Modifica')} #{model.mn}"
|
17
|
+
end
|
18
|
+
|
19
|
+
def title_new_g(model)
|
20
|
+
"#{t("new_title_#{model_gender(model)}", default: 'Nuovo')} #{model.mn}"
|
21
|
+
end
|
22
|
+
|
23
|
+
def title_del_g(model)
|
24
|
+
"#{t("del_title_#{model_gender(model)}", default: 'Cancella')} #{model.mn}"
|
25
|
+
end
|
26
|
+
|
27
|
+
def model_gender(model)
|
28
|
+
t("activerecord.modelgender.#{model.name.underscore.to_sym}", :default => :m).to_sym
|
29
|
+
end
|
30
|
+
|
31
|
+
def new_button(path, base_class=nil)
|
32
|
+
options = {class: 'btn btn-success btn-xs'}
|
33
|
+
options[:title] = title_new(base_class) unless base_class.nil?
|
34
|
+
|
35
|
+
link_to fa_icon("plus fw"), path, options
|
36
|
+
end
|
37
|
+
|
38
|
+
def edit_button(path)
|
39
|
+
link_to fa_icon("pencil fw"), path, class: 'btn btn-primary btn-xs'
|
40
|
+
end
|
41
|
+
|
42
|
+
def delete_button(path)
|
43
|
+
link_to fa_icon("trash fw"), path, method: :delete, data: {confirm: t(:are_you_sure)}, class: 'btn btn-danger btn-xs'
|
44
|
+
end
|
45
|
+
|
46
|
+
def form_submit(f)
|
47
|
+
f.actions do
|
48
|
+
f.action :submit, :button_html => {:class => "btn btn-primary", :disable_with => t('wait', default: 'Wait...')}
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
##
|
53
|
+
# Questa funzione serve per essere sovrascritta nell'helper specializzato del controller
|
54
|
+
def index_print_column(record, field)
|
55
|
+
record.send(field)
|
56
|
+
end
|
57
|
+
|
58
|
+
##
|
59
|
+
# Questa funzione serve per stampare il contenuto dell'header
|
60
|
+
def index_print_column_head(field)
|
61
|
+
block_given? ? yield(field) : base_class.han(field)
|
62
|
+
end
|
63
|
+
|
64
|
+
##
|
65
|
+
# Questa funzione serve per generare la colonna della tabella
|
66
|
+
#
|
67
|
+
# * *Attributes* :
|
68
|
+
# - colonna
|
69
|
+
# - tipo di colonna td|th
|
70
|
+
# - opzionali : hash{record} per fare altro
|
71
|
+
def index_column_builder(field, column, record: nil)
|
72
|
+
column_class = "column_#{field}"
|
73
|
+
column_id=''
|
74
|
+
if record
|
75
|
+
column_id = "#{column_class}-#{dom_id(record)}"
|
76
|
+
end
|
77
|
+
content_tag column, class: column_class, id: column_id do
|
78
|
+
yield column_class, column_id
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
def list_button(path)
|
83
|
+
link_to fa_icon("list fw"), path, class: 'btn btn-default btn-xs'
|
84
|
+
end
|
85
|
+
|
86
|
+
##
|
87
|
+
# Questa funzione serve per essere sovrascritta nell'helper specializzato del controller
|
88
|
+
# e quindi stampare un determinato campo in modo differente
|
89
|
+
# si occupa anche di gestire i campi provenienti dalla policy nel caso siano a più livelli con i nested
|
90
|
+
# prendiamo in considerazione la situazione con has_many :campo=>[] o con :campo=>[:ciao,:pippo,:pluto]
|
91
|
+
def editing_form_print_field(form, field)
|
92
|
+
if field.is_a?(Hash)
|
93
|
+
#devo nestarlo
|
94
|
+
bf = ActiveSupport::SafeBuffer.new
|
95
|
+
|
96
|
+
field.each do |k, v|
|
97
|
+
if v.length==0
|
98
|
+
#caso in cui è un elemento normale, ma che ha una selezione multipla
|
99
|
+
bf<< editing_form_print_field(form, k)
|
100
|
+
else
|
101
|
+
#caso in cui potremmo essere in un campo di multipli elementi con vari valori ognuno
|
102
|
+
bf<< nest_editing_form_print_field(form, k, v)
|
103
|
+
end
|
104
|
+
end
|
105
|
+
bf
|
106
|
+
else
|
107
|
+
form.input field
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
##
|
112
|
+
# Questa funzione può essere sovrascritta per gestire in modo personale la renderizzazine dei nested attributes
|
113
|
+
# * *Attributes* :
|
114
|
+
# - form -> form di formtastic
|
115
|
+
# - contenitore -> campo principale
|
116
|
+
# - campi -> i campi interni
|
117
|
+
def nest_editing_form_print_field(form, contenitore, campi)
|
118
|
+
form.semantic_fields_for contenitore do |item|
|
119
|
+
item.inputs :name => t(".#{form.object.mn}.#{contenitore}", :default => contenitore.to_s.camelcase) do
|
120
|
+
bf = ActiveSupport::SafeBuffer.new
|
121
|
+
campi.each do |c|
|
122
|
+
bf<<editing_form_print_field(item, c)
|
123
|
+
end
|
124
|
+
bf
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
129
|
+
##
|
130
|
+
# Per divisione in celle della form
|
131
|
+
#
|
132
|
+
def cell_column_class(field)
|
133
|
+
"col-md-12"
|
134
|
+
end
|
135
|
+
|
136
|
+
|
137
|
+
##
|
138
|
+
# Funzione che visualizza il caricamento e l'immagine caricata precedente se presente
|
139
|
+
#
|
140
|
+
# * *Args* :
|
141
|
+
# - form
|
142
|
+
# - attribute
|
143
|
+
# * *Returns* :
|
144
|
+
# - ActiveSupport:SafeBuffer
|
145
|
+
#
|
146
|
+
def image_show_upload(form, attribute)
|
147
|
+
|
148
|
+
buff = ActiveSupport::SafeBuffer.new
|
149
|
+
|
150
|
+
buff<<form.label(attribute)
|
151
|
+
|
152
|
+
buff<<content_tag(:div, class: 'row') do
|
153
|
+
tmp = ActiveSupport::SafeBuffer.new
|
154
|
+
|
155
|
+
|
156
|
+
tmp << content_tag(:div, class: "col-md-5") do
|
157
|
+
form.input attribute, :label => false
|
158
|
+
end
|
159
|
+
|
160
|
+
if form.object.send(attribute).exists?
|
161
|
+
tmp << content_tag(:div, class: "col-md-2 col-lg-5") do
|
162
|
+
link_to image_tag(form.object.send(attribute).url(:original), class: 'img-thumbnail logo-original'), form.object.send(attribute).url
|
163
|
+
end
|
164
|
+
end
|
165
|
+
|
166
|
+
tmp
|
167
|
+
end
|
168
|
+
|
169
|
+
|
170
|
+
end
|
171
|
+
|
172
|
+
|
173
|
+
def semantic_form_attributes(obj)
|
174
|
+
obj
|
175
|
+
end
|
176
|
+
|
177
|
+
|
178
|
+
##
|
179
|
+
# Helper per visualizzare l'alert del destroy
|
180
|
+
def destroy_link_to(path, options)
|
181
|
+
link_to t('.destroy'), path,
|
182
|
+
:method => :delete,
|
183
|
+
:class => "btn",
|
184
|
+
:confirm => t('.destroy_confirm.body', :item => options[:item]),
|
185
|
+
"data-confirm-fade" => true,
|
186
|
+
"data-confirm-title" => t('.destroy_confirm.title', :item => options[:item]),
|
187
|
+
"data-confirm-cancel" => t('.destroy_confirm.cancel', :item => options[:item]),
|
188
|
+
"data-confirm-cancel-class" => "btn-cancel",
|
189
|
+
"data-confirm-proceed" => t('.destroy_confirm.proceed', :item => options[:item]),
|
190
|
+
"data-confirm-proceed-class" => "btn-danger"
|
191
|
+
end
|
192
|
+
|
193
|
+
end
|
194
|
+
end
|
@@ -0,0 +1,173 @@
|
|
1
|
+
require 'kono_utils/search_attribute'
|
2
|
+
module KonoUtils
|
3
|
+
##
|
4
|
+
# Classe base per i form di ricerca nel sistema
|
5
|
+
class BaseSearch < VirtualModel
|
6
|
+
|
7
|
+
class UndefinedSearchModel < StandardError
|
8
|
+
def initialize(msg = 'Definire nella classe, attraverso set_search_model, il modello da utilizzare come base per la ricerca')
|
9
|
+
super(msg)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
class_attribute :_search_model, :_search_attributes, instance_writer: false
|
14
|
+
attr_accessor :scope
|
15
|
+
|
16
|
+
define_model_callbacks :set_scope, :make_query
|
17
|
+
|
18
|
+
##
|
19
|
+
# Definisce per la classe quale modello utilizzare per la ricerca
|
20
|
+
#
|
21
|
+
def self.set_search_model(model)
|
22
|
+
self._search_model = model
|
23
|
+
end
|
24
|
+
|
25
|
+
##
|
26
|
+
# Definisce gli attributi da utilizzare per la ricerca
|
27
|
+
# passandogli un hash finale si possono passare parametri di default
|
28
|
+
# per ognuno dei campi settati a formtastic per renderizzare il campo
|
29
|
+
# ES:
|
30
|
+
# set_search_attributes :nome,:cognome,:as=>:string
|
31
|
+
# renderizzerà nome e cognome come stringhe
|
32
|
+
#
|
33
|
+
# set_search_attributes :datadinascita, :as=>:datetimepicker
|
34
|
+
# renderizzerà un campo predisposto per attivare il datetimepicker
|
35
|
+
#
|
36
|
+
# Possiamo anche passare una Proc come ultimo elemento per la generazione degli attributi per la form,
|
37
|
+
# come argomento è presente il current_user
|
38
|
+
# set_search_attributes :datadinascita, Proc.new { |current_user,form| funzione da lanciare per eseguire la generazione
|
39
|
+
# degli attibuti da passare alla form per generare il campo }
|
40
|
+
#
|
41
|
+
# come hash di opzioni possiamo anche passargli una chiave :field_options
|
42
|
+
# con dentro configurazioni vedi TikalCore::SearchAttribute
|
43
|
+
#
|
44
|
+
# CALLBACKS
|
45
|
+
# Quando vengono creati gli attributi, vengono anche creati gli eventi per ogni attributi, sia per la
|
46
|
+
# chiamata del getter (nome_metodo) sia per setter (nome_metodo=), ogni callback ha un prefisso
|
47
|
+
# per avere quindi un namespace specifico per questa funzionalità:
|
48
|
+
# ES:
|
49
|
+
# set_search_attributes :datadinascita....
|
50
|
+
#
|
51
|
+
# genererà:
|
52
|
+
# - before_search_attr_datadinascita
|
53
|
+
# - before_search_attr_datadinascita_set => relativo al setter
|
54
|
+
# - around_search_attr_datadinascita
|
55
|
+
# - around_search_attr_datadinascita_set => relativo al setter
|
56
|
+
# - after_search_attr_datadinascita
|
57
|
+
# - after_search_attr_datadinascita_set => relativo al setter
|
58
|
+
#
|
59
|
+
def self.set_search_attributes(*attributes)
|
60
|
+
options = attributes.extract_options!
|
61
|
+
options = {:as => :string}.merge(options)
|
62
|
+
|
63
|
+
if attributes.last.is_a?(Proc)
|
64
|
+
options = attributes.pop
|
65
|
+
end
|
66
|
+
|
67
|
+
self._search_attributes = self._search_attributes || []
|
68
|
+
attributes.each do |a|
|
69
|
+
|
70
|
+
attr_accessor(a.to_sym)
|
71
|
+
|
72
|
+
# instance_variable_set "@#{a}".to_sym, nil
|
73
|
+
#
|
74
|
+
# unless method_defined? a.to_sym
|
75
|
+
define_method(a.to_sym) do
|
76
|
+
run_callbacks "search_attr_#{a}" do
|
77
|
+
# logger.debug { "Chiamata a metodo virtuale #{a} " }
|
78
|
+
instance_variable_get "@#{a}".to_sym
|
79
|
+
end
|
80
|
+
end
|
81
|
+
# end
|
82
|
+
#
|
83
|
+
# unless method_defined? "#{a}=".to_sym
|
84
|
+
define_method("#{a}=".to_sym) do |*args|
|
85
|
+
run_callbacks "search_attr_#{a}_set" do
|
86
|
+
# logger.debug { "Chiamata a metodo virtuale #{a}= -> #{args.inspect}" }
|
87
|
+
instance_variable_set "@#{a}".to_sym, *args
|
88
|
+
end
|
89
|
+
end
|
90
|
+
# end
|
91
|
+
|
92
|
+
|
93
|
+
#Definisco delle callbacks per ogni attributo
|
94
|
+
define_model_callbacks "search_attr_#{a}".to_sym, "search_attr_#{a}_set".to_sym
|
95
|
+
self._search_attributes += [KonoUtils::SearchAttribute.new(a, options)]
|
96
|
+
end
|
97
|
+
self._search_attributes.uniq!
|
98
|
+
end
|
99
|
+
|
100
|
+
##
|
101
|
+
# Restituisce il modello di ricerca
|
102
|
+
def search_model
|
103
|
+
self.class._search_model
|
104
|
+
end
|
105
|
+
|
106
|
+
##
|
107
|
+
# Attributi di ricerca
|
108
|
+
def search_attributes
|
109
|
+
self.class._search_attributes
|
110
|
+
end
|
111
|
+
|
112
|
+
def initialize
|
113
|
+
raise UndefinedSearchModel if search_model.nil?
|
114
|
+
super
|
115
|
+
self.scope = self.class._search_model
|
116
|
+
end
|
117
|
+
|
118
|
+
|
119
|
+
##
|
120
|
+
# deve indicarmi se i dati della ricerca sono stati inseriti
|
121
|
+
def data_loaded?
|
122
|
+
get_query_params.length>0
|
123
|
+
end
|
124
|
+
|
125
|
+
##
|
126
|
+
# Setta lo scope iniziale del modello
|
127
|
+
def set_scope(scope)
|
128
|
+
run_callbacks :set_scope do
|
129
|
+
self.scope = scope
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
133
|
+
|
134
|
+
##
|
135
|
+
# Genera la query di ricerca, passando i parametri da
|
136
|
+
# ricercare nello scoper di ricerca del modelo
|
137
|
+
def make_query
|
138
|
+
run_callbacks :make_query do
|
139
|
+
self.scope.search(get_query_params)
|
140
|
+
end
|
141
|
+
end
|
142
|
+
|
143
|
+
|
144
|
+
##
|
145
|
+
# Restituisce un hash con tutti i parametri da implementare sulla ricerca
|
146
|
+
#
|
147
|
+
def get_query_params
|
148
|
+
out = {}
|
149
|
+
search_attributes.each do |val|
|
150
|
+
out[val.field]=self.send(val.field) unless self.send(val.field).blank?
|
151
|
+
end
|
152
|
+
|
153
|
+
out
|
154
|
+
end
|
155
|
+
|
156
|
+
##
|
157
|
+
# Si occupa di aggiornare i valori interni di ricerca
|
158
|
+
def update_attributes(datas)
|
159
|
+
search_attributes.each do |val|
|
160
|
+
self.send("#{val.field}=", val.cast_value(datas[val.field]))
|
161
|
+
end
|
162
|
+
end
|
163
|
+
|
164
|
+
def method_missing(m, *args, &block)
|
165
|
+
if self.search_attributes.collect(&:field).include?(m.to_s.gsub(/=$/, ''))
|
166
|
+
self.send(m, *args)
|
167
|
+
else
|
168
|
+
super
|
169
|
+
end
|
170
|
+
end
|
171
|
+
|
172
|
+
end
|
173
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
require 'active_support/concern'
|
2
|
+
module KonoUtils::Concerns
|
3
|
+
module ActiveRecordTranslation
|
4
|
+
|
5
|
+
extend ActiveSupport::Concern
|
6
|
+
|
7
|
+
included do
|
8
|
+
|
9
|
+
def han(attr)
|
10
|
+
self.class.han(attr)
|
11
|
+
end
|
12
|
+
|
13
|
+
def mnp
|
14
|
+
self.class.mnp
|
15
|
+
end
|
16
|
+
|
17
|
+
def mn
|
18
|
+
self.class.mn
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
|
23
|
+
class_methods do
|
24
|
+
|
25
|
+
##
|
26
|
+
# E' un'alias per il TikalCore::Registration.human_attribute_name(:isee)
|
27
|
+
def han(attr)
|
28
|
+
self.human_attribute_name(attr)
|
29
|
+
end
|
30
|
+
|
31
|
+
##
|
32
|
+
# E' un alias di model_name.human(count:2)
|
33
|
+
def mnp
|
34
|
+
self.model_name.human(count: 2)
|
35
|
+
end
|
36
|
+
|
37
|
+
##
|
38
|
+
# E' un alias di model_name.human
|
39
|
+
def mn
|
40
|
+
self.model_name.human
|
41
|
+
end
|
42
|
+
|
43
|
+
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,195 @@
|
|
1
|
+
require 'active_support/concern'
|
2
|
+
|
3
|
+
module KonoUtils
|
4
|
+
module Concerns
|
5
|
+
module BaseEditing
|
6
|
+
extend ActiveSupport::Concern
|
7
|
+
|
8
|
+
included do
|
9
|
+
|
10
|
+
before_action :append_view_paths
|
11
|
+
|
12
|
+
before_action :load_object, except: [:index, :new, :create]
|
13
|
+
helper_method :base_class
|
14
|
+
helper_method :form_attributes
|
15
|
+
helper_method :table_columns
|
16
|
+
helper_method :new_custom_polymorphic_path
|
17
|
+
helper_method :edit_custom_polymorphic_path
|
18
|
+
helper_method :index_custom_polymorphic_path
|
19
|
+
after_action :check_errors, only: [:create, :update]
|
20
|
+
|
21
|
+
##
|
22
|
+
# E' possibile passare una callback per poter
|
23
|
+
# renderizzare ulteriori formati oppure cambiare la normale
|
24
|
+
# renderizzazione. La callback riceve il format della respond_to
|
25
|
+
# GET /utenti
|
26
|
+
# GET /utenti.xml
|
27
|
+
def index(respond_to_call: nil)
|
28
|
+
@objects = policy_scope(base_scope).all
|
29
|
+
@objects = yield(@objects) if block_given?
|
30
|
+
@objects = @objects.paginate(:page => params[:page])
|
31
|
+
|
32
|
+
respond_to do |format|
|
33
|
+
format.html # index.html.erb
|
34
|
+
format.xml { render :xml => @objects }
|
35
|
+
unless respond_to_call.nil?
|
36
|
+
respond_to_call.call(format)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
# GET /utenti/new
|
42
|
+
# GET /utenti/new.xml
|
43
|
+
def new
|
44
|
+
@object = base_class.new
|
45
|
+
authorize @object
|
46
|
+
@object = yield(@object) if block_given?
|
47
|
+
logger.debug { "Nuovo oggetto #{@object.inspect}" }
|
48
|
+
|
49
|
+
respond_to do |format|
|
50
|
+
format.html
|
51
|
+
format.xml { render :xml => @object }
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
# GET /utenti/1/edit
|
56
|
+
def edit
|
57
|
+
@object = yield(@object) if block_given?
|
58
|
+
end
|
59
|
+
|
60
|
+
# PUT /utenti/1
|
61
|
+
# PUT /utenti/1.xml
|
62
|
+
def update
|
63
|
+
@object = yield(@object) if block_given?
|
64
|
+
respond_to do |format|
|
65
|
+
if @object.update_attributes(clean_params)
|
66
|
+
format.html { redirect_to edit_custom_polymorphic_path(@object), :notice => success_update_message(@object) }
|
67
|
+
format.xml { head :ok }
|
68
|
+
else
|
69
|
+
format.html { render :action => :edit }
|
70
|
+
format.xml { render :xml => @object.errors, :status => :unprocessable_entity }
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
# POST /utenti
|
76
|
+
# POST /utenti.xml
|
77
|
+
def create
|
78
|
+
@object = base_class.new(clean_params)
|
79
|
+
authorize @object
|
80
|
+
@object = yield(@object) if block_given?
|
81
|
+
logger.debug { "Nuovo oggetto #{@object.inspect}" }
|
82
|
+
|
83
|
+
respond_to do |format|
|
84
|
+
if @object.save
|
85
|
+
format.html { redirect_to edit_custom_polymorphic_path(@object), :notice => success_create_message(@object) }
|
86
|
+
format.xml { render :xml => @object, :status => :created, :location => @object }
|
87
|
+
else
|
88
|
+
format.html { render :action => :new }
|
89
|
+
format.xml { render :xml => @object.errors, :status => :unprocessable_entity }
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
# DELETE /utenti/1
|
95
|
+
# DELETE /utenti/1.xml
|
96
|
+
def destroy
|
97
|
+
@object = yield(@object) if block_given?
|
98
|
+
|
99
|
+
|
100
|
+
respond_to do |format|
|
101
|
+
if @object.destroy
|
102
|
+
format.html { redirect_to index_custom_polymorphic_path(base_class),
|
103
|
+
:notice => success_destroy_message(@object) }
|
104
|
+
format.xml { head :ok }
|
105
|
+
else
|
106
|
+
format.html { redirect_to index_custom_polymorphic_path(base_class),
|
107
|
+
:flash => {:error => @object.errors.full_messages.join(',')} }
|
108
|
+
format.xml { head :ko }
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
##
|
114
|
+
# Elenco degli attributi da visualizzare nella form
|
115
|
+
def form_attributes(model = base_class.new)
|
116
|
+
policy(model).permitted_attributes
|
117
|
+
end
|
118
|
+
|
119
|
+
##
|
120
|
+
# Elenco ordinato dei campi da utilizzare nella visualizzazione della tabella index
|
121
|
+
def table_columns
|
122
|
+
policy(base_class.new).permitted_attributes
|
123
|
+
end
|
124
|
+
|
125
|
+
private
|
126
|
+
def load_object
|
127
|
+
@object = base_class.find(params[:id])
|
128
|
+
authorize @object
|
129
|
+
logger.debug { "Oggetto #{@object.inspect}" }
|
130
|
+
|
131
|
+
end
|
132
|
+
|
133
|
+
def base_class
|
134
|
+
controller = controller_name
|
135
|
+
modello = controller.singularize.camelize.safe_constantize
|
136
|
+
logger.debug { "Editazione del controller:#{controller} per modello: #{modello.to_s}" }
|
137
|
+
|
138
|
+
raise "Non riesco a restituire la classe base per il controller #{controller}" if modello.nil?
|
139
|
+
|
140
|
+
modello
|
141
|
+
end
|
142
|
+
|
143
|
+
##
|
144
|
+
# Scope iniziale per index, sovrascrivibile per poter inizializzare ricerca,
|
145
|
+
# viene passato al policy_scope in index
|
146
|
+
def base_scope
|
147
|
+
base_class
|
148
|
+
end
|
149
|
+
|
150
|
+
def clean_params
|
151
|
+
permitted = policy(base_class.new).permitted_attributes
|
152
|
+
dati = params.required(base_class.name.underscore.gsub('/', '_').to_sym).permit(permitted)
|
153
|
+
::Rails.logger.info { "Permitted Attributes: #{permitted.inspect}" }
|
154
|
+
::Rails.logger.info { "Parametri puliti: #{dati.inspect}" }
|
155
|
+
dati
|
156
|
+
end
|
157
|
+
|
158
|
+
def check_errors
|
159
|
+
unless @object.valid?
|
160
|
+
logger.debug { "Invalid Obj:" }
|
161
|
+
logger.debug { @object.errors.inspect }
|
162
|
+
end
|
163
|
+
end
|
164
|
+
|
165
|
+
##
|
166
|
+
# Aggiungo una path alla vista del base editing controller,
|
167
|
+
# nel caso non siamo derivati dal controller ma ho solamente incluso il concern
|
168
|
+
def append_view_paths
|
169
|
+
append_view_path KonoUtils::Engine.root.join("app", "views", "kono_utils")
|
170
|
+
append_view_path KonoUtils::Engine.root.join("app", "views", "kono_utils", "base_editing")
|
171
|
+
end
|
172
|
+
|
173
|
+
|
174
|
+
def new_custom_polymorphic_path(*base_class)
|
175
|
+
new_polymorphic_path(*base_class)
|
176
|
+
end
|
177
|
+
|
178
|
+
def edit_custom_polymorphic_path(*rec)
|
179
|
+
edit_polymorphic_path(*rec)
|
180
|
+
end
|
181
|
+
|
182
|
+
def index_custom_polymorphic_path(*rec)
|
183
|
+
polymorphic_path(*rec)
|
184
|
+
end
|
185
|
+
|
186
|
+
|
187
|
+
end
|
188
|
+
|
189
|
+
# module ClassMethods
|
190
|
+
#
|
191
|
+
#
|
192
|
+
# end
|
193
|
+
end
|
194
|
+
end
|
195
|
+
end
|