adminpanel 2.0.1 → 2.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (84) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +3 -0
  3. data/Gemfile +6 -3
  4. data/README.md +6 -26
  5. data/adminpanel.gemspec +6 -3
  6. data/app/assets/javascripts/adminpanel/bootstrap-wysihtml5-4pre.js +9579 -0
  7. data/app/assets/javascripts/adminpanel/bootstrap-wysihtml5.js +9 -9
  8. data/app/assets/javascripts/adminpanel/realm.js +12 -8
  9. data/app/assets/javascripts/adminpanel/spinner.js.coffee +11 -0
  10. data/app/assets/javascripts/adminpanel/wysiwyg.js.coffee +3 -0
  11. data/app/assets/javascripts/application-admin.js +1 -0
  12. data/app/assets/stylesheets/adminpanel/{bootstrap.css → bootstrap.css.erb} +2 -2
  13. data/app/assets/stylesheets/adminpanel/{theme.css → theme.css.erb} +6 -6
  14. data/app/controllers/adminpanel/analytics_controller.rb +2 -1
  15. data/app/controllers/adminpanel/application_controller.rb +1 -0
  16. data/app/controllers/adminpanel/auths_controller.rb +8 -0
  17. data/app/controllers/adminpanel/categories_controller.rb +1 -1
  18. data/app/controllers/adminpanel/galleries_controller.rb +3 -11
  19. data/app/controllers/adminpanel/sections_controller.rb +5 -14
  20. data/app/controllers/adminpanel/users_controller.rb +1 -1
  21. data/app/controllers/concerns/adminpanel/facebook_actions.rb +64 -0
  22. data/app/controllers/concerns/adminpanel/galleryzable_actions.rb +12 -14
  23. data/app/controllers/concerns/adminpanel/rest_actions.rb +2 -2
  24. data/app/helpers/adminpanel/adminpanel_form_builder.rb +20 -2
  25. data/app/helpers/adminpanel/shared_pages_helper.rb +13 -0
  26. data/app/models/adminpanel/auth.rb +34 -0
  27. data/app/models/adminpanel/section.rb +1 -2
  28. data/app/models/adminpanel/user.rb +1 -2
  29. data/app/models/concerns/adminpanel/base.rb +10 -34
  30. data/app/models/concerns/adminpanel/facebook.rb +27 -0
  31. data/app/views/adminpanel/sections/edit.html.erb +0 -5
  32. data/app/views/adminpanel/sections/index.html.erb +1 -3
  33. data/app/views/layouts/_side_menu.html.erb +5 -4
  34. data/app/views/shared/_create_remote_resource_button.html.erb +23 -0
  35. data/app/views/shared/_fb_icon_button.html.erb +26 -0
  36. data/app/views/shared/_fb_publish_modal.html.erb +40 -0
  37. data/app/views/shared/_form_fields.html.erb +6 -50
  38. data/app/views/shared/_modal.html.erb +1 -1
  39. data/app/views/shared/create_belongs_to.js.erb +1 -1
  40. data/app/views/shared/create_has_many.js.erb +1 -1
  41. data/app/views/shared/fb_choose_page.html.erb +47 -0
  42. data/app/views/shared/index.html.erb +2 -0
  43. data/app/views/shared/show.html.erb +2 -0
  44. data/config/initializers/pluralization_es.rb +3 -0
  45. data/config/locales/es.yml +69 -60
  46. data/config/routes.rb +8 -1
  47. data/lib/adminpanel.rb +1 -0
  48. data/lib/adminpanel/engine.rb +4 -1
  49. data/lib/adminpanel/version.rb +1 -1
  50. data/lib/generators/adminpanel/gallery/gallery_generator.rb +2 -2
  51. data/lib/generators/adminpanel/initialize/initialize_generator.rb +2 -3
  52. data/lib/generators/adminpanel/initialize/templates/ability.rb +1 -1
  53. data/lib/generators/adminpanel/initialize/templates/adminpanel_setup.rb +6 -2
  54. data/lib/generators/adminpanel/initialize/templates/create_adminpanel_tables.rb +11 -0
  55. data/lib/generators/adminpanel/resource/resource_generator.rb +112 -130
  56. data/lib/generators/adminpanel/resource/templates/controller.rb +4 -1
  57. data/lib/generators/adminpanel/resource/templates/resource.rb +4 -1
  58. data/lib/tasks/adminpanel/adminpanel.rake +6 -2
  59. data/spec/dummy/app/controllers/adminpanel/salesmen_controller.rb +9 -0
  60. data/spec/dummy/app/models/adminpanel/category.rb +1 -0
  61. data/spec/dummy/app/models/adminpanel/mug.rb +2 -2
  62. data/spec/dummy/app/models/adminpanel/product.rb +4 -6
  63. data/spec/dummy/app/models/adminpanel/salesman.rb +35 -0
  64. data/spec/dummy/config/initializers/adminpanel_setup.rb +2 -1
  65. data/spec/dummy/db/schema.rb +13 -0
  66. data/spec/features/shared_pages/edit_spec.rb +48 -0
  67. data/spec/features/shared_pages/index_spec.rb +50 -0
  68. data/spec/features/shared_pages/new_spec.rb +128 -0
  69. data/spec/features/shared_pages/show_spec.rb +30 -0
  70. data/spec/generators/gallery_generator_spec.rb +1 -1
  71. data/spec/generators/resource_generator_spec.rb +36 -11
  72. data/spec/spec_helper.rb +12 -13
  73. data/spec/support/capybara_matchers.rb +17 -0
  74. data/spec/support/factories.rb +1 -1
  75. data/spec/support/helper_methods.rb +0 -18
  76. data/spec/support/shared_connection.rb +10 -0
  77. metadata +100 -21
  78. data/app/assets/javascripts/adminpanel/bootstrap-wysihtml5-3.min.js +0 -261
  79. data/app/assets/javascripts/adminpanel/medium-editor.js +0 -703
  80. data/app/assets/javascripts/adminpanel/wysiwyg.js +0 -5
  81. data/app/assets/stylesheets/adminpanel/medium-editor.css.scss +0 -1
  82. data/app/views/shared/_init_editor.html.erb +0 -27
  83. data/lib/generators/adminpanel/resource/templates/migration.rb +0 -13
  84. data/spec/features/shared_pages_spec.rb +0 -128
