kono_utils 0.15.15 → 1.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (112) hide show
  1. checksums.yaml +5 -5
  2. data/README.rdoc +17 -78
  3. data/app/assets/javascripts/kono_utils/core.coffee +477 -0
  4. data/app/assets/stylesheets/kono_utils/{_kono_styles.css.scss → core.css.scss} +1 -16
  5. data/app/policies/kono_utils/base_editing_policy_concern.rb +52 -3
  6. data/app/policies/kono_utils/base_search_form_policy_concern.rb +25 -0
  7. data/config/initializers/mysql.rb +2 -2
  8. data/config/locales/it.yml +3 -1
  9. data/lib/generators/kono_utils/install/install_generator.rb +44 -0
  10. data/lib/generators/templates/base_editing_controller.template +3 -0
  11. data/lib/generators/templates/base_editing_helper.template +3 -0
  12. data/lib/generators/templates/base_editing_policy.template +4 -0
  13. data/lib/generators/templates/initializer.rb +3 -1
  14. data/lib/kono_utils.rb +29 -18
  15. data/lib/kono_utils/application_core_helper.rb +524 -0
  16. data/lib/kono_utils/application_enum_helper.rb +53 -0
  17. data/lib/kono_utils/application_helper.rb +4 -578
  18. data/lib/kono_utils/base_editing_core_helper.rb +194 -0
  19. data/lib/kono_utils/base_editing_helper.rb +3 -186
  20. data/lib/kono_utils/base_search.rb +32 -19
  21. data/lib/kono_utils/concerns.rb +12 -10
  22. data/lib/kono_utils/concerns/active_record_translation.rb +8 -4
  23. data/lib/kono_utils/concerns/active_storage_remover_helper.rb +61 -0
  24. data/lib/kono_utils/concerns/base_editing.rb +199 -53
  25. data/lib/kono_utils/configuration.rb +18 -0
  26. data/lib/kono_utils/engine.rb +15 -6
  27. data/lib/kono_utils/paginate_proxer.rb +17 -0
  28. data/lib/kono_utils/search_form_builder.rb +24 -0
  29. data/lib/kono_utils/version.rb +1 -1
  30. data/spec/dummy/.gitignore +2 -0
  31. data/spec/dummy/app/assets/config/manifest.js +2 -0
  32. data/spec/dummy/app/assets/javascripts/application.js +2 -0
  33. data/spec/dummy/app/controllers/application_controller.rb +10 -0
  34. data/spec/dummy/app/controllers/base_editing_controller.rb +3 -0
  35. data/spec/dummy/app/controllers/users_controller.rb +2 -0
  36. data/spec/dummy/app/helpers/application_helper.rb +1 -0
  37. data/spec/dummy/app/helpers/base_editing_helper.rb +3 -0
  38. data/spec/dummy/app/models/application_record.rb +5 -0
  39. data/spec/dummy/app/models/user.rb +2 -0
  40. data/spec/dummy/app/policies/application_policy.rb +49 -0
  41. data/spec/dummy/app/policies/base_editing_policy.rb +4 -0
  42. data/spec/dummy/app/policies/user_policy.rb +23 -0
  43. data/spec/dummy/bin/rails +1 -1
  44. data/spec/dummy/bin/setup +20 -13
  45. data/spec/dummy/bin/update +31 -0
  46. data/spec/dummy/bin/yarn +11 -0
  47. data/spec/dummy/config/application.rb +15 -17
  48. data/spec/dummy/config/environment.rb +1 -1
  49. data/spec/dummy/config/environments/development.rb +31 -11
  50. data/spec/dummy/config/environments/production.rb +26 -16
  51. data/spec/dummy/config/environments/test.rb +10 -6
  52. data/spec/dummy/config/initializers/application_controller_renderer.rb +8 -0
  53. data/spec/dummy/config/initializers/assets.rb +6 -3
  54. data/spec/dummy/config/initializers/content_security_policy.rb +25 -0
  55. data/spec/dummy/config/initializers/cookies_serializer.rb +2 -0
  56. data/spec/dummy/config/initializers/kono_utils.rb +5 -0
  57. data/spec/dummy/config/initializers/new_framework_defaults_5_2.rb +38 -0
  58. data/spec/dummy/config/initializers/wrap_parameters.rb +2 -2
  59. data/spec/dummy/config/locales/en.yml +10 -0
  60. data/spec/dummy/config/routes.rb +3 -52
  61. data/spec/dummy/config/storage.yml +34 -0
  62. data/spec/dummy/db/migrate/20190716093114_create_users.rb +11 -0
  63. data/spec/dummy/db/schema.rb +23 -0
  64. data/spec/dummy/package.json +5 -0
  65. data/spec/dummy/spec/models/user_spec.rb +5 -0
  66. data/spec/dummy/yarn.lock +21 -0
  67. metadata +83 -144
  68. data/app/assets/javascripts/kono_utils/utilities.coffee +0 -481
  69. data/app/assets/stylesheets/kono_utils/utils.css.scss +0 -4
  70. data/app/input/bs_aceeditor_input.rb +0 -53
  71. data/app/input/bs_autocomplete_input.rb +0 -60
  72. data/app/input/bs_datepicker_input.rb +0 -16
  73. data/app/input/bs_datetimepicker_input.rb +0 -80
  74. data/app/input/bs_file_download_input.rb +0 -35
  75. data/app/input/bs_image_input.rb +0 -35
  76. data/app/input/bs_label_with_container_input.rb +0 -22
  77. data/app/input/bs_location_picker_input.rb +0 -95
  78. data/app/input/bs_readonly_input.rb +0 -52
  79. data/app/input/bs_timepicker_input.rb +0 -14
  80. data/app/views/kono_utils/application/_search_panel.html.erb +0 -36
  81. data/app/views/kono_utils/base_editing/_edit.html.erb +0 -3
  82. data/app/views/kono_utils/base_editing/_edit_page_side_title_header.html.erb +0 -3
  83. data/app/views/kono_utils/base_editing/_edit_page_title_header.html.erb +0 -3
  84. data/app/views/kono_utils/base_editing/_form.html.erb +0 -15
  85. data/app/views/kono_utils/base_editing/_index_buttons.html.erb +0 -2
  86. data/app/views/kono_utils/base_editing/_index_page_side_title_header.html.erb +0 -3
  87. data/app/views/kono_utils/base_editing/_index_page_title_header.html.erb +0 -3
  88. data/app/views/kono_utils/base_editing/_index_tfoot.html.erb +0 -0
  89. data/app/views/kono_utils/base_editing/_new.html.erb +0 -3
  90. data/app/views/kono_utils/base_editing/_new_page_side_title_header.html.erb +0 -3
  91. data/app/views/kono_utils/base_editing/_new_page_title_header.html.erb +0 -3
  92. data/app/views/kono_utils/base_editing/_search_form.html.erb +0 -1
  93. data/app/views/kono_utils/base_editing/application/_edit_page_side_title_header.html.erb +0 -1
  94. data/app/views/kono_utils/base_editing/application/_edit_page_title_header.html.erb +0 -1
  95. data/app/views/kono_utils/base_editing/application/_index_page_side_title_header.html.erb +0 -1
  96. data/app/views/kono_utils/base_editing/application/_index_page_title_header.html.erb +0 -1
  97. data/app/views/kono_utils/base_editing/application/_new_page_side_title_header.html.erb +0 -1
  98. data/app/views/kono_utils/base_editing/application/_new_page_title_header.html.erb +0 -1
  99. data/app/views/kono_utils/base_editing/application/edit.html.erb +0 -1
  100. data/app/views/kono_utils/base_editing/application/new.html.erb +0 -1
  101. data/app/views/kono_utils/base_editing/edit.html.erb +0 -1
  102. data/app/views/kono_utils/base_editing/index.html.erb +0 -36
  103. data/app/views/kono_utils/base_editing/new.html.erb +0 -1
  104. data/lib/kono_utils/encoder.rb +0 -47
  105. data/lib/kono_utils/fiscal_code.rb +0 -47
  106. data/lib/kono_utils/params_hash_array.rb +0 -37
  107. data/lib/kono_utils/percentage.rb +0 -60
  108. data/lib/kono_utils/tmp_file.rb +0 -81
  109. data/lib/kono_utils/virtual_model.rb +0 -22
  110. data/lib/tasks/kono_utils_tasks.rake +0 -4
  111. data/spec/lib/kono_utils/fiscal_code_spec.rb +0 -56
  112. data/vendor/assets/javascripts/EventEmitter.js +0 -473
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: ff064113668b46f7504e1651bdb503ae8f909314
4
- data.tar.gz: 361d5bcb1a36aaa98371c414d736e8fc27aa7595
2
+ SHA256:
3
+ metadata.gz: c5015498a44dc1be3efa63b564cc3ad7e0198e40ba2477d1fee1cfaad0bbe97f
4
+ data.tar.gz: f23eaa227ce615b319615dbc816e694641c875c9abfeba4d4cdd0d736ebf1783
5
5
  SHA512:
