kono_utils 1.0.1 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/README.rdoc +0 -76
- data/app/assets/javascripts/kono_utils/core.coffee +477 -0
- data/app/assets/stylesheets/kono_utils/{_kono_styles.css.scss → core.css.scss} +1 -16
- data/app/policies/kono_utils/base_editing_policy_concern.rb +52 -3
- data/app/policies/kono_utils/base_search_form_policy_concern.rb +25 -0
- data/config/locales/it.yml +3 -1
- data/lib/generators/kono_utils/install/install_generator.rb +40 -3
- data/lib/generators/templates/base_editing_controller.template +3 -0
- data/lib/generators/templates/base_editing_helper.template +3 -0
- data/lib/generators/templates/base_editing_policy.template +4 -0
- data/lib/generators/templates/initializer.rb +3 -1
- data/lib/kono_utils.rb +20 -22
- data/lib/kono_utils/application_core_helper.rb +524 -0
- data/lib/kono_utils/application_enum_helper.rb +53 -0
- data/lib/kono_utils/application_helper.rb +4 -578
- data/lib/kono_utils/base_editing_core_helper.rb +194 -0
- data/lib/kono_utils/base_editing_helper.rb +3 -186
- data/lib/kono_utils/base_search.rb +32 -19
- data/lib/kono_utils/concerns/active_record_translation.rb +8 -4
- data/lib/kono_utils/concerns/active_storage_remover_helper.rb +61 -0
- data/lib/kono_utils/concerns/base_editing.rb +199 -53
- data/lib/kono_utils/configuration.rb +18 -0
- data/lib/kono_utils/engine.rb +15 -7
- data/lib/kono_utils/paginate_proxer.rb +17 -0
- data/lib/kono_utils/search_form_builder.rb +24 -0
- data/lib/kono_utils/version.rb +1 -1
- data/spec/dummy/app/assets/config/manifest.js +2 -0
- data/spec/dummy/app/assets/javascripts/application.js +1 -0
- data/spec/dummy/app/controllers/application_controller.rb +10 -0
- data/spec/dummy/app/controllers/base_editing_controller.rb +3 -0
- data/spec/dummy/app/controllers/users_controller.rb +2 -0
- data/spec/dummy/app/helpers/application_helper.rb +1 -0
- data/spec/dummy/app/helpers/base_editing_helper.rb +3 -0
- data/spec/dummy/app/models/application_record.rb +5 -0
- data/spec/dummy/app/models/user.rb +2 -0
- data/spec/dummy/app/policies/application_policy.rb +49 -0
- data/spec/dummy/app/policies/base_editing_policy.rb +4 -0
- data/spec/dummy/app/policies/user_policy.rb +23 -0
- data/spec/dummy/config/application.rb +1 -1
- data/spec/dummy/config/initializers/kono_utils.rb +3 -1
- data/spec/dummy/config/routes.rb +4 -0
- data/spec/dummy/db/migrate/20190716093114_create_users.rb +11 -0
- data/spec/dummy/db/schema.rb +23 -0
- data/spec/dummy/spec/models/user_spec.rb +5 -0
- metadata +63 -131
- data/app/assets/javascripts/kono_utils/utilities.coffee +0 -480
- data/app/assets/stylesheets/kono_utils/utils.css.scss +0 -4
- data/app/input/bs_aceeditor_input.rb +0 -53
- data/app/input/bs_autocomplete_input.rb +0 -60
- data/app/input/bs_datepicker_input.rb +0 -16
- data/app/input/bs_datetimepicker_input.rb +0 -80
- data/app/input/bs_file_download_input.rb +0 -35
- data/app/input/bs_image_input.rb +0 -35
- data/app/input/bs_label_with_container_input.rb +0 -22
- data/app/input/bs_location_picker_input.rb +0 -95
- data/app/input/bs_readonly_input.rb +0 -52
- data/app/input/bs_timepicker_input.rb +0 -14
- data/app/views/kono_utils/application/_search_panel.html.erb +0 -36
- data/app/views/kono_utils/base_editing/_edit.html.erb +0 -3
- data/app/views/kono_utils/base_editing/_edit_page_side_title_header.html.erb +0 -3
- data/app/views/kono_utils/base_editing/_edit_page_title_header.html.erb +0 -3
- data/app/views/kono_utils/base_editing/_form.html.erb +0 -15
- data/app/views/kono_utils/base_editing/_index_buttons.html.erb +0 -2
- data/app/views/kono_utils/base_editing/_index_page_side_title_header.html.erb +0 -3
- data/app/views/kono_utils/base_editing/_index_page_title_header.html.erb +0 -3
- data/app/views/kono_utils/base_editing/_index_tfoot.html.erb +0 -0
- data/app/views/kono_utils/base_editing/_new.html.erb +0 -3
- data/app/views/kono_utils/base_editing/_new_page_side_title_header.html.erb +0 -3
- data/app/views/kono_utils/base_editing/_new_page_title_header.html.erb +0 -3
- data/app/views/kono_utils/base_editing/_search_form.html.erb +0 -1
- data/app/views/kono_utils/base_editing/application/_edit_page_side_title_header.html.erb +0 -1
- data/app/views/kono_utils/base_editing/application/_edit_page_title_header.html.erb +0 -1
- data/app/views/kono_utils/base_editing/application/_index_page_side_title_header.html.erb +0 -1
- data/app/views/kono_utils/base_editing/application/_index_page_title_header.html.erb +0 -1
- data/app/views/kono_utils/base_editing/application/_new_page_side_title_header.html.erb +0 -1
- data/app/views/kono_utils/base_editing/application/_new_page_title_header.html.erb +0 -1
- data/app/views/kono_utils/base_editing/application/edit.html.erb +0 -1
- data/app/views/kono_utils/base_editing/application/new.html.erb +0 -1
- data/app/views/kono_utils/base_editing/edit.html.erb +0 -1
- data/app/views/kono_utils/base_editing/index.html.erb +0 -36
- data/app/views/kono_utils/base_editing/new.html.erb +0 -1
- data/lib/kono_utils/concerns.rb +0 -10
- data/lib/kono_utils/encoder.rb +0 -47
- data/lib/kono_utils/fiscal_code.rb +0 -47
- data/lib/kono_utils/params_hash_array.rb +0 -37
- data/lib/kono_utils/percentage.rb +0 -60
- data/lib/kono_utils/tmp_file.rb +0 -81
- data/lib/kono_utils/virtual_model.rb +0 -22
- data/lib/tasks/kono_utils_tasks.rake +0 -4
- data/spec/lib/kono_utils/fiscal_code_spec.rb +0 -56
- data/vendor/assets/javascripts/EventEmitter.js +0 -473
@@ -1,3 +1,4 @@
|
|
1
|
+
|
1
2
|
.kono_delete_button, .kono_edit_button {
|
2
3
|
margin: 1px;
|
3
4
|
&.align-right {
|
@@ -8,22 +9,6 @@
|
|
8
9
|
}
|
9
10
|
}
|
10
11
|
|
11
|
-
.search_panel {
|
12
|
-
.panel-title {
|
13
|
-
.icon-search {
|
14
|
-
cursor: pointer;
|
15
|
-
}
|
16
|
-
}
|
17
|
-
}
|
18
|
-
|
19
|
-
.bs_file_download {
|
20
|
-
.form-wrapper {
|
21
|
-
display: block;
|
22
|
-
.input-group{
|
23
|
-
width:100%;
|
24
|
-
}
|
25
|
-
}
|
26
|
-
}
|
27
12
|
|
28
13
|
//classi per una spaziatura verticale , utilizzare
|
29
14
|
// passando la classe generale v-space e poi il valore scelto: space-x1
|
@@ -5,10 +5,59 @@ module KonoUtils
|
|
5
5
|
extend ActiveSupport::Concern
|
6
6
|
|
7
7
|
included do
|
8
|
+
|
9
|
+
##
|
10
|
+
# elenco degli attributi filtrati alla ricezione nel controller
|
11
|
+
# @return [Array<Symbol>]
|
8
12
|
def permitted_attributes
|
9
|
-
|
13
|
+
cleard_columns+virtual_appended_attributes
|
14
|
+
end
|
15
|
+
|
16
|
+
##
|
17
|
+
# elenco attributi editabili nella form
|
18
|
+
# @return [Array<Symbol>]
|
19
|
+
def editable_attributes
|
20
|
+
cleard_columns
|
21
|
+
end
|
22
|
+
|
23
|
+
##
|
24
|
+
# elenco attributi visualizzabili nella show
|
25
|
+
# @return [Array<Symbol>]
|
26
|
+
def displayable_attributes
|
27
|
+
editable_attributes
|
28
|
+
end
|
29
|
+
|
30
|
+
##
|
31
|
+
# Elenco attributi da visualizzare, utilizzati nella vista della index
|
32
|
+
# @return [Array<Symbol>]
|
33
|
+
def show_attributes
|
34
|
+
cleard_columns
|
35
|
+
end
|
36
|
+
|
37
|
+
private
|
38
|
+
|
39
|
+
def cleard_columns
|
10
40
|
record.class.column_names.collect { |s| s.to_sym } - [:id, :created_at, :updated_at]
|
11
41
|
end
|
42
|
+
|
43
|
+
##
|
44
|
+
# Elenco di attributi generati dinamicamente da KonoUtils.
|
45
|
+
# Come ad esempio l'attributo per la cancellazione del file allegato
|
46
|
+
# @return [Array<Symbol>]
|
47
|
+
def virtual_appended_attributes
|
48
|
+
out = []
|
49
|
+
if record.class.respond_to?(:attribute_purger_name)
|
50
|
+
record.class.instance_methods.each do |c|
|
51
|
+
next if c.match(/=$/) #skippiamo per i writers
|
52
|
+
if record.respond_to?(record.class.attribute_purger_name(c))
|
53
|
+
Rails.logger.debug c.inspect
|
54
|
+
out << record.class.attribute_purger_name(c)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
out
|
59
|
+
end
|
60
|
+
|
12
61
|
end
|
13
62
|
|
14
63
|
if defined? ::Application::Scope
|
@@ -19,9 +68,9 @@ module KonoUtils
|
|
19
68
|
end
|
20
69
|
end
|
21
70
|
|
22
|
-
# module ClassMethods
|
71
|
+
# module ClassMethods
|
23
72
|
|
24
|
-
# end
|
73
|
+
# end
|
25
74
|
end
|
26
75
|
end
|
27
76
|
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'active_support/concern'
|
2
|
+
module KonoUtils
|
3
|
+
|
4
|
+
module BaseSearchFormPolicyConcern
|
5
|
+
extend ActiveSupport::Concern
|
6
|
+
|
7
|
+
included do
|
8
|
+
|
9
|
+
##
|
10
|
+
# elenco degli attributi filtrati alla ricezione nel controller
|
11
|
+
def permitted_attributes
|
12
|
+
record.search_attributes.collect(&:field)
|
13
|
+
end
|
14
|
+
|
15
|
+
alias_method :editable_attributes, :permitted_attributes
|
16
|
+
|
17
|
+
end
|
18
|
+
|
19
|
+
|
20
|
+
# module ClassMethods
|
21
|
+
|
22
|
+
# end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
data/config/locales/it.yml
CHANGED
@@ -15,4 +15,6 @@ it:
|
|
15
15
|
messages:
|
16
16
|
created: "%{model} creato correttamente."
|
17
17
|
updated: "%{model} aggiornato correttamente."
|
18
|
-
destroyed: "%{model} è stato correttamente cancellato."
|
18
|
+
destroyed: "%{model} è stato correttamente cancellato."
|
19
|
+
kono_utils:
|
20
|
+
user_not_authorized: Utente non autorizzato a modificare %{model}
|
@@ -19,12 +19,49 @@ module KonoUtils
|
|
19
19
|
copy_file 'initializer.rb', 'config/initializers/kono_utils.rb'
|
20
20
|
end
|
21
21
|
|
22
|
+
def install_pundit
|
23
|
+
run "rails g pundit:install"
|
24
|
+
end
|
25
|
+
|
26
|
+
def install_helper_on_application_helper
|
27
|
+
inject_into_file 'app/helpers/application_helper.rb', "\n include KonoUtils::ApplicationHelper", after: "module ApplicationHelper"
|
28
|
+
end
|
29
|
+
|
30
|
+
def install_active_record_traslation_on_application_record
|
31
|
+
inject_into_file 'app/models/application_record.rb', "\n include KonoUtils::Concerns::ActiveRecordTranslation\n", after: "ActiveRecord::Base"
|
32
|
+
inject_into_file 'app/models/application_record.rb', "\n include KonoUtils::Concerns::ActiveStorageRemoverHelper\n", after: "ActiveRecord::Base"
|
33
|
+
rescue Exception => e
|
34
|
+
puts "Attenzione, includere a mano:
|
35
|
+
- KonoUtils::Concerns::ActiveRecordTranslation
|
36
|
+
- KonoUtils::Concerns::ActiveStorageRemoverHelper
|
37
|
+
nel modello da cui darivano i modelli del base editing - #{e.message}"
|
38
|
+
end
|
39
|
+
|
40
|
+
def append_gem_dependency
|
41
|
+
append_to_file 'Gemfile', "# gem 'codice_fiscale'"
|
42
|
+
rescue Exception => e
|
43
|
+
puts e.message
|
44
|
+
end
|
45
|
+
|
46
|
+
|
47
|
+
|
22
48
|
def install_node_dependency
|
23
|
-
|
49
|
+
pacchetti_yarn = ["underscore"]#"wolfy87-eventemitter",
|
50
|
+
|
51
|
+
run "yarn add #{pacchetti_yarn.join(" ")}"
|
24
52
|
end
|
25
53
|
|
26
|
-
def
|
27
|
-
|
54
|
+
def base_editing_install
|
55
|
+
resp = ask "Vuoi che installi la struttura base del controller e base editing? y/n"
|
56
|
+
if resp=='y'
|
57
|
+
@controller_da_cui_derivare = ask("Controller da cui derivare il BaseEditingController?[RestrictedAreaController]")
|
58
|
+
@controller_da_cui_derivare = "RestrictedAreaController" if @controller_da_cui_derivare.blank?
|
59
|
+
template('base_editing_controller.template','app/controllers/base_editing_controller.rb')
|
60
|
+
template('base_editing_helper.template','app/helpers/base_editing_helper.rb')
|
61
|
+
template('base_editing_policy.template','app/policies/base_editing_policy.rb')
|
62
|
+
say "Tutti i Controller che dovranno lavorare con il base editing dovranno derivare da BaseEditingController"
|
63
|
+
say "Tutte le policy che dovranno lavorare con il base editing dovranno derivare da BaseEditingPolicy"
|
64
|
+
end
|
28
65
|
end
|
29
66
|
|
30
67
|
end
|
data/lib/kono_utils.rb
CHANGED
@@ -1,27 +1,29 @@
|
|
1
|
-
require
|
1
|
+
require "zeitwerk"
|
2
|
+
loader = Zeitwerk::Loader.for_gem
|
3
|
+
loader.ignore("#{__dir__}/generators")
|
2
4
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
autoload :Percentage
|
10
|
-
autoload :FiscalCode
|
11
|
-
autoload :TmpFile
|
12
|
-
autoload :ApplicationHelper
|
13
|
-
autoload :BaseEditingHelper
|
14
|
-
autoload :BaseSearch
|
15
|
-
autoload :Concerns
|
16
|
-
|
17
|
-
class Configuration
|
18
|
-
attr_accessor :google_api_key
|
5
|
+
|
6
|
+
if defined?(::Rails)
|
7
|
+
if Rails.gem_version <= Gem::Version.new('4.2.0')
|
8
|
+
# Non facciamo eager load nel caso di nuovi rails
|
9
|
+
translations_concerns = "#{__dir__}/kono_utils/concerns/active_record_translation"
|
10
|
+
loader.do_not_eager_load(translations_concerns)
|
19
11
|
end
|
12
|
+
else
|
13
|
+
# non carichiamo l'engine se non presente rails
|
14
|
+
loader.do_not_eager_load("#{__dir__}/kono_utils/engine")
|
15
|
+
end
|
16
|
+
|
17
|
+
loader.enable_reloading # you need to opt-in before setup
|
18
|
+
loader.setup
|
19
|
+
|
20
|
+
module KonoUtils
|
20
21
|
|
21
22
|
class << self
|
22
23
|
attr_writer :configuration
|
23
24
|
end
|
24
25
|
|
26
|
+
# @return [Configuration]
|
25
27
|
def self.configuration
|
26
28
|
@configuration ||= Configuration.new
|
27
29
|
end
|
@@ -34,8 +36,4 @@ module KonoUtils
|
|
34
36
|
end
|
35
37
|
|
36
38
|
|
37
|
-
|
38
|
-
if Rails.gem_version > Gem::Version.new('4.2.0')
|
39
|
-
require 'kono_utils/concerns/active_record_translation'
|
40
|
-
end
|
41
|
-
end
|
39
|
+
loader.eager_load
|
@@ -0,0 +1,524 @@
|
|
1
|
+
module KonoUtils
|
2
|
+
module ApplicationCoreHelper
|
3
|
+
|
4
|
+
# def self.included(base)
|
5
|
+
#
|
6
|
+
#
|
7
|
+
#
|
8
|
+
# base.send :include, FontAwesome::Rails::IconHelper
|
9
|
+
#
|
10
|
+
# end
|
11
|
+
|
12
|
+
# def will_paginate_bst(collection)
|
13
|
+
# will_paginate collection, renderer: BootstrapPagination::Rails
|
14
|
+
# end
|
15
|
+
|
16
|
+
|
17
|
+
##
|
18
|
+
# Crea un DIV che racchiude tutto il contenuto all'interno della classe utilizzata, splittando il nome della classe
|
19
|
+
# per suoi moduli, rendendo quindi filtrabile il contenuto sottostante
|
20
|
+
# @param [Proc] block -> contenuto che verrà inserito nel content
|
21
|
+
# @return [String]
|
22
|
+
def namespace_content(&block)
|
23
|
+
content_tag :div, class: "#{(controller.class.name.split("::") + [action_name]).join(" ")}" do
|
24
|
+
yield
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
|
29
|
+
# def true_false_label(val)
|
30
|
+
#
|
31
|
+
# if val
|
32
|
+
# icon =fa_icon(:check)
|
33
|
+
# classe='success'
|
34
|
+
# else
|
35
|
+
# classe='danger'
|
36
|
+
# icon =fa_icon(:times)
|
37
|
+
# end
|
38
|
+
#
|
39
|
+
# content_tag(:span, icon, class: "label label-#{classe}")
|
40
|
+
#
|
41
|
+
# end
|
42
|
+
|
43
|
+
|
44
|
+
##
|
45
|
+
# Genera una modal da riutilizzare per far aspettare determinate operazioni al client
|
46
|
+
# def bootstrap_please_wait
|
47
|
+
# content_tag(:div,
|
48
|
+
# class: 'modal fade',
|
49
|
+
# id: 'processing_wait',
|
50
|
+
# tabindex: "-1",
|
51
|
+
# role: "dialog",
|
52
|
+
# "aria-hidden".to_sym => "true") do
|
53
|
+
# content_tag :div, class: 'modal-dialog modal-sm' do
|
54
|
+
# content_tag :div, class: 'modal-content' do
|
55
|
+
#
|
56
|
+
# buff = ActiveSupport::SafeBuffer.new
|
57
|
+
#
|
58
|
+
# buff << content_tag(:div, class: 'modal-header') do
|
59
|
+
# content_tag(:h4, "Processing...", class: "modal-title")
|
60
|
+
# end
|
61
|
+
#
|
62
|
+
# buff << content_tag(:div, class: 'modal-body') do
|
63
|
+
# content_tag :div, class: "progress" do
|
64
|
+
# content_tag :div, ' ', class: "progress-bar progress-bar-striped active", role: "progressbar", style: "width: 100%"
|
65
|
+
# end
|
66
|
+
# end
|
67
|
+
#
|
68
|
+
# buff
|
69
|
+
# end
|
70
|
+
# end
|
71
|
+
# end
|
72
|
+
# end
|
73
|
+
|
74
|
+
|
75
|
+
##
|
76
|
+
# Genera la form di ricerca
|
77
|
+
# * *Args* :
|
78
|
+
# - search_model -> KonoUtils::BaseSearch
|
79
|
+
# - args -> Hash with configurations:
|
80
|
+
# - attributes -> array of symbols for the search, if empty used from search_model
|
81
|
+
# - reset_path -> path per cui resettare la ricerca, nil
|
82
|
+
# - form_opts -> opzioni da aggiungere per la form
|
83
|
+
# - buttons_editor -> Proc chiamata, con il passaggio dell'oggetto della form e
|
84
|
+
# del ActiveSupport::SafeBuffer con all'interno dei bottoni
|
85
|
+
# come parametro, deve ritornare
|
86
|
+
# un ActiveSupport::SafeBuffer a sua volta
|
87
|
+
# * *Returns* :
|
88
|
+
# -
|
89
|
+
#
|
90
|
+
# def search_form(search_model, args={})
|
91
|
+
#
|
92
|
+
# args = {
|
93
|
+
# :attributes => [],
|
94
|
+
# :reset_path => nil,
|
95
|
+
# :form_opts => {},
|
96
|
+
# :field_option => {:wrapper_html => {:class => "col-xs-12 col-sm-6 col-md-4 col-lg-3"}},
|
97
|
+
# :buttons_editor => Proc.new {|form_obj, sb| sb}
|
98
|
+
# }.merge(args)
|
99
|
+
#
|
100
|
+
# base_search_form_wrapper(search_model, {:attributes => args[:attributes], :form_opts => args[:form_opts]}) do |f|
|
101
|
+
#
|
102
|
+
# render :partial => '/application/search_panel.html', locals: {
|
103
|
+
# form: f,
|
104
|
+
# search_model: search_model
|
105
|
+
# }.merge(args)
|
106
|
+
#
|
107
|
+
# end
|
108
|
+
#
|
109
|
+
# end
|
110
|
+
|
111
|
+
# class BaseSearchFormWrapper < Struct.new(:formtastic_form, :attributes, :current_user)
|
112
|
+
#
|
113
|
+
# def fields_builder(cfgs={field_options: {}})
|
114
|
+
# form_buffer = ActiveSupport::SafeBuffer.new
|
115
|
+
#
|
116
|
+
# self.attributes.each do |field|
|
117
|
+
#
|
118
|
+
# form_options = field.form_options
|
119
|
+
# if form_options.is_a?(Proc)
|
120
|
+
# form_options = form_options.call(current_user, self.formtastic_form)
|
121
|
+
# end
|
122
|
+
#
|
123
|
+
# form_buffer << self.formtastic_form.input(field.field, cfgs[:field_options].merge(form_options))
|
124
|
+
# end
|
125
|
+
#
|
126
|
+
# form_buffer
|
127
|
+
# end
|
128
|
+
# end
|
129
|
+
|
130
|
+
##
|
131
|
+
# Utility interna che si occupa della logica minima per generare la il form di ricerca
|
132
|
+
# def base_search_form_wrapper(search_model, args={:attributes => [], :form_opts => {}})
|
133
|
+
# attributes = args[:attributes] || {}
|
134
|
+
# form_opts = args[:form_opts] || {}
|
135
|
+
# if attributes.length==0
|
136
|
+
# attributes = search_model.search_attributes
|
137
|
+
# end
|
138
|
+
#
|
139
|
+
# form_opts = {method: :get, :html => {autocomplete: 'off'}}.merge(form_opts)
|
140
|
+
#
|
141
|
+
# semantic_form_for search_model, form_opts do |f|
|
142
|
+
# yield BaseSearchFormWrapper.new(f, attributes, @current_user)
|
143
|
+
# end
|
144
|
+
# end
|
145
|
+
|
146
|
+
|
147
|
+
##
|
148
|
+
# Helper per generare una modal con all'interno un form
|
149
|
+
# Utilizzare passando un block il quale riceve come parametro la form di formtastic
|
150
|
+
# possibile passare anche una proc in buttons_proc per scrivere in modo differente i bottoni nella modal,
|
151
|
+
# alla proc viene passato il solito form di formtastic e il bottone standard di chiusura
|
152
|
+
#
|
153
|
+
# def modal_form_generator(args = {})
|
154
|
+
#
|
155
|
+
# args = {
|
156
|
+
# id: 'modal',
|
157
|
+
# class: '',
|
158
|
+
# title: 'Titolo',
|
159
|
+
# form_cfgs: [],
|
160
|
+
# buttons_proc: Proc.new do |f, default_close_btn|
|
161
|
+
# default_close_btn +
|
162
|
+
# f.action(:submit, button_html: {class: 'btn btn-primary'}, :label => :save_and_close)
|
163
|
+
# end
|
164
|
+
# }.merge(args)
|
165
|
+
#
|
166
|
+
# raise 'Passare le configurazioni per la form' if args[:form_cfgs]==[]
|
167
|
+
#
|
168
|
+
# default_close_btn = content_tag(:button, 'Chiudi', type: 'button', class: 'btn btn-default', data: {dismiss: "modal"})
|
169
|
+
#
|
170
|
+
# content_tag(:div,
|
171
|
+
# class: "modal fade kono_modal_form",
|
172
|
+
# id: args[:id],
|
173
|
+
# tabindex: "-1",
|
174
|
+
# role: "dialog",
|
175
|
+
# "aria-hidden".to_sym => "true") do
|
176
|
+
# content_tag :div, class: 'modal-dialog' do
|
177
|
+
# semantic_form_for(*args[:form_cfgs]) do |f|
|
178
|
+
# content_tag :div, class: 'modal-content' do
|
179
|
+
#
|
180
|
+
# buff = ActiveSupport::SafeBuffer.new
|
181
|
+
#
|
182
|
+
# buff << content_tag(:div, class: 'modal-header') do
|
183
|
+
# content_tag(:button, raw("×"), type: "button", class: "close", data: {dismiss: 'modal'}, "aria-hidden".to_sym => "true") +
|
184
|
+
# content_tag(:h4, args[:title], class: "modal-title")
|
185
|
+
# end
|
186
|
+
#
|
187
|
+
# buff << content_tag(:div, class: 'modal-body') do
|
188
|
+
# yield f
|
189
|
+
# end
|
190
|
+
#
|
191
|
+
# buff << content_tag(:div, class: 'modal-footer') do
|
192
|
+
# args[:buttons_proc].call(f, default_close_btn)
|
193
|
+
# end
|
194
|
+
#
|
195
|
+
# buff
|
196
|
+
# end
|
197
|
+
# end
|
198
|
+
# end
|
199
|
+
# end
|
200
|
+
#
|
201
|
+
# end
|
202
|
+
|
203
|
+
|
204
|
+
##
|
205
|
+
# Genera il bottone per editazione con una modal del contenuto,
|
206
|
+
# gli viene passato un block contenente la modal da lanciare per l'editazione,
|
207
|
+
# solitamente generata con modal_form_generator.
|
208
|
+
# come parametri viene passato l'id del target che si aspetta di richiamare
|
209
|
+
#
|
210
|
+
# ES:
|
211
|
+
# modal_edit_button do |id|
|
212
|
+
# render 'tikal_core/people/person_contacts/modal_form', :contact => contact, :id => id %>
|
213
|
+
# end
|
214
|
+
#
|
215
|
+
# Attributes:
|
216
|
+
# align: left|rigth
|
217
|
+
# updatable_content: elemento da rimpiazzare con il partial restituito
|
218
|
+
# class: classi aggiuntive per selezionare meglio il bottone
|
219
|
+
# btn_class: classi aggiuntive del bottone
|
220
|
+
# bnt_icon: Symbol che identifica che icona utilizzare per il bottone
|
221
|
+
#
|
222
|
+
#
|
223
|
+
# def modal_edit_button(*args, &block)
|
224
|
+
#
|
225
|
+
# options = {
|
226
|
+
# align: 'left',
|
227
|
+
# updatable_content: '',
|
228
|
+
# class: '',
|
229
|
+
# btn_class: '',
|
230
|
+
# bnt_icon: :edit
|
231
|
+
# }.merge(args.extract_options!)
|
232
|
+
#
|
233
|
+
# id = "#{SecureRandom.hex}"
|
234
|
+
#
|
235
|
+
#
|
236
|
+
# content_tag :div, class: "kono_edit_button align-#{options[:align]} #{options[:class]}", :data => {updatable_content: options[:updatable_content]} do
|
237
|
+
# buffer = ActiveSupport::SafeBuffer.new
|
238
|
+
#
|
239
|
+
# buffer << button_tag(data: {toggle: 'modal', target: "##{id}"}, class: "btn btn-default btn-xs #{options[:btn_class]}") {fa_icon(options[:bnt_icon])}
|
240
|
+
#
|
241
|
+
# buffer << capture do
|
242
|
+
# block.call(id)
|
243
|
+
# end
|
244
|
+
#
|
245
|
+
# buffer
|
246
|
+
# end
|
247
|
+
# end
|
248
|
+
|
249
|
+
|
250
|
+
##
|
251
|
+
# Genera il bottone per la cancellazione di un elemento
|
252
|
+
#
|
253
|
+
# modal_delete_button(path, [options])
|
254
|
+
# path -> resource to delete
|
255
|
+
# options:
|
256
|
+
# * confirm : Text to display in modal
|
257
|
+
# * align : left|right
|
258
|
+
# * callback_remove : id dell'elemento da rimuove una volta avuto successo il javascript di cancellazione
|
259
|
+
# * bnt_icon : Symbol che identifica che icona utilizzare per il bottone
|
260
|
+
# def modal_delete_button(*args)
|
261
|
+
# options = {
|
262
|
+
# confirm: 'Sicuri di voler eliminare il record? L\'azione non è annullabile.',
|
263
|
+
# align: 'left',
|
264
|
+
# callback_remove: nil,
|
265
|
+
# bnt_icon: :times
|
266
|
+
# }.merge(args.extract_options!)
|
267
|
+
# path = args[0]
|
268
|
+
#
|
269
|
+
# id = "#{SecureRandom.hex}"
|
270
|
+
#
|
271
|
+
# content_tag :div, class: "tk_delete_button align-#{options[:align]}" do
|
272
|
+
#
|
273
|
+
# buffer = ActiveSupport::SafeBuffer.new
|
274
|
+
#
|
275
|
+
# buffer<<button_tag(data: {toggle: 'modal', target: "##{id}"}, class: 'btn btn-danger btn-xs') {fa_icon(options[:bnt_icon])}
|
276
|
+
#
|
277
|
+
# buffer<< content_tag(:div,
|
278
|
+
# class: 'modal fade',
|
279
|
+
# id: id,
|
280
|
+
# tabindex: "-1",
|
281
|
+
# role: "dialog",
|
282
|
+
# "aria-hidden".to_sym => "true") do
|
283
|
+
# form_tag(path, method: :delete, data: {callback_remove: options[:callback_remove]}) do
|
284
|
+
# content_tag :div, class: 'modal-dialog' do
|
285
|
+
# content_tag :div, class: 'modal-content' do
|
286
|
+
#
|
287
|
+
# buff = ActiveSupport::SafeBuffer.new
|
288
|
+
#
|
289
|
+
# buff << content_tag(:div, class: 'modal-header') do
|
290
|
+
# tmp_buff = ActiveSupport::SafeBuffer.new
|
291
|
+
# tmp_buff<<button_tag(fa_icon(:times), type: "button", class: "close", data: {dismiss: "modal"}, "aria-hidden".to_sym => true)
|
292
|
+
# tmp_buff<<content_tag(:h4, "Attenzione", class: "modal-title")
|
293
|
+
# tmp_buff
|
294
|
+
# end
|
295
|
+
#
|
296
|
+
# buff << content_tag(:div, options[:confirm], class: 'modal-body text-danger')
|
297
|
+
#
|
298
|
+
# buff << content_tag(:div, class: 'modal-footer') do
|
299
|
+
# button_tag('Annulla', type: "button", class: "btn btn-default", data: {dismiss: "modal"})+
|
300
|
+
# button_tag('Conferma', type: 'submit', class: "btn btn-danger")
|
301
|
+
# end
|
302
|
+
#
|
303
|
+
# buff
|
304
|
+
# end
|
305
|
+
#
|
306
|
+
# end
|
307
|
+
# end
|
308
|
+
# end
|
309
|
+
#
|
310
|
+
# buffer << content_tag(:script, raw("$('##{id} form').kono_delete_button();"), :type => 'text/javascript')
|
311
|
+
#
|
312
|
+
# buffer
|
313
|
+
# end
|
314
|
+
# end
|
315
|
+
|
316
|
+
##
|
317
|
+
# Colleziona i mesi per la select box
|
318
|
+
def month_collection
|
319
|
+
(1..12).collect {|m| [t('date.month_names')[m].capitalize, m]}
|
320
|
+
end
|
321
|
+
|
322
|
+
|
323
|
+
##
|
324
|
+
# Genera una collection degli anni per la select box
|
325
|
+
# parte da -8 a +1
|
326
|
+
#
|
327
|
+
def year_collection(start=-8, last=1)
|
328
|
+
((Time.now.year+start)..(Time.now.year+last)).to_a.reverse
|
329
|
+
end
|
330
|
+
|
331
|
+
module_function :year_collection
|
332
|
+
|
333
|
+
|
334
|
+
##
|
335
|
+
# Si occupa di generare la visualizzazione dell'exception passata, con informazioni
|
336
|
+
# aggiuntive se utente è super admin
|
337
|
+
# * *Args* :
|
338
|
+
# - exception -> Exception
|
339
|
+
# def bs_rescue_printer(exception)
|
340
|
+
# bff = ActiveSupport::SafeBuffer.new
|
341
|
+
#
|
342
|
+
# bff<< content_tag(:div, class: "alert alert-warning") do
|
343
|
+
# button_tag(raw("×"), data: {dismiss: "alert", hidden: "true"}, class: 'close') +
|
344
|
+
# content_tag(:strong, 'Errore') +
|
345
|
+
# " Attenzione, il codice eseguito non è valido, contattare l'amministratore."
|
346
|
+
# end
|
347
|
+
#
|
348
|
+
# if @current_user.is_super_admin?
|
349
|
+
#
|
350
|
+
# bff<<content_tag(:div, class: "panel panel-info") do
|
351
|
+
# tmp = ActiveSupport::SafeBuffer.new
|
352
|
+
# tmp<<content_tag(:div, class: "panel-heading") do
|
353
|
+
# content_tag :h3, "Messagio di Errore: #{exception.message} "
|
354
|
+
# end
|
355
|
+
# tmp<<content_tag(:div, class: "panel-body") do
|
356
|
+
# content_tag :pre, exception.backtrace.join("\n")
|
357
|
+
# end
|
358
|
+
#
|
359
|
+
# tmp
|
360
|
+
# end
|
361
|
+
# end
|
362
|
+
#
|
363
|
+
# bff
|
364
|
+
# end
|
365
|
+
|
366
|
+
##
|
367
|
+
#
|
368
|
+
# * *Args* :
|
369
|
+
# - int -> Valore intero per definire
|
370
|
+
# - class -> optional classi aggiuntive
|
371
|
+
# * *Returns* :
|
372
|
+
# - content
|
373
|
+
#
|
374
|
+
# def bs_spacer(space, classe='')
|
375
|
+
# content_tag :div, nil, class: "v-spacer space-x#{space} #{classe}"
|
376
|
+
# end
|
377
|
+
|
378
|
+
|
379
|
+
##
|
380
|
+
# Costruisce una tabella con i campi utili alla creazione di elementi multipli
|
381
|
+
#
|
382
|
+
# Attributes:
|
383
|
+
# form -> la form proveniente da formtastic
|
384
|
+
# field -> il campo referente dell'associazione
|
385
|
+
# fields -> elenco di campi su cui costruire le varie colonne
|
386
|
+
# options -> Hash di opzioni:
|
387
|
+
# :disable_duplication => [false] : server per disabilitare il bottone della duplicazione
|
388
|
+
#
|
389
|
+
# se gli si passa un blocco allora possiamo elaborare la costruzione dei differenti campi in modo personale
|
390
|
+
# al blocco viene passato la classe di formtastic della form, il campo, e un blocco contenente la proc per
|
391
|
+
# elaborare i campi in modo standard
|
392
|
+
#
|
393
|
+
# multiple_elements_table(form, :campo_has_many, [:label, :string_value, :number_value]) do |field, form|
|
394
|
+
# case field
|
395
|
+
# when :string_value, :number_value
|
396
|
+
# form.input field, label: false, input_html: {:autocomplete => 'off', class: 'toggle_value'}
|
397
|
+
# else
|
398
|
+
# form.input field, label: false, input_html: {:autocomplete => 'off'}
|
399
|
+
# end
|
400
|
+
# end
|
401
|
+
#
|
402
|
+
# Traduzioni delle colonne:
|
403
|
+
#
|
404
|
+
# modello_iniziale/campo_has_many:
|
405
|
+
# campo_del_has_many
|
406
|
+
#
|
407
|
+
#
|
408
|
+
# def multiple_elements_table(*params)
|
409
|
+
# options = params.extract_options!
|
410
|
+
#
|
411
|
+
# options = {:disable_duplication => false}.merge(options)
|
412
|
+
#
|
413
|
+
# form = params[0]
|
414
|
+
# field = params[1]
|
415
|
+
# fields = params[2]
|
416
|
+
#
|
417
|
+
# semantic_form_nested=[field]
|
418
|
+
#
|
419
|
+
# #inserimento logiche per scope su elenco elementi multipli
|
420
|
+
# unless options[:scope].nil?
|
421
|
+
# semantic_form_nested<<options[:scope]
|
422
|
+
# end
|
423
|
+
#
|
424
|
+
# content_tag :table, class: "table table-bordered" do
|
425
|
+
#
|
426
|
+
# b = ActiveSupport::SafeBuffer.new
|
427
|
+
#
|
428
|
+
# b<< content_tag(:thead) do
|
429
|
+
# content_tag :tr do
|
430
|
+
# c = ActiveSupport::SafeBuffer.new
|
431
|
+
#
|
432
|
+
# fields.each do |f|
|
433
|
+
# ::Rails.logger.debug {form.object.class.inspect}
|
434
|
+
# ::Rails.logger.debug {field}
|
435
|
+
# ::Rails.logger.debug {f.inspect}
|
436
|
+
# c<<content_tag(:th, form.object.class.human_attribute_name("#{field}.#{f}"), class: "multi_tab_#{f}")
|
437
|
+
# end
|
438
|
+
# unless options[:disable_duplication]
|
439
|
+
# c<<content_tag(:td, nil)
|
440
|
+
# end
|
441
|
+
#
|
442
|
+
# c
|
443
|
+
# end
|
444
|
+
# end
|
445
|
+
#
|
446
|
+
# b<<content_tag(:tbody) do
|
447
|
+
# form.semantic_fields_for(*semantic_form_nested) do |measure|
|
448
|
+
#
|
449
|
+
# default_execution = Proc.new {|field| measure.input field, :label => false}
|
450
|
+
#
|
451
|
+
# content_tag :tr, class: "form-inline list riga_misura" do
|
452
|
+
#
|
453
|
+
# d = ActiveSupport::SafeBuffer.new
|
454
|
+
#
|
455
|
+
# fields.each do |f|
|
456
|
+
# d<<content_tag(:td, class: "multi_tab_#{f}") do
|
457
|
+
#
|
458
|
+
# if block_given?
|
459
|
+
# yield(f, measure, default_execution)
|
460
|
+
# else
|
461
|
+
# default_execution.call(f)
|
462
|
+
# end
|
463
|
+
#
|
464
|
+
# end
|
465
|
+
# end
|
466
|
+
#
|
467
|
+
# unless options[:disable_duplication]
|
468
|
+
# d << content_tag(:td) do
|
469
|
+
#
|
470
|
+
# link_to "#", class: 'btn btn-xs btn-default add_one_more' do
|
471
|
+
#
|
472
|
+
# h = ActiveSupport::SafeBuffer.new
|
473
|
+
# h<< fa_icon(:plus)
|
474
|
+
# h<< measure.input(:_destroy, as: :hidden)
|
475
|
+
#
|
476
|
+
# h
|
477
|
+
# end
|
478
|
+
#
|
479
|
+
# end
|
480
|
+
# end
|
481
|
+
#
|
482
|
+
# d
|
483
|
+
# end
|
484
|
+
# end
|
485
|
+
# end
|
486
|
+
#
|
487
|
+
# b
|
488
|
+
# end
|
489
|
+
# end
|
490
|
+
|
491
|
+
|
492
|
+
##
|
493
|
+
# Genera un'albero con bootstrap-tree
|
494
|
+
# deve ricevere un array di dati da trasformare in json.
|
495
|
+
# per come scrivere il parametro data vedi
|
496
|
+
# https://github.com/jonmiles/bootstrap-treeview
|
497
|
+
#
|
498
|
+
# def bs_tree(data)
|
499
|
+
#
|
500
|
+
# id_div = SecureRandom.hex(10)
|
501
|
+
#
|
502
|
+
# tmp = ActiveSupport::SafeBuffer.new
|
503
|
+
#
|
504
|
+
# tmp<< content_tag(:div, nil, id: id_div, class: 'bs_tree_list')
|
505
|
+
#
|
506
|
+
# tmp<< javascript_tag do
|
507
|
+
# raw "$('##{id_div}').treeview({data: #{data.to_json}});"
|
508
|
+
# end
|
509
|
+
#
|
510
|
+
# end
|
511
|
+
|
512
|
+
##
|
513
|
+
# Stampa una data con il default delle date se questa non è nil
|
514
|
+
#
|
515
|
+
def print_rescue_date(date)
|
516
|
+
unless date.nil?
|
517
|
+
return l date.to_date
|
518
|
+
end
|
519
|
+
''
|
520
|
+
end
|
521
|
+
|
522
|
+
|
523
|
+
end
|
524
|
+
end
|