@@ -36,5 +36,18 @@ module Adminpanel
36
36
  end
37
37
  end
38
38
 
39
+ def get_oauth_link(resource)
40
+ Koala::Facebook::OAuth.new(
41
+ Adminpanel.fb_app_id,
42
+ Adminpanel.fb_app_secret,
43
+ url_for({
44
+ controller: params[:controller],
45
+ action: 'fb_choose_page',
46
+ id: resource,
47
+ host: request.host
48
+ })
49
+ ).url_for_oauth_code
50
+ end
51
+
39
52
  end
40
53
  end
@@ -0,0 +1,34 @@
1
+ module Adminpanel
2
+ class Auth < ActiveRecord::Base
3
+ include Adminpanel::Base
4
+
5
+ def self.form_attributes
6
+ [
7
+ {
8
+ 'name' => {
9
+ 'type' => 'text_field',
10
+ 'label' => 'Cuenta:'
11
+ }
12
+ },
13
+ {
14
+ 'value' => {
15
+ 'type' => 'wysiwyg_field',
16
+ 'show' => 'show',
17
+ 'label' => 'Access Key'
18
+ }
19
+ },
20
+ {
21
+ 'key' => {
22
+ 'type' => 'text_field',
23
+ 'show' => 'show',
24
+ 'label' => 'Llave'
25
+ }
26
+ }
27
+ ]
28
+ end
29
+
30
+ def self.display_name
31
+ 'Cuenta'
32
+ end
33
+ end
34
+ end
@@ -41,13 +41,12 @@ module Adminpanel
41
41
  {'name' => {'name' => 'name', 'label' => 'Seccion'}},
