casein 4.0.0 → 5.0.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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