adminpanel 2.6.1 → 3.0.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 (91) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +1 -1
  3. data/adminpanel.gemspec +6 -6
  4. data/app/assets/images/adminpanel/magnifier.png +0 -0
  5. data/app/assets/javascripts/adminpanel/bootstrap-data-confirm.coffee.erb +142 -0
  6. data/app/assets/javascripts/adminpanel/dom-filter.coffee +15 -0
  7. data/app/assets/javascripts/adminpanel/dropzone.js +1728 -0
  8. data/app/assets/javascripts/adminpanel/filter-side-menu.coffee +4 -0
  9. data/app/assets/javascripts/adminpanel/gallery.js.coffee.erb +79 -0
  10. data/app/assets/javascripts/adminpanel/realm.js +0 -3
  11. data/app/assets/stylesheets/adminpanel/_search-input.scss.erb +11 -0
  12. data/app/assets/stylesheets/adminpanel/bootstrap.css.erb +1 -1
  13. data/app/assets/stylesheets/adminpanel/dropzone.css +515 -0
  14. data/app/assets/stylesheets/adminpanel/theme.css.scss.erb +1 -1
  15. data/app/controllers/adminpanel/analytics_controller.rb +7 -51
  16. data/app/controllers/adminpanel/application_controller.rb +1 -0
  17. data/app/controllers/adminpanel/roles_controller.rb +4 -1
  18. data/app/controllers/adminpanel/sections_controller.rb +1 -7
  19. data/app/controllers/concerns/adminpanel/facebook_actions.rb +3 -0
  20. data/app/controllers/concerns/adminpanel/gallery_actions.rb +31 -0
  21. data/app/controllers/concerns/adminpanel/rest_actions.rb +4 -1
  22. data/app/helpers/adminpanel/analytics_helper.rb +8 -18
  23. data/app/helpers/adminpanel/application_helper.rb +10 -2
  24. data/app/helpers/adminpanel/router_helper.rb +6 -2
  25. data/app/helpers/adminpanel/shared_pages_helper.rb +5 -3
  26. data/app/models/adminpanel/analytic.rb +4 -0
  27. data/app/models/adminpanel/image.rb +31 -0
  28. data/app/models/adminpanel/sectionfile.rb +1 -3
  29. data/app/models/concerns/adminpanel/base.rb +51 -7
  30. data/app/models/concerns/adminpanel/sortable_gallery.rb +12 -17
  31. data/app/views/adminpanel/analytics/_header.html.erb +1 -1
  32. data/app/views/adminpanel/form/_adminpanel_file_field.html.erb +27 -23
  33. data/app/views/adminpanel/icons/_delete.html.erb +1 -0
  34. data/app/views/adminpanel/sections/edit.html.erb +1 -12
  35. data/app/views/adminpanel/shared/_form_fields.html.erb +1 -0
  36. data/app/views/adminpanel/templates/destroy.js.erb +3 -0
  37. data/app/views/adminpanel/templates/index.html.erb +4 -4
  38. data/app/views/adminpanel/templates/show.html.erb +57 -52
  39. data/app/views/layouts/adminpanel/_side_menu.html.erb +18 -3
  40. data/config/initializers/adminpanel/assets.rb +4 -0
  41. data/config/locales/en.yml +24 -9
  42. data/config/locales/es.yml +18 -33
  43. data/config/routes.rb +10 -5
  44. data/lib/adminpanel/version.rb +1 -1
  45. data/lib/generators/adminpanel/gallery/gallery_generator.rb +0 -8
  46. data/lib/generators/adminpanel/gallery/templates/gallery_template.rb +7 -18
  47. data/lib/generators/adminpanel/gallery/templates/uploader.rb +1 -1
  48. data/lib/generators/adminpanel/initialize/templates/create_adminpanel_tables.rb +9 -5
  49. data/lib/generators/adminpanel/resource/resource_generator.rb +12 -16
  50. data/lib/generators/adminpanel/resource/resource_generator_helper.rb +23 -16
  51. data/test/dummy/.gitignore +2 -2
  52. data/test/dummy/app/controllers/adminpanel/products_controller.rb +1 -1
  53. data/test/dummy/app/models/adminpanel/galleryfile.rb +1 -13
  54. data/test/dummy/app/models/adminpanel/photo.rb +2 -9
  55. data/test/dummy/app/models/adminpanel/product.rb +1 -0
  56. data/test/dummy/config/initializers/carrierwave.rb +5 -0
  57. data/test/dummy/db/schema.rb +10 -18
  58. data/test/dummy/test/fixtures/adminpanel/galleries.yml +3 -3
  59. data/test/dummy/test/fixtures/adminpanel/images.yml +60 -0
  60. data/test/dummy/test/fixtures/adminpanel/products.yml +2 -2
  61. data/test/dummy/test/fixtures/{dog fries.png → attachments/dog-fries.png} +0 -0
  62. data/test/dummy/test/fixtures/attachments/hipster.jpg +0 -0
  63. data/test/dummy/test/fixtures/attachments/thumb_hipster.jpg +0 -0
  64. data/test/features/shared/form/belongs_to_remote_test.rb +1 -4
  65. data/test/features/shared/form/resource_field_test.rb +1 -1
  66. data/test/features/shared/resource/edit_test.rb +2 -5
  67. data/test/features/shared/resource/new_test.rb +5 -2
  68. data/test/features/shared/ui/dropzone_element_generation_test.rb +27 -0
  69. data/test/features/shared/ui/filtering_test.rb +29 -0
  70. data/test/generators/gallery_generator_test.rb +0 -10
  71. data/test/generators/resource_generator_test.rb +30 -6
  72. data/test/helpers/shared_pages_helper_test.rb +22 -43
  73. data/test/models/adminpanel/image_test.rb +31 -0
  74. data/test/models/adminpanel/sortable_gallery_unit_test.rb +8 -8
  75. data/test/support/view_case.rb +2 -2
  76. metadata +53 -43
  77. data/app/assets/images/adminpanel/dialogs.png +0 -0
  78. data/app/assets/images/adminpanel/icons-big.png +0 -0
  79. data/app/assets/images/adminpanel/icons-small.png +0 -0
  80. data/app/assets/images/adminpanel/select2.png +0 -0
  81. data/app/assets/images/adminpanel/select2x2.png +0 -0
  82. data/app/assets/images/adminpanel/toolbar.png +0 -0
  83. data/app/assets/javascripts/adminpanel/jquery.knob.js +0 -652
  84. data/app/assets/javascripts/adminpanel/jquery.masonry.min.js +0 -10
  85. data/app/assets/javascripts/adminpanel/jquery.slimscroll.min.js +0 -14
  86. data/app/views/adminpanel/analytics/_fb_statistic_widget.html.erb +0 -63
  87. data/app/views/adminpanel/analytics/fb.html.erb +0 -106
  88. data/test/dummy/config/carrierwave.rb +0 -6
  89. data/test/dummy/public/favicon.ico +0 -0
  90. data/test/dummy/test/fixtures/adminpanel/galleryfiles.yml +0 -42
  91. data/test/features/shared/ui/max_images_gallery_test.rb +0 -51
