kono_utils 0.15.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (112) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.rdoc +442 -0
  4. data/Rakefile +23 -0
  5. data/app/assets/javascripts/kono_utils/utilities.coffee +456 -0
  6. data/app/assets/stylesheets/kono_utils/utils.css.scss +43 -0
  7. data/app/controllers/kono_utils/change_log_controller.rb +6 -0
  8. data/app/input/bs_aceeditor_input.rb +53 -0
  9. data/app/input/bs_autocomplete_input.rb +60 -0
  10. data/app/input/bs_datepicker_input.rb +16 -0
  11. data/app/input/bs_datetimepicker_input.rb +80 -0
  12. data/app/input/bs_file_download_input.rb +35 -0
  13. data/app/input/bs_image_input.rb +35 -0
  14. data/app/input/bs_label_with_container_input.rb +22 -0
  15. data/app/input/bs_location_picker_input.rb +95 -0
  16. data/app/input/bs_readonly_input.rb +52 -0
  17. data/app/input/bs_timepicker_input.rb +14 -0
  18. data/app/policies/kono_utils/base_editing_policy_concern.rb +27 -0
  19. data/app/views/kono_utils/base_editing/_edit.html.erb +3 -0
  20. data/app/views/kono_utils/base_editing/_edit_page_side_title_header.html.erb +3 -0
  21. data/app/views/kono_utils/base_editing/_edit_page_title_header.html.erb +3 -0
  22. data/app/views/kono_utils/base_editing/_form.html.erb +15 -0
  23. data/app/views/kono_utils/base_editing/_index_buttons.html.erb +2 -0
  24. data/app/views/kono_utils/base_editing/_index_page_side_title_header.html.erb +3 -0
  25. data/app/views/kono_utils/base_editing/_index_page_title_header.html.erb +3 -0
  26. data/app/views/kono_utils/base_editing/_index_tfoot.html.erb +0 -0
  27. data/app/views/kono_utils/base_editing/_new.html.erb +3 -0
  28. data/app/views/kono_utils/base_editing/_new_page_side_title_header.html.erb +3 -0
  29. data/app/views/kono_utils/base_editing/_new_page_title_header.html.erb +3 -0
  30. data/app/views/kono_utils/base_editing/_search_form.html.erb +1 -0
  31. data/app/views/kono_utils/base_editing/application/_edit_page_side_title_header.html.erb +1 -0
  32. data/app/views/kono_utils/base_editing/application/_edit_page_title_header.html.erb +1 -0
  33. data/app/views/kono_utils/base_editing/application/_index_page_side_title_header.html.erb +1 -0
  34. data/app/views/kono_utils/base_editing/application/_index_page_title_header.html.erb +1 -0
  35. data/app/views/kono_utils/base_editing/application/_new_page_side_title_header.html.erb +1 -0
  36. data/app/views/kono_utils/base_editing/application/_new_page_title_header.html.erb +1 -0
  37. data/app/views/kono_utils/base_editing/application/edit.html.erb +1 -0
  38. data/app/views/kono_utils/base_editing/application/new.html.erb +1 -0
  39. data/app/views/kono_utils/base_editing/edit.html.erb +1 -0
  40. data/app/views/kono_utils/base_editing/index.html.erb +36 -0
  41. data/app/views/kono_utils/base_editing/new.html.erb +1 -0
  42. data/app/views/kono_utils/change_log/index.html.erb +3 -0
  43. data/config/initializers/mysql.rb +12 -0
  44. data/config/initializers/time.rb +12 -0
  45. data/config/locales/it.yml +18 -0
  46. data/lib/generators/kono_utils/install/install_generator.rb +24 -0
  47. data/lib/generators/templates/initializer.rb +3 -0
  48. data/lib/kono_utils.rb +41 -0
  49. data/lib/kono_utils/application_helper.rb +625 -0
  50. data/lib/kono_utils/base_editing_helper.rb +194 -0
  51. data/lib/kono_utils/base_search.rb +173 -0
  52. data/lib/kono_utils/concerns.rb +10 -0
  53. data/lib/kono_utils/concerns/active_record_translation.rb +47 -0
  54. data/lib/kono_utils/concerns/base_editing.rb +195 -0
  55. data/lib/kono_utils/concerns/base_modals.rb +97 -0
  56. data/lib/kono_utils/concerns/success_message.rb +25 -0
  57. data/lib/kono_utils/encoder.rb +55 -0
  58. data/lib/kono_utils/engine.rb +13 -0
  59. data/lib/kono_utils/fiscal_code.rb +47 -0
  60. data/lib/kono_utils/params_hash_array.rb +37 -0
  61. data/lib/kono_utils/percentage.rb +60 -0
  62. data/lib/kono_utils/search_attribute.rb +57 -0
  63. data/lib/kono_utils/tmp_file.rb +81 -0
  64. data/lib/kono_utils/version.rb +3 -0
  65. data/lib/kono_utils/virtual_model.rb +22 -0
  66. data/lib/tasks/kono_utils_tasks.rake +4 -0
  67. data/spec/dummy/README.rdoc +28 -0
  68. data/spec/dummy/Rakefile +6 -0
  69. data/spec/dummy/app/assets/images/.keep +0 -0
  70. data/spec/dummy/app/assets/javascripts/application.js +13 -0
  71. data/spec/dummy/app/assets/stylesheets/application.css +15 -0
  72. data/spec/dummy/app/controllers/application_controller.rb +5 -0
  73. data/spec/dummy/app/controllers/concerns/.keep +0 -0
  74. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  75. data/spec/dummy/app/mailers/.keep +0 -0
  76. data/spec/dummy/app/models/.keep +0 -0
  77. data/spec/dummy/app/models/concerns/.keep +0 -0
  78. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  79. data/spec/dummy/bin/bundle +3 -0
  80. data/spec/dummy/bin/rails +4 -0
  81. data/spec/dummy/bin/rake +4 -0
  82. data/spec/dummy/bin/setup +29 -0
  83. data/spec/dummy/config.ru +4 -0
  84. data/spec/dummy/config/application.rb +32 -0
  85. data/spec/dummy/config/boot.rb +5 -0
  86. data/spec/dummy/config/database.yml +25 -0
  87. data/spec/dummy/config/environment.rb +5 -0
  88. data/spec/dummy/config/environments/development.rb +41 -0
  89. data/spec/dummy/config/environments/production.rb +79 -0
  90. data/spec/dummy/config/environments/test.rb +42 -0
  91. data/spec/dummy/config/initializers/assets.rb +11 -0
  92. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  93. data/spec/dummy/config/initializers/cookies_serializer.rb +3 -0
  94. data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  95. data/spec/dummy/config/initializers/inflections.rb +16 -0
  96. data/spec/dummy/config/initializers/mime_types.rb +4 -0
  97. data/spec/dummy/config/initializers/session_store.rb +3 -0
  98. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  99. data/spec/dummy/config/locales/en.yml +23 -0
  100. data/spec/dummy/config/routes.rb +56 -0
  101. data/spec/dummy/config/secrets.yml +22 -0
  102. data/spec/dummy/lib/assets/.keep +0 -0
  103. data/spec/dummy/log/.keep +0 -0
  104. data/spec/dummy/public/404.html +67 -0
  105. data/spec/dummy/public/422.html +67 -0
  106. data/spec/dummy/public/500.html +66 -0
  107. data/spec/dummy/public/favicon.ico +0 -0
  108. data/spec/lib/kono_utils/fiscal_code_spec.rb +56 -0
  109. data/spec/rails_helper.rb +53 -0
  110. data/spec/spec_helper.rb +92 -0
  111. data/vendor/assets/javascripts/EventEmitter.js +473 -0
  112. metadata +425 -0
