casein 4.0.0 → 5.0.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (83) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE +246 -0
  3. data/PUBLIC_VERSION.yml +2 -2
  4. data/README.rdoc +73 -49
  5. data/Rakefile +7 -5
  6. data/app/assets/fonts/casein/glyphiconshalflings-regular.eot +0 -0
  7. data/app/assets/fonts/casein/glyphiconshalflings-regular.otf +0 -0
  8. data/app/assets/fonts/casein/glyphiconshalflings-regular.svg +175 -0
  9. data/app/assets/fonts/casein/glyphiconshalflings-regular.ttf +0 -0
  10. data/app/assets/fonts/casein/glyphiconshalflings-regular.woff +0 -0
  11. data/app/assets/images/casein/casein.png +0 -0
  12. data/app/assets/javascripts/casein/bootstrap.js +1966 -0
  13. data/app/assets/javascripts/casein/casein.js +34 -19
  14. data/app/assets/javascripts/casein/html5shiv.js +8 -0
  15. data/app/assets/stylesheets/casein/bootstrap-glyphicons.css.scss +2 -0
  16. data/app/assets/stylesheets/casein/bootstrap.css +4692 -0
  17. data/app/assets/stylesheets/casein/casein-bootstrap-overrides.css.scss +76 -0
  18. data/app/assets/stylesheets/casein/casein.css.scss +258 -3
  19. data/app/assets/stylesheets/casein/login.css.scss +48 -109
  20. data/app/controllers/casein/{user_sessions_controller.rb → admin_user_sessions_controller.rb} +6 -10
  21. data/app/controllers/casein/admin_users_controller.rb +124 -0
  22. data/app/controllers/casein/casein_controller.rb +11 -9
  23. data/app/controllers/casein/password_resets_controller.rb +8 -10
  24. data/app/helpers/casein/casein_helper.rb +94 -31
  25. data/app/mailers/casein/casein_notification.rb +13 -13
  26. data/app/models/casein/{user.rb → admin_user.rb} +2 -2
  27. data/app/models/casein/{user_session.rb → admin_user_session.rb} +1 -1
  28. data/app/views/casein/admin_user_sessions/new.html.erb +56 -0
  29. data/app/views/casein/admin_users/index.html.erb +39 -0
  30. data/app/views/casein/admin_users/new.html.erb +57 -0
  31. data/app/views/casein/admin_users/show.html.erb +104 -0
  32. data/app/views/casein/casein/blank.html.erb +12 -1
  33. data/app/views/casein/casein_notification/generate_new_password.erb +1 -1
  34. data/app/views/casein/casein_notification/new_user_information.erb +1 -1
  35. data/app/views/casein/casein_notification/password_reset_instructions.erb +1 -1
  36. data/app/views/casein/password_resets/edit.html.erb +21 -33
  37. data/app/views/layouts/casein_auth.html.erb +34 -22
  38. data/app/views/layouts/casein_main.html.erb +111 -64
  39. data/config/initializers/will_paginate.rb +40 -0
  40. data/config/routes.rb +2 -2
  41. data/lib/casein.rb +9 -3
  42. data/lib/casein/engine.rb +5 -1
  43. data/lib/generators/casein/install/install_generator.rb +3 -3
  44. data/lib/generators/casein/install/templates/app/helpers/casein/config_helper.rb +10 -11
  45. data/lib/generators/casein/install/templates/app/views/casein/layouts/{_left_navigation.html.erb → _tab_navigation.html.erb} +0 -0
  46. data/lib/generators/casein/install/templates/app/views/casein/layouts/_top_navigation.html.erb +4 -0
  47. data/lib/generators/casein/install/templates/db/migrate/{casein_create_users.rb → casein_create_admin_users.rb} +3 -3
  48. data/lib/generators/casein/scaffold/scaffold_generator.rb +20 -8
  49. data/lib/generators/casein/scaffold/templates/controller.rb +6 -6
  50. data/lib/generators/casein/scaffold/templates/views/_form.html.erb +11 -8
  51. data/lib/generators/casein/scaffold/templates/views/_table.html.erb +12 -10
  52. data/lib/generators/casein/scaffold/templates/views/index.html.erb +7 -3
  53. data/lib/generators/casein/scaffold/templates/views/new.html.erb +3 -3
  54. data/lib/generators/casein/scaffold/templates/views/show.html.erb +5 -5
  55. data/lib/railties/tasks.rake +15 -13
  56. metadata +67 -46
  57. data/MIT-LICENSE +0 -21
  58. data/app/assets/images/casein/header.png +0 -0
  59. data/app/assets/images/casein/icons/add.png +0 -0
  60. data/app/assets/images/casein/icons/delete.png +0 -0
  61. data/app/assets/images/casein/icons/table.png +0 -0
  62. data/app/assets/images/casein/login/alertBg.png +0 -0
  63. data/app/assets/images/casein/login/background.png +0 -0
  64. data/app/assets/images/casein/login/bottom.png +0 -0
  65. data/app/assets/images/casein/login/loginBoxBg.png +0 -0
  66. data/app/assets/images/casein/login/loginBoxBottom.png +0 -0
  67. data/app/assets/images/casein/login/loginBoxTop.png +0 -0
  68. data/app/assets/images/casein/login/loginSubmit.png +0 -0
  69. data/app/assets/images/casein/login/recoverSubmit.png +0 -0
  70. data/app/assets/images/casein/login/top.png +0 -0
  71. data/app/assets/images/casein/nav.png +0 -0
  72. data/app/assets/images/casein/rightNav.png +0 -0
  73. data/app/assets/images/casein/rightNavButton.png +0 -0
  74. data/app/assets/images/casein/visitSiteNav.png +0 -0
  75. data/app/assets/javascripts/casein/login.js +0 -27
  76. data/app/assets/stylesheets/casein/elements.css.scss +0 -307
  77. data/app/assets/stylesheets/casein/screen.css.scss +0 -224
  78. data/app/controllers/casein/users_controller.rb +0 -108
  79. data/app/views/casein/user_sessions/new.html.erb +0 -66
  80. data/app/views/casein/users/index.html.erb +0 -35
  81. data/app/views/casein/users/new.html.erb +0 -46
  82. data/app/views/casein/users/show.html.erb +0 -94
  83. data/lib/generators/casein/install/templates/app/views/casein/layouts/_right_navigation.html.erb +0 -1