@@ -767,7 +767,7 @@ table.table thead .sorting_desc_disabled { background: url(<%= asset_path 'admin
767
767
  margin:0 10px;
768
768
  }
769
769
  .widget{
770
- /*margin-bottom: 15px; */
770
+ margin-bottom: 15px;
771
771
  -moz-border-radius: 3px 3px 3px 3px;
772
772
  -webkit-border-radius: 3px 3px 3px 3px;
773
773
  border-radius: 3px 3px 3px 3px;
@@ -4,7 +4,8 @@ module Adminpanel
4
4
  include Adminpanel::Analytics::InstagramAnalytics
5
5
 
6
6
  skip_before_action :set_resource_collection
7
- before_action :check_if_fb_account, only:[:fb]
7
+
8
+ before_action :set_fb_token
8
9
 
9
10
  API_VERSION = 'v3'
10
11
  CACHED_API_FILE = "#{Rails.root}/tmp/cache/analytics-#{API_VERSION}.cache"
@@ -81,50 +82,6 @@ module Adminpanel
81
82
  end
82
83
  end
83
84
 
84
- def fb
85
- authorize! :read, Adminpanel::Analytic
86
- if params[:insight].present?
87
- period = params[:insight]
88
- else
89
- period = 'day' #default period
90
- end
91
- page_graph = Koala::Facebook::API.new(@auth.value)
92
- @impressions,
93
- @impressions_unique,
94
-
95
- @new_likes,
96
- @total_likes,
97
-
98
- @hidden,
99
- @hidden_unique,
100
-
101
- @consumptions,
102
- @consumptions_unique,
103
-
104
- @views,
105
- @views_unique,
106
-
107
- @stories = page_graph.batch do |api|
108
- #all information on same request
109
- api.get_connections('me', 'insights', metric: 'page_impressions', period: period) #eye
110
- api.get_connections('me', 'insights', metric: 'page_impressions_unique', period: period) #eye
111
-
112
- api.get_connections('me', 'insights', metric: 'page_fan_adds') #fb-thumb
113
- api.get_connections('me', 'insights', metric: 'page_fans') #fb-thumb
114
-
115
- api.get_connections('me', 'insights', metric: 'page_negative_feedback', period: period)
116
- api.get_connections('me', 'insights', metric: 'page_negative_feedback_unique', period: period)
117
-
118
- api.get_connections('me', 'insights', metric: 'page_consumptions', period: period)
119
- api.get_connections('me', 'insights', metric: 'page_consumptions_unique', period: period)
120
-
121
- api.get_connections('me', 'insights', metric: 'page_views')
122
- api.get_connections('me', 'insights', metric: 'page_views_unique')
123
-
124
- api.get_connections('me', 'insights', metric: 'page_stories', period: period)
125
- end
126
- end
127
-
128
85
  # uses @client to fetch replies and tweets, for some statics
129
86
  def twitter
130
87
  authorize! :read, Adminpanel::Analytic
@@ -153,12 +110,11 @@ module Adminpanel
153
110
  end
154
111
  end
155
112
 
156
- private
157
- def check_if_fb_account
158
- @auth = Adminpanel::Auth.find_by_key('facebook')
159
- if @auth.nil? || @auth.value == ''
160
- redirect_to analytics_path
113
+ private
114
+
115
+ def set_fb_token
116
+ @fb_auth = Adminpanel::Auth.find_by_key('facebook')
161
117
  end
162
- end
118
+
163
119
  end
164
120
  end
@@ -13,6 +13,7 @@ module Adminpanel
13
13
  include Adminpanel::FacebookActions
14
14
  include Adminpanel::TwitterActions
15
15
  include Adminpanel::SitemapActions
16
+ include Adminpanel::GalleryActions
16
17
 
17
18
  private
18
19
  rescue_from CanCan::AccessDenied do |exception|
@@ -3,7 +3,10 @@ module Adminpanel
3
3
 
4
4
  private
5
5
  def role_params
6
- params.require(:role).permit(:name, {permission_ids: []})
6
+ params.require(:role).permit(
7
+ :name,
8
+ { permission_ids: [] }
9
+ )
7
10
 
8
11
  end
9
12
  end
@@ -28,13 +28,7 @@ module Adminpanel
28
28
  :name,
29
29
  :max_files,
30
30
  :has_image,
31
- {
32
- sectionfiles_attributes: [
33
- :id,
34
- :file,
35
- :_destroy
36
- ]
37
- }
31
+ sectionfile_ids: []
38
32
  )
39
33
  end
40
34
  end
@@ -56,6 +56,7 @@ module Adminpanel
56
56
  @fb_auths_count ||= Auth.find_by_key('facebook')
57
57
  end
58
58
 
59
+ # Creates or updates the Facebook Auth token.
59
60
  def update_fb_auth(account_selected_name)
60
61
  auth = Auth.find_by(key: 'facebook', name: account_selected_name)
61
62
  if auth.nil?
@@ -70,6 +71,8 @@ module Adminpanel
70
71
  end
71
72
  end
72
73
 
74
+ # Extracts the name of the model
75
+ # @return Name of the model [String]
73
76
  def model_name
74
77
  @model.name.demodulize.downcase # ex: posts
75
78
  end
@@ -0,0 +1,31 @@
1
+ module Adminpanel
2
+ module GalleryActions
3
+ extend ActiveSupport::Concern
4
+
5
+ def add_to_gallery
6
+ image_class = params[:model].constantize
7
+ image = image_class.new(file: params[:file], model_type: params[:parent_object_class])
8
+ image.model_id = params[:resource_id] if params[:resource_id]
9
+
10
+ if image.save
11
+ response = {
12
+ class: image_class.to_controller_name,
13
+ id: image.id
14
+ }
15
+
16
+ respond_to do |f|
17
+ f.json{ render status: :ok, json: response.to_json }
18
+ end
19
+ end
20
+ end
21
+
22
+ def remove_image
23
+ @image = params[:model].constantize.find(params[:id])
24
+ @image.destroy
25
+
26
+ respond_to do |f|
27
+ f.json{ render status: :ok, json: @image.to_json }
28
+ end
29
+ end
30
+ end
31
+ end
@@ -72,7 +72,10 @@ module Adminpanel
72
72
 
73
73
  def destroy
74
74
  @resource_instance.destroy
75
- redirect_to action: :index
75
+ respond_to do |format|
76
+ format.html { redirect_to action: :index }
77
+ format.js { render('adminpanel/templates/destroy') }
78
+ end
76
79
  end
77
80
 
78
81
  private
@@ -1,15 +1,5 @@
1
1
  module Adminpanel
2
2
  module AnalyticsHelper
3
- def first_fb_value metric
4
- total = 0.0
5
- # metric.first['values'].each do |value|
6
- # if value['value'] != []
7
- # total = total + value['value'].to_f
8
- # end
9
- # end
10
- # return total
11
- metric.first['values'].last['value'].to_f
12
- end
13
3
 
14
4
  def days_to_substract
15
5
  if params[:insight] == 'day'
@@ -23,14 +13,6 @@ module Adminpanel
23
13
  end
24
14
  end
25
15
 
26
- def divide_metrics metric_1, metric_2
27
- if first_fb_value(metric_2) != 0.0
28
- return first_fb_value(metric_1) / first_fb_value(metric_2)
29
- else
30
- return 0
31
- end
32
- end
33
-
34
16
  def insight
35
17
  return 'day' if !params[:insight].present?
36
18
  return 'day' if params[:insight] == 'day'
@@ -46,6 +28,14 @@ module Adminpanel
46
28
  "http://www.twitter.com/#{tweet.user.screen_name}/status/#{tweet.id}"
47
29
  end
48
30
 
31
+ def fb_insights(fb_auth)
32
+ if fb_auth
33
+ "#{Koala::Facebook::API.new(fb_auth.value).get_object('me')['link']}insights"
34
+ else
35
+ '#'
36
+ end
37
+ end
38
+
49
39
  def exist_instagram_account?
50
40
  if @instagram_token.nil?
51
41
  false
@@ -6,13 +6,21 @@ module Adminpanel
6
6
 
7
7
  def adminpanel_form_for(name, *args, &block)
8
8
  options = args.extract_options!
9
- options.reverse_merge! builder: Adminpanel::AdminpanelFormBuilder, html: { class: "form-horizontal" }
9
+ options.reverse_merge! builder: Adminpanel::AdminpanelFormBuilder, html: { class: 'form-horizontal' }
10
+ if name.class.has_gallery?
11
+ options[:html][:"data-parent-object-class"] = name.class.to_s
12
+ options[:html][:"data-parent-object-id"] = name.id
13
+ options[:html][:"data-dropzone"] = name.class.to_s.demodulize.underscore
14
+ options[:html][:"data-dropzone-galleries"] = name.class.galleries.to_json
15
+ options[:html][:"data-dropzone-url"] = url_for(controller: name.class.to_controller_name, action: :add_to_gallery)
16
+ options[:html][:"data-dropzone-delete-url"] = url_for(controller: name.class.to_controller_name, action: :remove_image)
17
+ end
10
18
 
11
19
  form_for(name, *(args << options), &block)
12
20
  end
13
21
 
14
22
  def full_title(page_title)
15
- base_title = t("Panel title")
23
+ base_title = I18n.t("panel-title")
16
24
  if page_title.empty?
17
25
  base_title
18
26
  else
@@ -4,8 +4,8 @@ module Adminpanel
4
4
  resource_class(resource).has_sortable_gallery?
5
5
  end
6
6
 
7
- def sortable_gallery(resource)
8
- resource_class(resource).gallery_relationship
7
+ def sortable_galleries(resource)
8
+ resource_class(resource).sortable_galleries
9
9
  end
10
10
 
11
11
  def resources_parameters(resource)
@@ -20,6 +20,10 @@ module Adminpanel
20
20
  resource_class(resource).twitter_share?
21
21
  end
22
22
 
23
+ def has_gallery?(resource)
24
+ resource_class(resource).has_gallery?
25
+ end
26
+
23
27
  def resource_is_sortable?(resource)
24
28
  resource_class(resource).is_sortable?
25
29
  end
@@ -14,7 +14,7 @@ module Adminpanel
14
14
  end
15
15
 
16
16
  def pluralize_model(class_name)
17
- "#{demodulize_class(class_name).pluralize}"
17
+ demodulize_class(class_name).pluralize
18
18
  end
19
19
 
20
20
  def relationship_ids(class_string)
@@ -50,8 +50,8 @@ module Adminpanel
50
50
  ).url_for_oauth_code
