ab_admin 0.1.2 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +1 -0
- data/Guardfile +1 -1
- data/app/assets/images/admin/flags/b_uk.png +0 -0
- data/app/assets/images/admin/preloader.gif +0 -0
- data/app/assets/javascripts/ab_admin/application.js +1 -28
- data/app/assets/javascripts/ab_admin/components/admin_assets.js.coffee +29 -6
- data/app/assets/javascripts/ab_admin/components/gmaps.js.coffee +120 -91
- data/app/assets/javascripts/ab_admin/components/google_translate.js.coffee +3 -2
- data/app/assets/javascripts/ab_admin/core/batch_actions.js.coffee +4 -7
- data/app/assets/javascripts/ab_admin/core/init.js.coffee +8 -10
- data/app/assets/javascripts/ab_admin/core/ui_utils.js.coffee +53 -24
- data/app/assets/javascripts/ab_admin/core/utils.js.coffee +7 -0
- data/app/assets/javascripts/ab_admin/inputs/datetime_input.js.coffee +1 -2
- data/app/assets/javascripts/ab_admin/main.js +28 -0
- data/app/assets/stylesheets/ab_admin/application.css.scss +1 -10
- data/app/assets/stylesheets/ab_admin/bootstrap_and_overrides.css.scss +4 -0
- data/app/assets/stylesheets/ab_admin/components/_base.css.scss +4 -1
- data/app/assets/stylesheets/ab_admin/components/_form.css.scss +10 -13
- data/app/assets/stylesheets/ab_admin/components/_geo_input.css.scss +5 -9
- data/app/assets/stylesheets/ab_admin/fileupload.css.scss +68 -102
- data/app/assets/stylesheets/ab_admin/main.css.scss +8 -0
- data/app/controllers/admin/base_controller.rb +18 -14
- data/app/controllers/admin/manager_controller.rb +51 -6
- data/app/controllers/admin/users_controller.rb +23 -0
- data/app/views/admin/fileupload/_asset.html.slim +8 -0
- data/app/views/admin/fileupload/_container.html.slim +10 -0
- data/app/views/admin/fileupload/_file.html.slim +5 -0
- data/app/views/admin/fileupload/_ftmpl.html.slim +6 -0
- data/app/views/admin/fileupload/_tmpl.html.slim +9 -0
- data/app/views/admin/users/_form.html.slim +1 -0
- data/config/locales/en.yml +5 -60
- data/config/locales/ru.yml +14 -63
- data/config/routes.rb +7 -4
- data/features/dsl/custom_actions.feature +62 -0
- data/features/dsl/parent_resource.feature +18 -0
- data/features/step_definitions/configuration_steps.rb +6 -0
- data/features/step_definitions/dsl/parent_resource_steps.rb +8 -0
- data/features/step_definitions/settings_steps.rb +1 -1
- data/features/step_definitions/web_steps/transforms_steps.rb +3 -0
- data/features/support/paths.rb +3 -0
- data/lib/ab_admin.rb +5 -0
- data/lib/ab_admin/abstract_resource.rb +28 -4
- data/lib/ab_admin/carrierwave/base_uploader.rb +22 -22
- data/lib/ab_admin/concerns/admin_addition.rb +2 -2
- data/lib/ab_admin/concerns/utilities.rb +4 -4
- data/lib/ab_admin/config/base.rb +18 -0
- data/lib/ab_admin/controllers/head_options.rb +1 -1
- data/lib/ab_admin/core_ext/array.rb +4 -0
- data/lib/ab_admin/core_ext/string.rb +9 -10
- data/lib/ab_admin/hooks/quiet_scope_page.rb +16 -16
- data/lib/ab_admin/hooks/simple_form_hooks.rb +13 -13
- data/lib/ab_admin/i18n_tools/model_translator.rb +67 -0
- data/lib/ab_admin/models/asset.rb +32 -1
- data/lib/ab_admin/models/attachment_file.rb +1 -1
- data/lib/ab_admin/models/locator.rb +7 -0
- data/lib/ab_admin/models/settings.rb +7 -0
- data/lib/ab_admin/models/structure.rb +4 -0
- data/lib/ab_admin/utils.rb +2 -2
- data/lib/ab_admin/version.rb +1 -1
- data/lib/ab_admin/views/admin_helpers.rb +3 -3
- data/lib/ab_admin/views/admin_navigation_helpers.rb +1 -1
- data/lib/ab_admin/views/form_builder.rb +42 -39
- data/lib/ab_admin/views/helpers.rb +5 -0
- data/lib/ab_admin/views/manager_helpers.rb +10 -0
- data/lib/ab_admin/views/search_form_builder.rb +12 -5
- data/lib/generators/ab_admin/install/install_generator.rb +1 -1
- data/lib/generators/ab_admin/install/templates/config/admin_menu.rb +2 -2
- data/lib/generators/ab_admin/install/templates/helpers/admin/structures_helper.rb +1 -1
- data/lib/generators/ab_admin/install/templates/models/attachment_file.rb +2 -0
- data/lib/generators/ab_admin/install/templates/models/locator.rb +0 -1
- data/lib/generators/ab_admin/install/templates/models/settings.rb +0 -1
- data/lib/generators/ab_admin/install/templates/models/static_page.rb +1 -0
- data/lib/generators/ab_admin/install/templates/{scripts → script}/unicorn.sh +0 -0
- data/lib/generators/ab_admin/install/templates/uploaders/avatar_uploader.rb +4 -0
- data/lib/generators/ab_admin/resource/templates/_search_form.haml.erb +1 -1
- data/lib/generators/ab_admin/resource/templates/_search_form.slim.erb +1 -1
- data/lib/generators/ab_admin/resource/templates/_table.haml.erb +1 -2
- data/lib/generators/ab_admin/resource/templates/_table.slim.erb +1 -2
- data/lib/generators/template.rb +1 -0
- data/lib/tasks/i18n.rake +7 -0
- data/spec/dummy/app/models/ab_admin/ab_admin_collection.rb +35 -0
- data/spec/dummy/app/models/ab_admin/ab_admin_product.rb +2 -0
- data/spec/dummy/app/models/admin_menu.rb +4 -2
- data/spec/dummy/app/models/collection.rb +3 -1
- data/spec/generators/install_generator_spec.rb +1 -1
- data/spec/generators/resource_generator_spec.rb +1 -1
- data/spec/models/avatar_spec.rb +29 -2
- metadata +25 -12
- data/app/views/admin/fileupload/_asset.html.erb +0 -5
- data/app/views/admin/fileupload/_container.html.erb +0 -28
- data/app/views/admin/fileupload/_fcontainer.html.erb +0 -25
- data/app/views/admin/fileupload/_file.html.erb +0 -5
- data/app/views/admin/fileupload/_ftmpl.html.erb +0 -7
- data/app/views/admin/fileupload/_tmpl.html.erb +0 -9
- data/lib/ab_admin/utils/csv_builder.rb +0 -52
@@ -67,7 +67,38 @@ module AbAdmin
|
|
67
67
|
|
68
68
|
def main!
|
69
69
|
self.class.update_all('is_main=0', ['assetable_type=? AND assetable_id=? AND type=?', assetable_type, assetable_id, type])
|
70
|
-
update_column(:is_main, true)
|
70
|
+
update_column(:is_main, true)
|
71
|
+
refresh_assetable
|
72
|
+
self
|
73
|
+
end
|
74
|
+
|
75
|
+
def rotate!
|
76
|
+
rename!
|
77
|
+
self.rotate_degrees = 90
|
78
|
+
save!
|
79
|
+
refresh_assetable
|
80
|
+
self
|
81
|
+
end
|
82
|
+
|
83
|
+
def rename!
|
84
|
+
rename
|
85
|
+
save!
|
86
|
+
end
|
87
|
+
|
88
|
+
def rename
|
89
|
+
file = data.file
|
90
|
+
path = data.path
|
91
|
+
ext = File.extname(path)
|
92
|
+
new_path = File.join(File.dirname(path), "#{File.basename(path).chomp(ext)}_#{rand(99)}#{ext}")
|
93
|
+
new_file = ::CarrierWave::SanitizedFile.new file.move_to(new_path)
|
94
|
+
data.cache!(new_file)
|
95
|
+
end
|
96
|
+
|
97
|
+
def refresh_assetable
|
98
|
+
return unless assetable.try(:persisted?)
|
99
|
+
assetable.touch
|
100
|
+
assetable.tire.update_index if assetable.respond_to?(:tire)
|
101
|
+
true
|
71
102
|
end
|
72
103
|
|
73
104
|
def full_url(*args)
|
@@ -3,6 +3,13 @@ module AbAdmin
|
|
3
3
|
module Locator
|
4
4
|
extend ActiveSupport::Concern
|
5
5
|
|
6
|
+
included do
|
7
|
+
extend ActiveModel::Naming
|
8
|
+
extend ActiveRecord::Translation
|
9
|
+
class_attribute :base_class
|
10
|
+
self.base_class = self
|
11
|
+
end
|
12
|
+
|
6
13
|
module ClassMethods
|
7
14
|
def find_files
|
8
15
|
Dir[Rails.root.join('config', 'locales', '*.yml')]
|
@@ -3,6 +3,13 @@ module AbAdmin
|
|
3
3
|
module Settings
|
4
4
|
extend ActiveSupport::Concern
|
5
5
|
|
6
|
+
included do
|
7
|
+
extend ActiveModel::Naming
|
8
|
+
extend ActiveRecord::Translation
|
9
|
+
class_attribute :base_class
|
10
|
+
self.base_class = self
|
11
|
+
end
|
12
|
+
|
6
13
|
module ClassMethods
|
7
14
|
def load
|
8
15
|
configatron.configure_from_hash instance.all
|
data/lib/ab_admin/utils.rb
CHANGED
@@ -109,7 +109,7 @@ module AbAdmin
|
|
109
109
|
|
110
110
|
def pretty_data(object)
|
111
111
|
case object
|
112
|
-
when String, Integer
|
112
|
+
when String, Integer, BigDecimal, Float
|
113
113
|
object
|
114
114
|
when TrueClass
|
115
115
|
'+'
|
@@ -120,7 +120,7 @@ module AbAdmin
|
|
120
120
|
when NilClass
|
121
121
|
''
|
122
122
|
else
|
123
|
-
AbAdmin.safe_display_name(object)
|
123
|
+
AbAdmin.safe_display_name(object) || object
|
124
124
|
end
|
125
125
|
end
|
126
126
|
|
data/lib/ab_admin/version.rb
CHANGED
@@ -55,7 +55,7 @@ module AbAdmin
|
|
55
55
|
|
56
56
|
def layout_css
|
57
57
|
css = []
|
58
|
-
css << 'content_with_sidebar' if settings[:sidebar]
|
58
|
+
css << 'content_with_sidebar' if settings[:sidebar] || content_for?(:sidebar)
|
59
59
|
css << 'well' if settings[:well]
|
60
60
|
css << "#{settings[:index_view]}_view"
|
61
61
|
css
|
@@ -75,7 +75,7 @@ module AbAdmin
|
|
75
75
|
|
76
76
|
def admin_pretty_data(object)
|
77
77
|
case object
|
78
|
-
when String, Integer
|
78
|
+
when String, Integer, BigDecimal, Float
|
79
79
|
object
|
80
80
|
when TrueClass, FalseClass
|
81
81
|
color_bool(object)
|
@@ -86,7 +86,7 @@ module AbAdmin
|
|
86
86
|
when ActiveRecord::Base
|
87
87
|
admin_show_link(object)
|
88
88
|
else
|
89
|
-
AbAdmin.safe_display_name(object)
|
89
|
+
AbAdmin.safe_display_name(object) || object
|
90
90
|
end
|
91
91
|
end
|
92
92
|
|
@@ -68,7 +68,7 @@ module AbAdmin
|
|
68
68
|
link_to icon('eye-open', true), path, :class => 'btn btn-small btn-inverse', :title => t('admin.actions.preview.link'), :target => '_blank'
|
69
69
|
end
|
70
70
|
when AbAdmin::Config::ActionItem
|
71
|
-
instance_exec(&action.data) if action.for_context?(self)
|
71
|
+
instance_exec(item, &action.data) if action.for_context?(self)
|
72
72
|
else
|
73
73
|
meth = "#{resource_instance_name}_short_action_link"
|
74
74
|
send(meth, action, item) if respond_to? meth
|
@@ -24,12 +24,12 @@ module AbAdmin
|
|
24
24
|
case options[:as]
|
25
25
|
when :uploader
|
26
26
|
title = options[:title] || I18n.t("admin.#{attribute_name}", :default => object.class.han(attribute_name))
|
27
|
-
return template.input_set(title) { attach_file_field(attribute_name, options
|
27
|
+
return template.input_set(title) { attach_file_field(attribute_name, options) }
|
28
28
|
when :map
|
29
29
|
title = options[:title] || I18n.t("admin.#{attribute_name}", :default => object.class.han(attribute_name))
|
30
30
|
prefix = options[:prefix] || object.class.model_name.singular
|
31
31
|
data_fields = [:lat, :lon, :zoom].map { |attr| hidden_field(attr) }.join.html_safe
|
32
|
-
return template.input_set(title) { data_fields + geo_input(prefix) }
|
32
|
+
return template.input_set(title) { data_fields + geo_input(prefix, options[:js_options]) }
|
33
33
|
end
|
34
34
|
|
35
35
|
attribute_name = "#{attribute_name}_#{options[:locale]}" if options[:locale]
|
@@ -59,17 +59,23 @@ module AbAdmin
|
|
59
59
|
template.render 'admin/shared/save_buttons'
|
60
60
|
end
|
61
61
|
|
62
|
-
def geo_input(prefix, &block)
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
62
|
+
def geo_input(prefix, js_options={}, &block)
|
63
|
+
input_name = "#{prefix}_geo_ac"
|
64
|
+
js = %Q[$("##{prefix}_geo_input").geoInput(#{js_options.to_json})]
|
65
|
+
<<-HTML.html_safe
|
66
|
+
<script src="//maps.googleapis.com/maps/api/js?sensor=false&libraries=places&language=#{I18n.locale}" type="text/javascript"></script>
|
67
|
+
<div class="geo_input" id="#{prefix}_geo_input">
|
68
|
+
<div class="control-group">
|
69
|
+
<label class="control-label" for="#{input_name}">#{I18n.t('admin.geo_autocomplete')}</label>
|
70
|
+
<div class="controls">
|
71
|
+
<input type="text" name="#{input_name}" id="#{input_name}" class="geo_ac string">
|
72
|
+
</div>
|
73
|
+
</div>
|
74
|
+
#{template.capture(&block) if block_given?}
|
75
|
+
<div class="controls"><div id="#{prefix}_map" class="admin_map thumbnail"></div></div>
|
76
|
+
#{template.init_js(js)}
|
77
|
+
</div>
|
78
|
+
HTML
|
73
79
|
end
|
74
80
|
|
75
81
|
def attach_file_field(attribute_name, options = {})
|
@@ -100,8 +106,7 @@ module AbAdmin
|
|
100
106
|
script_options['allowedExtensions'] ||= %w(pdf doc docx xls xlsx ppt pptx zip rar csv jpg jpeg gif png)
|
101
107
|
script_options['template_id'] = '#fileupload_ftmpl'
|
102
108
|
options[:asset_render_template] = 'file'
|
103
|
-
|
104
|
-
if options[:video]
|
109
|
+
elsif options[:video]
|
105
110
|
script_options['allowedExtensions'] ||= %w(mp4 flv)
|
106
111
|
script_options['template_id'] = '#fileupload_vtmpl'
|
107
112
|
options[:asset_render_template] = 'video_file'
|
@@ -111,39 +116,37 @@ module AbAdmin
|
|
111
116
|
script_options['element'] ||= element_id
|
112
117
|
script_options['sizeLimit'] = max_size.megabytes.to_i
|
113
118
|
|
114
|
-
label ||= if object && object.class.respond_to?(:human_attribute_name)
|
115
|
-
object.class.human_attribute_name(attribute_name)
|
116
|
-
end
|
117
|
-
|
118
119
|
locals = {
|
119
|
-
:
|
120
|
-
:
|
121
|
-
:
|
122
|
-
:
|
123
|
-
:
|
124
|
-
:
|
125
|
-
:
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
120
|
+
element_id: element_id,
|
121
|
+
file_title: (options[:file_title] || script_options['allowedExtensions'].join(', ')),
|
122
|
+
file_max_size: max_size,
|
123
|
+
assets: [value].flatten.delete_if { |v| v.nil? || v.new_record? },
|
124
|
+
multiple: script_options['multiple'],
|
125
|
+
asset_render_template: (options[:asset_render_template] || 'asset'),
|
126
|
+
container_data: {
|
127
|
+
klass: params[:assetable_type],
|
128
|
+
asset: asset_klass.to_s,
|
129
|
+
assoc: params[:method],
|
130
|
+
multiple: script_options['multiple']
|
131
|
+
}
|
131
132
|
}
|
132
133
|
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
134
|
+
locals[:css_class] = ['fileupload', "#{locals[:asset_render_template]}_asset_type"]
|
135
|
+
locals[:css_class] << (script_options['multiple'] ? 'many_assets' : 'one_asset')
|
136
|
+
|
137
|
+
js_opts = [locals[:element_id], template.sort_admin_assets_path(:klass => asset_klass), locals[:multiple]].map(&:inspect).join(', ')
|
138
|
+
locals[:js] = <<-JAVASCRIPT
|
139
|
+
var upl = new qq.FileUploaderInput(#{script_options.to_json});
|
140
|
+
upl._setupDragDrop();
|
141
|
+
new AdminAssets(#{js_opts});
|
142
|
+
JAVASCRIPT
|
140
143
|
|
141
144
|
if options[:description]
|
142
145
|
opts = [attribute_name, object.class.name, object.id, object.fileupload_guid].map { |i| i.to_s.inspect }.join(', ')
|
143
146
|
template.concat javascript_tag("$(function(){new AssetDescription(#{opts})})")
|
144
147
|
end
|
145
148
|
|
146
|
-
template.render(:partial => "admin/fileupload/#{
|
149
|
+
template.render(:partial => "admin/fileupload/#{options[:container] || 'container'}", :locals => locals)
|
147
150
|
end
|
148
151
|
|
149
152
|
protected
|
@@ -54,6 +54,11 @@ module AbAdmin
|
|
54
54
|
%Q[<script type='text/javascript'>$(function(){#{js}})</script>].html_safe
|
55
55
|
end
|
56
56
|
|
57
|
+
def image_tag_if(image, options={})
|
58
|
+
return unless image
|
59
|
+
image_tag image, options
|
60
|
+
end
|
61
|
+
|
57
62
|
def render_title
|
58
63
|
@page_title || I18n.t("page.title")
|
59
64
|
end
|
@@ -17,6 +17,16 @@ module AbAdmin
|
|
17
17
|
def show_builder
|
18
18
|
manager.show ||= ::AbAdmin::Config::Show.default_for_model(resource_class)
|
19
19
|
end
|
20
|
+
|
21
|
+
def action_item_admin_path(name, record=nil)
|
22
|
+
custom_action = manager.custom_action_for(name, self)
|
23
|
+
if custom_action.collection?
|
24
|
+
admin_collection_action_path(:model_name => resource_collection_name, :custom_action => custom_action.name)
|
25
|
+
else
|
26
|
+
record ||= resource
|
27
|
+
admin_member_action_path(:model_name => resource_collection_name, :id => record.id, :custom_action => custom_action.name)
|
28
|
+
end
|
29
|
+
end
|
20
30
|
end
|
21
31
|
end
|
22
32
|
end
|
@@ -15,17 +15,24 @@ module AbAdmin
|
|
15
15
|
def select_field(attr, options={})
|
16
16
|
label(attr, options[:label]) + content_tag(:div, :class => 'controls') do
|
17
17
|
param = "#{options[:value_attr] || attr}_eq"
|
18
|
-
|
19
|
-
if options[:collection].
|
20
|
-
|
18
|
+
|
19
|
+
if options[:collection].is_a?(Proc)
|
20
|
+
collection = options[:collection].call
|
21
21
|
else
|
22
|
-
|
22
|
+
collection = options[:collection] || []
|
23
|
+
end
|
24
|
+
|
25
|
+
if collection.first.try(:respond_to?, :id)
|
26
|
+
collection.map!{|r| [AbAdmin.display_name(r), r.id] }
|
23
27
|
end
|
28
|
+
|
24
29
|
options[:html_options] ||= {}
|
25
30
|
if options[:fancy] || !options.has_key?(:fancy)
|
26
31
|
options[:html_options][:class] = [options[:html_options][:class], 'fancy_select'].join(' ')
|
27
32
|
end
|
28
|
-
|
33
|
+
|
34
|
+
html_options = options[:html_options].merge(:include_blank => true, :id => "q_#{attr}")
|
35
|
+
select_tag("q[#{param}]", options_for_select(collection, params[:q][param]), html_options)
|
29
36
|
end
|
30
37
|
end
|
31
38
|
|
@@ -21,7 +21,7 @@ module AbAdmin
|
|
21
21
|
|
22
22
|
template('config/logrotate-config', 'config/logrotate-config')
|
23
23
|
template('config/nginx.conf', 'config/nginx.conf')
|
24
|
-
template('
|
24
|
+
template('script/unicorn.sh', 'script/unicorn.sh')
|
25
25
|
template('config/settings.yml', 'config/settings/settings.yml')
|
26
26
|
template('config/settings.yml', 'config/settings/settings.local.yml')
|
27
27
|
copy_file('config/unicorn_config.rb', 'config/unicorn_config.rb')
|
@@ -3,8 +3,8 @@ class AdminMenu < AbAdmin::MenuBuilder
|
|
3
3
|
model User
|
4
4
|
group :system do
|
5
5
|
model Structure
|
6
|
-
|
7
|
-
|
6
|
+
link Locator.model_name.human, '/admin/locators'
|
7
|
+
link Settings.model_name.human, edit_admin_settings_path
|
8
8
|
end
|
9
9
|
end
|
10
10
|
end
|
File without changes
|
@@ -28,7 +28,7 @@
|
|
28
28
|
-%>
|
29
29
|
<% translated_columns.each do |col| -%>
|
30
30
|
<% next if [:description].include?(col.to_sym) -%>
|
31
|
-
= f.input
|
31
|
+
= f.input :<%= col %>
|
32
32
|
<% end -%>
|
33
33
|
<% model.columns_hash.except('id', 'slug').each do |key, col| -%>
|
34
34
|
<%= input_by_col(key, col) %>
|
@@ -28,7 +28,7 @@
|
|
28
28
|
-%>
|
29
29
|
<% translated_columns.each do |col| -%>
|
30
30
|
<% next if [:description].include?(col.to_sym) -%>
|
31
|
-
= f.input
|
31
|
+
= f.input :<%= col %>
|
32
32
|
<% end -%>
|
33
33
|
<% model.columns_hash.except('id', 'slug').each do |key, col| -%>
|
34
34
|
<%= input_by_col(key, col) %>
|