kono_utils 0.15.5
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 +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
data/Rakefile
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
begin
|
|
2
|
+
require 'bundler/setup'
|
|
3
|
+
rescue LoadError
|
|
4
|
+
puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
require 'rdoc/task'
|
|
8
|
+
|
|
9
|
+
RDoc::Task.new(:rdoc) do |rdoc|
|
|
10
|
+
rdoc.rdoc_dir = 'rdoc'
|
|
11
|
+
rdoc.title = 'KonoUtils'
|
|
12
|
+
rdoc.options << '--line-numbers'
|
|
13
|
+
rdoc.rdoc_files.include('README.rdoc')
|
|
14
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
Bundler::GemHelper.install_tasks
|
|
23
|
+
|
|
@@ -0,0 +1,456 @@
|
|
|
1
|
+
#= require underscore
|
|
2
|
+
#= require EventEmitter
|
|
3
|
+
#= require moment
|
|
4
|
+
#= require bootstrap-datetimepicker
|
|
5
|
+
#= require moment/it
|
|
6
|
+
#= require bootstrap-treeview
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
@Kono = @Kono || {};
|
|
10
|
+
|
|
11
|
+
@Kn = @Kono
|
|
12
|
+
|
|
13
|
+
##
|
|
14
|
+
# http://stackoverflow.com/questions/8730859/classes-within-coffeescript-namespace
|
|
15
|
+
# Funzione che si occupa di costruire il namespace se non presente e passarlo come risultato
|
|
16
|
+
# la funzione si aspetta una stringa divisa da punti che identificano i vari livelli di namespace
|
|
17
|
+
# Es: @Kn.ns 'Kn.admin.iseeprices', (exports)->
|
|
18
|
+
# exports.Form = Form
|
|
19
|
+
# exports.attributi_vari = 'ciao'
|
|
20
|
+
# ovviamente senza cancellare i precedenti livelli
|
|
21
|
+
|
|
22
|
+
@Kn.ns = (target, name, block) ->
|
|
23
|
+
if arguments.length < 3
|
|
24
|
+
tmp = (if typeof exports isnt 'undefined' then exports else window)
|
|
25
|
+
[target, name, block] = [tmp, arguments...]
|
|
26
|
+
top = target
|
|
27
|
+
target = target[item] or= {} for item in name.split '.'
|
|
28
|
+
block target, top
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
###
|
|
32
|
+
Si occupa di eseguire il blocco nel caso in cui siamo nel namespace di vista,
|
|
33
|
+
o che sia presente tale namespace.
|
|
34
|
+
eseguo ovviamente il tutto all'interno di un $-> per essere sicuro che la pagina sia caricata
|
|
35
|
+
Viene attaccanto anche un evento per ascoltare i possibili eventi di hashchange di jquery ui
|
|
36
|
+
per ascoltare se una nuova pagina viene inserita.
|
|
37
|
+
ES:
|
|
38
|
+
@Kn.view_ns '.Alim.Admin.IseepricesController.edit', (namespace)->
|
|
39
|
+
fai qualcosa solo se esiste tale namespace
|
|
40
|
+
|
|
41
|
+
###
|
|
42
|
+
@Kn.view_ns = (selector, block) ->
|
|
43
|
+
$ ->
|
|
44
|
+
if $(selector).length > 0
|
|
45
|
+
block(selector)
|
|
46
|
+
else
|
|
47
|
+
# attacco ascoltatore event haschanged
|
|
48
|
+
$(window).on 'hashchange', ->
|
|
49
|
+
block(selector)
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
###
|
|
53
|
+
Singleton per avere una modal da utilizzare
|
|
54
|
+
funziona attraverso helper bootstrap_please_wait
|
|
55
|
+
###
|
|
56
|
+
@Kn.show_wait = ->
|
|
57
|
+
$('#processing_wait').modal()
|
|
58
|
+
|
|
59
|
+
@Kn.hide_wait = ->
|
|
60
|
+
$('#processing_wait').modal('hide')
|
|
61
|
+
#forzo eliminazione di tutti i fade
|
|
62
|
+
$('.modal-backdrop.fade.in').remove()
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
##
|
|
66
|
+
# A tutte le form aggiungo l'autocomplete ad off
|
|
67
|
+
$ ->
|
|
68
|
+
$('form').prop('autocomplete', 'off')
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
##
|
|
72
|
+
# picker = new Kn.utilities.DateTimePicker(
|
|
73
|
+
# selector: _.map(view_namespace, (cls)-> "#{cls} #date_time_picker_documents_search_data").join(",")
|
|
74
|
+
# server_format: "YYYY-MM-DDTHH:mm:ss+Z"
|
|
75
|
+
# )
|
|
76
|
+
# picker.initialize()
|
|
77
|
+
#
|
|
78
|
+
class DateTimePicker
|
|
79
|
+
|
|
80
|
+
defaults = server_format: "YYYY-MM-DD HH:mm:ss Z",
|
|
81
|
+
format: 'DD/MM/YYYY',
|
|
82
|
+
server_match: /^[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2} .$/,
|
|
83
|
+
locale: 'it'
|
|
84
|
+
|
|
85
|
+
constructor: (options = {}) ->
|
|
86
|
+
{@selector, @server_format, @format, @server_match, @locale} = _.extend defaults, options
|
|
87
|
+
@input_date = @parse_input_value()
|
|
88
|
+
|
|
89
|
+
initialize: ->
|
|
90
|
+
if @input_date
|
|
91
|
+
val = @input_date
|
|
92
|
+
val = @input_date.format(@format) if _.isFunction(@input_date.format)
|
|
93
|
+
$(@selector).find("input").val(val)
|
|
94
|
+
|
|
95
|
+
$(@selector).datetimepicker(@picker_configs())
|
|
96
|
+
|
|
97
|
+
picker_configs: ->
|
|
98
|
+
{
|
|
99
|
+
format: @format,
|
|
100
|
+
locale: @locale
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
parse_input_value: ->
|
|
104
|
+
value = $(@selector).find("input").attr('value')
|
|
105
|
+
unless value == '' or _.isUndefined(value)
|
|
106
|
+
if @server_match.test(value)
|
|
107
|
+
return moment(value, @server_format)
|
|
108
|
+
else
|
|
109
|
+
return value
|
|
110
|
+
false
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
##
|
|
114
|
+
# Definisce l'elemento associato alla data finale di un range di date
|
|
115
|
+
set_end: (@end_pick)->
|
|
116
|
+
$(@selector).data("DateTimePicker").maxDate(@end_pick.input_date) if @end_pick.input_date
|
|
117
|
+
|
|
118
|
+
$("#{@end_pick.selector}").on "dp.change", (e) =>
|
|
119
|
+
$(@selector).data("DateTimePicker").maxDate(e.date)
|
|
120
|
+
|
|
121
|
+
##
|
|
122
|
+
# Definisce l'elemento associato alla data iniziale di un range di date
|
|
123
|
+
set_start: (@start_pick)->
|
|
124
|
+
$(@selector).data("DateTimePicker").minDate(@start_pick.input_date) if @start_pick.input_date
|
|
125
|
+
|
|
126
|
+
$("#{@start_pick.selector}").on "dp.change", (e) =>
|
|
127
|
+
$(@selector).data("DateTimePicker").minDate(e.date)
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
@Kn.ns 'Kn.utilities', (exports)->
|
|
131
|
+
exports.DateTimePicker = DateTimePicker
|
|
132
|
+
|
|
133
|
+
class TimePicker extends DateTimePicker
|
|
134
|
+
defaults = server_format: "HH:mm",
|
|
135
|
+
format: 'HH:mm',
|
|
136
|
+
server_match: /[0-9]{2}:[0-9]{2} .$/
|
|
137
|
+
|
|
138
|
+
picker_configs: ->
|
|
139
|
+
_.extend super(), {format: 'HH:mm'}
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
@Kn.ns 'Kn.utilities', (exports)->
|
|
143
|
+
exports.TimePicker = TimePicker
|
|
144
|
+
|
|
145
|
+
|
|
146
|
+
##
|
|
147
|
+
# Eventi generali Jquery
|
|
148
|
+
$ ->
|
|
149
|
+
$('.collapse_search').click (e) ->
|
|
150
|
+
e.preventDefault();
|
|
151
|
+
$('.search_panel .collapsible_panel').slideToggle()
|
|
152
|
+
$('.search_panel .collapsible_panel').slideUp() unless $('.search_panel .collapsible_panel.uncollapsed').length > 0
|
|
153
|
+
|
|
154
|
+
|
|
155
|
+
## Trasformare form bootstrap da label posizionate sopra a input a sinistra
|
|
156
|
+
# Default:
|
|
157
|
+
# label_cls: 'col-sm-2'
|
|
158
|
+
# wrapp_cls: 'col-sm-10'
|
|
159
|
+
$.fn.extend
|
|
160
|
+
bs3_form_inline: (options)->
|
|
161
|
+
settings =
|
|
162
|
+
label_cls: 'col-sm-2'
|
|
163
|
+
wrapp_cls: 'col-sm-10'
|
|
164
|
+
|
|
165
|
+
settings = $.extend settings, options
|
|
166
|
+
return @each () ->
|
|
167
|
+
$(this).find('.form-group .form-label').addClass settings.label_cls
|
|
168
|
+
$(this).find('.form-group .form-wrapper').addClass settings.wrapp_cls
|
|
169
|
+
|
|
170
|
+
|
|
171
|
+
duplicate_button_toggle = (btn)->
|
|
172
|
+
if $(btn.parentNode).find('.remove_row,.add_one_more').length == 1
|
|
173
|
+
if $(btn.parentNode).find('.remove_row').length == 0
|
|
174
|
+
rem_class = 'add_one_more'
|
|
175
|
+
add_class = 'remove_row'
|
|
176
|
+
ico_rem_class = 'fa-plus'
|
|
177
|
+
ico_add_class = 'fa-minus'
|
|
178
|
+
if $(btn.parentNode).find('.add_one_more').length == 0
|
|
179
|
+
rem_class = 'remove_row'
|
|
180
|
+
add_class = 'add_one_more'
|
|
181
|
+
ico_rem_class = 'fa-minus'
|
|
182
|
+
ico_add_class = 'fa-plus'
|
|
183
|
+
|
|
184
|
+
$(btn).clone().appendTo(btn.parentNode).
|
|
185
|
+
removeClass(rem_class).
|
|
186
|
+
addClass(add_class).
|
|
187
|
+
find('.fa').
|
|
188
|
+
removeClass(ico_rem_class).
|
|
189
|
+
addClass(ico_add_class)
|
|
190
|
+
|
|
191
|
+
elaborate_buttons = (tabella)->
|
|
192
|
+
# numero_elementi = $(tabella).find('.add_one_more').length
|
|
193
|
+
$(tabella).find('.add_one_more').each (index, ele)->
|
|
194
|
+
duplicate_button_toggle(ele)
|
|
195
|
+
if $(tabella).find('tr:not(.multiple_table_remove_row) .remove_row').length == 1
|
|
196
|
+
$(tabella).find('tr:not(.multiple_table_remove_row) .remove_row').first().remove()
|
|
197
|
+
|
|
198
|
+
|
|
199
|
+
## Gestione elementi multipli
|
|
200
|
+
$.fn.extend
|
|
201
|
+
multiple_table: (options) ->
|
|
202
|
+
# settings =
|
|
203
|
+
# label: ".form-label"
|
|
204
|
+
# content: ".form-wrapper"
|
|
205
|
+
#
|
|
206
|
+
# settings = $.extend settings, options
|
|
207
|
+
return @each () ->
|
|
208
|
+
tabella = @
|
|
209
|
+
elaborate_buttons(tabella)
|
|
210
|
+
|
|
211
|
+
|
|
212
|
+
$(tabella).on 'click', '.remove_row', (e)->
|
|
213
|
+
e.preventDefault()
|
|
214
|
+
$(@).closest('tr').hide().addClass('multiple_table_remove_row')
|
|
215
|
+
$(@).find('[type="hidden"]').val('true')
|
|
216
|
+
elaborate_buttons(tabella)
|
|
217
|
+
|
|
218
|
+
$(tabella).on 'click', '.add_one_more', (e)->
|
|
219
|
+
e.preventDefault()
|
|
220
|
+
row = $(@).closest('tr').clone(false, true)
|
|
221
|
+
uid = $(@).closest('tbody').find('tr').length
|
|
222
|
+
$(row).find('input,select').val('').each ->
|
|
223
|
+
name = $(@).attr('name').replace(/\[[0-9]+\]/, "[#{uid}]")
|
|
224
|
+
$(@).attr('name', name)
|
|
225
|
+
$(@).removeAttr('disabled')
|
|
226
|
+
|
|
227
|
+
row.appendTo($(@).closest('tbody'))
|
|
228
|
+
elaborate_buttons(tabella)
|
|
229
|
+
|
|
230
|
+
##fine
|
|
231
|
+
|
|
232
|
+
## Gestione bottone di cancellazione
|
|
233
|
+
# Precedentemente alla rimozione dell'elemento viene
|
|
234
|
+
# lanciato un evento che notifica tale cancellazione "component_removed"
|
|
235
|
+
$.fn.extend
|
|
236
|
+
kono_delete_button: ()->
|
|
237
|
+
return @each () ->
|
|
238
|
+
$(this).on 'submit', (e) ->
|
|
239
|
+
e.preventDefault()
|
|
240
|
+
form = $(this)
|
|
241
|
+
form.closest('.modal').modal('hide')
|
|
242
|
+
$.ajax
|
|
243
|
+
url: form.prop('action')
|
|
244
|
+
data: form.serialize()
|
|
245
|
+
method: 'DELETE'
|
|
246
|
+
success: (data)->
|
|
247
|
+
$('.modal-backdrop').remove() #rimuovo la modal
|
|
248
|
+
$('body').removeClass('modal-open') #rimuovo la classe che blocca
|
|
249
|
+
if data.success
|
|
250
|
+
base_component = $(form.data('callbackRemove'))
|
|
251
|
+
base_component.trigger('component_removed', [form.data('callbackRemove'), data]);
|
|
252
|
+
base_component.hide('fast').remove()
|
|
253
|
+
|
|
254
|
+
|
|
255
|
+
##
|
|
256
|
+
# Classe per la gestione delle form Modal
|
|
257
|
+
#
|
|
258
|
+
# Eventi:
|
|
259
|
+
# close_modal -> self
|
|
260
|
+
# rescue_invalid_content -> self,response,jquery(dom modal)
|
|
261
|
+
# success -> ajax_response
|
|
262
|
+
|
|
263
|
+
class ModalForm extends EventEmitter
|
|
264
|
+
|
|
265
|
+
defaults = {success: (->)}
|
|
266
|
+
|
|
267
|
+
constructor: (@modal, options = {}) ->
|
|
268
|
+
super
|
|
269
|
+
{@success} = _.extend defaults, options
|
|
270
|
+
@form = $(@modal).find('form').get(0)
|
|
271
|
+
@modal_id = $(@modal).attr('id')
|
|
272
|
+
@initialize_callbacks()
|
|
273
|
+
|
|
274
|
+
inject_format: (format = 'json')->
|
|
275
|
+
$(@form).append("<input type='hidden' value='#{format}' name='format'>")
|
|
276
|
+
|
|
277
|
+
close_modal: ->
|
|
278
|
+
$(@modal).modal('hide')
|
|
279
|
+
$('.modal-backdrop').remove()
|
|
280
|
+
$('body').removeClass('modal-open')
|
|
281
|
+
$(@form).get(0).reset()
|
|
282
|
+
@emitEvent('close_modal', [@]);
|
|
283
|
+
|
|
284
|
+
rescue_invalid_content: (response)->
|
|
285
|
+
# ricevendo in risposta la modal sostituirò la modal attuale,
|
|
286
|
+
# attacco tutte le opzioni di questa classe.
|
|
287
|
+
@close_modal()
|
|
288
|
+
mod = $(response.partial).appendTo($('body'))
|
|
289
|
+
id = Date.now()
|
|
290
|
+
$(mod).prop('id', id).modal('show')
|
|
291
|
+
modal = new @.__proto__.constructor(mod)
|
|
292
|
+
@propagate_events_on_child(modal)
|
|
293
|
+
@emitEvent('rescue_invalid_content', [@, response, modal])
|
|
294
|
+
return {response: response, modal: modal}
|
|
295
|
+
|
|
296
|
+
|
|
297
|
+
# Si occupa di propagare gli eventi attaccati sul padre pannello sui vari figli
|
|
298
|
+
propagate_events_on_child: (child)->
|
|
299
|
+
events = @_getEvents()
|
|
300
|
+
_.each events, (v, k) =>
|
|
301
|
+
child.on k, =>
|
|
302
|
+
@emitEvent(k, arguments)
|
|
303
|
+
|
|
304
|
+
|
|
305
|
+
initialize_callbacks: ->
|
|
306
|
+
@inject_format()
|
|
307
|
+
$(@form).on 'submit', (e) =>
|
|
308
|
+
Kn.show_wait()
|
|
309
|
+
e.preventDefault()
|
|
310
|
+
$.ajax
|
|
311
|
+
url: $(@form).prop('action')
|
|
312
|
+
method: $(@form).prop('method')
|
|
313
|
+
data: $(@form).serialize()
|
|
314
|
+
success: =>
|
|
315
|
+
@_on_success(arguments)
|
|
316
|
+
error: (xhr) =>
|
|
317
|
+
@_on_error(xhr)
|
|
318
|
+
|
|
319
|
+
##
|
|
320
|
+
# funzione privata eseguita al success
|
|
321
|
+
_on_success: (args)->
|
|
322
|
+
@close_modal()
|
|
323
|
+
Kn.hide_wait()
|
|
324
|
+
@emitEvent('success', args);
|
|
325
|
+
|
|
326
|
+
_on_error: (xhr)->
|
|
327
|
+
Kn.hide_wait()
|
|
328
|
+
switch parseInt(xhr.status/100)*100
|
|
329
|
+
when 400 then @rescue_invalid_content(xhr.responseJSON)
|
|
330
|
+
when 500 then alert("Attenzione, problemi nello svolgimento dell'operazione contattare amministratore")
|
|
331
|
+
|
|
332
|
+
|
|
333
|
+
@Kn.ns 'Kn.utilities', (exports)->
|
|
334
|
+
exports.ModalForm = ModalForm
|
|
335
|
+
|
|
336
|
+
|
|
337
|
+
class ModalNewButton extends ModalForm
|
|
338
|
+
|
|
339
|
+
##
|
|
340
|
+
# Funzione per ricaricare la modal
|
|
341
|
+
# Esegue un'ajax alla pagina corrente, ricercando l'elemento con l'id uguale a quello di se stesso,
|
|
342
|
+
# rimpiazza quindi la precedente modal di creazione e riattacca tutti gli eventi al modal appena creato.
|
|
343
|
+
# sucessivamente rimuove l'elemento iniziale e lancia l'evento "self_reloaded" per poter far eventualemnte ulteriori
|
|
344
|
+
# modifiche sul modal appena generato
|
|
345
|
+
self_reload: ()->
|
|
346
|
+
@_self_reload(@)
|
|
347
|
+
|
|
348
|
+
_self_reload: ()->
|
|
349
|
+
Kn.show_wait()
|
|
350
|
+
id = "tmp#{(new Date()).getTime()}"
|
|
351
|
+
$('body').append("<div id='#{id}'></div>")
|
|
352
|
+
$("##{id}").load "#{window.location.href} ##{@modal_id}", ()=>
|
|
353
|
+
ele = $("##{id}>*")
|
|
354
|
+
$(ele).attr('generated_id', id)
|
|
355
|
+
pre_modal = $("##{@modal_id}")
|
|
356
|
+
pre_modal.after(ele)
|
|
357
|
+
modal = new @__proto__.constructor(ele)
|
|
358
|
+
@propagate_events_on_child(modal)
|
|
359
|
+
@emitEvent('self_reloaded', [modal, @])
|
|
360
|
+
pre_modal.remove()
|
|
361
|
+
Kn.hide_wait()
|
|
362
|
+
|
|
363
|
+
|
|
364
|
+
@Kn.ns 'Kn.utilities', (exports)->
|
|
365
|
+
exports.ModalNewButton = ModalNewButton
|
|
366
|
+
|
|
367
|
+
|
|
368
|
+
###
|
|
369
|
+
Classe che gestisce la UI per il bottone edit
|
|
370
|
+
|
|
371
|
+
###
|
|
372
|
+
class ModalEditButton extends ModalForm
|
|
373
|
+
|
|
374
|
+
constructor: (@btn_blk, options = {}) ->
|
|
375
|
+
@updatable_content = $(@btn_blk).data('updatableContent')
|
|
376
|
+
if $(@btn_blk).hasClass('kono_modal_form')
|
|
377
|
+
super(@btn_blk, options)
|
|
378
|
+
else
|
|
379
|
+
super($(@btn_blk).find('.kono_modal_form').get(0), options)
|
|
380
|
+
|
|
381
|
+
_on_success: (args)->
|
|
382
|
+
super
|
|
383
|
+
data = args[0]
|
|
384
|
+
if @updatable_content
|
|
385
|
+
$(@updatable_content).replaceWith(data.partial)
|
|
386
|
+
#seleziono il nuovo pannello
|
|
387
|
+
panel = $(@updatable_content)
|
|
388
|
+
panel.find('.kono_edit_button').each (index,ele) =>
|
|
389
|
+
new_panel = new @.__proto__.constructor(ele)
|
|
390
|
+
new_panel.modal.updatable_content = @updatable_content
|
|
391
|
+
#rillacciamo gli eventi del vecchio pannello su quello nuovo
|
|
392
|
+
@propagate_events_on_child(new_panel)
|
|
393
|
+
@emitEvent('rendered', [@, panel, new_panel])
|
|
394
|
+
|
|
395
|
+
rescue_invalid_content: (response)->
|
|
396
|
+
res = super
|
|
397
|
+
res.modal.updatable_content = @updatable_content
|
|
398
|
+
|
|
399
|
+
|
|
400
|
+
initial_classes: ->
|
|
401
|
+
_.reduce _.compact($(@btn_blk).prop('class').split(' ')), (memo, str)->
|
|
402
|
+
"#{memo}.#{str}"
|
|
403
|
+
, ''
|
|
404
|
+
|
|
405
|
+
|
|
406
|
+
@Kn.ns 'Kn.utilities', (exports)->
|
|
407
|
+
exports.ModalEditButton = ModalEditButton
|
|
408
|
+
|
|
409
|
+
|
|
410
|
+
class BasePannel
|
|
411
|
+
|
|
412
|
+
form_inline_settings:
|
|
413
|
+
label_cls: 'col-xs-12 col-sm-4',
|
|
414
|
+
wrapp_cls: 'col-xs-12 col-sm-8'
|
|
415
|
+
|
|
416
|
+
constructor: (@blk) ->
|
|
417
|
+
$(@blk).bs3_form_inline @form_inline_settings
|
|
418
|
+
@initialize_events()
|
|
419
|
+
|
|
420
|
+
initialize_events: ->
|
|
421
|
+
ele = $(@blk).find('.kono_edit_button').get(0)
|
|
422
|
+
if(ele)
|
|
423
|
+
panel = new Kn.utilities.ModalEditButton ele
|
|
424
|
+
panel.on 'rendered', (button, panel)->
|
|
425
|
+
$(panel).bs3_form_inline @form_inline_settings
|
|
426
|
+
panel.on 'rescue_invalid_content', (a, b, c)->
|
|
427
|
+
$(c.modal).bs3_form_inline @form_inline_settings
|
|
428
|
+
|
|
429
|
+
@Kn.ns 'Kn.utilities', (exports)->
|
|
430
|
+
exports.BasePannel = BasePannel
|
|
431
|
+
|
|
432
|
+
## Gestione Generazione Mappa google per Input LocationPicker
|
|
433
|
+
#
|
|
434
|
+
$.fn.extend
|
|
435
|
+
kono_util_location_picker: (options)->
|
|
436
|
+
settings =
|
|
437
|
+
center: {lat: 42.908, lng: 12.303}
|
|
438
|
+
selector_field_lat: 'input[name="lat"]'
|
|
439
|
+
selector_field_lng: 'input[name="lat"]'
|
|
440
|
+
zoom_level: 5
|
|
441
|
+
|
|
442
|
+
settings = $.extend settings, options
|
|
443
|
+
|
|
444
|
+
return @each () ->
|
|
445
|
+
map = new google.maps.Map(@, {
|
|
446
|
+
zoom: settings.zoom_level,
|
|
447
|
+
center: settings.center
|
|
448
|
+
})
|
|
449
|
+
marker = new google.maps.Marker({
|
|
450
|
+
position: settings.center,
|
|
451
|
+
draggable: true,
|
|
452
|
+
map: map
|
|
453
|
+
})
|
|
454
|
+
marker.addListener 'drag', (data) ->
|
|
455
|
+
$(settings.selector_field_lat).val(data.latLng.lat())
|
|
456
|
+
$(settings.selector_field_lng).val(data.latLng.lng())
|