adminpanel 2.5.3 → 2.5.4

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