adminpanel 2.5.3 → 2.5.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (52) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +17 -13
  3. data/adminpanel.gemspec +2 -1
  4. data/app/controllers/concerns/adminpanel/rest_actions.rb +17 -42
  5. data/app/controllers/concerns/adminpanel/sortable_actions.rb +2 -10
  6. data/app/helpers/adminpanel/adminpanel_form_builder.rb +23 -28
  7. data/app/helpers/adminpanel/shared_pages_helper.rb +14 -10
  8. data/app/models/adminpanel/analytic.rb +10 -2
  9. data/app/models/adminpanel/permission.rb +4 -3
  10. data/app/models/adminpanel/role.rb +5 -3
  11. data/app/models/adminpanel/user.rb +4 -4
  12. data/app/models/concerns/adminpanel/base.rb +1 -2
  13. data/app/models/concerns/adminpanel/friendly.rb +28 -0
  14. data/app/views/adminpanel/form/_checkbox.html.erb +45 -0
  15. data/app/views/adminpanel/form/_select.html.erb +35 -0
  16. data/app/views/adminpanel/shared/_create_remote_resource_button.html.erb +4 -7
  17. data/app/views/adminpanel/templates/{create_has_many.js.erb → checkbox.js.erb} +1 -1
  18. data/app/views/adminpanel/templates/{create_belongs_to.js.erb → option_for_select.js.erb} +1 -1
  19. data/config/locales/es.yml +1 -2
  20. data/config/routes.rb +1 -1
  21. data/lib/adminpanel.rb +1 -0
  22. data/lib/adminpanel/version.rb +1 -1
  23. data/lib/generators/adminpanel/resource/resource_generator.rb +6 -0
  24. data/lib/generators/adminpanel/resource/resource_generator_helper.rb +25 -24
  25. data/lib/tasks/adminpanel/adminpanel.rake +2 -6
  26. data/test/dummy/app/models/adminpanel/department.rb +9 -7
  27. data/test/dummy/app/models/adminpanel/item.rb +8 -6
  28. data/test/dummy/app/models/adminpanel/mug.rb +1 -1
  29. data/test/dummy/app/models/adminpanel/product.rb +14 -2
  30. data/test/dummy/app/models/adminpanel/salesman.rb +16 -15
  31. data/test/dummy/app/models/adminpanel/test_object.rb +4 -3
  32. data/test/dummy/db/schema.rb +1 -0
  33. data/test/dummy/test/fixtures/adminpanel/products.yml +3 -1
  34. data/test/features/shared/concerns/friendly_test.rb +21 -0
  35. data/test/features/shared/form/checkbox_test.rb +39 -0
  36. data/test/features/shared/form/enum_field_test.rb +25 -0
  37. data/test/features/shared/form/has_many_through_remote_test.rb +0 -1
  38. data/test/features/shared/form/{remote_resource_modal_test.rb → modal_contents_test.rb} +2 -2
  39. data/test/features/shared/form/resource_field_test.rb +33 -0
  40. data/test/features/shared/form/select_test.rb +42 -0
  41. data/test/generators/resource_generator_test.rb +9 -6
  42. data/test/helpers/shared_pages_helper_test.rb +40 -16
  43. metadata +41 -36
  44. checksums.yaml.gz.sig +0 -3
  45. data.tar.gz.sig +0 -0
  46. data/app/assets/fonts/.DS_Store +0 -0
  47. data/app/assets/fonts/.keep +0 -0
  48. data/app/assets/stylesheets/adminpanel/fullcalendar.print.css +0 -61
  49. data/app/views/adminpanel/form/_belongs_to.html.erb +0 -21
  50. data/app/views/adminpanel/form/_has_many.html.erb +0 -19
  51. data/test/dummy/app/helpers/application_helper.rb +0 -2
  52. metadata.gz.sig +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: eadbce977126b17e453644c2508dd1e3377eb523
4
- data.tar.gz: 27354bf7c01b4a93fde0f398aa4e167053df40a9
3
+ metadata.gz: d9ebfa9303054c3167f2244f4343c26290c717c4
4
+ data.tar.gz: c9c795f7c6c8123c88ed3629bba3194ccdaa1c9d
5
5
  SHA512:
