adminpanel 1.2.9 → 1.2.10

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 (57) hide show
  1. data/Gemfile +1 -0
  2. data/adminpanel.gemspec +1 -0
  3. data/app/controllers/adminpanel/analytics_controller.rb +1 -1
  4. data/app/controllers/adminpanel/application_controller.rb +6 -6
  5. data/app/controllers/adminpanel/categories_controller.rb +17 -8
  6. data/app/controllers/adminpanel/galleries_controller.rb +2 -0
  7. data/app/controllers/adminpanel/sections_controller.rb +2 -0
  8. data/app/controllers/adminpanel/sessions_controller.rb +2 -2
  9. data/app/controllers/adminpanel/users_controller.rb +2 -0
  10. data/app/helpers/adminpanel/custom_form_builder.rb +24 -0
  11. data/app/helpers/adminpanel/rest_actions_helper.rb +26 -9
  12. data/app/helpers/adminpanel/shared_pages_helper.rb +2 -1
  13. data/app/models/adminpanel/group.rb +6 -0
  14. data/app/models/adminpanel/user.rb +48 -5
  15. data/app/views/adminpanel/categories/_categories_table.html.erb +3 -2
  16. data/app/views/adminpanel/categories/_category_form.html.erb +4 -4
  17. data/app/views/adminpanel/categories/create.js.erb +2 -1
  18. data/app/views/adminpanel/categories/index.html.erb +1 -1
  19. data/app/views/adminpanel/categories/new.js.erb +2 -1
  20. data/app/views/layouts/_side_menu.html.erb +20 -18
  21. data/app/views/layouts/_top_bar.html.erb +1 -1
  22. data/app/views/shared/_form_fields.html.erb +57 -5
  23. data/app/views/shared/_modal.html.erb +8 -0
  24. data/app/views/shared/_remote_form_fields.html.erb +12 -0
  25. data/app/views/shared/create_belongs_to.js.erb +5 -0
  26. data/app/views/shared/create_has_many.js.erb +5 -0
  27. data/app/views/shared/edit.html.erb +1 -0
  28. data/app/views/shared/new.html.erb +15 -4
  29. data/app/views/shared/new.js.erb +2 -0
  30. data/config/locales/es.yml +5 -3
  31. data/lib/adminpanel.rb +1 -0
  32. data/lib/adminpanel/active_record/adminpanel_extension.rb +0 -4
  33. data/lib/adminpanel/version.rb +1 -1
  34. data/lib/generators/adminpanel/initialize/initialize_generator.rb +11 -0
  35. data/lib/generators/adminpanel/initialize/templates/ability.rb +31 -0
  36. data/lib/generators/adminpanel/initialize/templates/adminpanel_setup.rb +7 -7
  37. data/lib/generators/adminpanel/initialize/templates/create_adminpanel_tables.rb +9 -1
  38. data/lib/tasks/adminpanel/adminpanel.rake +2 -1
  39. data/spec/dummy/app/models/ability.rb +31 -0
  40. data/spec/dummy/app/models/adminpanel/category.rb +4 -1
  41. data/spec/features/authentication_pages_spec.rb +6 -5
  42. data/spec/features/galleries_pages_spec.rb +3 -1
  43. data/spec/features/section_pages_spec.rb +2 -1
  44. data/spec/features/shared_pages_spec.rb +66 -22
  45. data/spec/generators/gallery_generator_spec.rb +3 -3
  46. data/spec/generators/resource_generator_spec.rb +3 -3
  47. data/spec/models/gallery_spec.rb +3 -1
  48. data/spec/models/section_spec.rb +12 -11
  49. data/spec/models/user_spec.rb +6 -2
  50. data/spec/spec_helper.rb +5 -2
  51. data/spec/support/define_factory_models.rb +6 -0
  52. data/spec/support/helper_methods.rb +2 -1
  53. data/spec/support/test_database.rb +7 -0
  54. data/spec/tasks/adminpanel_rake_spec.rb +1 -0
  55. metadata +53 -32
  56. data/spec/dummy/app/controllers/adminpanel/categories_controller.rb +0 -4
  57. data/spec/models/product_spec.rb +0 -39
@@ -13,30 +13,82 @@
13
13
  <% end %>
14
14
 
15
15
  <% elsif properties["type"] == "adminpanel_file_field" %>
16
+ <% if !defined? remote_request %>
16
17
  <%= f.fields_for(attribute) do |builder| %>
17
18
  <%= render 'shared/image_fields', :f => builder %>
18
19
  <% end -%>
19
20
  <%= link_to_add_fields t("Add Image"), f, attribute %>