6
- metadata.gz: d0f05be12fb1dccedcca3ca8fbb9e4889c71d6768d1438eacecc37a4d9a44461fdca88ead73513a7fd35da5749f2f9cb3a946f472f1d6818b5d76f800953f659
7
- data.tar.gz: ef3990575b03a918549b49ad75883b72811acb7f78a720522ef5d08d85986051fe7ee6f20bb8deb8980604782e6f7a85e7f036addaa48a73e12d7cffb936fd61
6
+ metadata.gz: 667bcd329e9df24bce3836715b866f431fad52f29c63939ca7386e6a8dfc04bd68ead2158310755987d52919f955ef099059a1d15c49571cce90fe9cdbf68f37
7
+ data.tar.gz: a12bdf8b96758abcaea4e7e540fb936973936e7f388cbbb1450694cdc4b07b3fe118f42cf245450399c82b6553093dde433cce149701759845678ff8825396fd
@@ -7,13 +7,28 @@ libreria di utilità per i vari progetti utilizzati da Archimedia.
7
7
 
8
8
  == Installazione
9
9
  aggiungere nel proprio gemfile
10
- source 'https://rails-assets.org'
11
10
 
12
11
  gem 'kono_utils'
13
12
 
14
- per avere anche le utilities in javascript:
13
+ bundle
14
+
15
+ Generatore:
16
+
17
+ bin/rails g kono_utils:install
18
+
19
+
20
+ che istalla le dipendenze con yarn e aggiunge il:
21
+
15
22
  require kono_utils/utilities