6
- metadata.gz: de75f1481eec50952eb50709d74141824c03af98f3ecf7b2b9f56da5f5292b3dbb5883536fdc26c792f873aeda6e31ad403b374ca185a394261c80b294062422
7
- data.tar.gz: 70889f9232f36f64f01e07f13dbaa79f88f96114ff24206ef2df9fe755efbb507c1b4c270c661b7a1feafc8f7562de9c14db6f06ffc2aa4dbf4d9c577f98bb25
6
+ metadata.gz: 2acee553facf3aeb288c3ac7cb47b7642f31e0cb64de12ac7f2ee341b65eff32cecfdeafd36e536d987c1c8268a602408aebd126dfe83fa36f7ac06c4df7e7c8
7
+ data.tar.gz: 7d2e33fd92205c7df96067e0fa663c8f5df8eb2f44106b11cc58078a86726137f142d075927b605cece97616411c6bada682ae87c2d896962e85ed738689e2ea
data/README.md CHANGED
@@ -16,29 +16,33 @@ And then execute:
16
16
 
17
17
  $ bundle
18
18
 
19
- In you application.rb
20
-
21
- config.i18n.default_locale = :es # or :en
22
-
23
- no other language is currently supported, but pull requests are welcome.
24
-
25
- Then run:
19
+ Run:
26
20
 
27
21
  rails g adminpanel:initialize
28
22
  rake db:migrate
29
- to create the database that the adminpanel it's expecting, this will also seed the database with the default user if you're in development environment (email: 'admin@admin.com', password: 'password').
23
+ This create and seeds a user to the database (email: 'admin@admin.com', password: 'password').
30
24
 
31
- Then, mount the gem wherever you like!
25
+ And mount the gem wherever you like!
32
26
 
33
27
  mount Adminpanel::Engine => '/panel'
28
+
29
+ #### Optional
34
30
 
35
- ## Usage
31
+ In you application.rb
36
32
 