@@ -1,7 +1,5 @@
1
1
  module Casein
2
- class UserSessionsController < Casein::CaseinController
3
-
4
- unloadable
2
+ class AdminUserSessionsController < Casein::CaseinController
5
3
 
6
4
  skip_before_filter :authorise, :only => [:new, :create]
7
5
  before_filter :requires_no_session_user, :except => [:destroy]
@@ -9,13 +7,12 @@ module Casein
9
7
  layout 'casein_auth'
10
8
 
11
9
  def new
12
- @user_session = Casein::UserSession.new
10
+ @admin_user_session = Casein::AdminUserSession.new
13
11
  end
14
12
 
15
13
  def create
16
- @user_session = Casein::UserSession.new params[:casein_user_session]
17
- if @user_session.save
18
- flash[:notice] = "Login successful"
14
+ @admin_user_session = Casein::AdminUserSession.new params[:casein_admin_user_session]
15
+ if @admin_user_session.save
19
16
  redirect_back_or_default :controller => :casein, :action => :index
20
17
  else
21
18
  render :action => :new
@@ -23,9 +20,8 @@ module Casein
23
20
  end
24
21
 
25
22
  def destroy
26
- current_user_session.destroy
27
- flash[:notice] = "Logout successful"
28
- redirect_back_or_default new_casein_user_session_url
23
+ current_admin_user_session.destroy
24
+ redirect_back_or_default new_casein_admin_user_session_url
29
25
  end
30
26
 
31
27
  private
