adminpanel 2.0.1 → 2.1.0

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 (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>