16
23
 
24
+ == Upgrade From 0.x
25
+ After bundle update make
26
+
27
+ bin/rails g kono_utils:install
28
+
29
+ so you have the yarn packages appended
30
+
31
+
17
32
  == Controllers/Views
18
33
 
19
34
  === ChangeLog
@@ -37,82 +52,6 @@ libreria di utilità per i vari progetti utilizzati da Archimedia.
37
52
  - **Feature** lorem
38
53
  </code>
39
54
 
40
- == TmpFile
41
- Classe Funzionante prettamente con RAILS
42
-
43
- La classe si occupa dei files temporanei creando una cartella dentro a tmp del progetto,
44
- per ovviare al problema di duplicazioni dei nomi, viene generata una nuova cartella con
45
- timestamp univoco per ogni file.
46
-
47
- Estende Tempfile,
48
- la root della struttura è quella di Rails.root
49
- e di default la classe scrive dentro a tmp della root di rails.
50
-
51
- Non c'è bisogno di preoccuparsi di svuotare la cartella tmp contenente i file temporanei dato che la classe
52
- avrà l'onere di controllare e ripulire eventuali files dopo 1.day di default.
53
-
54
- === Utilizzo:
55
- tmp = KonoUtils::TmpFile.new('nomefile.ext')
56
- tmp.path -> path completa
57
- tmp.write(valore_da_scrivere_dentro_a_file)
58
- tmp.original_filename -> restituisce il nome inizialmente passato alla classe
59
- tmp.unique_filename -> restoituisce il nome univoco del file
60
- tmp.path -> restituisce la path del file
61
-
62
-
63
-
64
- == Encoder
65
- Classe che si occupa di decodificare una qualsiasi stringa in formato utf8,
66
- cercando di trovare l'encoding iniziale a tentativi.
67
- Ha anche a disposizione una funzione per la rimozione dei caratteri BOM dalla stringa(http://en.wikipedia.org/wiki/Byte_order_mark)
68
-
69
- === Utilizzo
70
- str="stringa di un encoding sconosciuto"
71
- en = KonoUtils::Encoder.new(str)
72
- en.string_encoder -> normale tentativo di encoding restituendo stringa in utf8
73
- en.remove_bom -> rimozione del carattere BOM e encoding con la funzione precedente
74
-
75
- == Percentage
76
- Classe che si occupa di rappresentare un numero in percentuale.
77
- Per maggiori info sulle funzionalità controllare la documentazione sulla classe
78
-
79
- === Utilizzo
80
- p = KonoUtils::Percentage.new(100,20)
81
- p.percentage -> ritorna il valore percentuale float
82
- p.to_i -> ritorna percentuale intera con relativi arrotondamenti
83
- p.to_percentage -> si comporta come l'helper number_to_percentage
84
-
85
- == Params Hash Array
86
-
87
- Si occupa di trasformare un hash con elementi che sono chiramente array in un hash con elementi array:
88
-
89
- {"DatiOrdineAcquisto"=>{"0"=>{"RiferimentoNumeroLinea"=>{"0"=>""}, "IdDocumento"=>"", "Data"=>"", "NumItem"=>"", "CodiceCommessaConvenzione"=>"", "CodiceCUP"=>"", "CodiceCIG"=>""}}}
90
- {"DatiOrdineAcquisto"=>[{"RiferimentoNumeroLinea"=>[""], "IdDocumento"=>"", "Data"=>"", "NumItem"=>"", "CodiceCommessaConvenzione"=>"", "CodiceCUP"=>"", "CodiceCIG"=>""}]}
91
-
92
- === Utilizzo
93
- includere nel controller o dove si vuole utilizzare il concern
94
- include KonoUtils::ParamsHashArray
95
-
96
- e richiamare la funzione:
97
- elaborate_params_to_hash_array(params)
98
-
99
- == Virtual Model
100
- Server per avere un modello virtuale in Rails
101
-
102
- === Utilizzo
103
- Praticamente è come avere un active record ma senza avere una tabella
104
-
105
- class Session < KonoUtils::VirtualModel
106
-
107
- attr_accessor :username, :password, :token
108
-
109
-
110
- validates :token,:presence=>true
111
-
112
- end
113
-
114
- Session.new(:username=>'ciao',:password=>'pippo').valid? => false
115
-
116
55
  == BaseSearch
117
56
  Classe per semplificare il sistema di organizzazione dei modelli di ricerca, unendo anche la
118
57
  configurazione della form di ricerca utilizzando l'helper search_form
@@ -0,0 +1,477 @@
1
+ #= require underscore/underscore
2
+ ##= require wolfy87-eventemitter/EventEmitter
3
+
4
+ @Kono = @Kono || {};
5
+
6
+ @Kn = @Kono
7
+
8
+ ##
9
+ # http://stackoverflow.com/questions/8730859/classes-within-coffeescript-namespace
10
+ # Funzione che si occupa di costruire il namespace se non presente e passarlo come risultato
11
+ # la funzione si aspetta una stringa divisa da punti che identificano i vari livelli di namespace
12
+ # Es: @Kn.ns 'Kn.admin.iseeprices', (exports)->
13
+ # exports.Form = Form
14
+ # exports.attributi_vari = 'ciao'
15
+ # ovviamente senza cancellare i precedenti livelli
16
+
17
+ @Kn.ns = (target, name, block) ->
18
+ if arguments.length < 3
19
+ tmp = (if typeof exports isnt 'undefined' then exports else window)
20
+ [target, name, block] = [tmp, arguments...]
21
+ top = target
22
+ target = target[item] or= {} for item in name.split '.'
23
+ block target, top
24
+
25
+
26
+ ###
27
+ Si occupa di eseguire il blocco nel caso in cui siamo nel namespace di vista,
28
+ o che sia presente tale namespace.
29
+ eseguo ovviamente il tutto all'interno di un $-> per essere sicuro che la pagina sia caricata
30
+ Viene attaccanto anche un evento per ascoltare i possibili eventi di hashchange di jquery ui
31
+ per ascoltare se una nuova pagina viene inserita.
32
+ ES:
33
+ @Kn.view_ns '.Alim.Admin.IseepricesController.edit', (namespace)->
34
+ fai qualcosa solo se esiste tale namespace
35
+
36
+ ###
37
+ @Kn.view_ns = (selector, block) ->
38
+ #funzione da lanciare per il reload della pagina
39
+ esecutore = _.debounce(->
40
+ #se abbiamo il selettore allora lancio il blocco
41
+ if $(selector).length > 0
42
+ block(selector)
43
+ , 10, true)
44
+ #on ready
45
+ $ ->
46
+ esecutore()
47
+
48
+ #attacco ascoltatore event haschanged
49
+ $(window).on 'hashchange', esecutore
50
+
51
+ #Attacco evento anche per turbolinks
52
+ document.addEventListener("turbolinks:load", esecutore)
53
+
54
+
55
+ ###
56
+ Singleton per avere una modal da utilizzare
57
+ funziona attraverso helper bootstrap_please_wait
58
+ ###
59
+ #@Kn.show_wait = ->
60
+ # $('#processing_wait').modal()
61
+ #
62
+ #@Kn.hide_wait = ->
63
+ # $('#processing_wait').modal('hide')
64
+ # #forzo eliminazione di tutti i fade
65
+ # $('.modal-backdrop.fade.in').remove()
66
+
67
+
68
+ ##
69
+ # A tutte le form aggiungo l'autocomplete ad off
70
+ #$ ->
71
+ # $('form').prop('autocomplete', 'off')
72
+ #
73
+
74
+ ##
75
+ # picker = new Kn.utilities.DateTimePicker(
76
+ # selector: _.map(view_namespace, (cls)-> "#{cls} #date_time_picker_documents_search_data").join(",")
77
+ # server_format: "YYYY-MM-DDTHH:mm:ss+Z"
78
+ # )
79
+ # picker.initialize()
80
+ #
81
+ #class DateTimePicker
82
+ #
83
+ # defaults = server_format: "YYYY-MM-DD HH:mm:ss Z",
84
+ # format: 'DD/MM/YYYY',
85
+ # server_match: /^[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2} .$/,
86
+ # locale: 'it'
87
+ #
88
+ # constructor: (options = {}) ->
89
+ # {@selector, @server_format, @format, @server_match, @locale} = _.extend defaults, options
90
+ # @input_date = @parse_input_value()
91
+ #
92
+ # initialize: ->
93
+ # if @input_date
94
+ # val = @input_date
95
+ # val = @input_date.format(@format) if _.isFunction(@input_date.format)
96
+ # $(@selector).find("input").val(val)
97
+ #
98
+ # $(@selector).datetimepicker(@picker_configs())
99
+ #
100
+ # picker_configs: ->
101
+ # {
102
+ # format: @format,
103
+ # locale: @locale
104
+ # }
105
+ #
106
+ # parse_input_value: ->
107
+ # value = $(@selector).find("input").attr('value')
108
+ # unless value == '' or _.isUndefined(value)
109
+ # if @server_match.test(value)
110
+ # return moment(value, @server_format)
111
+ # else
112
+ # return value
113
+ # false
114
+
115
+
116
+ ##
117
+ # Definisce l'elemento associato alla data finale di un range di date
118
+ # set_end: (@end_pick)->
119
+ # $(@selector).data("DateTimePicker").maxDate(@end_pick.input_date) if @end_pick.input_date
120
+ #
121
+ # $("#{@end_pick.selector}").on "dp.change", (e) =>
122
+ # $(@selector).data("DateTimePicker").maxDate(e.date)
123
+ #
124
+ ## Definisce l'elemento associato alla data iniziale di un range di date
125
+ # set_start: (@start_pick)->
126
+ # $(@selector).data("DateTimePicker").minDate(@start_pick.input_date) if @start_pick.input_date
127
+ #
128
+ # $("#{@start_pick.selector}").on "dp.change", (e) =>
129
+ # $(@selector).data("DateTimePicker").minDate(e.date)
130
+
131
+
132
+
133
+
134
+ #@Kn.ns 'Kn.utilities', (exports)->
135
+ # exports.DateTimePicker = DateTimePicker
136
+
137
+ #class TimePicker extends DateTimePicker
138
+ # defaults = server_format: "HH:mm",
139
+ # format: 'HH:mm',
140
+ # server_match: /[0-9]{2}:[0-9]{2} .$/
141
+ #
142
+ # picker_configs: ->
143
+ # _.extend super(), {format: 'HH:mm'}
144
+ #
145
+ #
146
+ #@Kn.ns 'Kn.utilities', (exports)->
147
+ # exports.TimePicker = TimePicker
148
+
149
+
150
+ ##
151
+ # Eventi generali Jquery
152
+ #$ ->
153
+ # $('.collapse_search').click (e) ->
154
+ # e.preventDefault();
155
+ # $('.search_panel .collapsible_panel').slideToggle()
156
+ # $('.search_panel .collapsible_panel').slideUp() unless $('.search_panel .collapsible_panel.uncollapsed').length > 0
157
+ #
158
+
159
+ ## Trasformare form bootstrap da label posizionate sopra a input a sinistra
160
+ # Default:
161
+ # label_cls: 'col-sm-2'
162
+ # wrapp_cls: 'col-sm-10'
163
+ #$.fn.extend
164
+ # bs3_form_inline: (options)->
165
+ # settings =
166
+ # label_cls: 'col-sm-2'
167
+ # wrapp_cls: 'col-sm-10'
168
+ #
169
+ # settings = $.extend settings, options
170
+ # return @each () ->
171
+ # $(this).find('.form-group .form-label').addClass settings.label_cls
172
+ # $(this).find('.form-group .form-wrapper').addClass settings.wrapp_cls
173
+
174
+
175
+ #duplicate_button_toggle = (btn)->
176
+ # if $(btn.parentNode).find('.remove_row,.add_one_more').length == 1
177
+ # if $(btn.parentNode).find('.remove_row').length == 0
178
+ # rem_class = 'add_one_more'
179
+ # add_class = 'remove_row'
180
+ # ico_rem_class = 'fa-plus'
181
+ # ico_add_class = 'fa-minus'
182
+ # if $(btn.parentNode).find('.add_one_more').length == 0
183
+ # rem_class = 'remove_row'
184
+ # add_class = 'add_one_more'
185
+ # ico_rem_class = 'fa-minus'
186
+ # ico_add_class = 'fa-plus'
187
+ #
188
+ # $(btn).clone().appendTo(btn.parentNode).
189
+ # removeClass(rem_class).
190
+ # addClass(add_class).
191
+ # find('.fa').
192
+ # removeClass(ico_rem_class).
193
+ # addClass(ico_add_class)
194
+
195
+ #elaborate_buttons = (tabella)->
196
+ ## numero_elementi = $(tabella).find('.add_one_more').length
197
+ # $(tabella).find('.add_one_more').each (index, ele)->
198
+ # duplicate_button_toggle(ele)
199
+ # if $(tabella).find('tr:not(.multiple_table_remove_row) .remove_row').length == 1
200
+ # $(tabella).find('tr:not(.multiple_table_remove_row) .remove_row').first().remove()
201
+
202
+
203
+ ## Gestione elementi multipli
204
+ # Eventi sulla tabella:
205
+ # - row_append : lanciato quando viene appeso una nuova riga, parametri: tabella,riga appena aggiunta
206
+ # - row_removed : lanciato quando viene rimossa una nuova riga, parametri: tabella,riga appena rimossa
207
+ #$.fn.extend
208
+ # multiple_table: (options) ->
209
+ ## settings =
210
+ ## label: ".form-label"
211
+ ## content: ".form-wrapper"
212
+ ##
213
+ ## settings = $.extend settings, options
214
+ # return @each () ->
215
+ # tabella = @
216
+ # elaborate_buttons(tabella)
217
+ #
218
+ #
219
+ # $(tabella).on 'click', '.remove_row', (e)->
220
+ # e.preventDefault()
221
+ # row = $(@).closest('tr')
222
+ # row.hide().addClass('multiple_table_remove_row')
223
+ # $(@).find('[type="hidden"]').val('true')
224
+ # elaborate_buttons(tabella)
225
+ # $(tabella).trigger("row_removed", [tabella, row]);
226
+ #
227
+ # $(tabella).on 'click', '.add_one_more', (e)->
228
+ # e.preventDefault()
229
+ # row = $(@).closest('tr').clone(false, true)
230
+ # uid = $(@).closest('tbody').find('tr').length
231
+ # $(row).find('input,select').val('').each ->
232
+ # name = $(@).attr('name').replace(/\[[0-9]+\]/, "[#{uid}]")
233
+ # $(@).attr('name', name)
234
+ # $(@).removeAttr('disabled')
235
+ #
236
+ # datapicker_containers= $(row).find(".tk_date_time_picker")
237
+ # $(datapicker_containers).each (index,val) =>
238
+ # new_id= $(val).attr("id").concat( new Date().getTime())
239
+ # $(val).attr("id",new_id)
240
+ #
241
+ # script = $(val).siblings("script")[0]
242
+ # script_text = $(script).text();
243
+ # new_script_text = script_text.replace(/'#.*'/,"'#"+new_id+"'")
244
+ # script_parent= $(script).parent()
245
+ # $(script).replaceWith('<script type=\'text/javascript\'>'+new_script_text+'</script>');
246
+ #
247
+ # row.appendTo($(@).closest('tbody'))
248
+ # elaborate_buttons(tabella)
249
+ # $(tabella).trigger("row_append", [tabella, row]);
250
+
251
+ ##fine
252
+
253
+ ## Gestione bottone di cancellazione
254
+ # Precedentemente alla rimozione dell'elemento viene
255
+ # lanciato un evento che notifica tale cancellazione "component_removed"
256
+ #$.fn.extend
257
+ # kono_delete_button: ()->
258
+ # return @each () ->
259
+ # $(this).on 'submit', (e) ->
260
+ # e.preventDefault()
261
+ # form = $(this)
262
+ # form.closest('.modal').modal('hide')
263
+ # $.ajax
264
+ # url: form.prop('action')
265
+ # data: form.serialize()
266
+ # method: 'DELETE'
267
+ # success: (data)->
268
+ # $('.modal-backdrop').remove() #rimuovo la modal
269
+ # $('body').removeClass('modal-open') #rimuovo la classe che blocca
270
+ # if data.success
271
+ # base_component = $(form.data('callbackRemove'))
272
+ # base_component.trigger('component_removed', [form.data('callbackRemove'), data]);
273
+ # base_component.hide('fast').remove()
274
+
275
+
276
+ ##
277
+ # Classe per la gestione delle form Modal
278
+ #
279
+ # Eventi:
280
+ # close_modal -> self
281
+ # rescue_invalid_content -> self,response,jquery(dom modal)
282
+ # success -> ajax_response
283
+
284
+ #class ModalForm extends EventEmitter
285
+ #
286
+ # defaults = {success: (->)}
287
+ #
288
+ # constructor: (@modal, options = {}) ->
289
+ # super
290
+ # {@success} = _.extend defaults, options
291
+ # @form = $(@modal).find('form').get(0)
292
+ # @modal_id = $(@modal).attr('id')
293
+ # @initialize_callbacks()
294
+ #
295
+ # inject_format: (format = 'json')->
296
+ # $(@form).append("<input type='hidden' value='#{format}' name='format'>")
297
+ #
298
+ # close_modal: ->
299
+ # $(@modal).modal('hide')
300
+ # $('.modal-backdrop').remove()
301
+ # $('body').removeClass('modal-open')
302
+ # $(@form).get(0).reset()
303
+ # @emitEvent('close_modal', [@]);
304
+ #
305
+ # rescue_invalid_content: (response)->
306
+ ## ricevendo in risposta la modal sostituirò la modal attuale,
307
+ ## attacco tutte le opzioni di questa classe.
308
+ # @close_modal()
309
+ # mod = $(response.partial).appendTo($('body'))
310
+ # id = Date.now()
311
+ # $(mod).prop('id', id).modal('show')
312
+ # modal = new @.__proto__.constructor(mod)
313
+ # @propagate_events_on_child(modal)
314
+ # @emitEvent('rescue_invalid_content', [@, response, modal])
315
+ # return {response: response, modal: modal}
316
+ #
317
+ #
318
+ ## Si occupa di propagare gli eventi attaccati sul padre pannello sui vari figli
319
+ # propagate_events_on_child: (child)->
320
+ # events = @_getEvents()
321
+ # _.each events, (v, k) =>
322
+ # child.on k, =>
323
+ # @emitEvent(k, arguments)
324
+ #
325
+ #
326
+ # initialize_callbacks: ->
327
+ # @inject_format()
328
+ # $(@form).on 'submit', (e) =>
329
+ # Kn.show_wait()
330
+ # e.preventDefault()
331
+ # $.ajax
332
+ # url: $(@form).prop('action')
333
+ # method: $(@form).prop('method')
334
+ # data: $(@form).serialize()
335
+ # success: =>
336
+ # @_on_success(arguments)
337
+ # error: (xhr) =>
338
+ # @_on_error(xhr)
339
+ #
340
+ ###
341
+ ## funzione privata eseguita al success
342
+ # _on_success: (args)->
343
+ # @close_modal()
344
+ # Kn.hide_wait()
345
+ # @emitEvent('success', args);
346
+ #
347
+ # _on_error: (xhr)->
348
+ # Kn.hide_wait()
349
+ # switch parseInt(xhr.status/100)*100
350
+ # when 400 then @rescue_invalid_content(xhr.responseJSON)
351
+ # when 500 then alert("Attenzione, problemi nello svolgimento dell'operazione contattare amministratore")
352
+ #
353
+ #
354
+ #@Kn.ns 'Kn.utilities', (exports)->
355
+ # exports.ModalForm = ModalForm
356
+ #
357
+ #
358
+ #class ModalNewButton extends ModalForm
359
+ #
360
+ # ##
361
+ # # Funzione per ricaricare la modal
362
+ # # Esegue un'ajax alla pagina corrente, ricercando l'elemento con l'id uguale a quello di se stesso,
363
+ # # rimpiazza quindi la precedente modal di creazione e riattacca tutti gli eventi al modal appena creato.
364
+ # # sucessivamente rimuove l'elemento iniziale e lancia l'evento "self_reloaded" per poter far eventualemnte ulteriori
365
+ # # modifiche sul modal appena generato
366
+ # self_reload: ()->
367
+ # @_self_reload(@)
368
+ #
369
+ # _self_reload: ()->
370
+ # Kn.show_wait()
371
+ # id = "tmp#{(new Date()).getTime()}"
372
+ # $('body').append("<div id='#{id}'></div>")
373
+ # $("##{id}").load "#{window.location.href} ##{@modal_id}", ()=>
374
+ # ele = $("##{id}>*")
375
+ # $(ele).attr('generated_id', id)
376
+ # pre_modal = $("##{@modal_id}")
377
+ # pre_modal.after(ele)
378
+ # modal = new @__proto__.constructor(ele)
379
+ # @propagate_events_on_child(modal)
380
+ # @emitEvent('self_reloaded', [modal, @])
381
+ # pre_modal.remove()
382
+ # Kn.hide_wait()
383
+ #
384
+ #
385
+ #@Kn.ns 'Kn.utilities', (exports)->
386
+ # exports.ModalNewButton = ModalNewButton
387
+ #
388
+ #
389
+ ####
390
+ #Classe che gestisce la UI per il bottone edit
391
+ #
392
+ ####
393
+ #class ModalEditButton extends ModalForm
394
+ #
395
+ # constructor: (@btn_blk, options = {}) ->
396
+ # @updatable_content = $(@btn_blk).data('updatableContent')
397
+ # if $(@btn_blk).hasClass('kono_modal_form')
398
+ # super(@btn_blk, options)
399
+ # else
400
+ # super($(@btn_blk).find('.kono_modal_form').get(0), options)
401
+ #
402
+ # _on_success: (args)->
403
+ # super
404
+ # data = args[0]
405
+ # if @updatable_content
406
+ # $(@updatable_content).replaceWith(data.partial)
407
+ # #seleziono il nuovo pannello
408
+ # panel = $(@updatable_content)
409
+ # panel.find('.kono_edit_button').each (index,ele) =>
410
+ # new_panel = new @.__proto__.constructor(ele)
411
+ # new_panel.modal.updatable_content = @updatable_content
412
+ # #rillacciamo gli eventi del vecchio pannello su quello nuovo
413
+ # @propagate_events_on_child(new_panel)
414
+ # @emitEvent('rendered', [@, panel, new_panel])
415
+ #
416
+ # rescue_invalid_content: (response)->
417
+ # res = super
418
+ # res.modal.updatable_content = @updatable_content
419
+ #
420
+ #
421
+ # initial_classes: ->
422
+ # _.reduce _.compact($(@btn_blk).prop('class').split(' ')), (memo, str)->
423
+ # "#{memo}.#{str}"
424
+ # , ''
425
+ #
426
+ #
427
+ #@Kn.ns 'Kn.utilities', (exports)->
428
+ # exports.ModalEditButton = ModalEditButton
429
+ #
430
+ #
431
+ #class BasePannel
432
+ #
433
+ # form_inline_settings:
434
+ # label_cls: 'col-xs-12 col-sm-4',
435
+ # wrapp_cls: 'col-xs-12 col-sm-8'
436
+ #
437
+ # constructor: (@blk) ->
438
+ # $(@blk).bs3_form_inline @form_inline_settings
439
+ # @initialize_events()
440
+ #
441
+ # initialize_events: ->
442
+ # ele = $(@blk).find('.kono_edit_button').get(0)
443
+ # if(ele)
444
+ # panel = new Kn.utilities.ModalEditButton ele
445
+ # panel.on 'rendered', (button, panel)->
446
+ # $(panel).bs3_form_inline @form_inline_settings
447
+ # panel.on 'rescue_invalid_content', (a, b, c)->
448
+ # $(c.modal).bs3_form_inline @form_inline_settings
449
+ #
450
+ #@Kn.ns 'Kn.utilities', (exports)->
451
+ # exports.BasePannel = BasePannel
452
+ #
453
+ ### Gestione Generazione Mappa google per Input LocationPicker
454
+ ##
455
+ #$.fn.extend
456
+ # kono_util_location_picker: (options)->
457
+ # settings =
458
+ # center: {lat: 42.908, lng: 12.303}
459
+ # selector_field_lat: 'input[name="lat"]'
460
+ # selector_field_lng: 'input[name="lat"]'
461
+ # zoom_level: 5
462
+ #
463
+ # settings = $.extend settings, options
464
+ #
465
+ # return @each () ->
466
+ # map = new google.maps.Map(@, {
467
+ # zoom: settings.zoom_level,
468
+ # center: settings.center
469
+ # })
470
+ # marker = new google.maps.Marker({
471
+ # position: settings.center,
472
+ # draggable: true,
473
+ # map: map
474
+ # })
475
+ # marker.addListener 'drag', (data) ->
476
+ # $(settings.selector_field_lat).val(data.latLng.lat())
477
+ # $(settings.selector_field_lng).val(data.latLng.lng())