@@ -0,0 +1,124 @@
1
+ require 'securerandom'
2
+
3
+ module Casein
4
+ class AdminUsersController < Casein::CaseinController
5
+
6
+ before_filter :needs_admin, :except => [:show, :destroy, :update, :update_password]
7
+ before_filter :needs_admin_or_current_user, :only => [:show, :destroy, :update, :update_password]
8
+
9
+ def index
10
+ @casein_page_title = "Users"
11
+ @users = Casein::AdminUser.order(sort_order(:login)).paginate :page => params[:page]
12
+ end
13
+
14
+ def new
15
+ @casein_page_title = "Add a new user"
16
+ @casein_admin_user = Casein::AdminUser.new
17
+ @casein_admin_user.time_zone = Rails.configuration.time_zone
18
+ end
19
+
20
+ def create
21
+
22
+ generate_random_password if params[:generate_random_password]
23
+
24
+ @casein_admin_user = Casein::AdminUser.new casein_admin_user_params
25
+
26
+ if @casein_admin_user.save
27
+ flash[:notice] = "An email has been sent to " + @casein_admin_user.name + " with the new account details"
28
+ redirect_to casein_admin_users_path
29
+ else
30
+ flash.now[:warning] = "There were problems when trying to create a new user"
31
+ render :action => :new
32
+ end
33
+ end
34
+
35
+ def show
36
+ @casein_admin_user = Casein::AdminUser.find params[:id]
37
+ @casein_page_title = @casein_admin_user.name + " > View user"
38
+ end
39
+
40
+ def update
41
+ @casein_admin_user = Casein::AdminUser.find params[:id]
42
+ @casein_page_title = @casein_admin_user.name + " > Update user"
43
+
44
+ if @casein_admin_user.update_attributes casein_admin_user_params
45
+ flash[:notice] = @casein_admin_user.name + " has been updated"
46
+ else
47
+ flash.now[:warning] = "There were problems when trying to update this user"
48
+ render :action => :show
49
+ return
50
+ end
51
+
52
+ if @session_user.is_admin?
53
+ redirect_to casein_admin_users_path
54
+ else
55
+ redirect_to :controller => :casein, :action => :index
56
+ end
57
+ end
58
+
59
+ def update_password
60
+ @casein_admin_user = Casein::AdminUser.find params[:id]
61
+ @casein_page_title = @casein_admin_user.name + " > Update password"
62
+
63
+ if @casein_admin_user.valid_password? params[:form_current_password]
64
+ if params[:casein_admin_user][:password].blank? && params[:casein_admin_user][:password_confirmation].blank?
65
+ flash[:warning] = "New password cannot be blank"
66
+ elsif @casein_admin_user.update_attributes casein_admin_user_params
67
+ flash[:notice] = "Your password has been changed"
68
+ else
69
+ flash[:warning] = "There were problems when trying to change your password"
70
+ end
71
+ else
72
+ flash[:warning] = "The current password is incorrect"
73
+ end
74
+
75
+ redirect_to :action => :show
76
+ end
77
+
78
+ def reset_password
79
+ @casein_admin_user = Casein::AdminUser.find params[:id]
80
+ @casein_page_title = @casein_admin_user.name + " > Reset password"
81
+
82
+ if params[:generate_random_password].blank? && params[:casein_admin_user][:password].blank? && params[:casein_admin_user][:password_confirmation].blank?
83
+ flash[:warning] = "New password cannot be blank"
84
+ else
85
+ generate_random_password if params[:generate_random_password]
86
+ @casein_admin_user.notify_of_new_password = true unless (@casein_admin_user.id == @session_user.id && params[:generate_random_password].blank?)
87
+
88
+ if @casein_admin_user.update_attributes casein_admin_user_params
89
+ unless @casein_admin_user.notify_of_new_password
90
+ flash[:notice] = "Your password has been reset"
91
+ else
92
+ flash[:notice] = "Password has been reset and " + @casein_admin_user.name + " has been notified by email"
93
+ end
94
+ else
95
+ flash[:warning] = "There were problems when trying to reset this user's password"
96
+ end
97
+ end
98
+
99
+ redirect_to :action => :show
100
+ end
101
+
102
+ def destroy
103
+ user = Casein::AdminUser.find params[:id]
104
+ if user.is_admin? == false || Casein::AdminUser.has_more_than_one_admin
105
+ user.destroy
106
+ flash[:notice] = user.name + " has been deleted"
107
+ end
108
+ redirect_to casein_admin_users_path
109
+ end
110
+
111
+ private
112
+
113
+ def generate_random_password
114
+ random_password = random_string = SecureRandom.hex
115
+ params[:casein_admin_user] = Hash.new if params[:casein_admin_user].blank?
116
+ params[:casein_admin_user].merge! ({:password => random_password, :password_confirmation => random_password})
117
+ end
118
+
119
+ def casein_admin_user_params
120
+ params.require(:casein_admin_user).permit(:login, :name, :email, :time_zone, :access_level, :password, :password_confirmation)
121
+ end
122
+
123
+ end
124
+ end
@@ -3,8 +3,6 @@ require 'authlogic'
3
3
  module Casein