@@ -0,0 +1,43 @@
1
+ @import 'bootstrap-sprockets';
2
+ @import 'bootstrap';
3
+ @import 'bootstrap-datetimepicker';
4
+
5
+ .kono_delete_button, .kono_edit_button {
6
+ margin: 1px;
7
+ &.align-right {
8
+ float: right;
9
+ }
10
+ &.align-left {
11
+ float: left;
12
+ }
13
+ }
14
+
15
+ .search_panel {
16
+ .panel-title {
17
+ .icon-search {
18
+ cursor: pointer;
19
+ }
20
+ }
21
+ }
22
+
23
+ .bs_file_download {
24
+ .form-wrapper {
25
+ display: block;
26
+ .input-group{
27
+ width:100%;
28
+ }
29
+ }
30
+ }
31
+
32
+ //classi per una spaziatura verticale , utilizzare
33
+ // passando la classe generale v-space e poi il valore scelto: space-x1
34
+ // ogni valore dello spacer rappresente 0.2em
35
+ //ES:
36
+ // <div class="kono-v-spacer space-x2"></div> => 0.4em
37
+ .kono-v-spacer {
38
+ @for $i from 1 through 20 {
39
+ &.space-x#{$i} {
40
+ height: 0.2em * $i;
41
+ }
42
+ }
43
+ }
@@ -0,0 +1,6 @@
1
+ class KonoUtils::ChangeLogController < ApplicationController
2
+
3
+ def index
4
+ end
5
+
6
+ end
@@ -0,0 +1,53 @@
1
+ class BsAceeditorInput < Formtastic::Inputs::StringInput
2
+ include FormtasticBootstrap::Inputs::Base
3
+ include FormtasticBootstrap::Inputs::Base::Collections
4
+ include ActionView::Helpers::TagHelper
5
+ include ActionView::Context
6
+ include FontAwesome::Rails::IconHelper
7
+ include ActionView::Helpers::JavaScriptHelper
8
+
9
+
10
+ ##
11
+ # Nel caso di collection si può definire con
12
+ # :show_hidden => [true] per stampare il campo hidden o meno con il vero valore
13
+ # :display_field come options quale campo usare per stampare
14
+ #
15
+ def to_html
16
+
17
+ theme = options[:theme] || 'twilight'
18
+ mode = options[:mode] || 'ruby'
19
+ height = options[:height] || '300px'
20
+
21
+ bootstrap_wrapping do
22
+ content_tag(:div) do
23
+
24
+ id = SecureRandom.hex
25
+
26
+ buff = ActiveSupport::SafeBuffer.new
27
+
28
+ buff<< content_tag(:div, :class => "container_editor clearfix", :style => 'width:100%;') do
29
+ content_tag(:div, object.send(method), id: id, style: "height:#{height};width:100px;")
30
+ end
31
+
32
+ id_hidden = SecureRandom.hex
33
+ buff<< builder.hidden_field(method, form_control_input_html_options.merge(:id => id_hidden))
34
+
35
+ buff<< content_tag(:script, :type => "text/javascript") do
36
+ raw "var editor = ace.edit('#{id}');\n
37
+ editor.setTheme('ace/theme/#{theme}');\n
38
+ editor.getSession().setMode('ace/mode/#{mode}');\n
39
+ $('##{id}').width($('##{id}').closest('.container_editor').width());\n
40
+ editor.resize();\n
41
+ editor.getSession().on('change', function(e) {
42
+ $('##{id_hidden}').val(editor.getValue());
43
+ });
44
+ "
45
+ end
46
+
47
+ buff
48
+
49
+ end
50
+ end
51
+ end
52
+
53
+ end
@@ -0,0 +1,60 @@
1
+ ##
2
+ # <%= f.input :city,
3
+ # :as => :bs_autocomplete,
4
+ # :url => tikal_core.autocomplete_city_nome_autoclts_cities,
5
+ # :display_field => :nome,
6
+ # :value_field => :city_id %>
7
+ #
8
+ #
9
+ # -- display_field
10
+ # serve per indicare quale campo utilizzare come metodo per estrapolare i dati dal record associato
11
+ # può anche essere una proc a cui passiamo l'oggetto
12
+ # -- value_field
13
+ # indica quale campo utilizzare per estrapolare il dato del valore del record associato
14
+ # e quale nome dare al campo per creare una form corretta
15
+ #
16
+ #se è presente il Formtastic::Inputs::AutocompleteInput
17
+ begin
18
+ class BsAutocompleteInput < Formtastic::Inputs::AutocompleteInput
19
+
20
+ include FormtasticBootstrap::Inputs::Base
21
+
22
+ def input_html_options
23
+ id = super[:id]
24
+
25
+ opts = {class: "form-control", id: "autocomplete_#{id}"}
26
+
27
+ ##Setto valore utilizzando le impostazioni di identificativo del campo per autocomplete :display_field
28
+ unless options[:display_field].nil?
29
+ opts[:value] = object.send(method).try(options[:display_field])
30
+ end
31
+
32
+ super.merge(opts)
33
+ end
34
+
35
+ def to_html
36
+ bootstrap_wrapping do
37
+ buffer = ActiveSupport::SafeBuffer.new
38
+
39
+ html_options = input_html_options
40
+
41
+ hidden_field = nil
42
+ unless options[:value_field].nil?
43
+ hidden_id = "hidden_#{html_options[:id]}_#{SecureRandom.hex}"
44
+ html_options[:id_element] = "##{hidden_id}"
45
+ hidden_field = builder.hidden_field(options[:value_field], id: hidden_id)
46
+ end
47
+
48
+ buffer << builder.autocomplete_field(method, options.delete(:url), html_options)
49
+
50
+ buffer << hidden_field unless hidden_field.nil?
51
+
52
+ buffer
53
+ end
54
+ end
55
+ end
56
+ rescue Exception => e
57
+ if defined?(Rails)
58
+ Rails.logger.debug {"Non riesco a caricare questa input BsAutocompleteInput #{__FILE__}"}
59
+ end
60
+ end
@@ -0,0 +1,16 @@
1
+ ##
2
+ # Classe per la stampa del DatePicker con bootstrap
3
+ #
4
+ #
5
+ class BsDatepickerInput < BsDatetimepickerInput
6
+
7
+
8
+ def default_javascript_options
9
+ {
10
+ server_format: 'YYYY-MM-DD',
11
+ server_match: '/^[0-9]{4}-[0-9]{2}-[0-9]{2}$/',
12
+ format: 'DD/MM/YYYY'
13
+ }
14
+ end
15
+
16
+ end
@@ -0,0 +1,80 @@
1
+ ##
2
+ # Classe per la stampa del DatetimePicker con bootstrap
3
+ #
4
+ # * *Opzioni* :
5
+ # - inject_js => True|False|Hash per ozioni js
6
+ #
7
+ class BsDatetimepickerInput < Formtastic::Inputs::StringInput
8
+ include FormtasticBootstrap::Inputs::Base
9
+ include ActionView::Helpers::TagHelper
10
+ include ActionView::Context
11
+ include FontAwesome::Rails::IconHelper
12
+ include ActionView::Helpers::JavaScriptHelper
13
+ include ActionView::Helpers::OutputSafetyHelper
14
+
15
+ ##
16
+ # Serve per avere icone differenti nell'interfaccia
17
+ def icon
18
+ fa_icon(:calendar)
19
+ end
20
+
21
+ def to_html
22
+
23
+ bootstrap_wrapping do
24
+ tmp = ActiveSupport::SafeBuffer.new
25
+
26
+ tmp<< content_tag(:div, class: 'input-group date tk_date_time_picker', id: picker_container_id) do
27
+ builder.text_field(method, form_control_input_html_options)<<
28
+ content_tag(:span, icon, class: 'input-group-addon')
29
+
30
+ end
31
+
32
+ if options[:inject_js]
33
+ tmp << javascript_initializations
34
+ end
35
+ tmp
36
+ end
37
+ end
38
+
39
+ def picker_container_id
40
+ if @_container_id.nil?
41
+ @_container_id = "date_time_picker_#{form_control_input_html_options[:id]}_#{Random.new_seed}"
42
+ end
43
+ @_container_id
44
+ end
45
+
46
+ def javascript_initializations
47
+
48
+ opt = options[:inject_js]
49
+ unless opt.is_a?(Hash)
50
+ opt ={}
51
+ end
52
+
53
+ opt=default_javascript_options.merge(opt)
54
+
55
+ if block_given?
56
+ yield opt
57
+ else
58
+ content_tag(:script, :type => "text/javascript") do
59
+ raw "(function(){var data_picker = new Kn.utilities.DateTimePicker({
60
+ selector: $('##{picker_container_id}'),
61
+ server_format: \"#{opt[:server_format]}\",
62
+ server_match: #{opt[:server_match]},
63
+ format: \"#{opt[:format]}\"
64
+ }) ;
65
+ data_picker.initialize() ;
66
+ })();
67
+ "
68
+ end
69
+ end
70
+ end
71
+
72
+ def default_javascript_options
73
+ {
74
+ server_format: 'YYYY-MM-DD',
75
+ server_match: '/^[0-9]{4}-[0-9]{2}-[0-9]{2}$/',
76
+ format: 'DD/MM/YYYY HH:mm'
77
+ }
78
+ end
79
+
80
+ end
@@ -0,0 +1,35 @@
1
+ class BsFileDownloadInput < Formtastic::Inputs::StringInput
2
+ include FormtasticBootstrap::Inputs::Base
3
+ include FormtasticBootstrap::Inputs::Base::Collections
4
+ include ActionView::Helpers::TagHelper
5
+ include ActionView::Context
6
+ include ActionView::Helpers::UrlHelper
7
+
8
+
9
+ ##
10
+ # Passare nelle opzioni la chiave :content con una proc che richiamo per generare il buffer
11
+ #
12
+ def to_html
13
+
14
+ bootstrap_wrapping do
15
+ content_tag(:div, class: 'input-group bs_label_with_content') do
16
+ content_tag(:div, class: 'row') do
17
+ tmp = ActiveSupport::SafeBuffer.new
18
+
19
+ tmp << content_tag(:div, class: "col-md-6") do
20
+ builder.input method, :label => false
21
+ end
22
+
23
+ if object.send(method).exists?
24
+ tmp << content_tag(:div, class: "col-md-6 col-lg-6") do
25
+ link_to I18n.t('formtastic.inputs.bs_file_download.download'), object.send(method).url, class: 'btn btn-default'
26
+ end
27
+ end
28
+
29
+ tmp
30
+ end
31
+ end
32
+ end
33
+ end
34
+
35
+ end
@@ -0,0 +1,35 @@
1
+ class BsImageInput < Formtastic::Inputs::StringInput
2
+ include FormtasticBootstrap::Inputs::Base
3
+ include FormtasticBootstrap::Inputs::Base::Collections
4
+ include ActionView::Helpers::TagHelper
5
+ include ActionView::Context
6
+ include ActionView::Helpers::AssetTagHelper
7
+
8
+
9
+ ##
10
+ # Passare nelle opzioni la chiave :content con una proc che richiamo per generare il buffer
11
+ #
12
+ def to_html
13
+
14
+ bootstrap_wrapping do
15
+ content_tag(:div, class: 'input-group bs_label_with_content') do
16
+ content_tag(:div, class: 'row') do
17
+ tmp = ActiveSupport::SafeBuffer.new
18
+
19
+ tmp << content_tag(:div, class: "col-md-6 col-lg-6") do
20
+ builder.input method, :label => false
21
+ end
22
+
23
+ if object.send(method).exists?
24
+ tmp << content_tag(:div, class: "col-md-6 col-lg-6") do
25
+ image_tag object.send(method).url,class:'img-responsive img-thumbnail',style:'max-height:200px;'
26
+ end
27
+ end
28
+
29
+ tmp
30
+ end
31
+ end
32
+ end
33
+ end
34
+
35
+ end
@@ -0,0 +1,22 @@
1
+ class BsLabelWithContainerInput < Formtastic::Inputs::StringInput
2
+ include FormtasticBootstrap::Inputs::Base
3
+ include FormtasticBootstrap::Inputs::Base::Collections
4
+ include ActionView::Helpers::TagHelper
5
+ include ActionView::Context
6
+
7
+
8
+ ##
9
+ # Passare nelle opzioni la chiave :content con una proc che richiamo per generare il buffer
10
+ #
11
+ def to_html
12
+
13
+ bootstrap_wrapping do
14
+ content_tag(:div, class: 'input-group bs_label_with_content') do
15
+ buff = ActiveSupport::SafeBuffer.new
16
+ buff<< content_tag(:p, options[:content].call, class: 'form-control-static',id:"#{form_control_input_html_options[:id]}_container")
17
+ buff
18
+ end
19
+ end
20
+ end
21
+
22
+ end
@@ -0,0 +1,95 @@
1
+ class BsLocationPickerInput < Formtastic::Inputs::StringInput
2
+ include FormtasticBootstrap::Inputs::Base
3
+ include FormtasticBootstrap::Inputs::Base::Collections
4
+ include ActionView::Helpers::TagHelper
5
+ include ActionView::Context
6
+ include FontAwesome::Rails::IconHelper
7
+ include ActionView::Helpers::JavaScriptHelper
8
+
9
+ class ZoomInvalid < StandardError
10
+ def initialize(msg="Zoom non valido, deve essere intero")
11
+ super
12
+ end
13
+ end
14
+
15
+
16
+ ##
17
+ # Stampa Una Mappa di Google Maps, che rende possibile la selezione di un punto sulla mappa
18
+ # e di salvarlo nei due campi Lat Lng della form.
19
+ #
20
+ # Necessario aver aggiunto anche l'asset kono_utils/utilities
21
+ # per avere il javascript necessario alla generazione della mappa
22
+ #
23
+ # Nell'inizializzatore di kono_utils installato con il generatore impostare la chiave di google:
24
+ # google_api_key
25
+ #
26
+ # La mappa ha un contenitore
27
+ #
28
+ # Options:
29
+ # - default_center -> Array con [lat,lng] nel caso non siano impostati i valori iniziali
30
+ # - height -> [300px] Altezza da mettere nello stile della canvas di google maps
31
+ # - fields -> Array[:lat,:lng] campi che identificano la Latitudine e Longitudine
32
+ # nel record
33
+ # - zoom_level -> [5] Integer livello zoom della mappa, se passo una Proc viene elaborata
34
+ # passando il record, deve tornare un Integer
35
+ #
36
+ def to_html
37
+
38
+ default_center = options[:default_center] || [42.90887521920127, 12.303765624999983]
39
+ center = default_center
40
+
41
+ height = options[:height] || '300px'
42
+ fields = options[:fields] || [:lat, :lng]
43
+ zoom_level = options[:zoom_level] || 5
44
+
45
+ if zoom_level.is_a?(Proc)
46
+ zoom_level = zoom_level.call(object)
47
+ end
48
+
49
+ raise ZoomInvalid unless zoom_level.is_a?(Integer)
50
+
51
+
52
+ bootstrap_wrapping do
53
+ content_tag(:div) do
54
+
55
+ id = SecureRandom.hex
56
+
57
+ callback_name = "initMap#{id}"
58
+
59
+ buff = ActiveSupport::SafeBuffer.new
60
+
61
+ buff<< content_tag(:div, :class => "container_google_maps clearfix", :style => 'width:100%;') do
62
+ content_tag(:div, nil, id: id, style: "height:#{height}")
63
+ end
64
+
65
+ id_hidden_lat = SecureRandom.hex
66
+ buff<< builder.hidden_field(fields[0], form_control_input_html_options.merge(:id => id_hidden_lat))
67
+ id_hidden_lng = SecureRandom.hex
68
+ buff<< builder.hidden_field(fields[1], form_control_input_html_options.merge(:id => id_hidden_lng))
69
+
70
+ unless object.send(fields[0]).blank? or object.send(fields[1]).blank?
71
+ center = [object.send(fields[0]), object.send(fields[1])]
72
+ end
73
+
74
+ buff<< content_tag(:script, :type => "text/javascript") do
75
+ raw "function #{callback_name}(){
76
+ $('##{id}').kono_util_location_picker({
77
+ center:{lat:#{center[0]},lng:#{center[1]}},
78
+ zoom_level:#{zoom_level},
79
+ selector_field_lat:'##{id_hidden_lat}',
80
+ selector_field_lng:'##{id_hidden_lng}'
81
+ });
82
+ }"
83
+ end
84
+
85
+ buff<< content_tag(:script, nil,
86
+ src: "https://maps.googleapis.com/maps/api/js?key=#{KonoUtils.configuration.google_api_key}&callback=#{callback_name}",
87
+ :type => "text/javascript", async: '', defer: '')
88
+
89
+ buff
90
+
91
+ end
92
+ end
93
+ end
94
+
95
+ end