42
42
  {'key' => {'name' => 'key', 'label' => 'Llave'}},
43
43
  {'page' => {'name' => 'page'}},
44
- # {'key' => {'name' => 'key'}},
45
44
  ]
46
45
 
47
46
  end
48
47
 
49
48
  def self.icon
50
- "tasks"
49
+ 'tasks'
51
50
  end
52
51
 
53
52
  def self.display_name
@@ -82,8 +82,7 @@ module Adminpanel
82
82
  end
83
83
 
84
84
  def self.display_name
85
- "Usuario"
86
-
85
+ 'Usuario'
87
86
  end
88
87
 
89
88
  def User.new_remember_token
@@ -11,12 +11,7 @@ module Adminpanel
11
11
  end
12
12
 
13
13
  def form_attributes
14
- [{
15
- 'name' => {
16
- 'type' => 'text_field',
17
- 'label' => 'name'
18
- }
19
- }]
14
+ []
20
15
  end
21
16
 
22
17
  def display_name
@@ -34,17 +29,6 @@ module Adminpanel
34
29
  return "field #{field} 'label' property not found :("
35
30
  end
36
31
 
37
- def get_attribute_placeholder(field)
38
- form_attributes.each do |attribute|
39
- attribute.each do |name, properties|
40
- if name == field
41
- return properties['placeholder']
42
- end
43
- end
44
- end
45
- return "field #{field} 'placeholder' property not found :("
46
- end
47
-
48
32
  def display_attributes(type)
49
33
  display_attributes = []
50
34
  form_attributes.each do |attribute|
@@ -82,28 +66,16 @@ module Adminpanel
82
66
  return false
83
67
  end
84
68
 
85
- def belongs_to_relationships
86
- belongs_to_classes = []
69
+ def relationships_of(type_property)
70
+ classes_of_relation = []
87
71
  form_attributes.each do |fields|
88
72
  fields.each do |attribute, properties|
89
- if properties['type'] == 'belongs_to'
90
- belongs_to_classes << properties['model'].classify.constantize
73
+ if properties['type'] == type_property
74
+ classes_of_relation << properties['model'].classify.constantize
91
75
  end
92
76
  end
93
77
  end
94
- return belongs_to_classes
95
- end
96
-
97
- def has_many_relationships
98
- has_many_classes = []
99
- form_attributes.each do |fields|
100
- fields.each do |attribute, properties|
101
- if properties['type'] == 'has_many'
102
- has_many_classes << properties['model'].classify.constantize
103
- end
104
- end
105
- end
106
- return has_many_classes
78
+ return classes_of_relation
107
79
  end
108
80
 
109
81
  def icon
@@ -128,6 +100,10 @@ module Adminpanel
128
100
  false
129
101
  end
130
102
  end
103
+
104
+ def fb_share?
105
+ false
106
+ end
131
107
 
132
108
  private
133
109
  def exlude?(route)
@@ -0,0 +1,27 @@
1
+ module Adminpanel
2
+ module Facebook
3
+ extend ActiveSupport::Concern
4
+ included do
5
+ attr_accessor :fb_page_access_key, :fb_message
6
+ end
7
+
8
+ #instance methods
9
+ # def get_oauth_link
10
+ # Koala::Facebook::OAuth.new(
11
+ # Adminpanel.fb_app_id,
12
+ # Adminpanel.fb_app_secret,
13
+ # )
14
+ # end
15
+ def fb_link
16
+ 'www.google.com'
17
+ end
18
+
19
+ # static(class) methods
20
+ module ClassMethods
21
+ def fb_share?
22
+ true
23
+ end
24
+
25
+ end
26
+ end
27
+ end
@@ -14,11 +14,6 @@
14
14
  <%= f.hidden_field 'description', :id => "description-field", :value => @section.description %>
