beautiful_scaffold 1.0.0.pre → 2.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (91) hide show
  1. checksums.yaml +5 -5
  2. data/.gitignore +2 -0
  3. data/CHANGELOG +73 -1
  4. data/Gemfile +25 -17
  5. data/README.rdoc +45 -28
  6. data/Rakefile +29 -0
  7. data/beautiful_scaffold.gemspec +7 -7
  8. data/lib/beautiful_scaffold/version.rb +3 -0
  9. data/lib/generators/USAGE +3 -1
  10. data/lib/generators/beautiful_cancancan_generator.rb +51 -0
  11. data/lib/generators/beautiful_jointable_generator.rb +41 -8
  12. data/lib/generators/beautiful_locale_generator.rb +112 -88
  13. data/lib/generators/beautiful_migration_generator.rb +14 -20
  14. data/lib/generators/beautiful_scaffold_common_methods.rb +92 -25
  15. data/lib/generators/beautiful_scaffold_generator.rb +164 -101
  16. data/lib/generators/beautiful_sorcery_generator.rb +137 -0
  17. data/lib/generators/beautiful_storage_generator.rb +61 -0
  18. data/lib/generators/templates/app/assets/javascripts/application-bs.js +7 -7
  19. data/lib/generators/templates/app/assets/javascripts/beautiful_scaffold.js +70 -47
  20. data/lib/generators/templates/app/assets/javascripts/bootstrap-datetimepicker-for-beautiful-scaffold.js +23 -42
  21. data/lib/generators/templates/app/assets/javascripts/fixed_menu.js +3 -1
  22. data/lib/generators/templates/app/assets/javascripts/jstree.min.js +6 -0
  23. data/lib/generators/templates/app/assets/stylesheets/application-bs.css +14 -6
  24. data/lib/generators/templates/app/assets/stylesheets/beautiful-scaffold.css.scss +38 -3
  25. data/lib/generators/templates/app/assets/stylesheets/themes/default-dark/32px.png +0 -0
  26. data/lib/generators/templates/app/assets/stylesheets/themes/default-dark/40px.png +0 -0
  27. data/lib/generators/templates/app/assets/stylesheets/themes/default-dark/style.scss +1146 -0
  28. data/lib/generators/templates/app/assets/stylesheets/themes/default-dark/throbber.gif +0 -0
  29. data/lib/generators/templates/app/assets/stylesheets/themes/default/32px.png +0 -0
  30. data/lib/generators/templates/app/assets/stylesheets/themes/default/40px.png +0 -0
  31. data/lib/generators/templates/app/assets/stylesheets/themes/default/style.scss +1102 -0
  32. data/lib/generators/templates/app/assets/stylesheets/themes/default/throbber.gif +0 -0
  33. data/lib/generators/templates/app/controllers/base.rb +31 -14
  34. data/lib/generators/templates/app/controllers/master_base.rb +55 -47
  35. data/lib/generators/templates/app/controllers/user_sessions_controller.rb +20 -0
  36. data/lib/generators/templates/app/helpers/beautiful_helper.rb +122 -72
  37. data/lib/generators/templates/app/helpers/model_helper.rb +14 -3
  38. data/lib/generators/templates/app/initializers/link_renderer.rb +23 -18
  39. data/lib/generators/templates/app/initializers/ransack.rb +16 -0
  40. data/lib/generators/templates/app/locales/beautiful_scaffold.en.yml +8 -0
  41. data/lib/generators/templates/app/locales/beautiful_scaffold.fr.yml +9 -1
  42. data/lib/generators/templates/app/locales/beautiful_scaffold.ja.yml +9 -2
  43. data/lib/generators/templates/app/mailers/user_mailer.rb +13 -0
  44. data/lib/generators/templates/app/models/ability.rb +39 -0
  45. data/lib/generators/templates/app/models/concerns/caption_concern.rb +1 -1
  46. data/lib/generators/templates/app/models/user.rb +11 -0
  47. data/lib/generators/templates/app/views/_form.html.erb +4 -1
  48. data/lib/generators/templates/app/views/_form_habtm_tag.html.erb +6 -2
  49. data/lib/generators/templates/app/views/_mass_inserting.html.erb +40 -31
  50. data/lib/generators/templates/app/views/_modal_columns.html.erb +4 -4
  51. data/lib/generators/templates/app/views/edit.html.erb +1 -3
  52. data/lib/generators/templates/app/views/index.html.erb +84 -58
  53. data/lib/generators/templates/app/views/layout.html.erb +36 -47
  54. data/lib/generators/templates/app/views/login_logout/user_mailer/activation_needed_email.en.html.erb +16 -0
  55. data/lib/generators/templates/app/views/login_logout/user_mailer/activation_needed_email.en.text.erb +9 -0
  56. data/lib/generators/templates/app/views/login_logout/user_mailer/activation_needed_email.fr.html.erb +16 -0
  57. data/lib/generators/templates/app/views/login_logout/user_mailer/activation_needed_email.fr.text.erb +8 -0
  58. data/lib/generators/templates/app/views/login_logout/user_mailer/activation_success_email.en.html.erb +19 -0
  59. data/lib/generators/templates/app/views/login_logout/user_mailer/activation_success_email.en.text.erb +8 -0
  60. data/lib/generators/templates/app/views/login_logout/user_mailer/activation_success_email.fr.html.erb +19 -0
  61. data/lib/generators/templates/app/views/login_logout/user_mailer/activation_success_email.fr.text.erb +8 -0
  62. data/lib/generators/templates/app/views/login_logout/user_sessions/_form.html.erb +15 -0
  63. data/lib/generators/templates/app/views/login_logout/user_sessions/new.html.erb +3 -0
  64. data/lib/generators/templates/app/views/new.html.erb +0 -2
  65. data/lib/generators/templates/app/views/partials/_forget_password.html.erb +2 -2
  66. data/lib/generators/templates/app/views/partials/_form_field.html.erb +7 -7
  67. data/lib/generators/templates/app/views/partials/_index_batch.html.erb +1 -1
  68. data/lib/generators/templates/app/views/partials/_index_column.html.erb +4 -4
  69. data/lib/generators/templates/app/views/partials/_index_header.html.erb +1 -1
  70. data/lib/generators/templates/app/views/partials/_index_search.html.erb +2 -2
  71. data/lib/generators/templates/app/views/partials/_index_search_default_fields.html.erb +1 -1
  72. data/lib/generators/templates/app/views/partials/_login_logout_register.html.erb +7 -0
  73. data/lib/generators/templates/app/views/partials/_show_field.html.erb +3 -3
  74. data/lib/generators/templates/app/views/show.html.erb +2 -2
  75. data/lib/generators/templates/app/views/treeview.html.erb +8 -5
  76. metadata +41 -26
  77. data/lib/generators/beautiful_devisecancan_generator.rb +0 -128
  78. data/lib/generators/templates/app/assets/javascripts/bootstrap-datepicker.js +0 -834
  79. data/lib/generators/templates/app/assets/javascripts/bootstrap-timepicker.js +0 -797
  80. data/lib/generators/templates/app/assets/javascripts/jquery.jstree.js +0 -4551
  81. data/lib/generators/templates/app/assets/stylesheets/bootstrap_and_overrides.css.less +0 -40
  82. data/lib/generators/templates/app/assets/stylesheets/datepicker.css +0 -224
  83. data/lib/generators/templates/app/assets/stylesheets/reset.css +0 -48
  84. data/lib/generators/templates/app/assets/stylesheets/themes/default/d.gif +0 -0
  85. data/lib/generators/templates/app/assets/stylesheets/themes/default/d.png +0 -0
  86. data/lib/generators/templates/app/assets/stylesheets/themes/default/style.css +0 -74
  87. data/lib/generators/templates/app/assets/stylesheets/timepicker.css +0 -89
  88. data/lib/generators/templates/app/views/partials/_register_form.html.erb +0 -44
  89. data/lib/generators/templates/app/views/partials/_sign_in_form.html.erb +0 -18
  90. data/lib/generators/templates/app/views/partials/_sign_in_sign_out.html.erb +0 -19
  91. data/lib/generators/templates/lib/custom_failure.rb +0 -15