4
4
  class CaseinController < ApplicationController
5
5
 
6
- unloadable
7
-
8
6
  require 'casein/casein_helper'
9
7
  include Casein::CaseinHelper
10
8
 
@@ -13,11 +11,11 @@ module Casein
13
11
 
14
12
  layout 'casein_main'
15
13
 
16
- helper_method :current_user_session, :current_user
14
+ helper_method :current_admin_user_session, :current_user
17
15
  before_filter :authorise
18
16
  before_filter :set_time_zone
19
17
 
20
- ActionView::Base.field_error_proc = proc { |input, instance| "<span class='formError'>#{input}</span>".html_safe }
18
+ ActionView::Base.field_error_proc = proc { |input, instance| "#{input}".html_safe }
21
19
 
22
20
  def index
23
21
  redirect_to casein_config_dashboard_url
@@ -32,7 +30,7 @@ module Casein
32
30
  def authorise
33
31
  unless current_user
34
32
  session[:return_to] = request.fullpath
35
- redirect_to new_casein_user_session_url
33
+ redirect_to new_casein_admin_user_session_url
36
34
  return false
37
35
  end
38
36
  end
@@ -41,14 +39,14 @@ module Casein
41
39
  Time.zone = current_user.time_zone if current_user
42
40
  end
43
41
 
44
- def current_user_session
45
- return @current_user_session if defined?(@current_user_session)
46
- @current_user_session = Casein::UserSession.find
42
+ def current_admin_user_session
43
+ return @current_admin_user_session if defined?(@current_admin_user_session)
44
+ @current_admin_user_session = Casein::AdminUserSession.find
47
45
  end
48
46
 
49
47
  def current_user
50
48
  return @session_user if defined?(@session_user)
51
- @session_user = current_user_session && current_user_session.user
49
+ @session_user = current_admin_user_session && current_admin_user_session.admin_user
52
50
  end
53
51
 
54
52
  def needs_admin
@@ -68,5 +66,9 @@ module Casein
68
66
  session[:return_to] = nil
69
67
  end
70
68
 
69
+ def sort_order(default)
70
+ "#{(params[:c] || default.to_s).gsub(/[\s;'\"]/,'')} #{'ASC' if params[:d] == 'up'} #{'DESC' if params[:d] == 'down'}"
71
+ end
72
+
71
73
  end
72
74
  end
@@ -1,15 +1,13 @@
1
1
  module Casein
2
2
  class PasswordResetsController < Casein::CaseinController
3
3
 
4
- unloadable
5
-
6
4
  skip_before_filter :authorise
7
5
  before_filter :load_user_using_perishable_token, :only => [:edit, :update]
8
6
 
9
7
  layout 'casein_auth'
10
8
 
11
9
  def create
12
- users = Casein::User.where(:email => params[:recover_email]).all
10
+ users = Casein::AdminUser.where(:email => params[:recover_email]).all
13
11
 
