tb_core 1.3.2 → 1.3.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +101 -51
- data/app/assets/javascripts/admin/core/application.js +1 -5
- data/app/assets/javascripts/tb_core/remote.js +179 -0
- data/app/assets/libs/jquery-ui/jquery-ui.scss +16 -16
- data/app/assets/stylesheets/admin/core/{application.css.scss → application.scss} +22 -0
- data/app/assets/stylesheets/admin/core/{login.css.scss → login.scss} +0 -0
- data/app/controllers/admin/application_controller.rb +6 -0
- data/app/controllers/admin/users_controller.rb +4 -10
- data/app/controllers/spud/application_controller.rb +8 -2
- data/app/controllers/user_sessions_controller.rb +1 -1
- data/app/helpers/tb_core/application_helper.rb +88 -0
- data/app/views/admin/users/_form.html.erb +21 -17
- data/app/views/admin/users/edit.html.erb +1 -3
- data/app/views/admin/users/new.html.erb +1 -3
- data/app/views/layouts/admin/_search.html.erb +3 -0
- data/app/views/layouts/admin/detail.html.erb +1 -1
- data/app/views/layouts/admin/error_page.html.erb +10 -12
- data/config/locales/en.yml +8 -0
- data/lib/generators/spud/controller_spec_generator.rb +34 -0
- data/lib/generators/spud/module_generator.rb +37 -0
- data/lib/generators/spud/setup_generator.rb +5 -0
- data/lib/generators/spud/templates/admin_controller.rb.erb +2 -7
- data/lib/generators/spud/templates/assets/application.scss +1 -0
- data/lib/generators/spud/templates/controller.rb.erb +1 -5
- data/lib/generators/spud/templates/controller_spec.rb.erb +79 -0
- data/lib/generators/spud/templates/views/admin/_form.html.erb +2 -2
- data/lib/generators/spud/templates/views/layouts/application.html.erb +2 -3
- data/lib/spud_core/belongs_to_app.rb +1 -1
- data/lib/spud_core/engine.rb +2 -0
- data/lib/spud_core/errors.rb +23 -14
- data/lib/spud_core/version.rb +1 -1
- data/lib/tb_core/form_builder.rb +11 -1
- data/lib/tb_core/responder.rb +32 -0
- data/lib/tb_core/test_helper.rb +42 -0
- data/spec/controllers/admin/dashboard_controller_spec.rb +3 -7
- data/spec/controllers/admin/settings_controller_spec.rb +1 -4
- data/spec/controllers/admin/user_sessions_controller_spec.rb +1 -2
- data/spec/controllers/admin/users_controller_spec.rb +1 -4
- data/spec/dummy/app/assets/stylesheets/admin/{application.css.scss → application.scss} +0 -0
- data/spec/dummy/app/assets/stylesheets/{application.css.scss → application.scss} +0 -0
- data/spec/rails_helper.rb +2 -1
- metadata +14 -14
- data/app/helpers/spud/application_helper.rb +0 -36
- data/app/helpers/twice_baked/application_helper.rb +0 -42
- data/spec/authlogic_helper.rb +0 -2
- data/spec/helpers/spud/application_helper_spec.rb +0 -11
@@ -0,0 +1,88 @@
|
|
1
|
+
module TbCore::ApplicationHelper
|
2
|
+
|
3
|
+
def tb_form_for(record, options = {}, &block)
|
4
|
+
options[:builder] = TbCore::FormBuilder
|
5
|
+
|
6
|
+
options[:html] ||= {}
|
7
|
+
if options[:html][:class]
|
8
|
+
options[:html][:class] += ' form-horizontal'
|
9
|
+
else
|
10
|
+
options[:html][:class] = 'form-horizontal'
|
11
|
+
end
|
12
|
+
|
13
|
+
return form_for(record, options, &block)
|
14
|
+
end
|
15
|
+
|
16
|
+
def tb_form_errors(record, *fields_to_display)
|
17
|
+
if record.errors.any?
|
18
|
+
content_tag :div, :class => 'form-errors' do
|
19
|
+
concat(tb_form_error_header(record))
|
20
|
+
concat(raw "<ul>")
|
21
|
+
if fields_to_display.any?
|
22
|
+
messages = fields_to_display.collect{ |field| record.errors.full_messages_for(field) }.flatten()
|
23
|
+
else
|
24
|
+
messages = record.errors.full_messages
|
25
|
+
end
|
26
|
+
concat(raw messages.collect{ |msg| "<li>#{msg}</li>" }.join())
|
27
|
+
concat(raw "</ul>")
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def tb_form_error_header(record)
|
33
|
+
if record.errors.any?
|
34
|
+
message = "Please correct the following #{'error'.pluralize(record.errors.size)}:"
|
35
|
+
return content_tag :h4, message, :class => 'form-field-error'
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def tb_form_error_field(record, attribute)
|
40
|
+
message = record.errors[attribute].first
|
41
|
+
if message
|
42
|
+
return content_tag :p, message, :class => 'help-block form-field-error'
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def tb_form_field(attribute)
|
47
|
+
content_tag :div, :class => 'form-group' do
|
48
|
+
concat label_tag attribute, attribute, :class => 'col-sm-2 control-label'
|
49
|
+
concat(content_tag(:div, :class => 'col-sm-10') do
|
50
|
+
text_field_tag attribute, :placeholder => attribute, :class => 'form-control'
|
51
|
+
end)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
def tb_page_title
|
56
|
+
if content_for?(:title)
|
57
|
+
title = content_for(:title) + ' : ' + Spud::Core.site_name
|
58
|
+
elsif @page_title
|
59
|
+
title = @page_title + ' : ' + Spud::Core.site_name
|
60
|
+
else
|
61
|
+
title = Spud::Core.site_name
|
62
|
+
end
|
63
|
+
return content_tag :title, title
|
64
|
+
end
|
65
|
+
|
66
|
+
def current_site_name
|
67
|
+
return Spud::Core.config.site_name
|
68
|
+
end
|
69
|
+
|
70
|
+
def cache_key_for_spud_collection(collection, key:'view', cache_params:[], for_user:false)
|
71
|
+
cache_keys = [controller_name, action_name, key]
|
72
|
+
cache_keys << collection.collect(&:updated_at).max().try(:utc).try(:to_i)
|
73
|
+
if for_user
|
74
|
+
cache_keys << current_user_id
|
75
|
+
end
|
76
|
+
if cache_params.any?
|
77
|
+
cache_keys += cache_params.collect{ |cache_param| params[cache_param] || 'nil' }
|
78
|
+
end
|
79
|
+
cache_keys += collection.collect(&:id)
|
80
|
+
cache_key = cache_keys.join('/')
|
81
|
+
if cache_key.length > 250
|
82
|
+
return Digest::SHA1.hexdigest(cache_key)
|
83
|
+
else
|
84
|
+
return cache_key
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
end
|
@@ -1,25 +1,29 @@
|
|
1
|
-
<%=
|
1
|
+
<%= tb_form_for @user, :url => path, :remote => true, :data => {:errors => :inline, :success => admin_users_path} do |f| %>
|
2
|
+
|
3
|
+
<%= tb_form_error_header(f.object) %>
|
2
4
|
|
3
|
-
<h4>User Details</h4>
|
5
|
+
<h4>User Details</h4>
|
4
6
|
|
5
|
-
<% if !Spud::Core.config.use_email_as_login %>
|
6
|
-
|
7
|
-
<% end %>
|
8
|
-
<%= f.tb_text_field :email %>
|
9
|
-
<%= f.tb_text_field :first_name %>
|
10
|
-
<%= f.tb_text_field :last_name %>
|
11
|
-
<%= f.tb_time_zone_select :time_zone, ActiveSupport::TimeZone.us_zones, {:default => Rails.application.config.time_zone} %>
|
7
|
+
<% if !Spud::Core.config.use_email_as_login %>
|
8
|
+
<%= f.tb_text_field :login %>
|
9
|
+
<% end %>
|
10
|
+
<%= f.tb_text_field :email %>
|
11
|
+
<%= f.tb_text_field :first_name %>
|
12
|
+
<%= f.tb_text_field :last_name %>
|
13
|
+
<%= f.tb_time_zone_select :time_zone, ActiveSupport::TimeZone.us_zones, {:default => Rails.application.config.time_zone} %>
|
14
|
+
|
15
|
+
<%= render :partial => 'form_additions', :locals => {:f => f} %>
|
12
16
|
|
13
|
-
|
17
|
+
<h4>Credentials</h4>
|
14
18
|
|
15
|
-
|
19
|
+
<%= f.tb_password_field :password %>
|
20
|
+
<%= f.tb_password_field :password_confirmation %>
|
16
21
|
|
17
|
-
|
18
|
-
<%= f.tb_password_field :password_confirmation %>
|
22
|
+
<h4>Permissions</h4>
|
19
23
|
|
20
|
-
|
24
|
+
<%= f.tb_check_box :super_admin, :help_block => 'The super administrator bypasses all permissions and roles.' %>
|
25
|
+
<%= f.tb_select :spud_role_id, options_from_collection_for_select(SpudRole.all, :id, :name, f.object.spud_role_id), {:include_blank => 'No Role'} %>
|
21
26
|
|
22
|
-
<%= f.
|
23
|
-
<%= f.tb_select :spud_role_id, options_from_collection_for_select(SpudRole.all, :id, :name, f.object.spud_role_id), {:include_blank => 'No Role'} %>
|
27
|
+
<%= f.tb_save_buttons('User', @user.new_record? ? admin_users_path : admin_user_path(@user)) %>
|
24
28
|
|
25
|
-
|
29
|
+
<% end %>
|
@@ -1,3 +1 @@
|
|
1
|
-
<%=
|
2
|
-
<%= render :partial => "form", :locals => {:f => f} %>
|
3
|
-
<% end %>
|
1
|
+
<%= render :partial => "form", :locals => {:path => admin_user_path(@user)} %>
|
@@ -1,3 +1 @@
|
|
1
|
-
<%=
|
2
|
-
<%= render :partial => "form", :locals => {:f => f} %>
|
3
|
-
<% end %>
|
1
|
+
<%= render :partial => "form", :locals => {:path => admin_users_path} %>
|
@@ -1,13 +1,11 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
<
|
7
|
-
|
8
|
-
|
9
|
-
<p>Requested URL: <%= @error.request_url %></p>
|
10
|
-
</div>
|
11
|
-
</div>
|
1
|
+
<% @page_name = "#{@error.code}: #{@error.title}!" %>
|
2
|
+
|
3
|
+
<%= content_for :detail do %>
|
4
|
+
<p><%= @error.message %></p>
|
5
|
+
<% if @error.code == 403 %>
|
6
|
+
<p>Your user might not have admin rights, or you might be trying to access a module that you have not been granted permission to.</p>
|
7
|
+
<% end %>
|
8
|
+
<p>Requested URL: <%= @error.request_url %></p>
|
12
9
|
<% end %>
|
13
|
-
|
10
|
+
|
11
|
+
<%= render :template => 'layouts/admin/detail' %>
|
data/config/locales/en.yml
CHANGED
@@ -3,6 +3,14 @@
|
|
3
3
|
|
4
4
|
en:
|
5
5
|
hello: "Hello world"
|
6
|
+
tb_core:
|
7
|
+
errors:
|
8
|
+
not_found:
|
9
|
+
title: "Not Found"
|
10
|
+
message: "The %{item} you were looking for could not be found."
|
11
|
+
access_denied:
|
12
|
+
title: "Access Denied"
|
13
|
+
message: "You are not authorized to view the requested %{item}."
|
6
14
|
activerecord:
|
7
15
|
attributes:
|
8
16
|
spud_user:
|
@@ -0,0 +1,34 @@
|
|
1
|
+
class Spud::ControllerSpecGenerator < ::Rails::Generators::Base
|
2
|
+
source_root File.expand_path('../templates', __FILE__)
|
3
|
+
|
4
|
+
argument :name, :type => :string
|
5
|
+
argument :string_attribute, :type => :string
|
6
|
+
argument :editable, :type => :numeric, :default => 0
|
7
|
+
|
8
|
+
def controller
|
9
|
+
template 'controller_spec.rb.erb', "spec/controllers/#{name.downcase}_controller_spec.rb"
|
10
|
+
end
|
11
|
+
|
12
|
+
private
|
13
|
+
|
14
|
+
def controller_class_name
|
15
|
+
return name.camelize + 'Controller'
|
16
|
+
end
|
17
|
+
|
18
|
+
def model_variable_name
|
19
|
+
return name.split('/').last.downcase.singularize
|
20
|
+
end
|
21
|
+
|
22
|
+
def model_class_name
|
23
|
+
return name.split('/').last.camelize.singularize
|
24
|
+
end
|
25
|
+
|
26
|
+
def model_string_attribute_name
|
27
|
+
return string_attribute.downcase
|
28
|
+
end
|
29
|
+
|
30
|
+
def include_edit_actions?
|
31
|
+
return editable == 1
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
@@ -26,6 +26,13 @@ class Spud::ModuleGenerator < ::Rails::Generators::Base
|
|
26
26
|
Rails::Generators.invoke "model", [module_name_formatted.singularize] + attributes, :behavior => behavior
|
27
27
|
Rails::Generators.invoke 'helper', [module_name], :behavior => behavior
|
28
28
|
Rails::Generators.invoke 'helper', ["Admin/#{module_name}"], :behavior => behavior
|
29
|
+
|
30
|
+
if defined?(RSpec)
|
31
|
+
string_attribute = find_first_string_attr()
|
32
|
+
Rails::Generators.invoke 'spud:controller_spec', ["#{module_name}", string_attribute, 0], :behavior => behavior
|
33
|
+
Rails::Generators.invoke 'spud:controller_spec', ["Admin/#{module_name}", string_attribute, 1], :behavior => behavior
|
34
|
+
end
|
35
|
+
|
29
36
|
if self.behavior == :invoke
|
30
37
|
create_model_scopes()
|
31
38
|
end
|
@@ -79,4 +86,34 @@ RUBY
|
|
79
86
|
end
|
80
87
|
end
|
81
88
|
|
89
|
+
# NOT CURRENTLY USED
|
90
|
+
#
|
91
|
+
# Call this method from the create_module generator to automatically build length validators for string columns. The idea here is to protect against
|
92
|
+
# database exceptions when long strings are entered by a user.
|
93
|
+
#
|
94
|
+
# TODO: This doesn't take in to account any custom :limit values on the string column. Assumes 255 as the default limit.
|
95
|
+
#
|
96
|
+
#
|
97
|
+
def add_string_maximums
|
98
|
+
string_attrs = attributes.select{ |att| att.split(':')[1] == 'string' }.collect{ |att| att.split(':')[0] }
|
99
|
+
if string_attrs.any?
|
100
|
+
string_attrs_as_symbols = string_attrs.collect{ |att| ":#{att.to_s}" }.join(', ')
|
101
|
+
inject_into_file "app/models/#{module_name.singularize.underscore}.rb", :before => 'end' do <<-RUBY
|
102
|
+
|
103
|
+
validates #{string_attrs_as_symbols}, :length => {:maximum => 255}
|
104
|
+
|
105
|
+
RUBY
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
def find_first_string_attr
|
111
|
+
found = attributes.find{ |att| att.split(':')[1] == 'string' }
|
112
|
+
if found
|
113
|
+
return found.split(':')[0]
|
114
|
+
else
|
115
|
+
return 'string_not_found'
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
82
119
|
end
|
@@ -18,6 +18,11 @@ class Spud::SetupGenerator < ::Rails::Generators::Base
|
|
18
18
|
template 'assets/application.js', 'app/assets/javascripts/application.js'
|
19
19
|
template 'assets/admin/application.js', 'app/assets/javascripts/admin/application.js'
|
20
20
|
|
21
|
+
if defined?(Bootstrap)
|
22
|
+
theme_file = Bootstrap::Rails::Engine.root.join('templates', 'project', '_bootstrap-variables.sass')
|
23
|
+
template theme_file, 'app/assets/stylesheets/imports/bootstrap_theme.scss' if File.exist?(theme_file)
|
24
|
+
end
|
25
|
+
|
21
26
|
environment(spud_core_configs())
|
22
27
|
rake('railties:install:migrations')
|
23
28
|
|
@@ -1,8 +1,8 @@
|
|
1
1
|
class Admin::<%= module_name_formatted.camelize%>Controller < Admin::ApplicationController
|
2
2
|
|
3
|
-
before_action :load_<%= module_name_formatted.singularize %>, :only => [:show, :edit, :update, :destroy]
|
4
3
|
belongs_to_spud_app :<%= module_name_formatted %>
|
5
4
|
add_breadcrumb "<%= module_name_formatted.humanize.titlecase %>", :admin_<%= module_name_formatted %>_path
|
5
|
+
before_action :load_<%= module_name_formatted.singularize %>, :only => [:show, :edit, :update, :destroy]
|
6
6
|
|
7
7
|
def index
|
8
8
|
@<%= module_name_formatted %> = <%= module_name_formatted.singularize.camelize %>.ordered.paginate(:page => params[:page])
|
@@ -46,12 +46,7 @@ class Admin::<%= module_name_formatted.camelize%>Controller < Admin::Application
|
|
46
46
|
private
|
47
47
|
|
48
48
|
def load_<%= module_name_formatted.singularize %>
|
49
|
-
@<%= module_name_formatted.singularize %> = <%= module_name_formatted.singularize.camelize %>.find_by(:id => params[:id])
|
50
|
-
if @<%= module_name_formatted.singularize %>.blank?
|
51
|
-
flash[:error] = "Could not find the requested <%= module_name_formatted.singularize.camelize %>"
|
52
|
-
redirect_to admin_<%= module_name_formatted %>_path
|
53
|
-
return false
|
54
|
-
end
|
49
|
+
@<%= module_name_formatted.singularize %> = <%= module_name_formatted.singularize.camelize %>.find_by!(:id => params[:id])
|
55
50
|
end
|
56
51
|
|
57
52
|
def <%= module_name_formatted.singularize %>_params
|
@@ -15,11 +15,7 @@ class <%=module_name_formatted.camelize%>Controller < ApplicationController
|
|
15
15
|
private
|
16
16
|
|
17
17
|
def load_<%=module_name_formatted.singularize%>
|
18
|
-
@<%=module_name_formatted.singularize%> = <%=module_name_formatted.singularize.camelize%>.find_by(:id => params[:id])
|
19
|
-
if @<%=module_name_formatted.singularize%>.blank?
|
20
|
-
raise Spud::NotFoundError.new(:item => '<%= module_name_formatted.singularize %>')
|
21
|
-
return false
|
22
|
-
end
|
18
|
+
@<%=module_name_formatted.singularize%> = <%=module_name_formatted.singularize.camelize%>.find_by!(:id => params[:id])
|
23
19
|
end
|
24
20
|
|
25
21
|
end
|
@@ -0,0 +1,79 @@
|
|
1
|
+
require 'rails_helper'
|
2
|
+
|
3
|
+
RSpec.describe <%= controller_class_name %>, :type => :controller do
|
4
|
+
|
5
|
+
before(:each) do
|
6
|
+
# activate_session(admin: true)
|
7
|
+
end
|
8
|
+
|
9
|
+
describe 'index' do
|
10
|
+
it 'should render the index' do
|
11
|
+
get :index
|
12
|
+
expect(response).to have_http_status :success
|
13
|
+
expect(response).to render_template :index
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
describe 'show' do
|
18
|
+
it 'should render the show page' do
|
19
|
+
<%= model_variable_name %> = FactoryGirl.create(:<%= model_variable_name %>)
|
20
|
+
get :show, :id => <%= model_variable_name %>.id
|
21
|
+
expect(response).to have_http_status :success
|
22
|
+
expect(response).to render_template :show
|
23
|
+
end
|
24
|
+
|
25
|
+
it 'should return a 404 error' do
|
26
|
+
get :show, :id => 1
|
27
|
+
expect(response).to have_http_status :not_found
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
<%- if include_edit_actions? -%>
|
32
|
+
describe 'new' do
|
33
|
+
it 'should render the new page' do
|
34
|
+
get :new
|
35
|
+
expect(response).to have_http_status :success
|
36
|
+
expect(response).to render_template :new
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
describe 'edit' do
|
41
|
+
it 'should render the edit page' do
|
42
|
+
<%= model_variable_name %> = FactoryGirl.create(:<%= model_variable_name %>)
|
43
|
+
get :edit, :id => <%= model_variable_name %>.id
|
44
|
+
expect(response).to have_http_status :success
|
45
|
+
expect(response).to render_template :edit
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
describe 'create' do
|
50
|
+
it 'should create the record' do
|
51
|
+
expect{
|
52
|
+
post :create, :<%= model_variable_name %> => FactoryGirl.attributes_for(:<%= model_variable_name %>)
|
53
|
+
}.to change(<%= model_class_name %>, :count).by(1)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
describe 'update' do
|
58
|
+
it 'should update the record' do
|
59
|
+
<%= model_variable_name %> = FactoryGirl.create(:<%= model_variable_name %>)
|
60
|
+
current_value = <%= model_variable_name %>.<%= model_string_attribute_name %>
|
61
|
+
new_value = current_value + '-Updated'
|
62
|
+
expect{
|
63
|
+
patch :update, :id => <%= model_variable_name %>.id, :<%= model_variable_name %> => {:<%= model_string_attribute_name %> => new_value}
|
64
|
+
<%= model_variable_name %>.reload
|
65
|
+
}.to change(<%= model_class_name %>, :<%= model_string_attribute_name %>).to(new_value)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
describe 'destroy' do
|
70
|
+
it 'should destroy the record' do
|
71
|
+
<%= model_variable_name %> = FactoryGirl.create(:<%= model_variable_name %>)
|
72
|
+
expect{
|
73
|
+
delete :destroy, :id => <%= model_variable_name %>.id
|
74
|
+
}.to change(<%= model_class_name %>, :count).by(-1)
|
75
|
+
end
|
76
|
+
end
|
77
|
+
<%- end -%>
|
78
|
+
|
79
|
+
end
|
@@ -1,10 +1,10 @@
|
|
1
|
-
<%%=
|
1
|
+
<%%= tb_form_for [:admin, @<%=module_name_formatted.singularize%>], :remote => true, :data => {:errors => :inline, :success => admin_<%= module_name_formatted %>_path} do |f| %>
|
2
2
|
|
3
3
|
<%%= tb_form_errors(f.object, :base) %>
|
4
4
|
<%- attributes.collect{ |att| att.split(':') }.each do |arg_0, arg_1| %>
|
5
5
|
<%= field_for_attribute(arg_1, arg_0) %>
|
6
6
|
<%- end %>
|
7
|
-
<%%= f.tb_save_buttons('<%= module_name_formatted.singularize.humanize.titlecase %>',
|
7
|
+
<%%= f.tb_save_buttons('<%= module_name_formatted.singularize.humanize.titlecase %>', admin_<%= module_name_formatted %>_path) %>
|
8
8
|
|
9
9
|
<%% end %>
|
10
10
|
|
@@ -4,7 +4,6 @@
|
|
4
4
|
<meta charset="utf-8">
|
5
5
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
6
6
|
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
7
|
-
<meta name="viewport" content="width=device-width"/>
|
8
7
|
<%%= tb_page_title() %>
|
9
8
|
<%%= stylesheet_link_tag "application", :media => "all" %>
|
10
9
|
<%%= javascript_include_tag "application" %>
|
@@ -16,12 +15,12 @@
|
|
16
15
|
|
17
16
|
<%% if flash[:notice] %>
|
18
17
|
<div class="alert alert-info alert-dismissible">
|
19
|
-
<%%= flash[:notice] %>
|
18
|
+
<%%= flash[:notice] %>
|
20
19
|
<button type="button" class="close" data-dismiss="alert"><span aria-hidden="true">×</span><span class="sr-only">Close</span></button>
|
21
20
|
</div>
|
22
21
|
<%% elsif flash[:error] %>
|
23
22
|
<div class="alert alert-danger alert-dismissible">
|
24
|
-
<%%= flash[:error] %>
|
23
|
+
<%%= flash[:error] %>
|
25
24
|
<button type="button" class="close" data-dismiss="alert"><span aria-hidden="true">×</span><span class="sr-only">Close</span></button>
|
26
25
|
</div>
|
27
26
|
<%% end %>
|
@@ -29,7 +29,7 @@ module Spud::BelongsToApp
|
|
29
29
|
elsif controller.action_name == 'edit' || controller.action_name == 'update'
|
30
30
|
@page_name = "Edit #{@page_name.singularize}"
|
31
31
|
elsif controller.action_name == 'show'
|
32
|
-
@page_name = "
|
32
|
+
@page_name = "#{@page_name.singularize} Detail"
|
33
33
|
end
|
34
34
|
end
|
35
35
|
end
|
data/lib/spud_core/engine.rb
CHANGED
data/lib/spud_core/errors.rb
CHANGED
@@ -2,30 +2,39 @@ class Spud::RequestError < StandardError
|
|
2
2
|
attr_accessor :request_url, :item, :template
|
3
3
|
attr_reader :code, :title
|
4
4
|
|
5
|
-
|
5
|
+
# For compatability reasons, this method accepts multiple styles of inputs
|
6
|
+
# Going forward the expected input will be:
|
7
|
+
#
|
8
|
+
# * item: The item that could not be found. String. (default = page)
|
9
|
+
# * template (named): ERB template you wish to render
|
10
|
+
#
|
11
|
+
def initialize(item_or_opts='page', opts={})
|
12
|
+
if item_or_opts.is_a?(Hash)
|
13
|
+
# ActiveSupport::Deprecation.warn("Passing the :item as a key/value pair to #{self.class.to_s} is deprecated; Pass it as the first argument instead.")
|
14
|
+
@item = item_or_opts[:item]
|
15
|
+
@template = item_or_opts[:template]
|
16
|
+
else
|
17
|
+
@item = item_or_opts
|
18
|
+
@template = opts[:template]
|
19
|
+
end
|
6
20
|
@template ||= 'layouts/error_page'
|
7
|
-
|
21
|
+
@title = I18n.t(:title, :scope => [:tb_core, :errors, @i18n])
|
22
|
+
super(I18n.t(:message, :scope => [:tb_core, :errors, @i18n], :item => @item))
|
8
23
|
end
|
9
24
|
end
|
10
25
|
|
11
26
|
class Spud::AccessDeniedError < Spud::RequestError
|
12
|
-
def initialize(opts={})
|
13
|
-
@item = opts[:item] || 'page'
|
14
|
-
@template = opts[:template]
|
27
|
+
def initialize(item_or_opts='page', opts={})
|
15
28
|
@code = 403
|
16
|
-
@
|
17
|
-
|
18
|
-
super(message)
|
29
|
+
@i18n = 'access_denied'
|
30
|
+
super(item_or_opts, opts)
|
19
31
|
end
|
20
32
|
end
|
21
33
|
|
22
34
|
class Spud::NotFoundError < Spud::RequestError
|
23
|
-
def initialize(opts={})
|
24
|
-
@item = opts[:item] || 'page'
|
25
|
-
@template = opts[:template]
|
35
|
+
def initialize(item_or_opts='page', opts={})
|
26
36
|
@code = 404
|
27
|
-
@
|
28
|
-
|
29
|
-
super(message)
|
37
|
+
@i18n = 'not_found'
|
38
|
+
super(item_or_opts, opts)
|
30
39
|
end
|
31
40
|
end
|
data/lib/spud_core/version.rb
CHANGED
data/lib/tb_core/form_builder.rb
CHANGED
@@ -112,7 +112,7 @@ class TbCore::FormBuilder < ActionView::Helpers::FormBuilder
|
|
112
112
|
def tb_save_buttons(model_name, cancel_path)
|
113
113
|
content_tag :div, :class => 'form-group' do
|
114
114
|
content_tag :div, :class => 'col-sm-offset-2 col-sm-10' do
|
115
|
-
concat submit "Save #{model_name}", :class => 'btn btn-primary'
|
115
|
+
concat submit "Save #{model_name}", :class => 'btn btn-primary', :data => {:disable_with => "Saving #{model_name}...", :enable_with => 'Saved!'}
|
116
116
|
concat ' '
|
117
117
|
concat @template.link_to 'Cancel', cancel_path, :class => 'btn btn-default'
|
118
118
|
end
|
@@ -149,6 +149,7 @@ class TbCore::FormBuilder < ActionView::Helpers::FormBuilder
|
|
149
149
|
# Builds a text field group
|
150
150
|
#
|
151
151
|
def tb_text_field(attribute, options={})
|
152
|
+
options[:maxlength] ||= get_limit_for_column(attribute)
|
152
153
|
tb_input_field(attribute, :text_field, options)
|
153
154
|
end
|
154
155
|
|
@@ -262,4 +263,13 @@ private
|
|
262
263
|
return :text_field
|
263
264
|
end
|
264
265
|
|
266
|
+
def get_limit_for_column(attribute)
|
267
|
+
col = @object.class.columns.find{ |c| c.name == attribute.to_s }
|
268
|
+
if col.present? && col.sql_type.match(/^varchar/)
|
269
|
+
return col.limit
|
270
|
+
else
|
271
|
+
return nil
|
272
|
+
end
|
273
|
+
end
|
274
|
+
|
265
275
|
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
class TbCore::Responder < ActionController::Responder
|
2
|
+
|
3
|
+
def initialize(*)
|
4
|
+
super
|
5
|
+
|
6
|
+
# Don't require a :location parameter for redirecting
|
7
|
+
if !@options.has_key?(:location)
|
8
|
+
@options[:location] = nil
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
# Override the common behavior for formats associated with APIs, such as :xml and :json.
|
13
|
+
#
|
14
|
+
def api_behavior
|
15
|
+
raise MissingRenderer.new(format) unless has_renderer?
|
16
|
+
if get?
|
17
|
+
display resource
|
18
|
+
elsif post? || patch?
|
19
|
+
display resource, :status => :created, :location => api_location
|
20
|
+
else
|
21
|
+
head :no_content
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
# Default responder only sends the basic errors array
|
26
|
+
# This override also sends the full messages for convenience
|
27
|
+
#
|
28
|
+
def json_resource_errors
|
29
|
+
return {:errors => resource.errors, :full_messages => resource.errors.full_messages}
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require 'authlogic/test_case'
|
2
|
+
include Authlogic::TestCase
|
3
|
+
|
4
|
+
module TbCore::SessionHelper
|
5
|
+
|
6
|
+
# Use this helper in controller specs to establish a login session
|
7
|
+
# - admin: Set to true to create a super_admin
|
8
|
+
# - permissions: One or more permissions you want to assign to the user (a role will be auto generated)
|
9
|
+
#
|
10
|
+
def activate_session(admin: false, permissions: nil)
|
11
|
+
activate_authlogic()
|
12
|
+
if permissions
|
13
|
+
permissions = [permissions] unless permissions.is_a?(Array)
|
14
|
+
role = SpudRole.create(:name => 'New Role', :permission_tags => permissions)
|
15
|
+
else
|
16
|
+
role = nil
|
17
|
+
end
|
18
|
+
@user = FactoryGirl.create(:spud_user, {super_admin: admin, role: role})
|
19
|
+
SpudUserSession.create(@user)
|
20
|
+
return @user
|
21
|
+
end
|
22
|
+
|
23
|
+
# Returns the current user
|
24
|
+
#
|
25
|
+
def current_user
|
26
|
+
return @user
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
# Insert the session helper into RSpec if it is in use
|
31
|
+
#
|
32
|
+
if defined?(RSpec)
|
33
|
+
RSpec.configure do |config|
|
34
|
+
config.include TbCore::SessionHelper
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
# Auto load the spud_user factory if FactoryGirl is in use
|
39
|
+
#
|
40
|
+
if defined?(FactoryGirl)
|
41
|
+
Dir[TbCore::Engine.root.join('spec/factories/spud_user_factories.rb')].each{ |f| require f }
|
42
|
+
end
|