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