20
21
 
22
+ <% end %>
21
23
  <% elsif properties["type"] == "belongs_to" %>
24
+ <% if !defined? remote_request %>
22
25
  <% args = properties.except("type", "name", "model") %>
23
26
  <% args.symbolize_keys! %>
24
27
  <%= f.select(attribute, (@collections["#{properties["model"]}"].collect{|resource| [resource.name, resource.id]}), args) %>
25
28
 
26
- <% elsif properties["type"] == "has_many" %>
27
- <%#= f.checkbox(collection, relationship) %>
29
+
30
+ <% if(properties['remote_resource'].nil? || properties['remote_resource']) %>
31
+ <!-- Button to create a new of this belongs_to resource -->
32
+ <% model_name = properties['model'].classify.constantize.model_name.demodulize.downcase %>
33
+ <%=
34
+ link_to(
35
+ I18n.t('other.add',
36
+ :model => properties['model'].classify.constantize.display_name
37
+ ),
38
+ polymorphic_path(
39
+ [:new, :"#{model_name}"],
40
+ :model => @model.display_name,
41
+ :model_name => @model.name.demodulize.downcase,
42
+ :belongs_request => true
43
+ ),
44
+ :class => 'btn btn-info',
45
+ :id => "#{model_name}-modal-link",
46
+ :'data-target' => "#new-modal",
47
+ :'data-toggle' => 'modal',
48
+ :remote => true
49
+ )
50
+ %>
51
+ <% end %>
52
+
53
+
54
+ <% end %>
55
+ <% elsif properties['type'] == 'has_many' %>
56
+ <% if !defined? remote_request %>
28
57
  <div class="control-group">
29
58
  <div class="control-label">
30
- <%= I18n.t('other.choose', :model => pluralize_es(properties["model"].classify.constantize.display_name)) %>
59
+ <%= I18n.t('other.choose', :model => pluralize_es(properties['model'].classify.constantize.display_name)) %>
31
60
  </div>
32
61
  <%= hidden_field_tag("#{class_name_downcase(f.object)}[#{relationship_ids(properties["model"])}][]", nil) %>
33
- <div class="controls">
34
- <% @collections["#{properties["model"]}"].each do |resource| %>
62
+ <div class="controls" id="<%= properties['model'].demodulize.downcase %>-relation">
63
+ <% @collections["#{properties['model']}"].each do |resource| %>
35
64
  <%= f.checkbox(resource, class_name_downcase(f.object) ,relationship_ids(properties["model"])) %>
36
65
  <% end %>
37
66
  </div>
38
67
  </div>
39
68
 
69
+ <% if properties['remote_resource'].nil? || propeties['remote_resource'] %>
70
+ <!-- Button to create a new of this has_many resource -->
71
+ <% model_name = properties['model'].classify.constantize.model_name.demodulize.downcase %>
72
+ <%=
73
+ link_to(
74
+ I18n.t('other.add',
75
+ :model => properties['model'].classify.constantize.display_name
76
+ ),
77
+ polymorphic_path(
78
+ [:new, :"#{model_name}"],
79
+ :model => @model.display_name,
80
+ :model_name => @model.name.demodulize.downcase
81
+ ),
82
+ :class => 'btn btn-info',
83
+ :id => "#{model_name}-modal-link",
84
+ :'data-target' => "#new-modal",
85
+ :'data-toggle' => 'modal',
86
+ :remote => true
87
+ )
88
+ %>
89
+ <% end %>
90
+ <% end %>
91
+
40
92
  <% else %>
41
93
  <% type = properties["type"] %>
42
94
  <% args = properties.except("type", "name") %>