37
- Make sure you [read the wiki](https://github.com/codn/adminpanel/wiki), there is the descriptions of every relevant part of the gem.
33
+ config.i18n.default_locale = :es # or :en
38
34
 
39
- To create a new resource check the [Resource Generator.](https://github.com/codn/adminpanel/wiki/Generator-adminpanel:resource)
35
+ no other language is currently supported, but pull requests are welcome.
40
36
 
41
- You can seed the sections with help of the [Section task.](https://github.com/codn/adminpanel/wiki/Rake-task-adminpanel:section)
37
+ ## Usage
38
+
39
+ To create a new resource:
40
+ ```
41
+ rails g adminpanel:resource product name price:float description:wysiwyg
42
+ ```
43
+ check the [Resource Generator wiki.](https://github.com/codn/adminpanel/wiki/Generator-adminpanel:resource) for more information.
44
+
45
+ Make sure you [read the wiki](https://github.com/codn/adminpanel/wiki), there is the descriptions of every relevant part of the gem.
42
46
 
43
47
  ## Dependencies
44
48
 
data/adminpanel.gemspec CHANGED
@@ -27,7 +27,8 @@ Gem::Specification.new do |spec|
27
27
  spec.add_runtime_dependency 'mini_magick', '4.1.0'
28
28
  spec.add_runtime_dependency 'bcrypt', '~> 3.1', '>= 3.1.7'
29
29
  spec.add_runtime_dependency 'carrierwave', '~> 0.10', '>= 0.10.0'
30
- spec.add_runtime_dependency 'cancancan', '~> 1.10.1', '>= 1.10.1'
30
+ spec.add_runtime_dependency 'cancancan', '~> 1.10.1','>= 1.10.1'
31
+ spec.add_runtime_dependency 'friendly_id', '~> 5.1.0', '>= 5.1.0'
31
32
 
32
33
  # Implemented APIs
33
34
  spec.add_runtime_dependency 'google-api-client', '0.8.2' # Google analytics
@@ -7,21 +7,25 @@ module Adminpanel
7
7
  :edit,
8
8
  :update,
9
9
  :destroy,
10
+ :move_to_position,
10
11
  :fb_choose_page,
11
12
  :fb_save_token,
12
13
  :fb_publish,
13
14
  :twitter_publish
14
15
  ]
15
- before_action :set_resource_collection, only: [:index, :destroy]
16
- before_action :set_relationship_collections, only: [:new, :create, :edit, :update]
16
+ before_action :set_resource_collection, only: [:index, :destroy]
17
17
  end
18
18
 
19
19
  def index
20
- render 'adminpanel/templates/index' if stale?(etag: @collection, public: true, template: false)
20
+ if stale?(etag: @collection, public: true, template: false)
21
+ render 'adminpanel/templates/index'
22
+ end
21
23
  end
22
24
 
23
25
  def show
24
- render 'adminpanel/templates/show' if stale?(etag: @resource_instance, public: true, template: false)
26
+ if stale?(etag: @resource_instance, public: true, template: false)
27
+ render 'adminpanel/templates/show'
28
+ end
25
29
  end
26
30
 
27
31
  def new
@@ -41,10 +45,10 @@ module Adminpanel
41
45
  # if format js, request is from another controller's form
42
46
  if params[:belongs_request]
43
47
  # we are in other controller as a belongs_to, add option to select
44
- render 'adminpanel/templates/create_belongs_to', locals: { resource: @resource_instance }
48
+ render 'adminpanel/templates/option_for_select'
45
49
  else
46
50
  # we are in other controller as a has_many, add checkbox
47
- render 'adminpanel/templates/create_has_many', locals: { resource: @resource_instance }
51
+ render 'adminpanel/templates/checkbox'
48
52
  end
49
53
  end
50
54
  else
@@ -73,32 +77,15 @@ module Adminpanel
73
77
 
74
78
  private
75
79
 
76
- def set_relationship_collections
77
- @collections = {}
78
- set_belongs_to_collections
79
- set_has_many_collections
80
- end
81
-
82
- # set the collection of objects for each attribute that it's a select (belongs_to)
83
- # to populate the <select></select>s
84
- def set_belongs_to_collections
85
- @model.relationships_of('belongs_to').each do |class_variable|
86
- set_relationship(class_variable)
87
- end
88
- end
89
-
90
- # set the collection of objects for each attribute that it's a checkbox (has_many)
91
- def set_has_many_collections
92
- @model.relationships_of('has_many').each do |class_variable|
93
- set_relationship(class_variable)
94
- end
80
+ def set_resource_collection
81
+ @collection = @model.all
95
82
  end
96
83
 
97
- def set_relationship(class_variable)
98
- if class_variable.respond_to?('of_model')
99
- @collections.merge!({"#{class_variable}" => class_variable.of_model(@model.display_name)})
84
+ def set_resource_instance
85
+ if @model.respond_to? :friendly
86
+ @resource_instance ||= @model.friendly.find(params[:id])
100
87
  else
101
- @collections.merge!({"#{class_variable}" => class_variable.all})
88
+ @resource_instance ||= @model.find(params[:id])
102
89
  end
103
90
  end
104
91
 
@@ -113,24 +100,12 @@ module Adminpanel
113
100
  "#{resource}_params"
114
101
  end
115
102
 
116
- def set_resource_instance
117
- if @model.respond_to? :friendly
118
- @resource_instance = @model.friendly.find(params[:id])
119
- else
120
- @resource_instance = @model.find(params[:id])
121
- end
122
- end
123
-
124
- def set_resource_collection
125
- @collection = @model.all
126
- end
127
-
128
103
  def render_new(format)
129
104
  format.html do
130
105
  render 'adminpanel/templates/new'
131
106
  end
132
107
  format.js do
133
- render 'adminpanel/templates/new', locals: { resource: @resource_instance }
108
+ render 'adminpanel/templates/new'
134
109
  end
135
110
  end
136
111
  end
@@ -3,16 +3,8 @@ module Adminpanel
3
3
  extend ActiveSupport::Concern
4
4
 
5
5
  def move_to_position
6
- if @model.respond_to? :friendly
7
- resource = @model.friendly.find(params[:id])
8
- else
9
- resource = @model.find(params[:id])
10
- end
11
-
12
- resource = @model.find(params[:id])
13
-
14
- resource.move_to_position(params[:position].to_i)
15
- render json: {status: :ok}
6
+ @resource_instance.move_to_position(params[:position].to_i)
7
+ render json: { status: :ok }
16
8
  end
17
9
  end
18
10
  end
@@ -23,12 +23,12 @@ module Adminpanel
23
23
  end
24
24
  end
25
25
 
26
- def text_field(name, *args)
27
- base_layout name, *args, 'text_field_original'
26
+ def text_field(method, *args)
27
+ base_layout method, *args, 'text_field_original'
28
28
  end
29
29
 
30
- def file_field(name, *args)
31
- image_input = base_layout(name, *args, 'file_field_original')
30
+ def file_field(method, *args)
31
+ image_input = base_layout(method, *args, 'file_field_original')
32
32
 
33
33
  if !object.nil? && !object.new_record? #if not new record
34
34
  "#{thumbnail_layout(name)}#{image_input}".html_safe
@@ -37,11 +37,11 @@ module Adminpanel
37
37
  end
38
38
  end
39
39
 
40
- def non_image_file_field(name, *args)
41
- file_input = base_layout(name, *args, 'file_field_original')
40
+ def non_image_file_field(method, *args)
41
+ file_input = base_layout(method, *args, 'file_field_original')
42
42
 
43
43
  if !object.nil? && !object.new_record? #if not new record
44
- "#{title_layout(name)}#{file_input}".html_safe
44
+ "#{title_layout(method)}#{file_input}".html_safe
45
45
  else
46
46
  file_input
47
47
  end
@@ -51,16 +51,16 @@ module Adminpanel
51
51
  base_layout name, *args, 'gallery_base'
52
52
  end
53
53
 
54
- def wysiwyg_field(name, *args)
54
+ def wysiwyg_field(method, *args)
55
55
 
56
56
  options = args.extract_options!
57
57
  options.reverse_merge! class: 'wysihtml5 span7'
58
58
 
59
- base_layout name, options, 'text_area_original'
59
+ base_layout method, options, 'text_area_original'
60
60
  end
61
61
 
62
- def text_area(name, *args)
63
- base_layout name, *args, 'text_area_original'
62
+ def text_area(method, *args)
63
+ base_layout method, *args, 'text_area_original'
64
64
  end
65
65
 
66
66
  # def radio_button_group(name, buttons, options)
@@ -78,26 +78,23 @@ module Adminpanel
78
78
  # end
79
79
  # end
80
80
 
81
- def checkbox(checkbox_object, form_object_name, relationship)
82
- @template.content_tag(
83
- :label,
84
- @template.check_box_tag(
85
- "#{form_object_name}[#{relationship}][]",
86
- checkbox_object.id,
87
- self.object.send(relationship).include?(checkbox_object.id)
88
- ) + checkbox_object.name,
89
- class: "checkbox"
90
- )
81
+ def collection_check_boxes(method, collection, value_method, text_method, options = {}, html_options = {})
82
+ super method, collection, value_method, text_method, options, html_options do |b|
83
+ b.label class: 'checkbox' do
84
+ b.check_box +
85
+ b.label
86
+ end
87
+ end
91
88
  end
92
89
 
93
- def boolean(name, *args)
94
- base_layout name, *args, 'boolean_base'
90
+ def boolean(method, *args)
91
+ base_layout method, *args, 'boolean_base'
95
92
  end
96
93
 
97
- def enum_field(name, *args)
94
+ def enum_field(method, *args)
98
95
  select(
99
- name,
100
- self.object.class.send(name.pluralize).map{|option, value|
96
+ method,
97
+ self.object.class.send(method.pluralize).map{|option, value|
101
98
  [I18n.t("#{self.object.class.name.demodulize.downcase}.#{option}"), option]
102
99
  },
103
100
  *args
@@ -106,8 +103,6 @@ module Adminpanel
106
103
 
107
104
  def resource_select(name, *args)
108
105
  select name, Adminpanel.displayable_resources.map{|resource| [symbol_class(resource).display_name, resource.to_s]}, *args
109
- # select name, Adminpanel.displayable_resources.map{|resource| ['resource', 'resource']}, *args
110
-
111
106
  end
112
107
 
113
108
  def select(name, select_options, *args)
@@ -50,14 +50,14 @@ module Adminpanel
50
50
  ).url_for_oauth_code
51
51
  end
52
52
 
53
- def field_value properties, attribute, object
53
+ def field_value(properties, attribute, object)
54
54
  case properties['type']
55
- when 'belongs_to'
56
- belong_to_object_name(object, attribute.split('_id').first)
57
- when 'has_many'
55
+ when 'select'
56
+ belong_to_object_name(object, attribute.gsub('_id', ''))
57
+ when 'checkbox'
58
58
  li_tags = ""
59
59
  content_tag :ul do
60
- object.send("#{pluralize_model(properties['model'])}").each do |member|
60
+ object.send(attribute.gsub('_ids', '').pluralize).each do |member|
61
61
  li_tags << content_tag(:li, class: 'priority-low') do
62
62
  member.name
63
63
  end
@@ -76,6 +76,8 @@ module Adminpanel
76
76
  end
77
77
  when 'enum_field'
78
78
  I18n.t("#{object.class.name.demodulize.downcase}.#{object.send(attribute)}")
79
+ when 'adminpanel_file_field'
80
+ object.send(attribute).count
79
81
  else
80
82
  object.send(attribute)
81
83
  end
@@ -83,11 +85,13 @@ module Adminpanel
83
85
 
84
86
  def is_customized_field?(field_name)
85
87
  field_name = field_name.to_sym
86
- return (field_name == :adminpanel_file_field ||
87
- field_name == :belongs_to ||
88
- field_name == :file_field ||
89
- field_name == :non_image_file_field ||
90
- field_name == :has_many)
88
+ [
89
+ :adminpanel_file_field,
90
+ :file_field,
91
+ :non_image_file_field,
92
+ :checkbox,
93
+ :select
94
+ ].include? field_name
91
95
  end
92
96
 
93
97
  def table_type(model)
@@ -1,11 +1,19 @@
1
1
  module Adminpanel
2
- class Analytic # PORO
3
- include Adminpanel::Base
2
+ class Analytic
3
+ # include Adminpanel::Base
4
+
5
+ def name
6
+ 'analytic'
7
+ end
4
8
 
5
9
  def self.display_name
6
10
  I18n.t("model.Analytic")
7
11
  end
8
12
 
13
+ def self.collection_name
14
+ display_name
15
+ end
16
+
9
17
  def self.icon
10
18
  "dashboard"
11
19
  end
@@ -26,10 +26,11 @@ module Adminpanel
26
26
  [
27
27
  {
28
28
  'role_id' => {
29
- 'type' => 'belongs_to',
29
+ 'type' => 'select',
30
30
  'label' => I18n.t('permission.role'),
31
- 'model' => 'Adminpanel::Role',
32
- # 'remote_resource' => false
31
+ 'options' => Proc.new {|object|
32
+ Adminpanel::Role.all.map {|o| [o.id, o.name]}
33
+ }
33
34
  }
34
35
  },
35
36
  {
@@ -23,9 +23,11 @@ module Adminpanel
23
23
  },
24
24
  {
25
25
  'permission_ids' => {
26
- 'type' => 'has_many',
27
- 'model' => "Adminpanel::Permission",
28
- 'label' => 'Permisos'
26
+ 'label' => 'Permisos',
27
+ 'type' => 'checkbox',
28
+ 'options' => Proc.new { |object|
29
+ Adminpanel::Permission.all
30
+ },
29
31
  }
30
32
  }
31
33
  ]
@@ -66,10 +66,10 @@ module Adminpanel
66
66
  },
67
67
  {
68
68
  'role_id' => {
69
- 'type' => 'belongs_to',
70
- 'model' => 'Adminpanel::Role',
71
- # 'remote_resource' => false,
72
- 'placeholder' => I18n.t('model.attributes.role_id'),
69
+ 'type' => 'select',
70
+ 'options' => Proc.new { |user|
71
+ Role.all.map { |r| [r.id, r.name] }
72
+ },
73
73
  'label' => I18n.t('model.attributes.role_id')
74
74
  }
75
75
  },
@@ -2,10 +2,9 @@ module Adminpanel
2
2
  module Base
3
3
  extend ActiveSupport::Concern
4
4
 
5
- # static(class) methods
6
5
  module ClassMethods
7
6
 
8
- # API methods
7
+ # Adminpanel API
9
8
  def mount_images(relation)
10
9
  has_many relation, dependent: :destroy
11
10
  accepts_nested_attributes_for relation, allow_destroy: true
@@ -0,0 +1,28 @@
1
+ module Adminpanel
2
+ module Friendly
3
+ extend ActiveSupport::Concern
4
+
5
+ included do
6
+ extend FriendlyId
7
+
8
+ friendly_id :slug_candidates, use: :slugged
9
+
10
+ before_validation :make_slug_nil, if: Proc.new { |object|
11
+ object.name_changed?
12
+ }, prepend: true
13
+ end
14
+
15
+ private
16
+
17
+ def slug_candidates
18
+ [
19
+ :name,
20
+ :id
21
+ ]
22
+ end
23
+
24
+ def make_slug_nil
25
+ self.slug = nil
26
+ end
27
+ end
28
+ end