gemboree 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (47) hide show
  1. data/MIT-LICENSE +20 -0
  2. data/README.rdoc +59 -0
  3. data/Rakefile +38 -0
  4. data/app/assets/images/glyphicons-halflings-white.png +0 -0
  5. data/app/assets/images/glyphicons-halflings.png +0 -0
  6. data/app/assets/javascripts/bootstrap.js +2027 -0
  7. data/app/assets/javascripts/gemboree.js +2 -0
  8. data/app/assets/javascripts/scaffolds.js +20 -0
  9. data/app/assets/stylesheets/bootstrap-responsive.css +1092 -0
  10. data/app/assets/stylesheets/bootstrap.css +6039 -0
  11. data/app/assets/stylesheets/gemboree-nores.css +4 -0
  12. data/app/assets/stylesheets/gemboree.css +6 -0
  13. data/app/assets/stylesheets/navspace.css +4 -0
  14. data/app/assets/stylesheets/scaffolds.css +2 -0
  15. data/app/helpers/nav_helper.rb +7 -0
  16. data/app/helpers/sortable_helper.rb +10 -0
  17. data/app/models/role.rb +14 -0
  18. data/app/models/user_role.rb +11 -0
  19. data/app/views/layouts/_error_messages.html.erb +20 -0
  20. data/app/views/layouts/_errors.html.erb +11 -0
  21. data/config/routes.rb +3 -0
  22. data/lib/gemboree.rb +22 -0
  23. data/lib/gemboree/acts_as_actor.rb +47 -0
  24. data/lib/gemboree/version.rb +3 -0
  25. data/lib/generators/gemboree/devise_generator.rb +13 -0
  26. data/lib/generators/gemboree/install_generator.rb +46 -0
  27. data/lib/generators/gemboree/migration_generator.rb +25 -0
  28. data/lib/templates/devise/passwords/new.html.erb +27 -0
  29. data/lib/templates/devise/registrations/edit.html.erb +65 -0
  30. data/lib/templates/devise/registrations/new.html.erb +45 -0
  31. data/lib/templates/devise/sessions/new.html.erb +41 -0
  32. data/lib/templates/erb/scaffold/_form.html.erb +19 -0
  33. data/lib/templates/erb/scaffold/edit.html.erb +22 -0
  34. data/lib/templates/erb/scaffold/index.html.erb +31 -0
  35. data/lib/templates/erb/scaffold/new.html.erb +11 -0
  36. data/lib/templates/erb/scaffold/show.html.erb +22 -0
  37. data/lib/templates/gemboree/install/ability.rb +7 -0
  38. data/lib/templates/gemboree/install/application.html.erb +19 -0
  39. data/lib/templates/gemboree/install/home_controller.rb +6 -0
  40. data/lib/templates/gemboree/install/index.html.erb +5 -0
  41. data/lib/templates/gemboree/install/nav.html.erb +38 -0
  42. data/lib/templates/gemboree/install/users_controller.rb +7 -0
  43. data/lib/templates/migration/migration.rb +19 -0
  44. data/lib/templates/rails/scaffold_controller/controller.rb +81 -0
  45. data/test/gemboree_test.rb +7 -0
  46. data/test/test_helper.rb +15 -0
  47. metadata +195 -0