15
15
  </div>
16
16
  <%= f.wysiwyg_field 'description', 'label' => I18n.t('section.description'), :name => 'description' %>
17
- <%= content_for :scripts do %>
18
- <script type="text/javascript">
19
- <%= render "shared/init_editor", :field_var => 'description', :label => 'description' %>
20
- </script>
21
- <% end %>
22
17
  <% else %>
23
18
  <%= f.text_field 'description', :label => t("section.description") %>
24
19
  <% end %>
@@ -35,10 +35,8 @@
35
35
  <% current_page = section.page %>
36
36
  <% end %>
37
37
  <% end %>
38
- </div>
38
+ </div>
39
39
 
40
40
  </div>
41
41
  </div>
42
42
  </div>
43
-
44
-
@@ -11,7 +11,7 @@
11
11
  )
12
12
  %>
13
13
  </div>
14
- <div class="accordion" id="accordion2">
14
+ <div class="accordion">
15
15
  <% Adminpanel.displayable_resources.each do |resource| %>
16
16
  <% resource_class = symbol_class(resource) %>
17
17
  <% if can? :read, resource_class %>
@@ -23,10 +23,11 @@
23
23
  :i,
24
24
  nil,
25
25
  class:"fa fa-#{resource_class.icon}"
26
- ) + content_tag(:span," " + resource_class.display_name.pluralize(I18n.default_locale)),
26
+ ) + content_tag(:span," " + resource_class.display_name.pluralize(I18n.default_locale)
27
+ ),
27
28
  [route_symbol(resource.to_s)],
28
- :class => "accordion-toggle b_99FFCC
29
- #{is_current_section?(resource_class.display_name)}"
29
+ data: { no_transition_cache: true },
30
+ class: "accordion-toggle b_99FFCC #{is_current_section?(resource_class.display_name)}"
30
31
  )
31
32
  %>
32
33
  </div>
@@ -0,0 +1,23 @@
1
+ <!--
2
+ Button to create a new of remote resource
3
+ if it's supposed to be created in relation model
4
+ -->
5
+ <% demodulized_remote_model_name = remote_resource_name.classify.constantize.model_name.to_s.demodulize.downcase %>
6
+ <%=
7
+ link_to(
8
+ I18n.t('other.add',
9
+ :model => remote_resource_name.classify.constantize.display_name
10
+ ),
11
+ polymorphic_path(
12
+ [:new, :"#{demodulized_remote_model_name}"],
13
+ :model => @model.display_name,
14
+ :model_name => @model.name.demodulize.downcase,
15
+ :belongs_request => defined? belongs_request
16
+ ),
17
+ :class => 'btn btn-info',
18
+ :id => "#{demodulized_remote_model_name}-modal-link",
19
+ :'data-target' => "#remote-form-modal",
20
+ :'data-toggle' => 'modal',
21
+ :remote => true
22
+ )
23
+ %>
@@ -0,0 +1,26 @@
1
+ <%
2
+ if @model.fb_share?
3
+ if @fb_auths_count > 0
4
+ link = '#'
5
+ options = { target: "#fb-#{resource.id}", toggle: 'modal' }
6
+ else
7
+ link = get_oauth_link(resource)
8
+ options = {}
9
+ end
10
+ %>
11
+ <%=
12
+ link_to(
13
+ content_tag(
14
+ :i,
15
+ nil,
16
+ class: 'fa fa-facebook'
17
+ ),
18
+ link,
19
+ title: 'Compartir en Facebook',
20
+ id: 'resource-publish',
21
+ data: options
22
+ )
23
+ %>
24
+ <!-- the modal that it's going to toggle if exist the fb acces token -->
25
+ <%= render 'shared/fb_publish_modal', resource: resource %>
26
+ <% end %>
@@ -0,0 +1,40 @@
1
+ <div id="fb-<%= resource.id %>" 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"><%= I18n.t('action.publish') %> en Facebook</h3>
5
+ </div>
6
+ <div id="modal-container">
7
+ <%=
8
+ adminpanel_form_for(
9
+ resource,
10
+ url: url_for({
11
+ controller: params[:controller],
12
+ action: :fb_publish,
13
+ id: resource
14
+ }),
15
+ method: :post
16
+ ) do |f|
17
+ %>
18
+ <div class="row-fluid">
19
+ <div class="modal-body">
20
+ <%= f.text_area :fb_message, { 'label' => I18n.t('fb.message') } %>
21
+ </div>
22
+ </div>
23
+ <div class="modal-footer">
24
+ <button id="modal-button" class="btn" data-dismiss="modal" aria-hidden="true">
25
+ <%= I18n.t('action.close') %>
26
+ </button>
27
+ <%=
28
+ f.submit(
29
+ I18n.t('action.publish') + " " + @model.display_name,
30
+ data: {
31
+ :disable_with => I18n.t('action.submitting')
32
+ },
33
+ :id =>"new-#{@model.name.demodulize}-button"
34
+ )
35
+ %>
36
+ </div>
37
+ <% end %>
38
+
39
+ </div>
40
+ </div>
@@ -4,10 +4,7 @@
4
4
  <% field_type = properties['type'] %>