14
12
  if users.length > 0
15
13
  users.each do |user|
@@ -25,7 +23,7 @@ module Casein
25
23
  flash[:warning] = "There is no user with that email"
26
24
  end
27
25
 
28
- redirect_to new_casein_user_session_url
26
+ redirect_to new_casein_admin_user_session_url
29
27
  end
30
28
 
31
29
  def edit
@@ -34,16 +32,16 @@ module Casein
34
32
 
35
33
  def update
36
34
 
37
- if params[:casein_user][:password].empty? || params[:casein_user][:password_confirmation].empty?
35
+ if params[:casein_admin_user][:password].empty? || params[:casein_admin_user][:password_confirmation].empty?
38
36
  flash.now[:warning] = "A field has been left empty"
39
37
  else
40
38
 
41
- @reset_user.password = params[:casein_user][:password]
42
- @reset_user.password_confirmation = params[:casein_user][:password_confirmation]
39
+ @reset_user.password = params[:casein_admin_user][:password]
40
+ @reset_user.password_confirmation = params[:casein_admin_user][:password_confirmation]
43
41
 
44
42
  if @reset_user.save
45
43
  flash[:notice] = "Password successfully updated"
46
- redirect_to new_casein_user_session_url
44
+ redirect_to new_casein_admin_user_session_url
47
45
  return
48
46
  end
49
47
  end
@@ -55,11 +53,11 @@ module Casein
55
53
 
56
54
  def load_user_using_perishable_token
57
55
 
58
- @reset_user = Casein::User.find_using_perishable_token params[:token]
56
+ @reset_user = Casein::AdminUser.find_using_perishable_token params[:token]
59
57
 
60
58
  unless @reset_user
61
59
  flash[:warning] = "Your account could not be located. Try to copy and paste the URL directly from the email."
62
- redirect_to new_casein_user_session_url
60
+ redirect_to new_casein_admin_user_session_url
63
61
  end
64
62
  end
65
63
  end
@@ -1,18 +1,26 @@
1
1
  module Casein
2
2
  module CaseinHelper
3
3
 
4
- def casein_get_version_info
4
+ def casein_get_footer_string include_version = false
5
+ if include_version
6
+ "Running on #{link_to 'Casein', 'http://www.github.com/russellquinn/casein'} #{casein_get_full_version_string}, an open-source project.".html_safe
7
+ else
8
+ "Running on #{link_to 'Casein', 'http://www.github.com/russellquinn/casein'}, an open-source project.".html_safe
9
+ end
10
+ end
11
+
12
+ def casein_get_version_info
5
13
  YAML::load_file File.join(File.dirname(__FILE__), '..', '..', '..', 'PUBLIC_VERSION.yml')
6
14
  end
7
15
 
8
16
  def casein_get_full_version_string
9
17
  version_info = casein_get_version_info
10
- "v.#{version_info['major']}.#{version_info['minor']}.#{version_info['patch']}"
18
+ "v#{version_info['major']}.#{version_info['minor']}.#{version_info['patch']}.#{version_info['build']}"
11
19
  end
12
20
 
13
21
  def casein_get_short_version_string
14
22
  version_info = casein_get_version_info
15
- "v.#{version_info['major']}"
23
+ "v#{version_info['major']}"
16
24
  end
17
25
 
18
26
  def casein_generate_page_title
@@ -21,7 +29,7 @@ module Casein
21
29
  return casein_config_website_name
22
30
  end
23
31
 
24
- @casein_page_title + " > " + casein_config_website_name
32
+ casein_config_website_name + " > " + @casein_page_title
25
33
  end
26
34
 
27
35
  def casein_get_access_level_text level
@@ -38,6 +46,10 @@ module Casein
38
46
  def casein_get_access_level_array
39
47
  [["Administrator", $CASEIN_USER_ACCESS_LEVEL_ADMIN], ["User", $CASEIN_USER_ACCESS_LEVEL_USER]]