51
51
  end
52
52
 
53
- def field_value(properties, attribute, object)
54
- case properties['type']
53
+ def field_value(attr_type, attribute, object)
54
+ case attr_type
55
55
  when 'select'
56
56
  belong_to_object_name(object, attribute.gsub('_id', ''))
57
57
  when 'checkbox'
@@ -65,6 +65,8 @@ module Adminpanel
65
65
  li_tags.html_safe
66
66
  end
67
67
  when 'file_field'
68
+ object[attribute]
69
+ when 'image_field'
68
70
  content_tag :ul do
69
71
  image_tag(object.send("#{attribute}_url", :thumb))
70
72
  end
@@ -18,5 +18,9 @@ module Adminpanel
18
18
  "dashboard"
19
19
  end
20
20
 
21
+ def self.has_route?(path)
22
+ true
23
+ end
24
+
21
25
  end
22
26
  end
@@ -0,0 +1,31 @@
1
+ module Adminpanel
2
+ class Image < ActiveRecord::Base
3
+ include Adminpanel::Base
4
+
5
+ belongs_to :model, polymorphic: true
6
+
7
+ before_save :store_file_size_and_content_type
8
+ # after_save :delete_old_unused_images
9
+ before_destroy :remove_attachment
10
+
11
+ private
12
+ def remove_attachment
13
+ self.remove_file!
14
+ end
15
+
16
+ def store_file_size_and_content_type
17
+ if file.present? && file_changed?
18
+ self.content_type = file.file.content_type
19
+ self.file_size = file.file.size
20
+ end
21
+ end
22
+
23
+ # def delete_old_unused_images
24
+ # self.class.where('created_at < ?', Time.now - 30.minutes)
25
+ # .delete_all(
26
+ # model_id: nil,
27
+ # type: self.type
28
+ # )
29
+ # end
30
+ end
31
+ end
@@ -1,9 +1,7 @@
1
1
  module Adminpanel
