tb_core 1.3.2 → 1.3.3
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.
- 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
|