40
48
  end
49
+
50
+ def casein_pagination_details objs
51
+ " <small class='pagination-details'>/ page #{objs.current_page} of #{objs.total_pages}</small>".html_safe if objs.current_page && objs.total_pages > 1
52
+ end
41
53
 
42
54
  def casein_table_cell_link contents, link, options = {}
43
55
 
@@ -54,43 +66,77 @@ module Casein
54
66
  contents = truncate(contents, :length => options[:casein_truncate], :omission => "...")
55
67
  end
56
68
 
57
- "<div class='noLink'>#{contents}</div>".html_safe
69
+ "<div class='no-link'>#{contents}</div>".html_safe
58
70
  end
59
71
 
60
72
  def casein_show_icon icon_name
61
- "<div class='icon'>".html_safe + image_tag("casein/icons/#{icon_name}.png", :alt => "") + "</div>".html_safe
73
+ "<div class='icon'><span class='glyphicon glyphicon-#{icon_name}'></span></div>".html_safe
62
74
  end
63
75
 
64
76
  def casein_show_row_icon icon_name
65
- "<div class='iconRow'>".html_safe + image_tag("casein/icons/#{icon_name}.png", :alt => "") + "</div>".html_safe
77
+ "<div class='iconRow'><span class='glyphicon glyphicon-#{icon_name}'></span></div>".html_safe
66
78
  end
79
+
80
+ def casein_format_date date, format = "%b %d, %Y"
81
+ date.strftime(format)
82
+ end
83
+
84
+ def casein_format_time time, format = "%H:%M"
85
+ time.strftime(format)
86
+ end
87
+
88
+ def casein_format_datetime datetime, format = "%b %d, %Y %H:%M"
89
+ datetime.strftime(format)
90
+ end
91
+
92
+ def casein_sort_link title, column, options = {}
93
+ condition = options[:unless] if options.has_key?(:unless)
94
+ icon_to_show_html = "<div class='table-header-icon'>&nbsp;</div>".html_safe
95
+ if params[:c].to_s == column.to_s
96
+ icon_to_show = params[:d] == 'down' ? 'chevron-up' : 'chevron-down'
97
+ icon_to_show_html = "<div class='table-header-icon glyphicon glyphicon-#{icon_to_show}'></div>".html_safe
98
+ end
99
+ sort_dir = params[:d] == 'down' ? 'up' : 'down'
100
+ link_to_unless(condition, title, request.parameters.merge({:c => column, :d => sort_dir})) + icon_to_show_html
101
+ end
102
+
103
+ def casein_yes_no_label value
104
+ if value
105
+ return "<span class='label label-success'>Yes</span>".html_safe
106
+ else
107
+ return "<span class='label label-danger'>No</span>".html_safe
108
+ end
109
+ end
110
+
111
+ def casein_no_yes_label value
112
+ if value
113
+ return "<span class='label label-danger'>Yes</span>".html_safe
114
+ else
115
+ return "<span class='label label-success'>No</span>".html_safe
116
+ end
117
+ end
67
118
 
68
119
  # Styled form tag helpers
69
120
 
70
121
  def casein_text_field form, obj, attribute, options = {}
71
- casein_form_tag_wrapper(form.text_field(attribute, strip_casein_options(options_hash_with_merged_classes(options, 'caseinTextField'))), form, obj, attribute, options).html_safe
122
+ casein_form_tag_wrapper(form.text_field(attribute, strip_casein_options(options_hash_with_merged_classes(options, 'form-control'))), form, obj, attribute, options).html_safe
72
123
  end
73
124
 
74
125
  def casein_password_field form, obj, attribute, options = {}
75
- casein_form_tag_wrapper(form.password_field(attribute, strip_casein_options(options_hash_with_merged_classes(options, 'caseinTextField'))), form, obj, attribute, options).html_safe
126
+ casein_form_tag_wrapper(form.password_field(attribute, strip_casein_options(options_hash_with_merged_classes(options, 'form-control'))), form, obj, attribute, options).html_safe
76
127
  end