2
- class Sectionfile < ActiveRecord::Base
2
+ class Sectionfile < Image
3
3
  include Adminpanel::Base
4
4
 
5
- validates_presence_of :file
6
-
7
5
  mount_uploader :file, Adminpanel::SectionUploader
8
6
  end
9
7
  end
@@ -3,11 +3,15 @@ module Adminpanel
3
3
  extend ActiveSupport::Concern
4
4
 
5
5
  module ClassMethods
6
+ FILE_FIELD_NAME = 'adminpanel_file_field'
7
+
6
8
 
7
9
  # Adminpanel API
8
10
  def mount_images(relation)
9
- has_many relation, dependent: :destroy
11
+ has_many relation, dependent: :destroy, as: :model
10
12
  accepts_nested_attributes_for relation, allow_destroy: true
13
+ after_save :destroy_unattached_images
14
+ after_save :correlative_order_gallery, if: Proc.new { |model| model.class.has_sortable_gallery? }
11
15
  end
12
16
 
13
17
  # implementing cache by default.
@@ -61,7 +65,7 @@ module Adminpanel
61
65
  properties['show'] == 'true' ||
62
66
  (
63
67
  properties['show'] == type &&
64
- properties['type'] != 'adminpanel_file_field' #file fields get only displayed in form
68
+ properties['type'] != FILE_FIELD_NAME #file fields get only displayed in form
65
69
  )