@@ -1,4 +1,14 @@
1
1
  # encoding : utf-8
2
+ <%
3
+ if !engine_name.blank?
4
+ b_module = "module #{engine_camel}"
5
+ e_module = "end"
6
+ else
7
+ b_module = ""
8
+ e_module = ""
9
+ end
10
+ %>
11
+ <%= b_module %>
2
12
  class <%= namespace_for_class %><%= model_camelize.pluralize %>Controller < BeautifulController
3
13
 
4
14
  before_action :load_<%= model %>, :only => [:show, :edit, :update, :destroy]
@@ -7,12 +17,12 @@ class <%= namespace_for_class %><%= model_camelize.pluralize %>Controller < Beau
7
17
  #authorize_resource
8
18
 
9
19
  def index
10
- session[:fields] ||= {}
11
- session[:fields]["<%= model %>"] ||= (<%= model_camelize %>.columns.map(&:name) - ["id"])[0..4]
12
- do_select_fields("<%= model %>")
13
- do_sort_and_paginate("<%= model %>")
20
+ session['fields'] ||= {}
21
+ session['fields']['<%= model %>'] ||= (<%= model_camelize %>.columns.map(&:name) - ["id"])[0..4]
22
+ do_select_fields('<%= model %>')
23
+ do_sort_and_paginate('<%= model %>')
14
24
 
15
- @q = <%= model_camelize %>.search(
25
+ @q = <%= model_camelize %>.ransack(
16
26
  params[:q]
17
27
  )
18
28
 
@@ -38,7 +48,7 @@ class <%= namespace_for_class %><%= model_camelize.pluralize %>Controller < Beau
38
48
  render
39
49
  }
40
50
  format.json{
41
- render :json => @<%= model %>_scope.to_a
51
+ render :json => @<%= model %>_scope.to_json(methods: :caption)
42
52
  }
