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
@@ -0,0 +1,45 @@
|
|
1
|
+
<%
|
2
|
+
block = properties['options']
|
3
|
+
args = properties.except('options')
|
4
|
+
collection = block.call(@resource_instance)
|
5
|
+
if collection.class.to_s.demodulize == 'ActiveRecord_Relation'
|
6
|
+
id_method = :id
|
7
|
+
label_method = :name
|
8
|
+
else
|
9
|
+
# collection is an array of arrays:
|
10
|
+
# [
|
11
|
+
# [123, value],
|
12
|
+
# [456, value]
|
13
|
+
# ...
|
14
|
+
# ]
|
15
|
+
id_method = :first
|
16
|
+
label_method = :last
|
17
|
+
end
|
18
|
+
%>
|
19
|
+
<div class="control-group">
|
20
|
+
<div class="control-label">
|
21
|
+
<%= properties['label'] %>
|
22
|
+
</div>
|
23
|
+
<%= hidden_field_tag("#{class_name_downcase(f.object)}[#{relationship_ids(properties["model"])}][]", nil) %>
|
24
|
+
<div class="controls" id="<%= attribute.gsub('_ids', '') %>-relation">
|
25
|
+
<%= f.collection_check_boxes(
|
26
|
+
attribute,
|
27
|
+
collection,
|
28
|
+
id_method,
|
29
|
+
label_method
|
30
|
+
) %>
|
31
|
+
</div>
|
32
|
+
</div>
|
33
|
+
|
34
|
+
<% if !is_modal &&
|
35
|
+
(
|
36
|
+
properties['remote_resource'].nil? ||
|
37
|
+
properties['remote_resource']
|
38
|
+
) %>
|
39
|
+
<!-- if not making resource from other form so we don't have to manage
|
40
|
+
infinite nested forms and relations -->
|
41
|
+
<%= render(
|
42
|
+
'adminpanel/shared/create_remote_resource_button',
|
43
|
+
remote_model: attribute.gsub('_ids', '')
|
44
|
+
) %>
|
45
|
+
<% end %>
|
@@ -0,0 +1,35 @@
|
|
1
|
+
<%
|
2
|
+
block = properties['options']
|
3
|
+
args = properties.except('options')
|
4
|
+
collection = block.call(f.object)
|
5
|
+
if collection.class.to_s.demodulize == 'ActiveRecord_Relation'
|
6
|
+
id_method = :id
|
7
|
+
label_method = :name
|
8
|
+
else
|
9
|
+
id_method = :first
|
10
|
+
label_method = :last
|
11
|
+
end
|
12
|
+
collection = options_from_collection_for_select(
|
13
|
+
collection,
|
14
|
+
id_method,
|
15
|
+
label_method,
|
16
|
+
@resource_instance.send(attribute)
|
17
|
+
)
|
18
|
+
%>
|
19
|
+
<%= f.select attribute, collection, { include_blank: true }, args %>
|
20
|
+
|
21
|
+
<% if !is_modal &&
|
22
|
+
(
|
23
|
+
properties['remote_resource'].nil? ||
|
24
|
+
properties['remote_resource']
|
25
|
+
) %>
|
26
|
+
<!-- if rendering the form inside a modal, so we don't have to
|
27
|
+
manage infinited nested forms and if it's supposed to be
|
28
|
+
created in relation model -->
|
29
|
+
|
30
|
+
<%= render(
|
31
|
+
'adminpanel/shared/create_remote_resource_button',
|
32
|
+
belongs_request: true,
|
33
|
+
remote_model: attribute.gsub('_id', '')
|
34
|
+
) %>
|
35
|
+
<% end %>
|
@@ -1,19 +1,16 @@
|
|
1
|
-
<!-- Button to create a new of remote resource if it's supposed to be
|
2
|
-
created in relation model -->
|
3
|
-
<% demodulized_remote_model_name = remote_resource_name.classify.constantize.model_name.to_s.demodulize.underscore %>
|
4
1
|
<%=
|
5
2
|
link_to(
|
6
3
|
I18n.t('other.add',
|
7
|
-
:
|
4
|
+
model: "adminpanel/#{remote_model}".classify.constantize.display_name
|
8
5
|
),
|
9
6
|
polymorphic_path(
|
10
|
-
[:new, :"#{
|
7
|
+
[:new, :"#{remote_model}"],
|
11
8
|
model: @model.display_name,
|
12
9
|
model_name: @model.name.demodulize.downcase,
|
13
|
-
belongs_request: defined?
|
10
|
+
belongs_request: defined?(belongs_request)
|
14
11
|
),
|
15
12
|
class: 'btn btn-info',
|
16
|
-
id: "#{
|
13
|
+
id: "#{remote_model}-modal-link",
|
17
14
|
:'data-target' => "#remote-form-modal",
|
18
15
|
:'data-toggle' => 'modal',
|
19
16
|
remote: true
|
@@ -1,5 +1,5 @@
|
|
1
1
|
var model_name = "<%= params[:model_name] %>";
|
2
2
|
var new_model = "<%= @model.name.demodulize.downcase %>";
|
3
|
-
row = '<label class="checkbox"><input checked="checked" id="' + model_name + '_' + new_model + '_ids_" name="' + model_name + '[' + new_model + '_ids][]" type="checkbox" value="<%=
|
3
|
+
row = '<label class="checkbox"><input checked="checked" id="' + model_name + '_' + new_model + '_ids_" name="' + model_name + '[' + new_model + '_ids][]" type="checkbox" value="<%= @resource_instance.id %>"><%= @resource_instance.name %></label>';
|
4
4
|
$("#" + new_model + "-relation").append(row);
|
5
5
|
$("#remote-form-modal").modal('toggle');
|
@@ -1,5 +1,5 @@
|
|
1
1
|
var model_name = "<%= params[:model_name] %>";
|
2
2
|
var new_model = "<%= @model.name.demodulize.downcase %>";
|
3
|
-
var option = '<option value="<%=
|
3
|
+
var option = '<option value="<%= @resource_instance.id %>" selected="selected"><%= @resource_instance.name %></option>';
|
4
4
|
$("#" + model_name + "_" + new_model + "_id").append(option);
|
5
5
|
$("#remote-form-modal").modal('toggle');
|
data/config/locales/es.yml
CHANGED
data/config/routes.rb
CHANGED
@@ -5,7 +5,7 @@ Adminpanel::Engine.routes.draw do
|
|
5
5
|
Adminpanel.displayable_resources.each do |resource|
|
6
6
|
case resource
|
7
7
|
when :analytics
|
8
|
-
resources :analytics,
|
8
|
+
resources :analytics, only: [:index] do
|
9
9
|
collection do
|
10
10
|
get :google, to: 'analytics#google', path: 'google'
|
11
11
|
|
data/lib/adminpanel.rb
CHANGED
data/lib/adminpanel/version.rb
CHANGED
@@ -23,6 +23,12 @@ module Adminpanel
|
|
23
23
|
when 'wysiwyg'
|
24
24
|
fields_to_delete << attribute
|
25
25
|
fields << attribute.split(':').first + ':' + 'text'
|
26
|
+
when 'belongs_to'
|
27
|
+
fields_to_delete << attribute
|
28
|
+
fields << attribute.split(':').first + ':' + 'select'
|
29
|
+
when 'has_many'
|
30
|
+
fields_to_delete << attribute
|
31
|
+
fields << attribute.split(':').first + ':' + 'checkbox'
|
26
32
|
end
|
27
33
|
end
|
28
34
|
fields_to_delete.each do |field|
|
@@ -19,11 +19,11 @@ module Adminpanel
|
|
19
19
|
"#{resource_name}_#{@attr_field}".camelize
|
20
20
|
end
|
21
21
|
|
22
|
-
def
|
22
|
+
def select_field(resource)
|
23
23
|
"#{resource.singularize.downcase}_id"
|
24
24
|
end
|
25
25
|
|
26
|
-
def
|
26
|
+
def checkbox_field(resource)
|
27
27
|
"#{resource.singularize.downcase}_ids"
|
28
28
|
end
|
29
29
|
|
@@ -43,7 +43,7 @@ module Adminpanel
|
|
43
43
|
def is_a_resource?
|
44
44
|
fields.each do |attribute|
|
45
45
|
assign_attributes_variables(attribute)
|
46
|
-
if @attr_type != '
|
46
|
+
if @attr_type != 'select'
|
47
47
|
return true
|
48
48
|
end
|
49
49
|
end
|
@@ -74,11 +74,11 @@ module Adminpanel
|
|
74
74
|
fields.map do |attribute|
|
75
75
|
assign_attributes_variables(attribute)
|
76
76
|
case @attr_type
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
77
|
+
when 'select'
|
78
|
+
":#{select_field(@attr_field)}"
|
79
|
+
when 'checkbox'
|
80
|
+
"{ #{checkbox_field(@attr_field)}: [] }"
|
81
|
+
else
|
82
82
|
":#{attribute.split(':').first}"
|
83
83
|
end
|
84
84
|
end.join(",\n")
|
@@ -123,12 +123,12 @@ module Adminpanel
|
|
123
123
|
attribute_hash(gallery_name.pluralize, 'adminpanel_file_field')
|
124
124
|
end
|
125
125
|
|
126
|
-
def
|
127
|
-
attribute_hash(
|
126
|
+
def select_form_hash
|
127
|
+
attribute_hash(select_field(@attr_field), 'select', resource_class_name(@attr_field))
|
128
128
|
end
|
129
129
|
|
130
|
-
def
|
131
|
-
attribute_hash(
|
130
|
+
def checkbox_form_hash
|
131
|
+
attribute_hash(checkbox_field(resource_class_name(@attr_field.downcase.singularize + 's')), 'checkbox', @attr_field.capitalize.singularize)
|
132
132
|
end
|
133
133
|
|
134
134
|
def attribute_hash(name, type, model = '')
|
@@ -155,17 +155,18 @@ module Adminpanel
|
|
155
155
|
"'placeholder' => '#{@attr_field}'"
|
156
156
|
end
|
157
157
|
|
158
|
-
def model_type(
|
159
|
-
"'
|
158
|
+
def model_type(model_name)
|
159
|
+
"'options' => Proc.new { |object|\n" +
|
160
|
+
indent("Adminpanel::#{model_name}.all\n", 2) +
|
161
|
+
'}'
|
160
162
|
end
|
161
163
|
|
162
164
|
def has_associations?
|
163
165
|
fields.each do |attribute|
|
164
166
|
assign_attributes_variables(attribute)
|
165
167
|
if( @attr_type == 'images' ||
|
166
|
-
@attr_type == '
|
167
|
-
@attr_type == '
|
168
|
-
@attr_type == 'has_many_through' ||
|
168
|
+
@attr_type == 'select' ||
|
169
|
+
@attr_type == 'checkbox' ||
|
169
170
|
@attr_type == 'file' ||
|
170
171
|
has_gallery? )
|
171
172
|
return true
|
@@ -179,10 +180,10 @@ module Adminpanel
|
|
179
180
|
fields.each do |attribute|
|
180
181
|
assign_attributes_variables(attribute)
|
181
182
|
case @attr_type
|
182
|
-
when '
|
183
|
-
association = "#{association}#{
|
184
|
-
when '
|
185
|
-
association = "#{association}#{
|
183
|
+
when 'select'
|
184
|
+
association = "#{association}#{select_association(@attr_field)}"
|
185
|
+
when 'checkbox'
|
186
|
+
association = "#{association}#{checkbox_association(@attr_field)}"
|
186
187
|
when 'file'
|
187
188
|
association = "#{association}#{file_assocation(@attr_field)}"
|
188
189
|
end
|
@@ -195,11 +196,11 @@ module Adminpanel
|
|
195
196
|
association
|
196
197
|
end
|
197
198
|
|
198
|
-
def
|
199
|
+
def select_association(field)
|
199
200
|
"belongs_to :#{field.singularize.downcase}\n\t\t"
|
200
201
|
end
|
201
202
|
|
202
|
-
def
|
203
|
+
def checkbox_association(field)
|
203
204
|
return "# has_many :#{@attr_field.downcase}zations\n\t\t" +
|
204
205
|
"# has_many :#{@attr_field.pluralize.downcase}, " +
|
205
206
|
"through: :#{@attr_field.downcase}zations, " +
|
@@ -207,7 +208,7 @@ module Adminpanel
|
|
207
208
|
end
|
208
209
|
|
209
210
|
def file_assocation(field)
|
210
|
-
|
211
|
+
"mount_uploader :#{field}, #{class_name}Uploader\n\t\t"
|
211
212
|
end
|
212
213
|
|
213
214
|
end
|
@@ -95,12 +95,8 @@ namespace :adminpanel do
|
|
95
95
|
value = Faker::Internet.url
|
96
96
|
when 'id' #assign field_id it to a random instance of Adminpanel::field
|
97
97
|
field = field.downcase.singularize
|
98
|
-
|
99
|
-
|
100
|
-
else
|
101
|
-
value = "adminpanel/#{field}".classify.constantize.of_model(@model.display_name).order('RAND()').first.id
|
102
|
-
end
|
103
|
-
field = "#{field}_id"
|
98
|
+
value = "adminpanel/#{field}".classify.constantize.order('RAND()').first.id
|
99
|
+
field = "#{field}_id"
|
104
100
|
|
105
101
|
when 'email' #generates a random email
|
106
102
|
value = Faker::Internet.email
|
@@ -5,24 +5,26 @@ module Adminpanel
|
|
5
5
|
belongs_to :category
|
6
6
|
|
7
7
|
has_many :items
|
8
|
-
has_many :product, :
|
8
|
+
has_many :product, through: :items, dependent: :destroy
|
9
9
|
|
10
10
|
def self.form_attributes
|
11
11
|
[
|
12
12
|
{
|
13
13
|
'category_id' => {
|
14
|
-
'type' => '
|
15
|
-
'label' => 'category',
|
14
|
+
'type' => 'select',
|
16
15
|
'placeholder' => 'category',
|
17
|
-
'
|
16
|
+
'options' => Proc.new { |object|
|
17
|
+
Adminpanel::Category.all
|
18
|
+
}
|
18
19
|
}
|
19
20
|
},
|
20
21
|
{
|
21
22
|
'product_ids' => {
|
22
|
-
'type' => '
|
23
|
-
'label' => 'product',
|
23
|
+
'type' => 'checkbox',
|
24
24
|
'placeholder' => 'product',
|
25
|
-
'
|
25
|
+
'options' => Proc.new { |object|
|
26
|
+
Adminpanel::Product.all
|
27
|
+
}
|
26
28
|
}
|
27
29
|
},
|
28
30
|
{
|
@@ -9,18 +9,20 @@ module Adminpanel
|
|
9
9
|
[
|
10
10
|
{
|
11
11
|
'product_id' => {
|
12
|
-
'type' => '
|
13
|
-
'label' => 'product',
|
12
|
+
'type' => 'select',
|
14
13
|
'placeholder' => 'product',
|
15
|
-
'
|
14
|
+
'options' => Proc.new {|object|
|
15
|
+
Adminpanel::Product.all {|o| [o.id, o.name] }
|
16
|
+
}
|
16
17
|
}
|
17
18
|
},
|
18
19
|
{
|
19
20
|
'category_id' => {
|
20
|
-
'type' => '
|
21
|
-
'label' => 'category',
|
21
|
+
'type' => 'select',
|
22
22
|
'placeholder' => 'category',
|
23
|
-
'
|
23
|
+
'options' => Proc.new {|object|
|
24
|
+
Adminpanel::Category.all {|o| [o.id, o.name] }
|
25
|
+
}
|
24
26
|
}
|
25
27
|
},
|
26
28
|
|
@@ -3,6 +3,7 @@ module Adminpanel
|
|
3
3
|
include Adminpanel::Base
|
4
4
|
include Adminpanel::Facebook
|
5
5
|
include Adminpanel::Twitter
|
6
|
+
include Adminpanel::Friendly
|
6
7
|
|
7
8
|
has_many :categorizations
|
8
9
|
has_many :categories, through: :categorizations
|
@@ -12,9 +13,21 @@ module Adminpanel
|
|
12
13
|
validates_presence_of :price
|
13
14
|
validates_presence_of :description
|
14
15
|
|
16
|
+
def supername
|
17
|
+
"Super#{name}"
|
18
|
+
end
|
19
|
+
|
15
20
|
def self.form_attributes
|
16
21
|
[
|
17
|
-
{
|
22
|
+
{
|
23
|
+
"category_ids" => {
|
24
|
+
"type" => "checkbox",
|
25
|
+
"options" => Proc.new {|object|
|
26
|
+
Adminpanel::Category.all
|
27
|
+
}
|
28
|
+
}
|
29
|
+
},
|
30
|
+
|
18
31
|
{
|
19
32
|
'name' => {
|
20
33
|
'type' => 'text_field',
|
@@ -24,7 +37,6 @@ module Adminpanel
|
|
24
37
|
{
|
25
38
|
'price' => {
|
26
39
|
'type' => 'text_field',
|
27
|
-
'name' => 'price'
|
28
40
|
}
|
29
41
|
},
|
30
42
|
{
|
@@ -8,21 +8,22 @@ module Adminpanel
|
|
8
8
|
|
9
9
|
def self.form_attributes
|
10
10
|
[
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
11
|
+
{
|
12
|
+
'name' => {
|
13
|
+
'type' => 'text_field',
|
14
|
+
'label' => 'name',
|
15
|
+
'placeholder' => 'name'
|
16
|
+
}
|
17
|
+
},
|
18
|
+
{
|
19
|
+
'product_id' => {
|
20
|
+
'type' => 'select',
|
21
|
+
'label' => 'product_id',
|
22
|
+
'options' => Proc.new { |object|
|
23
|
+
Adminpanel::Product.all.map {|o| [o.id, o.supername]}
|
24
|
+
}
|
25
|
+
}
|
26
|
+
},
|
26
27
|
]
|
27
28
|
end
|
28
29
|
|