77
128
 
78
129
  def casein_text_area form, obj, attribute, options = {}
79
- casein_form_tag_wrapper(form.text_area(attribute, strip_casein_options(options_hash_with_merged_classes(options, 'caseinTextArea'))), form, obj, attribute, options).html_safe
130
+ casein_form_tag_wrapper(form.text_area(attribute, strip_casein_options(options_hash_with_merged_classes(options, 'form-control'))), form, obj, attribute, options).html_safe
80
131
  end
81
132
 
82
133
  def casein_text_area_big form, obj, attribute, options = {}
83
- casein_form_tag_wrapper(form.text_area(attribute, strip_casein_options(options_hash_with_merged_classes(options, 'caseinTextAreaBig'))), form, obj, attribute, options).html_safe
134
+ casein_form_tag_wrapper(form.text_area(attribute, strip_casein_options(options_hash_with_merged_classes(options, 'form-control'))), form, obj, attribute, options).html_safe
84
135
  end
85
136
 
86
137
  def casein_check_box form, obj, attribute, options = {}
87
- form_tag = form.check_box(attribute, strip_casein_options(options))
88
-
89
- if options.key? :casein_box_label
90
- form_tag = "<div>" + form_tag + "<span class=\"rcText\">#{options[:casein_box_label]}</span></div>".html_safe
91
- end
92
-
93
- casein_form_tag_wrapper(form_tag, form, obj, attribute, options).html_safe
138
+ form_tag = "<div class='check-box'>#{form.check_box(attribute, strip_casein_options(options))}</div>".html_safe
139
+ casein_form_tag_wrapper(form_tag, form, obj, attribute, options).html_safe
94
140
  end
95
141
 
96
142
  def casein_check_box_group form, obj, check_boxes = {}
@@ -100,7 +146,7 @@ module Casein
100
146
  form_tags += casein_check_box form, obj, check_box[0], check_box[1]
101
147
  end
102
148
 
103
- casein_form_tag_wrapper form_tag, form, obj, attribute, options
149
+ casein_form_tag_wrapper(form_tag, form, obj, attribute, options)
104
150
  end
105
151
 
106
152
  def casein_radio_button form, obj, attribute, tag_value, options = {}
@@ -124,38 +170,47 @@ module Casein
124
170
  end
125
171
 
126
172
  def casein_select form, obj, attribute, option_tags, options = {}
127
- casein_form_tag_wrapper(form.select(attribute, option_tags, strip_casein_options(options), merged_class_hash(options, 'caseinSelect')), form, obj, attribute, options).html_safe
173
+ casein_form_tag_wrapper(form.select(attribute, option_tags, strip_casein_options(options), merged_class_hash(options, 'form-control')), form, obj, attribute, options).html_safe
128
174
  end
129
175
 
130
176
  def casein_time_zone_select form, obj, attribute, option_tags, options = {}
131
- casein_form_tag_wrapper(form.time_zone_select(attribute, option_tags, strip_casein_options(options), merged_class_hash(options, 'caseinSelect')), form, obj, attribute, options).html_safe
177
+ casein_form_tag_wrapper(form.time_zone_select(attribute, option_tags, strip_casein_options(options), merged_class_hash(options, 'form-control')), form, obj, attribute, options).html_safe
132
178
  end
133
179
 
134
- def casein_collection_select form, obj, object, attribute, collection, value_method, text_method, options = {}
135
- casein_form_tag_wrapper(collection_select(object, attribute, collection, value_method, text_method, strip_casein_options(options), merged_class_hash(options, 'caseinSelect')), form, obj, attribute, options).html_safe
180
+ def casein_collection_select form, obj, attribute, collection, value_method, text_method, options = {}
181
+ casein_form_tag_wrapper(collection_select(obj, attribute, collection, value_method, text_method, strip_casein_options(options), merged_class_hash(options, 'form-control')), form, obj, attribute, options).html_safe
136
182
  end