43
53
  format.csv{
44
54
  require 'csv'
@@ -48,7 +58,7 @@ class <%= namespace_for_class %><%= model_camelize.pluralize %>Controller < Beau
48
58
  csv << <%= model_camelize %>.attribute_names.map{ |a| o[a] }
49
59
  }
50
60
  end
51
- render :text => csvstr
61
+ render :plain => csvstr
52
62
  }
53
63
  format.xml{
54
64
  render :xml => @<%= model %>_scope.to_a
@@ -100,7 +110,7 @@ class <%= namespace_for_class %><%= model_camelize.pluralize %>Controller < Beau
100
110
  else
101
111
  format.html {
102
112
  if params[:mass_inserting] then
103
- redirect_to <%= namespace_for_route %><%= model_pluralize %>_path(:mass_inserting => true), :flash => { :error => t(:error, "Error") }
113
+ redirect_to <%= namespace_for_route %><%= model_pluralize %>_path(:mass_inserting => true), :flash => { :error => "#{t(:error, default: "Error")} : #{@<%= model %>.errors.full_messages.join(", ")}" }
104
114
  else
105
115
  render :action => "new"
106
116
  end
@@ -113,7 +123,7 @@ class <%= namespace_for_class %><%= model_camelize.pluralize %>Controller < Beau
113
123
  def update
114
124
 
115
125
  respond_to do |format|
116
- if @<%= model %>.update_attributes(params_for_model)
126
+ if @<%= model %>.update(params_for_model)
117
127
  format.html { redirect_to <%= namespace_for_route %><%= singular_table_name %>_path(@<%= model %>), :flash => { :notice => t(:update_success, :model => "<%= model %>") }}
118
128
  format.json { head :ok }
119
129
  else
@@ -142,8 +152,8 @@ class <%= namespace_for_class %><%= model_camelize.pluralize %>Controller < Beau
142
152
  # Selected with filter and search
143
153
  do_sort_and_paginate(:<%= model %>)
144
154
 
145
- @<%= model_pluralize %> = <%= model_camelize %>.search(
146
- params[:q]
155
+ @<%= model_pluralize %> = <%= model_camelize %>.ransack(
156
+ session['search']['<%= model %>']
147
157
  ).result(
148
158
  :distinct => true
149
159
  )
@@ -163,12 +173,14 @@ class <%= namespace_for_class %><%= model_camelize.pluralize %>Controller < Beau
163
173
  # <%= model %>.save
164
174
  when "destroy" then
165
175
  <%= model %>.destroy
176
+ when "touch" then
177
+ <%= model %>.touch
166
178
  end
167
179
  end
168
180
  }
169
181
  end
170
182
 
171
- redirect_to :back
183
+ redirect_to <%= namespace_for_route %><%= model_pluralize %>_url
172
184
  end
173
185
 
174
186
  def treeview
@@ -179,7 +191,12 @@ class <%= namespace_for_class %><%= model_camelize.pluralize %>Controller < Beau
179
191
  modelclass = <%= model_camelize %>
180
192
  foreignkey = :<%= model %>_id
181
193
 
182
- render :nothing => true, :status => (update_treeview(modelclass, foreignkey) ? 200 : 500)
194
+
195
+ if update_treeview(modelclass, foreignkey)
196
+ head :ok
197
+ else
198
+ head :internal_server_error
199
+ end
183
200
  end
184
201
 
185
202
  private
@@ -192,4 +209,4 @@ class <%= namespace_for_class %><%= model_camelize.pluralize %>Controller < Beau
192
209
  params.require(:<%= model %>).permit(<%= model_camelize %>.permitted_attributes)
193
210
  end
194
211
  end
195
-
212
+ <%= e_module %>
@@ -3,53 +3,65 @@ class BeautifulController < ApplicationController
3
3
 
4
4
  layout "beautiful_layout"
5
5
 
6
+ # That clear cookie to avoid cookie overflow
7
+ # if you want to keep all in memory and you use ARCookieStore, just comment next line
8
+ before_action :delete_session_for_others_models_scaffold
9
+
6
10
  def dashboard
7
11
  render :layout => "beautiful_layout"
8
12
  end
9
13
 
14
+ def delete_session_for_others_models_scaffold
15
+ current_model = params[:controller].split('/').last.singularize
16
+
17
+ ['fields','sorting','search','scope','paginate'].each{ |k|
18
+ session[k] = session[k].delete_if {|key, v| key != current_model } if not session[k].blank?
19
+ }
20
+ end
21
+
10
22
  # Call in AJAX
11
23
  def select_fields
12
24
  model_sym = params[:model_sym]
13
25
 
14
- do_select_fields(model_sym)
26
+ do_select_fields(model_sym.to_s)
15
27
 
16
- render :nothing => true
28
+ head :ok
17
29
  end
18
30
 
19
- def do_select_fields(model_sym)
31
+ def do_select_fields(model_str)
20
32
  # Fields
21
- session[:fields] ||= {}
22
- session[:fields][model_sym] ||= nil
23
- params[:fields] ||= session[:fields][model_sym]
24
- session[:fields][model_sym] = params[:fields]
33
+ session['fields'] ||= {}
34
+ session['fields'][model_str] ||= nil
35
+ params[:fields] ||= session['fields'][model_str]
36
+ session['fields'][model_str] = params[:fields]
25
37
  end
26
38
 
27
- def do_sort_and_paginate(model_sym)
39
+ def do_sort_and_paginate(model_str)
28
40
  # Sort
29
- session[:sorting] ||= {}
30
- session[:sorting][model_sym] ||= { :attribute => "id", :sorting => "DESC" }
31
- params[:sorting] ||= session[:sorting][model_sym]
32
- session[:sorting][model_sym] = params[:sorting]
33
-
41
+ session['sorting'] ||= {}
42
+ session['sorting'][model_str] ||= { 'attribute' => "id", 'sorting' => "DESC" }
43
+ params[:sorting] ||= session['sorting'][model_str]
44
+ session['sorting'][model_str] = params[:sorting]
45
+
34
46
  # Search and Filter
35
- session[:search] ||= {}
36
- session[:search][model_sym] = nil if not params[:nosearch].blank?
47
+ session['search'] ||= {}
48
+ session['search'][model_str] = nil if not params[:nosearch].blank?
37
49
  params[:page] = 1 if not params[:q].nil?
38
- params[:q] ||= session[:search][model_sym]
39
- session[:search][model_sym] = params[:q] if params[:skip_save_search].blank?
40
-
50
+ params[:q] ||= session['search'][model_str]
51
+ session['search'][model_str] = params[:q] if params[:skip_save_search].blank?
52
+
41
53
  # Scope
42
- session[:scope] ||= {}
43
- session[:scope][model_sym] ||= nil
54
+ session['scope'] ||= {}
55
+ session['scope'][model_str] ||= nil
44
56
  params[:page] = 1 if not params[:scope].nil?
45
- params[:scope] ||= session[:scope][model_sym]
46
- session[:scope][model_sym] = params[:scope]
57
+ params[:scope] ||= session['scope'][model_str]
58
+ session['scope'][model_str] = params[:scope]
47
59
 
48
60
  # Paginate
49
- session[:paginate] ||= {}
50
- session[:paginate][model_sym] ||= nil
51
- params[:page] ||= session[:paginate][model_sym]
52
- session[:paginate][model_sym] = params[:page]
61
+ session['paginate'] ||= {}
62
+ session['paginate'][model_str] ||= nil
63
+ params[:page] ||= session['paginate'][model_str]
64
+ session['paginate'][model_str] = params[:page]
53
65
  end
54
66
 
55
67
  def boolean(string)
@@ -65,32 +77,28 @@ class BeautifulController < ApplicationController
65
77
  elt = modelclass.find(params[:id])
66
78
  elt.attributes = { foreignkey => parent_id }
67
79
 
68
- if modelclass.column_names.include?("position") then
80
+ if modelclass.column_names.include?("position")
69
81
  new_pos = 0
70
82
  modelclass.transaction do
71
83
  all_elt = modelclass.where(foreignkey => parent_id).order("position ASC").to_a
72
84
 
73
- #begin
74
- if index == 0 then
75
- new_pos = (begin (all_elt.first.position - 1) rescue 1 end)
76
- elsif index == all_elt.length then
77
- new_pos = (begin (all_elt.last.position + 1) rescue 1 end)
78
- else
79
- new_pos = all_elt[index].position
80
-
81
- end_of_array = all_elt[index..-1]
82
- end_of_array.each{ |g|
83
- next if g == elt
84
- g.position = g.position.to_i + 1
85
- g.save!
86
-
87
- next_elt = end_of_array[end_of_array.index(g) + 1]
88
- break if not next_elt.nil? and next_elt.position > g.position
89
- }
85
+ if index == 0
86
+ new_pos = (begin (all_elt.first.position - 1) rescue 1 end)
87
+ elsif index == (all_elt.length - 1)
88
+ new_pos = (begin (all_elt.last.position + 1) rescue 1 end)
89
+ else
90
+ new_pos = all_elt[index].position
91
+
92
+ end_of_array = all_elt[index..-1]
93
+ end_of_array.each do |g|
94
+ next if g == elt
95
+ g.position = g.position.to_i + 1
96
+ g.save!
97
+
98
+ next_elt = end_of_array[end_of_array.index(g) + 1]
99
+ break if !next_elt.nil? && next_elt.position > g.position
90
100
  end
91
- #rescue
92
- # new_pos = 0
93
- #end
101
+ end
94
102
  end
95
103
  elt.position = new_pos
96
104
  end
@@ -0,0 +1,20 @@
1
+ class UserSessionsController < BeautifulController
2
+
3
+ skip_before_action :require_login, only: [:new, :create]
4
+
5
+ def create
6
+ @user = login(params[:email], params[:password])
7
+
8
+ if @user
9
+ redirect_back_or_to(:users, notice: 'Login successful')
10
+ else
11
+ flash.now[:alert] = 'Login failed'
12
+ render action: 'new'
13
+ end
14
+ end
15
+
16
+ def destroy
17
+ logout
18
+ redirect_to(:users, notice: 'Logged out!')
19
+ end
20
+ end
@@ -1,8 +1,18 @@
1
1
  # encoding : utf-8
2
+ <%
3
+ if !engine_name.blank?
4
+ b_module = "module #{engine_camel}"
5
+ e_module = "end"
6
+ else
7
+ b_module = ""
8
+ e_module = ""
9
+ end
10
+ %>
11
+ <%= b_module %>
2
12
  module BeautifulHelper
3
13
 
4
14
  def visible_column(model_name, field_name, display_default = 'table-cell', other_css = "")
5
- return ('style="display:' + ((session[:fields][model_name].to_a.include?(field_name)) ? display_default : 'none') + ';' + other_css + '"').html_safe
15
+ return ('style="display:' + ((session['fields'][model_name].to_a.include?(field_name)) ? display_default : 'none') + ';' + other_css + '"').html_safe
6
16
  end
7
17
 
8
18
  def dropdown_submenu(link_caption, &block)
@@ -15,7 +25,7 @@ module BeautifulHelper
15
25
  attr = nil
16
26
  sort = nil
17
27
 
18
- if not params[:sorting].blank? then
28
+ if !params[:sorting].blank?
19
29
  attr = params[:sorting][:attribute]
20
30
  sort = params[:sorting][:sorting]
21
31
  end
@@ -24,11 +34,11 @@ module BeautifulHelper
24
34
  sortstr = sort.to_s.downcase
25
35
  opposite_sortstr = ""
26
36
  csort = '' # <i class="fa fa-stop"></i>
27
- if attribute_name == attr then
28
- if sortstr == "asc" then
37
+ if attribute_name == attr
38
+ if sortstr == "asc"
29
39
  csort = '<i class="fa fa-chevron-up"></i>'
30
40
  opposite_sortstr = "desc"
31
- elsif sortstr == "desc" then
41
+ elsif sortstr == "desc"
32
42
  csort = '<i class="fa fa-chevron-down"></i>'
33
43
  opposite_sortstr = "asc"
34
44
  end
@@ -37,7 +47,7 @@ module BeautifulHelper
37
47
  end
38
48
 
39
49
  default_caption = attribute_name.capitalize
40
- if is_belongs_to_column?(default_caption) then
50
+ if is_belongs_to_column?(default_caption)
41
51
  default_caption = get_belongs_to_model(default_caption)
42
52
  end
43
53
 
@@ -45,7 +55,7 @@ module BeautifulHelper
45
55
 
46
56
  caption = t(cap, :default => default_caption).capitalize
47
57
  strpath = model_name.pluralize + "_url"
48
- strpath = namespace + '_' + strpath if not namespace.blank?
58
+ strpath = namespace + '_' + strpath if !namespace.blank?
49
59
 
50
60
  return link_to(
51
61
  "#{csort} #{caption}".html_safe,
@@ -54,18 +64,18 @@ module BeautifulHelper
54
64
  ).html_safe
55
65
  end
56
66
 
57
- def ransack_field(path_of_model, attribute_name, f, caption = nil)
67
+ def ransack_field(path_of_model, attribute_name, f, caption = nil, engine = nil)
58
68
  model_path = path_of_model.split("/")
59
69
  model_name = model_path.last
60
70
  model_path.delete(model_path.first)
61
71
  model_name_for_ransack = model_path.join("_")
62
72
 
63
- ar_model = model_name.camelize.constantize
73
+ ar_model = (engine.blank? ? model_name.camelize.constantize : "#{engine.camelize}::#{model_name.camelize}".constantize)
64
74
 
65
75
  default_caption = caption
66
- if default_caption.blank? then
76
+ if default_caption.blank?
67
77
  default_caption = attribute_name.capitalize
68
- if is_belongs_to_column?(default_caption) then
78
+ if is_belongs_to_column?(default_caption)
69
79
  default_caption = get_belongs_to_model(default_caption)
70
80
  end
71
81
  end
@@ -74,7 +84,7 @@ module BeautifulHelper
74
84
  name_field_bk = attribute_name
75
85
  label_field = attribute_name
76
86
 
77
- if is_belongs_to_column?(name_field_bk) then
87
+ if is_belongs_to_column?(name_field_bk)
78
88
  label_field = get_belongs_to_model(attribute_name)
79
89
  end
80
90
 
@@ -82,105 +92,143 @@ module BeautifulHelper
82
92
 
83
93
  cap = i18n_translate_path(model_name, attribute_name)
84
94
 
95
+ type_of_column = ar_model.columns_hash[attribute_name].type unless ar_model.columns_hash[attribute_name].nil?
96
+ type_of_column ||= :other
97
+
85
98
  infostr = ''
86
99
  response = '' # See at end
100
+ response += '<div class="form-check form-check-inline">' if type_of_column == :boolean
87
101
  response += f.label name_field, t(cap, :default => default_caption).capitalize, :class => "control-label"
102
+ response += '</div>' if type_of_column == :boolean
88
103
 
89
- type_of_column = ar_model.columns_hash[attribute_name].type unless ar_model.columns_hash[attribute_name].nil?
90
- type_of_column ||= :other
91
104
  case type_of_column
92
- when :date, :datetime then
105
+ when :date, :datetime
93
106
  dt = (type_of_column == :datetime)
94
107
  interval = (dt ? (1..5) : (1..3))
95
108
 
109
+ html_id = "#{name_field}_dp_gt"
110
+ filter = session['search'][model_name]
111
+ filter ||= {}
112
+
96
113
  # Greater than
97
- response += '<div class="input-group input-' + type_of_column.to_s + '">'
98
- response += '<span class="input-group-addon"><i class="fa fa-chevron-right"></i></span>'
114
+ response += '<div class="dpicker input-group input-' + type_of_column.to_s + ' mb-2" data-field="q_' + name_field + '_gteq" id="' + html_id + '_id" data-target-input="nearest">'
115
+ response += '<div class="input-group-prepend"><span class="input-group-text"><i class="fa fa-chevron-right"></i></span></div>'
99
116
  response += f.text_field(
100
- (name_field + "_dp_gt").to_sym,
101
- :value => (begin params[:q][(name_field + "_dp_gt").to_sym] rescue '' end),
102
- :class => "col-md-9 dpicker form-control",
117
+ (html_id).to_sym,
118
+ :value => ("#{filter["#{name_field}_gteq(3i)"]}/#{filter["#{name_field}_gteq(2i)"]}/#{filter["#{name_field}_gteq(1i)"]}"),
119
+ :class => " form-control datetimepicker-input",
120
+ "data-target" => "##{html_id}_id",
103
121
  "data-id" => ("q_" + name_field + "_gteq"))
104
- response += '<span class="input-group-addon"><i class="fa fa-calendar"></i></span>'
122
+ response += '<div class="input-group-append" data-target="' + html_id + '_id" data-toggle="datetimepicker"><span class="input-group-text"><i class="fa fa-calendar"></i></span></div>'
105
123
  response += '</div>'
106
124
 
107
- if dt then
108
- response += '<div class="input-group input-' + type_of_column.to_s + '">'
109
- response += '<span class="input-group-addon"><i class="fa fa-chevron-right"></i></span>'
125
+ html_id = "#{name_field}_tp_gt"
126
+
127
+ if dt
128
+ response += '<div class="tpicker input-group input-' + type_of_column.to_s + ' mb-2" data-field="q_' + name_field + '_gteq" id="' + html_id + '_id" data-target-input="nearest">'
129
+ response += '<div class="input-group-prepend"><span class="input-group-text"><i class="fa fa-chevron-right"></i></span></div>'
110
130
  response += f.text_field(
111
131
  (name_field + "_tp_gt").to_sym,
112
- :value => (begin params[:q][(name_field + "_tp_gt").to_sym] rescue '' end),
113
- :class => "col-md-9 tpicker form-control",
132
+ :value => ("#{filter["#{name_field}_gteq(4i)"]}/#{filter["#{name_field}_gteq(5i)"]}"),
133
+ :class => " form-control datetimepicker-input",
134
+ "data-target" => "##{html_id}_id",
114
135
  "data-id" => ("q_" + name_field + "_gteq"))
115
- response += '<span class="input-group-addon"><i class="fa fa-clock-o"></i></span>'
136
+ response += '<div class="input-group-append" data-target="' + html_id + '_id" data-toggle="datetimepicker"><span class="input-group-text"><i class="fa fa-clock"></i></span></div>'
116
137
  response += '</div>'
117
138
  end
118
139
 
119
140
  for i in interval
120
141
  response += f.hidden_field(name_field + "_gteq(#{i}i)",
121
- :value => (begin params[:q][(name_field + "_gteq(#{i}i)").to_sym] rescue '' end),
142
+ :value => (filter["#{name_field}_gteq(#{i}i)"]),
122
143
  :id => ('q_' + name_field + "_gteq_#{i}i"))
123
144
  end
124
145
 
146
+ html_id = "#{name_field}_dp_lt"
147
+
125
148
  # Less than
126
- response += '<div class="input-group input-' + type_of_column.to_s + '">'
127
- response += '<span class="input-group-addon"><i class="fa fa-chevron-left"></i></span>'
149
+ response += '<div class="dpicker input-group input-' + type_of_column.to_s + ' mb-2" data-field="q_' + name_field + '_lteq" id="' + html_id + '_id" data-target-input="nearest">'
150
+ response += '<div class="input-group-prepend"><span class="input-group-text"><i class="fa fa-chevron-left"></i></span></div>'
128
151
  response += f.text_field(
129
152
  (name_field + "_dp_lt").to_sym,
130
- :value => (begin params[:q][(name_field + "_dp_lt").to_sym] rescue '' end),
131
- :class => "col-md-9 dpicker form-control",
153
+ :value => ("#{filter["#{name_field}_lteq(3i)"]}/#{filter["#{name_field}_lteq(2i)"]}/#{filter["#{name_field}_lteq(1i)"]}"),
154
+ :class => " form-control datetimepicker-input",
155
+ "data-target" => "##{html_id}_id",
132
156
  "data-id" => ("q_" + name_field + "_lteq"))
133
- response += '<span class="input-group-addon"><i class="fa fa-calendar"></i></span>'
157
+ response += '<div class="input-group-append" data-target="' + html_id + '_id" data-toggle="datetimepicker"><span class="input-group-text"><i class="fa fa-calendar"></i></span></div>'
134
158
  response += '</div>'
135
159
 
136
- if dt then
137
- response += '<div class="input-group input-' + type_of_column.to_s + '">'
138
- response += '<span class="input-group-addon"><i class="fa fa-chevron-left"></i></span>'
160
+ html_id = "#{name_field}_tp_lt"
161
+
162
+ if dt
163
+ response += '<div class="tpicker input-group input-' + type_of_column.to_s + ' mb-2" data-field="q_' + name_field + '_lteq" id="' + html_id + '_id" data-target-input="nearest">'
164
+ response += '<div class="input-group-prepend"><span class="input-group-text"><i class="fa fa-chevron-left"></i></span></div>'
139
165
  response += f.text_field(
140
166
  (name_field + "_tp_lt").to_sym,
141
- :value => (begin params[:q][(name_field + "_tp_lt").to_sym] rescue '' end),
142
- :class => "col-md-9 tpicker form-control",
167
+ :value => ("#{filter["#{name_field}_lteq(4i)"]}/#{filter["#{name_field}_lteq(5i)"]}"),
168
+ :class => " form-control datetimepicker-input",
169
+ "data-target" => "##{html_id}_id",
143
170
  "data-id" => ("q_" + name_field + "_lteq"))
144
- response += '<span class="input-group-addon"><i class="fa fa-clock-o"></i></span>'
171
+ response += '<div class="input-group-append" data-target="' + html_id + '_id" data-toggle="datetimepicker"><span class="input-group-text"><i class="fa fa-clock"></i></span></div>'
145
172
  response += '</div>'
146
173
  end
147
174
 
148
175
  for i in interval
149
176
  response += f.hidden_field(name_field + "_lteq(#{i}i)",
150
- :value => (begin params[:q][(name_field + "_lteq(#{i}i)").to_sym] rescue '' end),
177
+ :value => (filter["#{name_field}_lteq(#{i}i)"]),
151
178
  :id => ('q_' + name_field + "_lteq_#{i}i"))
152
179
  end
153
180
 
154
181
  infostr = info_input(model_name, [(name_field + "_dp_lt").to_sym, (name_field + "_tp_lt").to_sym, (name_field + "_dp_gt").to_sym, (name_field + "_tp_gt").to_sym])
155
- when :boolean then
182
+ when :boolean
156
183
  # Specify a default value (false) in rails migration
157
- response += f.label name_field + "_eq_true", raw(f.radio_button((name_field + "_eq").to_sym, true)) + " " + h(t(:yes, :default => "Yes")), :class => "checkbox inline"
158
- response += f.label name_field + "_eq_false", raw(f.radio_button((name_field + "_eq").to_sym, false)) + " " + h(t(:no, :default => "No")), :class => "checkbox inline"
159
- response += f.label name_field + "_eq", raw(f.radio_button((name_field + "_eq").to_sym, nil)) + " " + h(t(:all, :default => "All")), :class => "checkbox inline"
184
+ response += '<div class="form-check form-check-inline">'
185
+ response += f.radio_button((name_field + "_eq").to_sym, true, { class: 'form-check-input'})
186
+ response += f.label name_field + "_eq_true", h(t(:yes, default: "Yes")), class: "form-check-label"
187
+ response += '</div>'
160
188
 
161
- infostr = (begin session[:search][model_name.to_sym][(name_field + "_eq").to_sym] == "on" ? "" : "info" rescue "" end)
162
- when :string then
189
+ response += '<div class="form-check form-check-inline">'
190
+ response += f.radio_button((name_field + "_eq").to_sym, false, { class: 'form-check-input'})
191
+ response += f.label name_field + "_eq_false", h(t(:no, default: "No")), class: "form-check-label"
192
+ response += '</div>'
193
+
194
+ response += '<div class="form-check form-check-inline">'
195
+ response += f.radio_button((name_field + "_eq").to_sym, nil, { class: 'form-check-input'})
196
+ response += f.label name_field + "_eq", h(t(:all, default: "All")), class: "form-check-label"
197
+ response += '</div>'
198
+
199
+ infostr = (begin session['search'][model_name][(name_field + "_eq").to_sym] == "on" ? "" : "info" rescue "" end)
200
+ when :string
163
201
  response += f.text_field((name_field + "_cont").to_sym, :class => "filter col-md-12 form-control")
164
202
 
165
203
  infostr = info_input(model_name, (name_field + "_cont").to_sym)
166
- when :integer, :float, :decimal then
167
- if is_belongs_to_column?(name_field_bk) then
168
- btmodel = get_belongs_to_model(name_field_bk).camelize.constantize
169
- response += f.collection_select((name_field + "_eq").to_sym, btmodel.all, :id, :caption, { :include_blank => t(:all, :default => "All") }, { :class => "col-md-12 form-control" })
204
+ when :integer, :float, :decimal #, :other
205
+ if is_belongs_to_column?(name_field_bk)
206
+ bt_model_name = get_belongs_to_model(name_field_bk).camelize
207
+ field = name_field + "_eq"
170
208
 
171
- infostr = info_input(model_name, (name_field + "_eq").to_sym)
172
- elsif name_field == "id" then
209
+ if !engine.blank?
210
+ bt_model_name = "#{engine.camelize}::#{bt_model_name}"
211
+ #field = "#{engine.downcase}_#{field}"
212
+ end
213
+
214
+ btmodel = bt_model_name.constantize
215
+ field = field.to_sym
216
+
217
+ response += f.collection_select(field, btmodel.all, :id, :caption, { :include_blank => t(:all, :default => "All") }, { :class => "col-md-12 form-control" })
218
+
219
+ infostr = info_input(model_name, field)
220
+ elsif name_field == "id"
173
221
  response += f.text_field((name_field + "_eq").to_sym, :class => "filter col-md-12 form-control")
174
222
 
175
223
  infostr = info_input(model_name, (name_field + "_eq").to_sym)
176
224
  else
177
225
  response += '<div class="input-group">'
178
- response += '<span class="input-group-addon" rel="tooltip" title="' + t(:greater_than, :default => "Greater than") + '"><i class="fa fa-chevron-right"></i></span>'
179
- response += f.text_field((name_field + "_gteq").to_sym, :class => "#{align_attribute("integer")} filter-min col-md-10 form-control")
226
+ response += '<div class="input-group-prepend" rel="tooltip" title="' + t(:greater_than, :default => "Greater than") + '"><span class="input-group-text"><i class="fa fa-chevron-right"></i></span></div>'
227
+ response += f.text_field((name_field + "_gteq").to_sym, :class => "#{align_attribute("integer")} filter-min form-control")
180
228
  response += '</div>'
181
229
  response += '<div class="input-group">'
182
- response += '<span class="input-group-addon" rel="tooltip" title="' + t(:smaller_than, :default => "Smaller than") + '"><i class="fa fa-chevron-left"></i></span>'
183
- response += f.text_field((name_field + "_lteq").to_sym, :class => "#{align_attribute("integer")} filter-max col-md-10 form-control")
230
+ response += '<div class="input-group-append" rel="tooltip" title="' + t(:smaller_than, :default => "Smaller than") + '"><span class="input-group-text"><i class="fa fa-chevron-left"></i></span></div>'
231
+ response += f.text_field((name_field + "_lteq").to_sym, :class => "#{align_attribute("integer")} filter-max form-control")
184
232
  response += '</div>'
185
233
 
186
234
  infostr = info_input(model_name, [(name_field + "_lteq").to_sym, (name_field + "_gteq").to_sym])
@@ -199,13 +247,13 @@ module BeautifulHelper
199
247
  end
200
248
 
201
249
  def info_input(modname, attr)
202
- model_name = modname.to_sym
250
+ model_name = modname
203
251
  rep = false
204
- if not session[:search].blank? and not session[:search][model_name].blank? then
205
- if attr.kind_of?(Array) then
206
- rep = (attr.any? { |elt| (not session[:search][model_name][elt].blank?) })
252
+ if !session['search'].blank? and !session['search'][model_name].blank?
253
+ if attr.kind_of?(Array)
254
+ rep = (attr.any? { |elt| (not session['search'][model_name][elt].blank?) })
207
255
  else
208
- rep = (not session[:search][model_name][attr].blank?)
256
+ rep = (!session['search'][model_name][attr].blank?)
209
257
  end
210
258
  end
211
259
  return (rep ? "info" : "")
@@ -213,17 +261,17 @@ module BeautifulHelper
213
261
 
214
262
  def align_attribute(attribute_type)
215
263
  return case attribute_type
216
- when "string" then
217
- "al"
218
- when "integer", "float", "numeric", "decimal" then
219
- "ar"
220
- when "boolean" then
221
- "ac"
222
- when "date", "datetime", "timestamp" then
223
- "ac"
224
- else
225
- "al"
226
- end
264
+ when "string"
265
+ "al"
266
+ when "integer", "float", "numeric", "decimal"
267
+ "ar"
268
+ when "boolean"
269
+ "ac"
270
+ when "date", "datetime", "timestamp"
271
+ "ac"
272
+ else
273
+ "al"
274
+ end
227
275
  end
228
276
 
229
277
  # Encore utilisé avec wysihtml5 ?
@@ -264,6 +312,7 @@ module BeautifulHelper
264
312
  def clean_params
265
313
  params.delete :q
266
314
  params.delete :fields
315
+ params.delete :scope
267
316
  end
268
317
 
269
318
  def i18n_translate_path(model, attr)
@@ -278,3 +327,4 @@ module BeautifulHelper
278
327
  "app.models.#{model}.bs_caption_plural"
279
328
  end
280
329
  end
330
+ <%= e_module %>