66
70
  )
67
71
  display_attributes << attribute
@@ -76,7 +80,7 @@ module Adminpanel
76
80
  def has_gallery?
77
81
  form_attributes.each do |fields|
78
82
  fields.each do |attribute, properties|
79
- if properties['type'] == 'adminpanel_file_field'
83
+ if properties['type'] == FILE_FIELD_NAME
80
84
  return true
81
85
  end
82
86
  end
@@ -84,12 +88,39 @@ module Adminpanel
84
88
  return false
85
89
  end
86
90
 
91
+ #Returns an array of all the adminpanel_field_field fields found in form_attributes
92
+ def galleries
93
+ galleries = {}
94
+ form_attributes.each do |fields|
95
+ fields.each do |attribute, properties|
96
+ if properties['type'] == FILE_FIELD_NAME
97
+ galleries["#{attribute.singularize}"] = "adminpanel/#{attribute}".classify.constantize.to_s
98
+ end
99
+ end
100
+ end
101
+
102
+ return galleries
103
+ end
104
+
105
+ def sortable_galleries
106
+ galleries = {}
107
+ form_attributes.each do |fields|
108
+ fields.each do |attribute, properties|
109
+ if properties['type'] == FILE_FIELD_NAME && "adminpanel/#{attribute}".classify.constantize.is_sortable?
110
+ galleries["#{attribute.singularize}"] = "adminpanel/#{attribute}".classify.constantize.to_s
111
+ end
112
+ end
113
+ end
114
+
115
+ galleries
116
+ end
117
+
87
118
  # returns the attribute that should be namespaced to be the class