137
183
 
138
184
  def casein_date_select form, obj, attribute, options = {}
139
- casein_form_tag_wrapper(form.date_select(attribute, strip_casein_options(options), merged_class_hash(options, 'caseinDateTimeSelect')), form, obj, attribute, options).html_safe
185
+ casein_form_tag_wrapper("<div class='casein-date-select'>".html_safe + form.date_select(attribute, strip_casein_options(options), merged_class_hash(options, 'form-control')) + "</div>".html_safe, form, obj, attribute, options).html_safe
140
186
  end
141
187
 
142
188
  def casein_time_select form, obj, attribute, options = {}
143
- casein_form_tag_wrapper(form.time_select(attribute, strip_casein_options(options), merged_class_hash(options, 'caseinDateTimeSelect')), form, obj, attribute, options).html_safe
189
+ casein_form_tag_wrapper("<div class='casein-time-select'>".html_safe + form.time_select(attribute, strip_casein_options(options), merged_class_hash(options, 'form-control')) + "</div>".html_safe, form, obj, attribute, options).html_safe
144
190
  end
145
191
 
146
192
  def casein_datetime_select form, obj, attribute, options = {}
147
- casein_form_tag_wrapper(form.datetime_select(attribute, strip_casein_options(options), merged_class_hash(options, 'caseinDateTimeSelect')), form, obj, attribute, options).html_safe
193
+ casein_form_tag_wrapper("<div class='casein-datetime-select'>".html_safe + form.datetime_select(attribute, strip_casein_options(options), merged_class_hash(options, 'form-control')) + "</div>".html_safe, form, obj, attribute, options).html_safe
148
194
  end
149
195
 
150
196
  def casein_file_field form, obj, object_name, attribute, options = {}
151
- class_hash = merged_class_hash(options, 'caseinFileFieldContainer')
197
+ class_hash = merged_class_hash(options, 'form-control')
152
198
  contents = "<div class='#{class_hash[:class]}'>" + file_field(object_name, attribute, strip_casein_options(options)) + '</div>'
199
+
200
+ if options.key? :casein_contents_preview
201
+ contents = options[:casein_contents_preview].html_safe + contents.html_safe
202
+ end
203
+
153
204
  casein_form_tag_wrapper(contents, form, obj, attribute, options).html_safe
154
205
  end
155
206
 
156
207
  def casein_hidden_field form, obj, attribute, options = {}
157
208
  form.hidden_field(attribute, strip_casein_options(options)).html_safe
158
209
  end
210
+
211
+ def casein_custom_field form, obj, attribute, custom_contents, options = {}
212
+ casein_form_tag_wrapper(custom_contents, form, obj, attribute, options).html_safe
213
+ end
159
214
 
160
215
  protected
161
216
 
@@ -186,15 +241,23 @@ module Casein
186
241
  human_attribute_name = options[:casein_label]
187
242
  end
188
243
 
189
- html = "<p>"
244
+ sublabel = ""
245
+
246
+ if options.key? :casein_sublabel
247
+ sublabel = " <small>#{options[:casein_sublabel]}</small>".html_safe
248
+ end
249
+
250
+ html = ""
190
251
 
191
252
  if obj && obj.errors[attribute].any?
192
- html += "<span class='formError'>#{human_attribute_name} #{obj.errors[attribute].first}</span>".html_safe
253
+ html += "<div class='form-group has-error'>"
254
+ html += form.label(attribute, "#{human_attribute_name} #{obj.errors[attribute].first}".html_safe, :class => "control-label")
193
255
  else
194
- html += form.label(attribute, human_attribute_name)
256
+ html += "<div class='form-group'>"
257
+ html += form.label(attribute, "#{human_attribute_name}#{sublabel}".html_safe, :class => "control-label")
195
258
  end
196
259
 
197
- html += "</p>\n<p>#{form_tag}</p>"
260
+ html += "<div class='well'>#{form_tag}</div></div>"
198
261
  end
199
262
  end
200
263
  end