@@ -0,0 +1,8 @@
1
+ <div id="new-modal" class="modal hide fade" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
2
+ <div class="modal-header" id="modal-header">
3
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
4
+ <h3 id="modal-title"></h3>
5
+ </div>
6
+ <div id="modal-container">
7
+ </div>
8
+ </div>
@@ -0,0 +1,12 @@
1
+ <%= custom_form_for(resource, :url => {:action => :create, :model => params[:model], :model_name => params[:model_name], :belongs_request => params[:belongs_request] }, :remote => true, :html => {:class => "form-horizontal", :id => "new_resource"}) do |f| -%>
2
+ <div class="row-fluid">
3
+ <div class="modal-body">
4
+ <%= render 'shared/error_messages', :object => resource %>
5
+ <%= render 'shared/form_fields', :f => f, :remote_request => true %>
6
+ </div>
7
+ </div>
8
+ <div class="modal-footer">
9
+ <button id="modal-button" class="btn" data-dismiss="modal" aria-hidden="true"><%= I18n.t('action.close') %></button>
10
+ <%= f.submit t("action.add") + " " + @model.display_name, :disable_with => t("action.submitting"), :id =>"new-resource-button" %>
11
+ </div>
12
+ <% end -%>
@@ -0,0 +1,5 @@
1
+ var model_name = "<%= params[:model_name] %>";
2
+ var new_model = "<%= @model.name.demodulize.downcase %>";
3
+ var option = '<option value="<%= resource.id %>" selected="selected"><%= resource.name %></option>';
4
+ $("#" + model_name + "_" + new_model + "_id").append(option);
5
+ $("#new-modal").modal('toggle');
@@ -0,0 +1,5 @@
1
+ var model_name = "<%= params[:model_name] %>";
2
+ var new_model = "<%= @model.name.demodulize.downcase %>";
3
+ row = '<label class="checkbox"><input checked="checked" id="' + model_name + '_' + new_model + '_ids_" name="' + model_name + '[' + new_model + '_ids][]" type="checkbox" value="<%= resource.id %>"><%= resource.name %></label>';
4
+ $("#" + new_model + "-relation").append(row);
5
+ $("#new-modal").modal('toggle');
@@ -26,3 +26,4 @@
26
26
  <% end -%>
27
27
  </div>
28
28
  </div>
29
+ <%= render 'shared/modal' %>
@@ -1,6 +1,6 @@
1
1
  <% provide(:page_title, t("action.create") + " #{@model.display_name.capitalize}") -%>