88
119
  # ex: returns 'productfiles', so class is Adminpanel::Productfile
89
120
  def gallery_relationship
90
121
  form_attributes.each do |fields|
91
122
  fields.each do |attribute, properties|
92
- if properties['type'] == 'adminpanel_file_field'
123
+ if properties['type'] == FILE_FIELD_NAME
93
124
  return attribute
94
125
  end
95
126
  end
@@ -152,9 +183,11 @@ module Adminpanel
152
183
  end
153
184
 
154
185
  def has_sortable_gallery?
155
- if has_gallery?
156
- gallery_class.is_sortable?
157
- end
186
+ !sortable_galleries.empty?
187
+ end
188
+
189
+ def to_controller_name
190
+ to_s.demodulize.underscore.pluralize
158
191
  end
159
192
 
160
193
  private
@@ -176,6 +209,17 @@ module Adminpanel
176
209
  false
177
210
  end
178
211
  end
212
+
213
+ end
214
+
215
+ def destroy_unattached_images
216
+ self.class.galleries.each{|gallery| gallery.last.constantize.delete_all(model_id: nil) }
217
+ end
218
+
219
+ def correlative_order_gallery
220
+ self.class.galleries.each do |gallery|
221
+ self.send(gallery.first.pluralize).ordered.each_with_index{ |image, index| image.update(position: index + 1) }
222
+ end
179
223
  end
180
224
  end
181
225
  end