5
5
  <% properties = properties.except('type') %>
6
6
 
7
- <% if field_type == 'wysiwyg_field' %>
8
- <%= f.send(field_type, attribute) %>
9
-
10
- <% elsif field_type == 'adminpanel_file_field' %>
7
+ <% if field_type == 'adminpanel_file_field' %>
11
8
 
12
9
  <% if !defined? remote_request %>
13
10
  <!-- if not making resource from other form -->
@@ -27,32 +24,10 @@
27
24
  <% args = properties.except('model') %>
28
25
  <%= f.select(attribute, (@collections["#{properties["model"]}"].collect{|resource| [resource.name, resource.id]}), args) %>
29
26
 
30
-
31
27
  <% if(properties['remote_resource'].nil? || properties['remote_resource']) %>
32
- <!--
33
- Button to create a new of this belongs_to resource
34
- if it's supposed to be created remotely
35
- -->
36
- <% model_name = properties['model'].classify.constantize.model_name.to_s.demodulize.downcase %>
37
- <%=
38
- link_to(
39
- I18n.t('other.add',
40
- :model => properties['model'].classify.constantize.display_name
41
- ),
42
- polymorphic_path(
43
- [:new, :"#{model_name}"],
44
- :model => @model.display_name,
45
- :model_name => @model.name.demodulize.downcase,
46
- :belongs_request => true
47
- ),
48
- :class => 'btn btn-info',
49
- :id => "#{model_name}-modal-link",
50
- :'data-target' => "#new-modal",
51
- :'data-toggle' => 'modal',
52
- :remote => true
53
- )
54
- %>
28
+ <%= render 'shared/create_remote_resource_button', belongs_request: true, remote_resource_name: properties['model'] %>
55
29
  <% end %>
30
+
56
31
  <% end %>
57
32
  <% elsif field_type == 'has_many' %>
58
33
  <% if !defined? remote_request %>
@@ -63,32 +38,13 @@
63
38
  <%= hidden_field_tag("#{class_name_downcase(f.object)}[#{relationship_ids(properties["model"])}][]", nil) %>
64
39
  <div class="controls" id="<%= properties['model'].demodulize.downcase %>-relation">
65
40
  <% @collections["#{properties['model']}"].each do |resource| %>
66
- <%= f.checkbox(resource, class_name_downcase(f.object) ,relationship_ids(properties["model"])) %>
41
+ <%= f.checkbox(resource, class_name_downcase(f.object), relationship_ids(properties['model'])) %>
67
42
  <% end %>
68
43
  </div>
69
44
  </div>
70
45
 