2
2
  <% breadcrumb_add(
3
- @model.display_name.capitalize.pluralize,
3
+ @model.display_name.capitalize.pluralize,
4
4
  {
5
5
  :controller => params[:controller],
6
6
  :action => "index"
@@ -15,14 +15,25 @@
15
15
  </div>
16
16
  <div class = "widget-body">
17
17
  <div class = "widget-forms clearfix">
18
- <%= custom_form_for(resource, :html => {:class => "form-horizontal", :id => "new_resource"}) do |f| -%>
18
+ <%=
19
+ custom_form_for(
20
+ resource, :html => {
21
+ :class => "form-horizontal",
22
+ :id => "new_resource"
23
+ }
24
+ ) do |f| -%>
19
25
  <%= render 'shared/error_messages', :object => resource %>
20
26
  <%= render 'shared/form_fields', :f => f %>
21
27
  </div>
22
28
  </div>
23
29
  <div class = "widget-footer">
24
- <%= f.submit t("action.add") + " " + @model.display_name, :disable_with => t("action.submitting"), :id =>"new-resource-button" %>
30
+ <%=
31
+ f.submit t("action.add") + " " + @model.display_name,
32
+ :disable_with => t("action.submitting"),
33
+ :id =>"new-#{@model.name.demodulize}-button"
34
+ %>
25
35
  </div>
26
36
  <% end -%>
27
37
  </div>
28
- </div>
38
+ </div>
39
+ <%= render 'shared/modal' %>
@@ -0,0 +1,2 @@
1
+ $("#modal-title").html('Agregar <%= @model.display_name %>');
2
+ $("#modal-container").html('<%= escape_javascript(render "shared/remote_form_fields", :resource => resource) %>');
@@ -8,10 +8,10 @@ es:
8
8
  brief: "Pequeña descripción"
9
9
  category_id: "Categoría"
10
10
  client_id: "Cliente"
11
- adminproject_id: "Proyecto"
12
11
  description: "Descripción"
13
12
  email: "Correo electrónico"
14
13
  file: "Imagen"
14
+ group_id: "Rol de usuario"
15
15
  name: "Nombre"
16
16
  password: "Contraseña"
17
17
  password_confirmation: "Confirmar contraseña"
@@ -55,8 +55,9 @@ es:
55
55
  delete confirmation: "Estás seguro que desea eliminar?"
56
56
  authentication:
57
57
  welcome: "Bienvenido! Inicia Sesión"
58
- signin error: "Contraseña incorrecta"
59
- signin success: "Bienvenido!"
58
+ signin_error: "Correo y/o Contraseña incorrecta."
59
+ signin_success: "Bienvenido!"
60
+ not_authorized: 'No tienes permisos para acceder'
60
61
  gallery:
61
62
  new: "Agregar Imagen"
62
63
  success: "La imagen ha sido guardada"
@@ -79,6 +80,7 @@ es:
79
80
  password: "Contraseña"
80
81
  email: "Correo electrónico"
81
82
  other:
83
+ add : "Agregar %{model}"
82
84
  choose: "Selecciona %{model} pertenecientes"
83
85
  no description: "No tiene descripción aún"
84
86
  key:
@@ -5,6 +5,7 @@ require "adminpanel/active_record/adminpanel_extension"
5
5
  require "carrierwave"
6
6
  require "carrierwave/orm/activerecord"
7
7
  require "google/api_client"
8
+ require 'cancan'
8
9
 
9
10
  module Adminpanel
10
11
  end
@@ -43,10 +43,6 @@ module ActiveRecord
43
43
  default_scope { order("position ASC")}
44
44
  end
45
45
 
46
- # def self.of_parent(field, id)
47
- # where(field.to_sym => id)
48
- # end
49
-
50
46
  def form_attributes
51
47
  [{
52
48
  "name" => {
@@ -1,3 +1,3 @@
1
1
  module Adminpanel
2
- VERSION = "1.2.9"
2
+ VERSION = "1.2.10"
3
3
  end
@@ -25,6 +25,11 @@ module Adminpanel
25
25
  :aliases => '-p',
26
26
  :default => false,
27
27
  :desc => 'Skip setup if true'
28
+ class_option :'skip-setup',
29
+ :type => :boolean,
30
+ :aliases => '-y',
31
+ :default => false,
32
+ :desc => 'Skip cancan\'s ability.rb'
28
33
 
29
34
  def create_initializers
30
35
  if !options[:'skip-setup']
@@ -32,6 +37,12 @@ module Adminpanel
32
37
  end
33
38
  end
34
39
 
40
+ def create_ability
41
+ if !options[:'skip-ability']
42
+ copy_file 'ability.rb', 'app/models/ability.rb'
43
+ end
44
+ end
45
+
35
46
  def create_categories
36
47
  if !options[:'skip-category']
37
48
  # puts "including category files"
@@ -0,0 +1,31 @@
1
+ class Ability
2
+ include CanCan::Ability
3
+
4
+ def initialize(user)
5
+
6
+ if user.group.name == "Admin"
7
+ can :manage, :all
8
+ else
9
+ # cannot :manage, Adminpanel::User
10
+ # can :manage, Adminpanel::Analytic
11
+ # can :manage, Adminpanel::Section
12
+ # can :manage, Adminpanel::Gallery
13
+ # can :manage, Adminpanel::Category
14
+ end
15
+
16
+ # The first argument to `can` is the action you are giving the user
17
+ # permission to do.
18
+ # If you pass :manage it will apply to every action. Other common actions
19
+ # here are :read, :create, :update and :destroy.
20
+ #
21
+ # The second argument is the resource the user can perform the action on.
22
+ # If you pass :all it will apply to every resource. Otherwise pass a Ruby
23
+ # class of the resource.
24
+ #
25
+ # The third argument is an optional hash of conditions to further filter the
26
+ # objects.
27
+ # For example, here the user can only update published articles.
28
+ #
29
+ # can :update, Article, :published => true
30
+ end
31
+ end
@@ -11,11 +11,11 @@ Adminpanel.setup do |config|
11
11
  # config.analytics_key_path = "config/analytics"
12
12
 
13
13
  # # This are the modules that are going to be displayed and order that are going to be displayed
14
- # config.displayable_resources = [
15
- # :analytics,
16
- # :users,
17
- # :galleries,
18
- # :sections,
19
- # :categories
20
- # ]
14
+ config.displayable_resources = [
15
+ :analytics,
16
+ :users,
17
+ :galleries,
18
+ :sections,
19
+ :categories
20
+ ]
21
21
  end
@@ -4,8 +4,11 @@ class CreateAdminpanelTables < ActiveRecord::Migration
4
4
  # Create a default user
5
5
  if direction == :up
6
6
  if Rails.env.development?
7
- Adminpanel::User.new(:email => 'admin@admin.com', :name => "Admin", :password => 'password', :password_confirmation => 'password').save
7
+ group = Adminpanel::Group.new(:name => "Admin")
8
+ group.save
9
+ Adminpanel::User.new(:email => 'admin@admin.com', :name => "Admin", :password => 'password', :password_confirmation => 'password', :group_id => group.object_id).save
8
10
  puts "The password for admin@admin.com is: password"
11
+
9
12
  end
10
13
  end
11
14
  end
@@ -33,6 +36,11 @@ class CreateAdminpanelTables < ActiveRecord::Migration
33
36
  t.timestamps
34
37
  end
35
38
 
39
+ create_table :adminpanel_groups do |t|
40
+ t.string :name
41
+ t.timestamps
42
+ end
43
+
36
44
  create_table :adminpanel_sections do |t|
37
45
  t.string :name
38
46
  t.boolean :has_description
@@ -45,7 +45,8 @@ namespace :adminpanel do
45
45
  :email => 'admin@codn.com',
46
46
  :name => 'CoDN',
47
47
  :password => password,
48
- :password_confirmation => password
48
+ :password_confirmation => password,
49
+ :group_id => Adminpanel::Group.find_by_name("Admin").object_id
49
50
  ).save
50
51
  end
51
52
 
@@ -0,0 +1,31 @@
1
+ class Ability
2
+ include CanCan::Ability
3
+
4
+ def initialize(user)
5
+
6
+ if user.group.name == "Admin"
7
+ can :manage, :all
8
+ else
9
+ # cannot :manage, Adminpanel::User
10
+ # can :manage, Adminpanel::Analytic
11
+ # can :manage, Adminpanel::Section
12
+ # can :manage, Adminpanel::Gallery
13
+ # can :manage, Adminpanel::Category
14
+ end
15
+
16
+ # The first argument to `can` is the action you are giving the user
17
+ # permission to do.
18
+ # If you pass :manage it will apply to every action. Other common actions
19
+ # here are :read, :create, :update and :destroy.
20
+ #
21
+ # The second argument is the resource the user can perform the action on.
22
+ # If you pass :all it will apply to every resource. Otherwise pass a Ruby
23
+ # class of the resource.
24
+ #
25
+ # The third argument is an optional hash of conditions to further filter the
26
+ # objects.
27
+ # For example, here the user can only update published articles.
28
+ #
29
+ # can :update, Article, :published => true
30
+ end
31
+ end
@@ -1,6 +1,8 @@
1
1
  module Adminpanel
2
2
  class Category < ActiveRecord::Base
3
- attr_accessible :product_ids, :name
3
+ attr_accessible :product_ids, :name, :model
4
+
5
+ validates_presence_of :model
4
6
 
5
7
  has_many :categorizations
6
8
  has_many :products, :through => :categorizations, :dependent => :destroy
@@ -9,6 +11,7 @@ module Adminpanel
9
11
  def self.form_attributes
10
12
  [
11
13
  {"name" => {"type" => "text_field", "name" => "name", "label" => "name", "placeholder" => "name"}},
14
+ # {'model' => {"type" => "text_field", "name" => "name", "label" => "name", "placeholder" => "name", 'show' => 'false'}},
12
15
  {"product_ids" => {"type" => "has_many", "model" => "Adminpanel::Product", "name" => "product_ids"}},
13
16
  ]
14
17
  end
@@ -1,9 +1,10 @@
1
1
  require 'spec_helper'
2
+ require 'support/test_database'
2
3
 
3
4
  describe "Authentication" do
4
5
 
5
6
  subject { page }
6
-
7
+
7
8
  describe "sign in page" do
8
9
  before { visit adminpanel.signin_path }
9
10
 
@@ -20,7 +21,7 @@ describe "Authentication" do
20
21
 
21
22
  it { expect(page).to have_title(I18n.t("Panel title")) }
22
23
 
23
- it { should have_selector('div.alert.alert-error', :text => I18n.t("authentication.signin error")) }
24
+ it { should have_selector('div.alert.alert-error', :text => I18n.t("authentication.signin_error")) }
24
25
  end
25
26
 
26
27
  describe "with valid information" do
@@ -29,7 +30,7 @@ describe "Authentication" do
29
30
  valid_signin(user)
30
31
  end
31
32
 
32
- it { should have_selector('div.alert.alert-success', :text => I18n.t("authentication.signin success")) }
33
+ it { should have_selector('div.alert.alert-success', :text => I18n.t("authentication.signin_success")) }
33
34
  it { should have_selector('i.icon-off') }
34
35
 
35
36
  describe "signing out" do
@@ -37,8 +38,8 @@ describe "Authentication" do
37
38
 
38
39
  it { current_path.should == adminpanel.signin_path }
39
40
  it { expect(page).to have_title(I18n.t("Panel title")) }
40
-
41
+
41
42
  end
42
43
  end
43
44
  end
44
- end
45
+ end
@@ -1,4 +1,6 @@
1
- require "spec_helper"
1
+ require 'spec_helper'
2
+ require 'support/test_database'
3
+
2
4
 
3
5
  describe "Gallery pages" do
4
6
  subject {page}
@@ -1,4 +1,5 @@
1
- require "spec_helper"
1
+ require 'spec_helper'
2
+ require 'support/test_database'
2
3
 
3
4
  describe "Section pages" do
4
5
  subject {page}