adminpanel 2.5.3 → 2.5.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +17 -13
- data/adminpanel.gemspec +2 -1
- data/app/controllers/concerns/adminpanel/rest_actions.rb +17 -42
- data/app/controllers/concerns/adminpanel/sortable_actions.rb +2 -10
- data/app/helpers/adminpanel/adminpanel_form_builder.rb +23 -28
- data/app/helpers/adminpanel/shared_pages_helper.rb +14 -10
- data/app/models/adminpanel/analytic.rb +10 -2
- data/app/models/adminpanel/permission.rb +4 -3
- data/app/models/adminpanel/role.rb +5 -3
- data/app/models/adminpanel/user.rb +4 -4
- data/app/models/concerns/adminpanel/base.rb +1 -2
- data/app/models/concerns/adminpanel/friendly.rb +28 -0
- data/app/views/adminpanel/form/_checkbox.html.erb +45 -0
- data/app/views/adminpanel/form/_select.html.erb +35 -0
- data/app/views/adminpanel/shared/_create_remote_resource_button.html.erb +4 -7
- data/app/views/adminpanel/templates/{create_has_many.js.erb → checkbox.js.erb} +1 -1
- data/app/views/adminpanel/templates/{create_belongs_to.js.erb → option_for_select.js.erb} +1 -1
- data/config/locales/es.yml +1 -2
- data/config/routes.rb +1 -1
- data/lib/adminpanel.rb +1 -0
- data/lib/adminpanel/version.rb +1 -1
- data/lib/generators/adminpanel/resource/resource_generator.rb +6 -0
- data/lib/generators/adminpanel/resource/resource_generator_helper.rb +25 -24
- data/lib/tasks/adminpanel/adminpanel.rake +2 -6
- data/test/dummy/app/models/adminpanel/department.rb +9 -7
- data/test/dummy/app/models/adminpanel/item.rb +8 -6
- data/test/dummy/app/models/adminpanel/mug.rb +1 -1
- data/test/dummy/app/models/adminpanel/product.rb +14 -2
- data/test/dummy/app/models/adminpanel/salesman.rb +16 -15
- data/test/dummy/app/models/adminpanel/test_object.rb +4 -3
- data/test/dummy/db/schema.rb +1 -0
- data/test/dummy/test/fixtures/adminpanel/products.yml +3 -1
- data/test/features/shared/concerns/friendly_test.rb +21 -0
- data/test/features/shared/form/checkbox_test.rb +39 -0
- data/test/features/shared/form/enum_field_test.rb +25 -0
- data/test/features/shared/form/has_many_through_remote_test.rb +0 -1
- data/test/features/shared/form/{remote_resource_modal_test.rb → modal_contents_test.rb} +2 -2
- data/test/features/shared/form/resource_field_test.rb +33 -0
- data/test/features/shared/form/select_test.rb +42 -0
- data/test/generators/resource_generator_test.rb +9 -6
- data/test/helpers/shared_pages_helper_test.rb +40 -16
- metadata +41 -36
- checksums.yaml.gz.sig +0 -3
- data.tar.gz.sig +0 -0
- data/app/assets/fonts/.DS_Store +0 -0
- data/app/assets/fonts/.keep +0 -0
- data/app/assets/stylesheets/adminpanel/fullcalendar.print.css +0 -61
- data/app/views/adminpanel/form/_belongs_to.html.erb +0 -21
- data/app/views/adminpanel/form/_has_many.html.erb +0 -19
- data/test/dummy/app/helpers/application_helper.rb +0 -2
- metadata.gz.sig +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d9ebfa9303054c3167f2244f4343c26290c717c4
|
4
|
+
data.tar.gz: c9c795f7c6c8123c88ed3629bba3194ccdaa1c9d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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
|
-
|
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
|
-
|
23
|
+
This create and seeds a user to the database (email: 'admin@admin.com', password: 'password').
|
30
24
|
|
31
|
-
|
25
|
+
And mount the gem wherever you like!
|
32
26
|
|
33
27
|
mount Adminpanel::Engine => '/panel'
|
28
|
+
|
29
|
+
#### Optional
|
34
30
|
|
35
|
-
|
31
|
+
In you application.rb
|
36
32
|
|
37
|
-
|
33
|
+
config.i18n.default_locale = :es # or :en
|
38
34
|
|
39
|
-
|
35
|
+
no other language is currently supported, but pull requests are welcome.
|
40
36
|
|
41
|
-
|
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',
|
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,
|
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
|
-
|
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
|
-
|
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/
|
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/
|
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
|
77
|
-
@
|
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
|
98
|
-
if
|
99
|
-
@
|
84
|
+
def set_resource_instance
|
85
|
+
if @model.respond_to? :friendly
|
86
|
+
@resource_instance ||= @model.friendly.find(params[:id])
|
100
87
|
else
|
101
|
-
@
|
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'
|
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
|
-
|
7
|
-
|
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(
|
27
|
-
base_layout
|
26
|
+
def text_field(method, *args)
|
27
|
+
base_layout method, *args, 'text_field_original'
|
28
28
|
end
|
29
29
|
|
30
|
-
def file_field(
|
31
|
-
image_input = base_layout(
|
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(
|
41
|
-
file_input = base_layout(
|
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(
|
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(
|
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
|
59
|
+
base_layout method, options, 'text_area_original'
|
60
60
|
end
|
61
61
|
|
62
|
-
def text_area(
|
63
|
-
base_layout
|
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
|
82
|
-
|
83
|
-
:
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
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(
|
94
|
-
base_layout
|
90
|
+
def boolean(method, *args)
|
91
|
+
base_layout method, *args, 'boolean_base'
|
95
92
|
end
|
96
93
|
|
97
|
-
def enum_field(
|
94
|
+
def enum_field(method, *args)
|
98
95
|
select(
|
99
|
-
|
100
|
-
self.object.class.send(
|
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
|
53
|
+
def field_value(properties, attribute, object)
|
54
54
|
case properties['type']
|
55
|
-
when '
|
56
|
-
belong_to_object_name(object, attribute.
|
57
|
-
when '
|
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(
|
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
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
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
|
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' => '
|
29
|
+
'type' => 'select',
|
30
30
|
'label' => I18n.t('permission.role'),
|
31
|
-
'
|
32
|
-
|
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
|
-
'
|
27
|
-
'
|
28
|
-
'
|
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' => '
|
70
|
-
'
|
71
|
-
|
72
|
-
|
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
|
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
|