@@ -0,0 +1,4 @@
1
+ /*
2
+ *= require bootstrap.css
3
+ *= require scaffolds.css
4
+ */
@@ -0,0 +1,6 @@
1
+ /*
2
+ *= require bootstrap.css
3
+ *= require navspace.css
4
+ *= require bootstrap-responsive.css
5
+ *= require scaffolds.css
6
+ */
@@ -0,0 +1,4 @@
1
+ body {
2
+ padding-top: 60px;
3
+ padding-bottom: 40px;
4
+ }
@@ -0,0 +1,2 @@
1
+ .field_with_errors input {
2
+ border: 1px dashed #ff0000; }
@@ -0,0 +1,7 @@
1
+ module NavHelper
2
+
3
+ def active_link(controller, action)
4
+ 'class="active"' if params[:action] == action
5
+ end
6
+
7
+ end
@@ -0,0 +1,10 @@
1
+ module SortableHelper
2
+
3
+ def sortable(column, title = nil)
4
+ title ||= column.titleize
5
+ css_class = column == sort_column ? "current #{sort_direction}" : nil
6
+ direction = column == sort_column && sort_direction == "asc" ? "desc" : "asc"
7
+ link_to title, {:sort => column, :direction => direction}, {:class => css_class}
8
+ end
9
+
10
+ end
@@ -0,0 +1,14 @@
1
+ class Role < ActiveRecord::Base
2
+
3
+ attr_accessible :name, :access_level
4
+
5
+ has_many :user_roles, :dependent => :destroy
6
+ has_many :users, :through => :user_roles
7
+
8
+ validates :name,
9
+ :presence => true,
10
+ :uniqueness => true
11
+
12
+ validates :access_level, :presence => true
13
+
14
+ end
@@ -0,0 +1,11 @@
1
+ class UserRole < ActiveRecord::Base
2
+
3
+ attr_accessible :role_id, :user_id
4
+
5
+ belongs_to :role
6
+ belongs_to :user
7
+
8
+ validates :role_id, :presence => true
9
+ validates :user_id, :presence => true
10
+
11
+ end
@@ -0,0 +1,20 @@
1
+ <% if notice %>
2
+ <div class="alert alert-success">
3
+ <button type="button" class="close" data-dismiss="alert">x</button>
4
+ <strong><%= notice %></strong>
5
+ </div>
6
+ <% end %>
7
+
8
+ <% if alert %>
9
+ <div class="alert alert-alert">
10
+ <button type="button" class="close" data-dismiss="alert">x</button>
11
+ <strong><%= alert %></strong>
12
+ </div>
13
+ <% end %>
14
+
15
+ <% if flash[:error] %>
16
+ <div class="alert alert-error">
17
+ <button type="button" class="close" data-dismiss="alert">x</button>
18
+ <strong><%= flash[:error] %></strong>
19
+ </div>
20
+ <% end %>
@@ -0,0 +1,11 @@
1
+ <% if target.errors.any? %>
2
+ <div id="errorExplanation">
3
+ <h2><%= pluralize(target.errors.count, "Error") %> prohibited this form from submission:</h2>
4
+ <ul class="errors_explained">
5
+ <% target.errors.full_messages.each do |message| %>
6
+ <li><%= message %></li>
7
+ <% end %>
8
+ </ul>
9
+ </div>
10
+ <br class="clear"/>
11
+ <% end %>
@@ -0,0 +1,3 @@
1
+ Gemboree::Engine.routes.draw do
2
+
3
+ end
@@ -0,0 +1,22 @@
1
+ require 'devise'
2
+ require 'cancan'
3
+ require 'will_paginate'
4
+ require 'gemboree/version'
5
+ require 'gemboree/acts_as_actor'
6
+ require 'paperclip'
7
+
8
+ module Gemboree
9
+
10
+ class Engine < Rails::Engine
11
+
12
+ initializer 'acts_as_actor.ar_extensions' do |app|
13
+ ActiveRecord::Base.extend Gemboree::ActsAsActor
14
+ end
15
+
16
+ config.app_generators do |g|
17
+ g.templates.unshift File::expand_path('../templates', __FILE__)
18
+ end
19
+
20
+ end
21
+
22
+ end
@@ -0,0 +1,47 @@
1
+ module Gemboree
2
+ module ActsAsActor
3
+
4
+ def acts_as_actor(options = {})
5
+ has_many :user_roles, :foreign_key => "user_id", :dependent => :destroy
6
+ has_many :roles, :through => :user_roles
7
+ include InstanceMethods
8
+ end
9
+
10
+ module InstanceMethods
11
+
12
+ def role_name
13
+ roles.order('access_level desc').first.try(:name)
14
+ end
15
+
16
+ def access_level
17
+ roles.first.nil? ? 0 : roles.order('access_level desc').first.access_level
18
+ end
19
+
20
+ def has_access?(level)
21
+ access_level >= level
22
+ end
23
+
24
+ def has_role?(name)
25
+ roles.find_by_name(name)
26
+ end
27
+
28
+ def add_role(name)
29
+ return false if has_role?(name)
30
+ role = Role.find_by_name(name)
31
+ role ? roles << role : false
32
+ end
33
+
34
+ def remove_role(name)
35
+ role = has_role?(name)
36
+ role ? UserRole.where(user_id: id, role_id: role.id).first.delete : false
37
+ end
38
+
39
+ def change_role(name)
40
+ roles.clear
41
+ add_role(name)
42
+ end
43
+
44
+ end
45
+
46
+ end
47
+ end
@@ -0,0 +1,3 @@
1
+ module Gemboree
2
+ VERSION = "0.1.2"
3
+ end
@@ -0,0 +1,13 @@
1
+ module Gemboree
2
+ module Generators
3
+ class DeviseGenerator < Rails::Generators::Base
4
+
5
+ source_root File.expand_path("../../../templates/devise/", __FILE__)
6
+
7
+ def copy_views
8
+ copy_file "registrations/new.html.erb", "app/views/devise/registrations/new.html.erb"
9
+ end
10
+
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,46 @@
1
+ module Gemboree
2
+ module Generators
3
+ class InstallGenerator < Rails::Generators::Base
4
+
5
+ def setup_home_page
6
+ remove_file "public/index.html"
7
+ remove_file "app/assets/images/rails.png"
8
+ remove_file "app/views/layouts/application.html.erb"
9
+ copy_file "home_controller.rb", "app/controllers/home_controller.rb"
10
+ copy_file "index.html.erb", "app/views/home/index.html.erb"
11
+ copy_file "nav.html.erb", "app/views/layouts/_nav.html.erb"
12
+ copy_file "application.html.erb", "app/views/layouts/application.html.erb"
13
+ route "root :to => 'home#index'"
14
+ end
15
+
16
+ def setup_asssets
17
+ insert_into_file "app/assets/javascripts/application.js", :after => "jquery_ujs\n" do
18
+ "//= require gemboree\n"
19
+ end
20
+ insert_into_file "app/assets/stylesheets/application.css", :after => "require_self\n" do
21
+ " *= require gemboree\n"
22
+ end
23
+ end
24
+
25
+ def setup_devise
26
+ generate "devise:install"
27
+ generate "devise", "User"
28
+ end
29
+
30
+ def setup_cancan
31
+ copy_file "ability.rb", "app/models/ability.rb"
32
+ end
33
+
34
+ def setup_roles
35
+ generate "gemboree:migration"
36
+ insert_into_file "app/models/user.rb", :after => "ActiveRecord::Base\n" do
37
+ %{ acts_as_actor
38
+ has_many :user_roles, :dependent => :destroy
39
+ has_many :roles, :through => :user_roles
40
+ }
41
+ end
42
+ end
43
+
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,25 @@
1
+ module Gemboree
2
+ module Generators
3
+ class MigrationGenerator < Rails::Generators::Base
4
+
5
+ include Rails::Generators::Migration
6
+
7
+ source_root File.expand_path("../../../templates/migration/", __FILE__)
8
+
9
+ def self.next_migration_number(dirname)
10
+ if ActiveRecord::Base.timestamped_migrations
11
+ migration_number = Time.now.utc.strftime("%Y%m%d%H%M%S").to_i
12
+ migration_number += 1
13
+ migration_number.to_s
14
+ else
15
+ "%.3d" % (current_migration_number(dirname) + 1)
16
+ end
17
+ end
18
+
19
+ def create_migration
20
+ migration_template "migration.rb", "db/migrate/acts_as_actor"
21
+ end
22
+
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,27 @@
1
+ <h2>Forgot your password?</h2>
2
+
3
+ <div class="row-fluid">
4
+ <div class="span6">
5
+
6
+ <%= form_for(resource, :as => resource_name, :url => password_path(resource_name),
7
+ :html => { :method => :post, class: 'form-horizontal well' }) do |f| %>
8
+
9
+ <%= devise_error_messages! %>
10
+
11
+ <div class="control-group">
12
+ <%= f.label :email, class: 'control-label' %>
13
+ <div class="controls">
14
+ <%= f.email_field :email %>
15
+ </div>
16
+ </div>
17
+
18
+ <div class="form-actions">
19
+ <%= f.submit "Send me reset password instructions", class: 'btn btn-warning' %>
20
+ </div>
21
+
22
+ <% end %>
23
+ </div>
24
+
25
+ <%= render "devise/shared/links" %>
26
+
27
+ </div><!--/.row-fluid -->
@@ -0,0 +1,65 @@
1
+ <h2>Edit <%= resource_name.to_s.humanize %></h2>
2
+
3
+ <div class="row-fluid">
4
+ <div class="span6">
5
+
6
+ <%= form_for(resource, :as => resource_name, :url => registration_path(resource_name),
7
+ :html => { :method => :put, class: 'form-horizontal well' }) do |f| %>
8
+
9
+ <%= devise_error_messages! %>
10
+
11
+ <div class="control-group">
12
+ <%= f.label :first_name, class: 'control-label' %>
13
+ <div class="controls">
14
+ <%= f.text_field :first_name %>
15
+ </div>
16
+ </div>
17
+
18
+ <div class="control-group">
19
+ <%= f.label :last_name, class: 'control-label' %>
20
+ <div class="controls">
21
+ <%= f.text_field :last_name %>
22
+ </div>
23
+ </div>
24
+
25
+ <div class="control-group">
26
+ <%= f.label :email, class: 'control-label' %>
27
+ <div class="controls">
28
+ <%= f.email_field :email %>
29
+ </div>
30
+ </div>
31
+
32
+ <div class="control-group">
33
+ <%= f.label :password, class: 'control-label' %>
34
+ <div class="controls">
35
+ <%= f.password_field :password, :autocomplete => "off" %><br />
36
+ <i>(leave blank if you don't want to change it)</i>
37
+ </div>
38
+ </div>
39
+
40
+ <div class="control-group">
41
+ <%= f.label :password_confirmation, class: 'control-label' %>
42
+ <div class="controls">
43
+ <%= f.password_field :password_confirmation %>
44
+ </div>
45
+ </div>
46
+
47
+ <div class="control-group">
48
+ <%= f.label :current_password, class: 'control-label' %>
49
+ <div class="controls">
50
+ <%= f.password_field :current_password %><br />
51
+ <i>(we need your current password to confirm your changes)</i>
52
+ </div>
53
+ </div>
54
+
55
+ <div class="form-actions btn-group">
56
+ <%= link_to "Back", :back, class: 'btn' %>
57
+ <%= f.submit "Update", class: 'btn btn-success' %>
58
+ <%= link_to "Cancel my account", registration_path(resource_name),
59
+ :data => { :confirm => "Are you sure?" }, :method => :delete, class: 'btn btn-danger' %>
60
+ </div>
61
+
62
+ <% end %>
63
+ </div>
64
+
65
+ </div><!--/.row-fluid -->
@@ -0,0 +1,45 @@
1
+ <div class="row-fluid">
2
+ <legend>Sign Up</legend>
3
+ <div class="span6">
4
+ <%= form_for(resource, :as => resource_name, :url => registration_path(resource_name),
5
+ :html => { class: 'form-horizontal well' }) do |f| %>
6
+
7
+ <%= devise_error_messages! %>
8
+
9
+ <div class="control-group">
10
+ <%= f.label :email, class: 'control-label' %>
11
+ <div class="controls">
12
+ <%= f.email_field :email %>
13
+ </div>
14
+ </div>
15
+
16
+ <div class="control-group">
17
+ <%= f.label :password, class: 'control-label' %>
18
+ <div class="controls">
19
+ <%= f.password_field :password %>
20
+ </div>
21
+ </div>
22
+
23
+ <div class="control-group">
24
+ <%= f.label :password_confirmation, class: 'control-label' %>
25
+ <div class="controls">
26
+ <%= f.password_field :password_confirmation %>
27
+ </div>
28
+ </div>
29
+
30
+ <div class="form-actions">
31
+ <%= f.submit "Sign up", class: 'btn' %>
32
+ </div>
33
+
34
+ <% end %>
35
+ </div>
36
+
37
+ <div class="span4">
38
+ <div class="well sidebar-nav">
39
+ <ul class="nav nav-list">
40
+ <%= render "devise/shared/links" %>
41
+ </ul>
42
+ </div>
43
+ </div>
44
+
45
+ </div><!--./row-fluid>
@@ -0,0 +1,41 @@
1
+ <h2>Sign in</h2>
2
+
3
+ <div class="row-fluid">
4
+ <div class="span6">
5
+
6
+ <%= form_for(resource, :as => resource_name, :url => session_path(resource_name),
7
+ :html => { class: 'form-horizontal well' }) do |f| %>
8
+
9
+ <div class="control-group">
10
+ <%= f.label :email, class: 'control-label' %>
11
+ <div class="controls">
12
+ <%= f.email_field :email %>
13
+ </div>
14
+ </div>
15
+
16
+ <div class="control-group">
17
+ <%= f.label :password, class: 'control-label' %>
18
+ <div class="controls">
19
+ <%= f.password_field :password %>
20
+ </div>
21
+ </div>
22
+
23
+ <% if devise_mapping.rememberable? -%>
24
+ <div class="control-group">
25
+ <%= f.label :remember_me, class: 'control-label' %>
26
+ <div class="controls">
27
+ <%= f.check_box :remember_me %>
28
+ </div>
29
+ </div>
30
+ <% end -%>
31
+
32
+ <div class="form-actions">
33
+ <%= f.submit "Sign in", class: 'btn btn-primary' %>
34
+ </div>
35
+
36
+ <% end %>
37
+ </div>
38
+
39
+ <%= render "devise/shared/links" %>
40
+
41
+ </div><!--/.row-fluid -->