71
- <% if properties['remote_resource'].nil? || propeties['remote_resource'] %>
72
- <!-- Button to create a new of this has_many resource
73
- if it can be created remotely -->
74
- <% model_name = properties['model'].classify.constantize.model_name.to_s.demodulize.downcase %>
75
- <%=
76
- link_to(
77
- I18n.t('other.add',
78
- :model => properties['model'].classify.constantize.display_name
79
- ),
80
- polymorphic_path(
81
- [:new, :"#{model_name}"],
82
- :model => @model.display_name,
83
- :model_name => @model.name.demodulize.downcase
84
- ),
85
- :class => 'btn btn-info',
86
- :id => "#{model_name}-modal-link",
87
- :'data-target' => "#new-modal",
88
- :'data-toggle' => 'modal',
89
- :remote => true
90
- )
91
- %>
46
+ <% if(properties['remote_resource'].nil? || properties['remote_resource']) %>
47
+ <%= render 'shared/create_remote_resource_button', remote_resource_name: properties['model'] %>
92
48
  <% end %>
93
49
  <% end %>
94
50
 
@@ -1,4 +1,4 @@
1
- <div id="new-modal" class="modal hide fade" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
1
+ <div id="remote-form-modal" class="modal hide fade" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
2
2
  <div class="modal-header" id="modal-header">
3
3
  <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
4
4
  <h3 id="modal-title"></h3>
@@ -2,4 +2,4 @@ var model_name = "<%= params[:model_name] %>";
2
2
  var new_model = "<%= @model.name.demodulize.downcase %>";
3
3
  var option = '<option value="<%= resource.id %>" selected="selected"><%= resource.name %></option>';
4
4
  $("#" + model_name + "_" + new_model + "_id").append(option);
5
- $("#new-modal").modal('toggle');
5
+ $("#remote-form-modal").modal('toggle');
@@ -2,4 +2,4 @@ var model_name = "<%= params[:model_name] %>";
2
2
  var new_model = "<%= @model.name.demodulize.downcase %>";
3
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
4
  $("#" + new_model + "-relation").append(row);
5
- $("#new-modal").modal('toggle');
5
+ $("#remote-form-modal").modal('toggle');
@@ -0,0 +1,47 @@
1
+ <% provide(:page_title, I18n.t('fb.pages', name: @name)) %>
2
+ <% breadcrumb_add(
3
+ @model.display_name.capitalize.pluralize(I18n.default_locale),
4
+ {
5
+ :controller => params[:controller],
6
+ :action => "index"
7
+ }
8
+ )
9
+ %>
10
+ <div class="row-fluid">
11
+ <div class = "widget widget-padding span12">
12
+ <div class = "widget-header">
13
+ <%= content_tag(:i, nil, :class => "fa fa-#{@model.icon}") %>
14
+ <h5><%= t("action.share", model: @model.display_name) %></h5>
15
+ </div>
16
+ <div class = "widget-body">
17
+ <div class = "widget-forms clearfix">
18
+ <%= adminpanel_form_for(
19
+ resource,
20
+ url: url_for({
21
+ controller: params[:controller],
22
+ action: :fb_save_token,
23
+ id: resource,
24
+ host: request.host
25
+ }),
26
+ method: :post
27
+ ) do |f| %>
28
+
29
+ <%= f.select(
30
+ :fb_page_access_key,
31
+ options_for_select(@pages.map{ |p| [ p['name'], p['access_token'] ] }),
32
+ { 'label' => I18n.t('fb.page-select') }
33
+ )
34
+ %>
35
+
36
+ </div>
37
+ </div>
38
+ <div class = "widget-footer">
39
+ <%=
40
+ f.submit t('action.add') + " " + @model.display_name,
41
+ data: {:disable_with => t("action.submitting")},
42
+ :id =>"new-#{@model.name.demodulize}-button"
43
+ %>
44
+ </div>
45
+ <% end -%>
46
+ </div>
47
+ </div>