ab_admin 0.2.3 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +6 -6
- data/Guardfile +6 -6
- data/README.md +5 -5
- data/app/assets/images/admin/Jcrop.gif +0 -0
- data/app/assets/javascripts/ab_admin/components/admin_assets.js.coffee +20 -19
- data/app/assets/javascripts/ab_admin/components/croppable_image.js.coffee +22 -38
- data/app/assets/javascripts/ab_admin/components/gmaps.js.coffee +2 -2
- data/app/assets/javascripts/ab_admin/core/ui_utils.js.coffee +6 -2
- data/app/assets/stylesheets/ab_admin/components/_base.css.scss +17 -1
- data/app/assets/stylesheets/ab_admin/components/_form.css.scss +1 -1
- data/app/assets/stylesheets/ab_admin/main.css.scss +1 -0
- data/app/controllers/admin/assets_controller.rb +10 -10
- data/app/controllers/admin/base_controller.rb +39 -37
- data/app/controllers/admin/locators_controller.rb +5 -4
- data/app/controllers/admin/manager_controller.rb +11 -10
- data/app/controllers/admin/settings_controller.rb +4 -3
- data/app/controllers/admin/static_pages_controller.rb +1 -1
- data/app/controllers/admin/structures_controller.rb +2 -2
- data/app/views/ab_admin/devise/passwords/edit.html.slim +5 -5
- data/app/views/ab_admin/devise/passwords/new.html.slim +3 -3
- data/app/views/ab_admin/devise/sessions/new.html.slim +5 -5
- data/app/views/admin/admin_comments/_comment.html.slim +3 -3
- data/app/views/admin/admin_comments/_comments.html.slim +2 -2
- data/app/views/admin/admin_comments/_form.html.slim +5 -5
- data/app/views/admin/admin_comments/create.js.erb +1 -1
- data/app/views/admin/base/_form.html.slim +1 -1
- data/app/views/admin/base/_search_layout.html.slim +4 -4
- data/app/views/admin/base/_tree.html.slim +1 -1
- data/app/views/admin/base/create.js.erb +1 -1
- data/app/views/admin/base/index.html.slim +3 -3
- data/app/views/admin/base/update.js.erb +1 -1
- data/app/views/admin/dashboards/index.html.slim +15 -1
- data/app/views/admin/fileupload/_asset.html.slim +1 -1
- data/app/views/admin/fileupload/_container.html.slim +2 -2
- data/app/views/admin/fileupload/_file.html.slim +1 -1
- data/app/views/admin/fileupload/_tmpl.html.slim +1 -1
- data/app/views/admin/headers/_form.html.slim +3 -3
- data/app/views/admin/locators/edit.html.slim +4 -4
- data/app/views/admin/locators/show.html.slim +3 -3
- data/app/views/admin/manager/_form.html.slim +2 -1
- data/app/views/admin/manager/_table.html.slim +6 -3
- data/app/views/admin/settings/_form.html.slim +8 -8
- data/app/views/admin/shared/_batch_actions.html.slim +1 -1
- data/app/views/admin/static_pages/_form.html.slim +3 -3
- data/app/views/admin/structures/_form.html.slim +7 -7
- data/app/views/admin/users/_form.html.slim +9 -9
- data/app/views/admin/users/_search_form.html.slim +4 -4
- data/app/views/admin/users/_table.html.slim +3 -3
- data/app/views/layouts/admin/_footer.html.slim +4 -0
- data/app/views/layouts/admin/_navigation.html.slim +2 -2
- data/app/views/layouts/admin/application.html.slim +3 -3
- data/app/views/layouts/admin/devise.html.slim +2 -2
- data/config/locales/ru.yml +1 -0
- data/config/routes.rb +23 -23
- data/db/migrate/20130101000001_create_users.rb +11 -11
- data/db/migrate/20130101000003_create_assets.rb +8 -8
- data/db/migrate/20130101000004_create_headers.rb +3 -3
- data/db/migrate/20130101000005_create_static_pages.rb +2 -2
- data/db/migrate/20130101000006_create_structures.rb +8 -8
- data/db/migrate/20130101000007_base_translations.rb +3 -3
- data/db/migrate/20130101000008_create_admin_comments.rb +3 -3
- data/features/dsl/action_items.feature +1 -1
- data/features/dsl/admin_comments.feature +2 -2
- data/features/dsl/batch_actions.feature +1 -1
- data/features/dsl/config.feature +2 -2
- data/features/dsl/custom_actions.feature +5 -5
- data/features/dsl/form.feature +4 -4
- data/features/dsl/in_place_edit.feature +1 -1
- data/features/dsl/list_edit.feature +1 -1
- data/features/dsl/resource_action_items.feature +1 -1
- data/features/dsl/table.feature +3 -3
- data/features/dsl/tree.feature +3 -3
- data/features/locators.feature +1 -1
- data/features/menu.feature +3 -3
- data/features/step_definitions/dsl/action_items_steps.rb +3 -3
- data/features/step_definitions/dsl/admin_comments_steps.rb +1 -1
- data/features/step_definitions/dsl/batch_actions_steps.rb +1 -1
- data/features/step_definitions/dsl/parent_resource_steps.rb +2 -2
- data/features/step_definitions/dsl/table_steps.rb +3 -3
- data/features/step_definitions/dsl/tree_steps.rb +3 -3
- data/features/step_definitions/menu_steps.rb +3 -3
- data/features/step_definitions/structure_steps.rb +1 -1
- data/features/step_definitions/user_steps.rb +7 -7
- data/features/step_definitions/web_steps/browsing_steps.rb +2 -2
- data/features/step_definitions/web_steps/form_steps.rb +7 -7
- data/features/support/selectors.rb +5 -5
- data/features/support/tolerance_for_selenium_sync_issues.rb +1 -1
- data/lib/ab_admin/abstract_resource.rb +3 -3
- data/lib/ab_admin/carrierwave/base_uploader.rb +7 -7
- data/lib/ab_admin/carrierwave/file_size_validator.rb +4 -4
- data/lib/ab_admin/carrierwave/glue.rb +1 -1
- data/lib/ab_admin/concerns/admin_addition.rb +17 -13
- data/lib/ab_admin/concerns/headerable.rb +2 -2
- data/lib/ab_admin/concerns/nested_set.rb +23 -1
- data/lib/ab_admin/concerns/reloadable.rb +56 -0
- data/lib/ab_admin/concerns/utilities.rb +3 -3
- data/lib/ab_admin/concerns/validations.rb +2 -2
- data/lib/ab_admin/config/base.rb +5 -5
- data/lib/ab_admin/config/optional_display.rb +4 -4
- data/lib/ab_admin/controllers/callbacks.rb +1 -1
- data/lib/ab_admin/controllers/can_can_manager_resource.rb +1 -1
- data/lib/ab_admin/controllers/head_options.rb +5 -9
- data/lib/ab_admin/controllers/tree.rb +2 -2
- data/lib/ab_admin/core_ext/other.rb +2 -2
- data/lib/ab_admin/core_ext/string.rb +2 -2
- data/lib/ab_admin/devise.rb +3 -3
- data/lib/ab_admin/engine.rb +1 -1
- data/lib/ab_admin/hooks/paginate_hooks.rb +2 -2
- data/lib/ab_admin/hooks/simple_form_hooks.rb +2 -2
- data/lib/ab_admin/i18n_tools/google_translate.rb +5 -5
- data/lib/ab_admin/i18n_tools/model_translator.rb +7 -7
- data/lib/ab_admin/i18n_tools/translate_app.rb +1 -1
- data/lib/ab_admin/menu_builder.rb +3 -3
- data/lib/ab_admin/models/asset.rb +14 -6
- data/lib/ab_admin/models/attachment_file.rb +2 -2
- data/lib/ab_admin/models/header.rb +1 -1
- data/lib/ab_admin/models/locator.rb +3 -3
- data/lib/ab_admin/models/structure.rb +8 -8
- data/lib/ab_admin/models/type_model.rb +3 -3
- data/lib/ab_admin/models/user.rb +7 -7
- data/lib/ab_admin/utils/csv_document.rb +2 -2
- data/lib/ab_admin/utils/logger.rb +1 -1
- data/lib/ab_admin/utils/xls_document.rb +4 -4
- data/lib/ab_admin/utils.rb +11 -11
- data/lib/ab_admin/version.rb +1 -1
- data/lib/ab_admin/views/admin_helpers.rb +13 -13
- data/lib/ab_admin/views/admin_navigation_helpers.rb +26 -26
- data/lib/ab_admin/views/form_builder.rb +36 -22
- data/lib/ab_admin/views/helpers.rb +6 -6
- data/lib/ab_admin/views/inputs/ckeditor_input.rb +1 -1
- data/lib/ab_admin/views/inputs/color_input.rb +1 -1
- data/lib/ab_admin/views/inputs/date_time_input.rb +7 -7
- data/lib/ab_admin/views/manager_helpers.rb +3 -3
- data/lib/ab_admin/views/search_form_builder.rb +18 -18
- data/lib/ab_admin/views/url_for_routes.rb +4 -4
- data/lib/ab_admin.rb +1 -2
- data/lib/generators/ab_admin/glob/glob_generator.rb +1 -1
- data/lib/generators/ab_admin/install/install_generator.rb +2 -2
- data/lib/generators/ab_admin/install/templates/config/admin_menu.rb +2 -0
- data/lib/generators/ab_admin/install/templates/config/seeds.rb +1 -1
- data/lib/generators/ab_admin/install/templates/config/unicorn_config.rb +3 -3
- data/lib/generators/ab_admin/install/templates/helpers/admin/structures_helper.rb +2 -2
- data/lib/generators/ab_admin/install/templates/models/ability.rb +4 -4
- data/lib/generators/ab_admin/install/templates/models/admin_comment.rb +4 -4
- data/lib/generators/ab_admin/install/templates/models/asset.rb +2 -1
- data/lib/generators/ab_admin/install/templates/models/attachment_file.rb +1 -1
- data/lib/generators/ab_admin/install/templates/models/avatar.rb +2 -2
- data/lib/generators/ab_admin/install/templates/models/locator.rb +3 -0
- data/lib/generators/ab_admin/install/templates/models/picture.rb +2 -2
- data/lib/generators/ab_admin/install/templates/models/settings.rb +3 -0
- data/lib/generators/ab_admin/install/templates/models/static_page.rb +3 -3
- data/lib/generators/ab_admin/install/templates/models/structure.rb +2 -2
- data/lib/generators/ab_admin/install/templates/models/user.rb +2 -2
- data/lib/generators/ab_admin/install/templates/spec/spec_helper.rb +2 -2
- data/lib/generators/ab_admin/install/templates/spec/support/shared_connection.rb +1 -1
- data/lib/generators/ab_admin/install/templates/uploaders/avatar_uploader.rb +2 -2
- data/lib/generators/ab_admin/install/templates/uploaders/picture_uploader.rb +4 -3
- data/lib/generators/ab_admin/model/model_generator.rb +4 -2
- data/lib/generators/ab_admin/model/templates/resource.erb +6 -6
- data/lib/generators/ab_admin/resource/resource_generator.rb +9 -9
- data/lib/generators/ab_admin/resource/templates/_form.haml.erb +10 -14
- data/lib/generators/ab_admin/resource/templates/_form.slim.erb +11 -11
- 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/controller.erb +1 -1
- data/lib/generators/template.rb +8 -8
- data/lib/tasks/assets.rake +5 -5
- data/lib/tasks/cache.rake +1 -1
- data/lib/tasks/i18n.rake +1 -1
- data/spec/ab_admin_spec.rb +3 -3
- data/spec/dummy/app/models/ab_admin/ab_admin_catalogue.rb +1 -1
- data/spec/dummy/app/models/ab_admin/ab_admin_collection.rb +6 -6
- data/spec/dummy/app/models/ab_admin/ab_admin_product.rb +14 -14
- data/spec/dummy/app/models/admin_menu.rb +2 -2
- data/spec/dummy/app/models/ckeditor/asset.rb +1 -1
- data/spec/dummy/app/models/ckeditor/attachment_file.rb +1 -1
- data/spec/dummy/app/models/ckeditor/picture.rb +1 -1
- data/spec/dummy/app/models/collection.rb +5 -5
- data/spec/dummy/app/models/product.rb +5 -5
- data/spec/dummy/app/uploaders/ckeditor_attachment_file_uploader.rb +1 -1
- data/spec/dummy/app/uploaders/ckeditor_picture_uploader.rb +3 -3
- data/spec/dummy/app/views/layouts/application.html.erb +2 -2
- data/spec/dummy/config/application.rb +2 -2
- data/spec/dummy/config/environments/test.rb +1 -1
- data/spec/dummy/config/initializers/ckeditor.rb +2 -2
- data/spec/dummy/config/initializers/devise.rb +5 -5
- data/spec/dummy/config/initializers/session_store.rb +1 -1
- data/spec/dummy/config/initializers/simple_form.rb +8 -8
- data/spec/dummy/config/initializers/simple_form_bootstrap.rb +14 -14
- data/spec/dummy/config/initializers/wrap_parameters.rb +1 -1
- data/spec/dummy/config/routes.rb +2 -2
- data/spec/dummy/db/migrate/20130129151853_create_ckeditor_assets.rb +5 -5
- data/spec/dummy/db/migrate/20130130161853_create_collections.rb +2 -2
- data/spec/dummy/db/migrate/20130130162046_create_products.rb +2 -2
- data/spec/dummy/db/migrate/20130130175446_create_globalize_collection_product.rb +2 -2
- data/spec/dummy/db/migrate/20130207224516_create_catalogues.rb +3 -3
- data/spec/dummy/db/migrate/20130209223506_add_lat_lon_zoom_to_products.rb +1 -1
- data/spec/dummy/db/seeds.rb +5 -5
- data/spec/dummy/lib/capybara_irb.rb +10 -10
- data/spec/dummy/lib/tasks/cucumber.rake +10 -10
- data/spec/dummy/lib/templates/slim/scaffold/_form.html.slim +2 -2
- data/spec/factories/assets.rb +9 -9
- data/spec/factories/catalogues.rb +1 -1
- data/spec/factories/collections.rb +1 -1
- data/spec/factories/products.rb +2 -2
- data/spec/factories/structures.rb +2 -2
- data/spec/generators/ckeditor_assets_generator_spec.rb +1 -1
- data/spec/generators/install_generator_spec.rb +1 -1
- data/spec/generators/model_generator_spec.rb +2 -2
- data/spec/generators/resource_generator_spec.rb +1 -1
- data/spec/models/avatar_spec.rb +1 -1
- data/spec/models/picture_uploader_spec.rb +1 -1
- data/spec/models/structure_spec.rb +2 -2
- data/spec/models/user_spec.rb +1 -1
- data/spec/spec_helper.rb +3 -3
- data/spec/support/shared_connection.rb +1 -1
- data/vendor/assets/javascripts/ab_admin/jquery.Jcrop.js +1083 -0
- data/vendor/assets/stylesheets/ab_admin/jquery.Jcrop.min.css.scss +28 -0
- metadata +8 -6
- data/lib/ab_admin/views/inputs/association_input.rb +0 -13
- data/lib/ab_admin/views/inputs/tree_select_input.rb +0 -16
@@ -8,29 +8,42 @@ module AbAdmin
|
|
8
8
|
include ActionView::Helpers::TagHelper
|
9
9
|
include NestedForm::BuilderMixin if defined? NestedForm
|
10
10
|
|
11
|
-
map_type :color, :
|
12
|
-
map_type :ckeditor, :
|
13
|
-
map_type :editor, :
|
14
|
-
map_type :
|
15
|
-
map_type :
|
16
|
-
map_type :date, :time, :datetime, :to => ::AbAdmin::Views::Inputs::DateTimeInput
|
17
|
-
map_type :token, :to => ::AbAdmin::Views::Inputs::TokenInput
|
11
|
+
map_type :color, to: ::AbAdmin::Views::Inputs::ColorInput
|
12
|
+
map_type :ckeditor, to: ::AbAdmin::Views::Inputs::CkeditorInput
|
13
|
+
map_type :editor, to: ::AbAdmin::Views::Inputs::EditorInput
|
14
|
+
map_type :date, :time, :datetime, to: ::AbAdmin::Views::Inputs::DateTimeInput
|
15
|
+
map_type :token, to: ::AbAdmin::Views::Inputs::TokenInput
|
18
16
|
|
19
17
|
def input(attribute_name, options = {}, &block)
|
20
|
-
|
21
|
-
options[:
|
22
|
-
|
18
|
+
unless options.key?(:fancy)
|
19
|
+
if (!options.key?(:as) || options[:as] == :select) && options[:collection].respond_to?(:size) && options[:collection].size > 10
|
20
|
+
options[:input_html] ||= {}
|
21
|
+
options[:input_html][:class] = "#{options[:input_html][:class]} fancy_select"
|
22
|
+
end
|
23
23
|
end
|
24
24
|
|
25
25
|
case options[:as]
|
26
26
|
when :uploader
|
27
|
-
title = options[:title] || I18n.t("admin.#{attribute_name}", :
|
27
|
+
title = options[:title] || I18n.t("admin.#{attribute_name}", default: object.class.han(attribute_name))
|
28
28
|
return template.input_set(title) { attach_file_field(attribute_name, options) }
|
29
29
|
when :map
|
30
|
-
title = options[:title] || I18n.t("admin.#{attribute_name}", :
|
30
|
+
title = options[:title] || I18n.t("admin.#{attribute_name}", default: object.class.han(attribute_name))
|
31
31
|
prefix = options[:prefix] || object.class.model_name.singular
|
32
32
|
data_fields = [:lat, :lon, :zoom].map { |attr| hidden_field(attr) }.join.html_safe
|
33
33
|
return template.input_set(title) { data_fields + geo_input(prefix, options[:js_options]) }
|
34
|
+
when :token
|
35
|
+
options[:label] ||= object.class.han(attribute_name.to_s.sub(/^token_|_id$/, ''))
|
36
|
+
when :association, :tree_select
|
37
|
+
unless options[:reflection]
|
38
|
+
if options[:as] == :tree_select
|
39
|
+
options[:collection] ||= begin
|
40
|
+
reflection = object.class.reflect_on_association(attribute_name)
|
41
|
+
records = reflection.klass.all(reflection.options.slice(:conditions, :order))
|
42
|
+
reflection.klass.nested_opts_with_parent(records, object)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
return association(attribute_name, options.merge(as: :select))
|
46
|
+
end
|
34
47
|
end
|
35
48
|
|
36
49
|
attribute_name = "#{attribute_name}_#{options[:locale]}" if options[:locale]
|
@@ -41,11 +54,11 @@ module AbAdmin
|
|
41
54
|
def link_to_add_assoc(assoc, options={})
|
42
55
|
model = @object.class.reflect_on_association(assoc).klass
|
43
56
|
title = [@template.icon('plus', true), I18n.t('admin.add'), model.model_name.human].join(' ').html_safe
|
44
|
-
link_to_add title, assoc, :
|
57
|
+
link_to_add title, assoc, class: "btn btn-primary #{options[:class]}"
|
45
58
|
end
|
46
59
|
|
47
60
|
def link_to_remove_assoc
|
48
|
-
link_to_remove @template.icon('trash', true) + I18n.t('admin.delete'), :
|
61
|
+
link_to_remove @template.icon('trash', true) + I18n.t('admin.delete'), class: 'btn btn-danger btn-mini pull-right'
|
49
62
|
end
|
50
63
|
|
51
64
|
def locale_tabs(&block)
|
@@ -53,7 +66,7 @@ module AbAdmin
|
|
53
66
|
Globalize.available_locales.each do |l|
|
54
67
|
loc_html[l] = template.capture { block.call(l) }
|
55
68
|
end
|
56
|
-
template.render 'admin/shared/locale_tabs', :
|
69
|
+
template.render 'admin/shared/locale_tabs', loc_html: loc_html
|
57
70
|
end
|
58
71
|
|
59
72
|
def save_buttons
|
@@ -90,10 +103,10 @@ module AbAdmin
|
|
90
103
|
script_options = (options.delete(:script) || {}).stringify_keys
|
91
104
|
|
92
105
|
params = {
|
93
|
-
:
|
94
|
-
:
|
95
|
-
:
|
96
|
-
:
|
106
|
+
method: attribute_name,
|
107
|
+
assetable_id: object.new_record? ? nil : object.id,
|
108
|
+
assetable_type: object.class.name,
|
109
|
+
guid: element_guid
|
97
110
|
}.merge(script_options.delete(:params) || {})
|
98
111
|
|
99
112
|
script_options['action'] ||= '/sunrise/fileupload?' + Rack::Utils.build_query(params)
|
@@ -129,7 +142,8 @@ module AbAdmin
|
|
129
142
|
klass: params[:assetable_type],
|
130
143
|
asset: asset_klass.to_s,
|
131
144
|
assoc: params[:method],
|
132
|
-
multiple: script_options['multiple']
|
145
|
+
multiple: script_options['multiple'],
|
146
|
+
crop: options[:crop]
|
133
147
|
}
|
134
148
|
}
|
135
149
|
|
@@ -138,7 +152,7 @@ module AbAdmin
|
|
138
152
|
locals[:css_class] << 'error' if locals[:error]
|
139
153
|
|
140
154
|
|
141
|
-
js_opts = [locals[:element_id], template.sort_admin_assets_path(:
|
155
|
+
js_opts = [locals[:element_id], template.sort_admin_assets_path(klass: asset_klass), locals[:multiple]].map(&:inspect).join(', ')
|
142
156
|
locals[:js] = <<-JAVASCRIPT
|
143
157
|
var upl = new qq.FileUploaderInput(#{script_options.to_json});
|
144
158
|
upl._setupDragDrop();
|
@@ -150,7 +164,7 @@ module AbAdmin
|
|
150
164
|
template.concat javascript_tag("$(function(){new AssetDescription(#{opts})})")
|
151
165
|
end
|
152
166
|
|
153
|
-
template.render(:
|
167
|
+
template.render(partial: "admin/fileupload/#{options[:container] || 'container'}", locals: locals)
|
154
168
|
end
|
155
169
|
|
156
170
|
protected
|
@@ -36,7 +36,7 @@ module AbAdmin
|
|
36
36
|
|
37
37
|
def external_link(raw_link, options={}, &block)
|
38
38
|
return unless raw_link.present?
|
39
|
-
options.reverse_merge!(:
|
39
|
+
options.reverse_merge!(title: raw_link, target: '_blank', rel: 'nofollow')
|
40
40
|
link = raw_link =~ /^http[s]?:\/\// ? raw_link : "http://#{raw_link}"
|
41
41
|
if block_given?
|
42
42
|
link_to link, options, &block
|
@@ -60,15 +60,15 @@ module AbAdmin
|
|
60
60
|
end
|
61
61
|
|
62
62
|
def render_title
|
63
|
-
@page_title || I18n.t(
|
63
|
+
@page_title || I18n.t('page.title')
|
64
64
|
end
|
65
65
|
|
66
66
|
def render_keywords
|
67
|
-
@page_keywords || I18n.t(
|
67
|
+
@page_keywords || I18n.t('page.keywords')
|
68
68
|
end
|
69
69
|
|
70
70
|
def render_description
|
71
|
-
@page_description || I18n.t(
|
71
|
+
@page_description || I18n.t('page.description')
|
72
72
|
end
|
73
73
|
|
74
74
|
# swf_object
|
@@ -79,7 +79,7 @@ module AbAdmin
|
|
79
79
|
attributes = options.delete(:attributes) || {}
|
80
80
|
flashvars = options.delete(:flashvars) || {}
|
81
81
|
|
82
|
-
attributes[:classid] ||=
|
82
|
+
attributes[:classid] ||= 'clsid:D27CDB6E-AE6D-11cf-96B8-444553540000'
|
83
83
|
attributes[:id] ||= id
|
84
84
|
attributes[:name] ||= id
|
85
85
|
|
@@ -88,7 +88,7 @@ module AbAdmin
|
|
88
88
|
if options[:create_div]
|
89
89
|
output_buffer << content_tag(:div,
|
90
90
|
"This website requires <a href='http://www.adobe.com/shockwave/download/download.cgi?P1_Prod_Version=ShockwaveFlash&promoid=BIOW' target='_blank'>Flash player</a> #{flash_version} or higher.",
|
91
|
-
:
|
91
|
+
id: id)
|
92
92
|
end
|
93
93
|
|
94
94
|
js = []
|
@@ -8,7 +8,7 @@ module AbAdmin
|
|
8
8
|
@builder.template.concat @builder.template.javascript_include_tag('/javascripts/ckeditor/init')
|
9
9
|
@builder.template.instance_variable_set(:@ckeditor_init, true)
|
10
10
|
end
|
11
|
-
input_html_options.reverse_merge!({:
|
11
|
+
input_html_options.reverse_merge!({width: 800, height: 200, toolbar: 'Easy'})
|
12
12
|
@builder.cktext_area(attribute_name, input_html_options)
|
13
13
|
end
|
14
14
|
end
|
@@ -5,7 +5,7 @@ module AbAdmin
|
|
5
5
|
def input
|
6
6
|
value = @builder.object[attribute_name].to_s.sub(/^#|/, '#')
|
7
7
|
name = "#{@builder.object_name}[#{attribute_name}]"
|
8
|
-
@builder.template.tag(:input, input_html_options.merge(:
|
8
|
+
@builder.template.tag(:input, input_html_options.merge(type: 'color', name: name, value: value))
|
9
9
|
end
|
10
10
|
end
|
11
11
|
end
|
@@ -16,14 +16,14 @@ module AbAdmin
|
|
16
16
|
|
17
17
|
if [:date, :datetime].include? input_type
|
18
18
|
attr = "#{data_target}_date"
|
19
|
-
html << template.text_field_tag(attr, object.send(attribute_name).try(:strftime,
|
20
|
-
:
|
19
|
+
html << template.text_field_tag(attr, object.send(attribute_name).try(:strftime, '%d.%m.%Y'), id: attr,
|
20
|
+
class: 'datepicker input-small', data: {target: data_target})
|
21
21
|
end
|
22
22
|
|
23
23
|
if [:time, :datetime].include? input_type
|
24
24
|
attr = "#{data_target}_time"
|
25
|
-
html << template.text_field(attr, object.send(attribute_name).try(:strftime,
|
26
|
-
:
|
25
|
+
html << template.text_field(attr, object.send(attribute_name).try(:strftime, '%H:%M'), id: attr,
|
26
|
+
class: 'timepicker input-small', data: {target: data_target})
|
27
27
|
end
|
28
28
|
|
29
29
|
html.join.html_safe
|
@@ -38,11 +38,11 @@ module AbAdmin
|
|
38
38
|
def value_format
|
39
39
|
case input_type
|
40
40
|
when :date then
|
41
|
-
|
41
|
+
'%d.%m.%Y'
|
42
42
|
when :datetime then
|
43
|
-
|
43
|
+
'%d.%m.%Y %H:%M'
|
44
44
|
when :time then
|
45
|
-
|
45
|
+
'%H:%M'
|
46
46
|
end
|
47
47
|
end
|
48
48
|
|
@@ -11,7 +11,7 @@ module AbAdmin
|
|
11
11
|
end
|
12
12
|
|
13
13
|
def form_builder
|
14
|
-
manager.form ||= ::AbAdmin::Config::Form.default_for_model(resource_class, :
|
14
|
+
manager.form ||= ::AbAdmin::Config::Form.default_for_model(resource_class, skip: [:id, :created_at, :updated_at, :lft, :rgt, :depth])
|
15
15
|
end
|
16
16
|
|
17
17
|
def show_builder
|
@@ -21,10 +21,10 @@ module AbAdmin
|
|
21
21
|
def action_item_admin_path(name, record=nil)
|
22
22
|
custom_action = manager.custom_action_for(name, self)
|
23
23
|
if custom_action.collection?
|
24
|
-
admin_collection_action_path(:
|
24
|
+
admin_collection_action_path(model_name: resource_collection_name, custom_action: custom_action.name)
|
25
25
|
else
|
26
26
|
record ||= resource
|
27
|
-
admin_member_action_path(:
|
27
|
+
admin_member_action_path(model_name: resource_collection_name, id: record.id, custom_action: custom_action.name)
|
28
28
|
end
|
29
29
|
end
|
30
30
|
end
|
@@ -3,17 +3,17 @@ module AbAdmin
|
|
3
3
|
class SearchFormBuilder < ::Ransack::Helpers::FormBuilder
|
4
4
|
delegate :content_tag, :tag, :params,
|
5
5
|
:text_field_tag, :check_box_tag, :radio_button_tag, :label_tag, :select_tag,
|
6
|
-
:options_for_select, :options_from_collection_for_select, :hidden_field_tag, :
|
6
|
+
:options_for_select, :options_from_collection_for_select, :hidden_field_tag, to: :@template
|
7
7
|
|
8
8
|
def input(attr, options={})
|
9
9
|
filed_type = filed_type(attr, options)
|
10
|
-
content_tag :div, :
|
10
|
+
content_tag :div, class: "clearfix #{filed_type}" do
|
11
11
|
send("#{filed_type}_field", attr, options)
|
12
12
|
end
|
13
13
|
end
|
14
14
|
|
15
15
|
def select_field(attr, options={})
|
16
|
-
label(attr, options[:label]) + content_tag(:div, :
|
16
|
+
label(attr, options[:label]) + content_tag(:div, class: 'controls') do
|
17
17
|
param = "#{options[:value_attr] || attr}_eq"
|
18
18
|
|
19
19
|
if options[:collection].is_a?(Proc)
|
@@ -31,21 +31,21 @@ module AbAdmin
|
|
31
31
|
options[:html_options][:class] = [options[:html_options][:class], 'fancy_select'].join(' ')
|
32
32
|
end
|
33
33
|
|
34
|
-
html_options = options[:html_options].merge(:
|
34
|
+
html_options = options[:html_options].merge(include_blank: true, id: "q_#{attr}")
|
35
35
|
select_tag("q[#{param}]", options_for_select(collection, params[:q][param]), html_options)
|
36
36
|
end
|
37
37
|
end
|
38
38
|
|
39
39
|
def date_field(attr, options={})
|
40
|
-
label(attr, options[:label]) + content_tag(:div, :
|
40
|
+
label(attr, options[:label]) + content_tag(:div, class: 'controls') do
|
41
41
|
gt_param, lt_param = "#{attr}_gteq", "#{attr}_lteq"
|
42
|
-
text_field_tag("q[#{gt_param}]", params[:q][gt_param], :
|
43
|
-
text_field_tag("q[#{lt_param}]", params[:q][lt_param], :
|
42
|
+
text_field_tag("q[#{gt_param}]", params[:q][gt_param], class: 'input-small datepicker', autocomplete: 'off') + ' - ' +
|
43
|
+
text_field_tag("q[#{lt_param}]", params[:q][lt_param], class: 'input-small datepicker', autocomplete: 'off', id: "q_#{attr}")
|
44
44
|
end
|
45
45
|
end
|
46
46
|
|
47
47
|
def string_field(attr, options={})
|
48
|
-
label(attr, options[:label]) + content_tag(:div, :
|
48
|
+
label(attr, options[:label]) + content_tag(:div, class: 'controls') do
|
49
49
|
param = "#{options[:value_attr] || attr}_cont"
|
50
50
|
options[:input_html] ||= {}
|
51
51
|
options[:input_html][:id] = "q_#{attr}"
|
@@ -54,29 +54,29 @@ module AbAdmin
|
|
54
54
|
end
|
55
55
|
|
56
56
|
def ac_string_field(attr, options={})
|
57
|
-
options.reverse_deep_merge!({:
|
57
|
+
options.reverse_deep_merge!({input_html: {class: 'ac_field', data: {class: @object.klass.name}}})
|
58
58
|
string_field(attr, options)
|
59
59
|
end
|
60
60
|
|
61
61
|
def number_field(attr, options={})
|
62
|
-
label(attr, options[:label]) + content_tag(:div, :
|
62
|
+
label(attr, options[:label]) + content_tag(:div, class: 'controls') do
|
63
63
|
opts = [['=', 'eq'], ['>', 'gt'], ['<', 'lt']].map { |m| [m[0], "#{attr}_#{m[1]}"] }
|
64
64
|
current_filter = (opts.detect { |m| params[:q][m[1]].present? } || opts.first)[1]
|
65
|
-
select_tag('', options_for_select(opts, current_filter), :
|
66
|
-
text_field_tag("q[#{current_filter}]", params[:q][current_filter], :
|
65
|
+
select_tag('', options_for_select(opts, current_filter), class: 'input-small predicate-select') +
|
66
|
+
text_field_tag("q[#{current_filter}]", params[:q][current_filter], class: 'input-small')
|
67
67
|
end
|
68
68
|
end
|
69
69
|
|
70
70
|
def boolean_field(attr, options={})
|
71
|
-
content_tag(:div, :
|
71
|
+
content_tag(:div, class: 'pull-left') do
|
72
72
|
param = "#{attr}_eq"
|
73
|
-
content_tag(:label, :
|
74
|
-
check_box_tag("q[#{param}]", 1, params[:q][param].to_i == 1, :
|
73
|
+
content_tag(:label, class: 'checkbox inline') do
|
74
|
+
check_box_tag("q[#{param}]", 1, params[:q][param].to_i == 1, class: 'inline', id: "q_#{attr}") + I18n.t('simple_form.yes')
|
75
75
|
end +
|
76
|
-
content_tag(:label, :
|
77
|
-
check_box_tag("q[#{param}]", 0, params[:q][param] && params[:q][param].to_i == 0, :
|
76
|
+
content_tag(:label, class: 'checkbox inline') do
|
77
|
+
check_box_tag("q[#{param}]", 0, params[:q][param] && params[:q][param].to_i == 0, class: 'inline') + I18n.t('simple_form.no')
|
78
78
|
end
|
79
|
-
end + label(attr, options[:label], :
|
79
|
+
end + label(attr, options[:label], class: 'right-label')
|
80
80
|
end
|
81
81
|
|
82
82
|
def hidden_field(attr, options={})
|
@@ -8,23 +8,23 @@ module AbAdmin
|
|
8
8
|
|
9
9
|
def resource_path(rec=nil, options={})
|
10
10
|
r = rec || resource
|
11
|
-
options.reverse_merge!(:
|
11
|
+
options.reverse_merge!(id: r.id, action: :show)
|
12
12
|
url_for options
|
13
13
|
end
|
14
14
|
|
15
15
|
def edit_resource_path(rec=nil, options={})
|
16
16
|
r = rec || resource
|
17
|
-
options.reverse_merge!(:
|
17
|
+
options.reverse_merge!(id: r.id, action: :edit)
|
18
18
|
url_for options
|
19
19
|
end
|
20
20
|
|
21
21
|
def new_resource_path(options={})
|
22
|
-
options.reverse_merge!(:
|
22
|
+
options.reverse_merge!(action: :new)
|
23
23
|
url_for options
|
24
24
|
end
|
25
25
|
|
26
26
|
def collection_path(options={})
|
27
|
-
options.reverse_merge!(:
|
27
|
+
options.reverse_merge!(action: :index)
|
28
28
|
url_for options
|
29
29
|
end
|
30
30
|
end
|
data/lib/ab_admin.rb
CHANGED
@@ -50,6 +50,7 @@ module AbAdmin
|
|
50
50
|
autoload :Headerable, 'ab_admin/concerns/headerable'
|
51
51
|
autoload :NestedSet, 'ab_admin/concerns/nested_set'
|
52
52
|
autoload :Validations, 'ab_admin/concerns/validations'
|
53
|
+
autoload :Reloadable, 'ab_admin/concerns/reloadable'
|
53
54
|
end
|
54
55
|
|
55
56
|
module Controllers
|
@@ -88,8 +89,6 @@ module AbAdmin
|
|
88
89
|
autoload :CkeditorInput, 'ab_admin/views/inputs/ckeditor_input'
|
89
90
|
autoload :ColorInput, 'ab_admin/views/inputs/color_input'
|
90
91
|
autoload :EditorInput, 'ab_admin/views/inputs/editor_input'
|
91
|
-
autoload :TreeSelectInput, 'ab_admin/views/inputs/tree_select_input'
|
92
|
-
autoload :AssociationInput, 'ab_admin/views/inputs/association_input'
|
93
92
|
autoload :DateTimeInput, 'ab_admin/views/inputs/date_time_input'
|
94
93
|
autoload :TokenInput, 'ab_admin/views/inputs/token_input'
|
95
94
|
end
|
@@ -6,7 +6,7 @@ module AbAdmin
|
|
6
6
|
|
7
7
|
source_root File.expand_path('../templates', __FILE__)
|
8
8
|
|
9
|
-
argument :name, :
|
9
|
+
argument :name, type: :string, default: 'fake'
|
10
10
|
|
11
11
|
def create_migration
|
12
12
|
migration_template 'migration.erb', "db/migrate/#{migration_name}.rb"
|
@@ -42,7 +42,7 @@ module AbAdmin
|
|
42
42
|
# Add devise routes
|
43
43
|
def add_routes
|
44
44
|
route 'devise_for :users, ::AbAdmin::Devise.config'
|
45
|
-
route
|
45
|
+
route 'root to: redirect(\'/users/sign_in\')'
|
46
46
|
end
|
47
47
|
|
48
48
|
def autoload_paths
|
@@ -52,7 +52,7 @@ module AbAdmin
|
|
52
52
|
code = 'config.autoload_paths += %W(#{config.root}/app/models/defaults #{config.root}/app/models/ab_admin)'
|
53
53
|
|
54
54
|
in_root do
|
55
|
-
inject_into_file 'config/application.rb', " #{code}\n", {:
|
55
|
+
inject_into_file 'config/application.rb', " #{code}\n", {after: sentinel, verbose: false}
|
56
56
|
end
|
57
57
|
end
|
58
58
|
|
@@ -20,7 +20,7 @@ end
|
|
20
20
|
def insert_structures
|
21
21
|
Structure.truncate!
|
22
22
|
|
23
|
-
main_page = Structure.create!({:
|
23
|
+
main_page = Structure.create!({title: 'Главная страница', slug: 'main-page', structure_type: StructureType.main, parent: nil}, as: :admin)
|
24
24
|
end
|
25
25
|
|
26
26
|
insert_user
|
@@ -10,8 +10,8 @@ worker_processes 2
|
|
10
10
|
|
11
11
|
working_directory APP_ROOT
|
12
12
|
|
13
|
-
listen "#{APP_ROOT}/tmp/sockets/unicorn.sock", :
|
14
|
-
listen 8080, :
|
13
|
+
listen "#{APP_ROOT}/tmp/sockets/unicorn.sock", backlog: 64
|
14
|
+
listen 8080, tcp_nopush: true
|
15
15
|
|
16
16
|
timeout 90
|
17
17
|
|
@@ -43,7 +43,7 @@ end
|
|
43
43
|
after_fork do |server, worker|
|
44
44
|
# per-process listener ports for debugging/admin/migrations
|
45
45
|
# addr = "127.0.0.1:#{9293 + worker.nr}"
|
46
|
-
# server.listen(addr, :
|
46
|
+
# server.listen(addr, tries: -1, delay: 5, tcp_nopush: true)
|
47
47
|
|
48
48
|
defined?(ActiveRecord::Base) and
|
49
49
|
ActiveRecord::Base.establish_connection
|
@@ -4,9 +4,9 @@ module Admin::StructuresHelper
|
|
4
4
|
case structure.structure_type
|
5
5
|
when StructureType.static_page
|
6
6
|
if structure.static_page
|
7
|
-
edit_admin_structure_static_page_path(:
|
7
|
+
edit_admin_structure_static_page_path(structure_id: structure.id)
|
8
8
|
else
|
9
|
-
new_admin_structure_static_page_path(:
|
9
|
+
new_admin_structure_static_page_path(structure_id: structure.id)
|
10
10
|
end
|
11
11
|
when StructureType.posts
|
12
12
|
'#'
|
@@ -2,7 +2,7 @@ class Ability
|
|
2
2
|
include CanCan::Ability
|
3
3
|
|
4
4
|
def initialize(user)
|
5
|
-
alias_action :destroy, :
|
5
|
+
alias_action :destroy, to: :delete
|
6
6
|
|
7
7
|
@user = user
|
8
8
|
|
@@ -33,13 +33,13 @@ class Ability
|
|
33
33
|
default
|
34
34
|
can :manage, Dashboard
|
35
35
|
can [:read, :create], AdminComment
|
36
|
-
can :destroy, AdminComment, :
|
37
|
-
cannot :destroy, User, :
|
36
|
+
can :destroy, AdminComment, author_id: @user.id
|
37
|
+
cannot :destroy, User, id: @user.id
|
38
38
|
end
|
39
39
|
|
40
40
|
def admin
|
41
41
|
can :manage, :all
|
42
42
|
|
43
|
-
cannot :destroy, User, :
|
43
|
+
cannot :destroy, User, id: @user.id
|
44
44
|
end
|
45
45
|
end
|
@@ -1,8 +1,8 @@
|
|
1
1
|
class AdminComment < ActiveRecord::Base
|
2
2
|
attr_accessible :body, :resource_id, :resource_type
|
3
3
|
|
4
|
-
belongs_to :resource, :
|
5
|
-
belongs_to :author, :
|
4
|
+
belongs_to :resource, polymorphic: true
|
5
|
+
belongs_to :author, class_name: 'User'
|
6
6
|
belongs_to :user
|
7
7
|
|
8
8
|
validates_presence_of :resource
|
@@ -19,11 +19,11 @@ class AdminComment < ActiveRecord::Base
|
|
19
19
|
end
|
20
20
|
|
21
21
|
def self.find_for_resource(resource)
|
22
|
-
where(:
|
22
|
+
where(resource_type: resource_type(resource), resource_id: resource.id)
|
23
23
|
end
|
24
24
|
|
25
25
|
def for_form
|
26
|
-
{:
|
26
|
+
{body: body, id: id, author_name: user.try(:name), author_id: user.try(:id), created_at: I18n.l(created_at, format: :long)}
|
27
27
|
end
|
28
28
|
|
29
29
|
end
|
@@ -1,8 +1,8 @@
|
|
1
1
|
class Avatar < Asset
|
2
2
|
sunrise_uploader AvatarUploader
|
3
3
|
|
4
|
-
validates :data_content_type, :
|
4
|
+
validates :data_content_type, inclusion: {in: AbAdmin.image_types }
|
5
5
|
validates_integrity_of :data
|
6
|
-
validates_filesize_of :data, :
|
6
|
+
validates_filesize_of :data, maximum: 1.megabyte
|
7
7
|
|
8
8
|
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
class Picture < Asset
|
2
2
|
sunrise_uploader PictureUploader
|
3
3
|
|
4
|
-
validates :data_content_type, :
|
4
|
+
validates :data_content_type, inclusion: {in: AbAdmin.image_types }
|
5
5
|
validates_integrity_of :data
|
6
|
-
validates_filesize_of :data, :
|
6
|
+
validates_filesize_of :data, maximum: 2.megabytes
|
7
7
|
end
|
@@ -3,12 +3,12 @@ class StaticPage < ActiveRecord::Base
|
|
3
3
|
|
4
4
|
belongs_to :structure
|
5
5
|
|
6
|
-
has_many :pictures, :
|
7
|
-
has_many :attachment_files, :
|
6
|
+
has_many :pictures, as: :assetable, dependent: :destroy
|
7
|
+
has_many :attachment_files, as: :assetable, dependent: :destroy, autosave: true
|
8
8
|
|
9
9
|
validates_presence_of :title, :content
|
10
10
|
|
11
|
-
enumerated_attribute :static_page_type, :
|
11
|
+
enumerated_attribute :static_page_type, id_attribute: :kind
|
12
12
|
|
13
13
|
fileuploads :pictures, :attachment_files
|
14
14
|
translates :title, :content
|
@@ -4,7 +4,7 @@ class Structure < ActiveRecord::Base
|
|
4
4
|
attr_accessible :kind, :position, :parent_id, :title, :redirect_url, :is_visible,
|
5
5
|
:structure_type, :position_type, :slug, :parent
|
6
6
|
|
7
|
-
has_one :picture, :
|
7
|
+
has_one :picture, as: :assetable, dependent: :destroy
|
8
8
|
|
9
9
|
fileuploads :picture
|
10
10
|
translates :title, :redirect_url
|
@@ -12,7 +12,7 @@ class Structure < ActiveRecord::Base
|
|
12
12
|
|
13
13
|
include AbAdmin::Concerns::AdminAddition
|
14
14
|
extend FriendlyId
|
15
|
-
friendly_id :title, :
|
15
|
+
friendly_id :title, use: :slugged
|
16
16
|
|
17
17
|
default_scope nested_set.includes(:translations)
|
18
18
|
|
@@ -1,14 +1,14 @@
|
|
1
1
|
class User < ActiveRecord::Base
|
2
2
|
devise :database_authenticatable, :confirmable, :lockable, #:timeoutable,
|
3
3
|
:recoverable, :rememberable, :trackable, :validatable, :registerable,
|
4
|
-
:encryptable, :
|
4
|
+
:encryptable, encryptor: :sha512
|
5
5
|
|
6
6
|
attr_accessible :password, :password_confirmation, :email, :remember_me,
|
7
7
|
:login, :first_name, :last_name, :patronymic, :phone, :skype, :web_site, :address, :birthday,
|
8
8
|
:time_zone, :locale, :bg_color, :gender
|
9
9
|
|
10
10
|
|
11
|
-
attr_accessible :user_role_id, :trust_state, :
|
11
|
+
attr_accessible :user_role_id, :trust_state, as: :admin
|
12
12
|
|
13
13
|
include AbAdmin::Concerns::AdminAddition
|
14
14
|
include AbAdmin::Models::User
|