ab_admin 0.8.3 → 0.9.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/MIT-LICENSE +1 -1
- data/README.md +11 -5
- data/app/assets/javascripts/ab_admin/components/admin_assets.js.coffee +0 -25
- data/app/assets/javascripts/ab_admin/components/google_translate.js.coffee +3 -5
- data/app/assets/javascripts/ab_admin/components/in_place_edit.js.coffee +5 -1
- data/app/assets/javascripts/ab_admin/core/columns_hider.js.coffee +24 -23
- data/app/assets/javascripts/ab_admin/core/init.js.coffee +6 -2
- data/app/assets/javascripts/ab_admin/core/search_form.js.coffee +1 -7
- data/app/assets/javascripts/ab_admin/core/ui_utils.js.coffee +2 -6
- data/app/assets/javascripts/ab_admin/core/utils.js.coffee +8 -2
- data/app/assets/javascripts/ab_admin/main.js +2 -2
- data/app/assets/stylesheets/ab_admin/bootstrap_and_overrides.scss +35 -10
- data/app/assets/stylesheets/ab_admin/components/_base.scss +21 -1
- data/app/assets/stylesheets/ab_admin/components/_form.scss +13 -17
- data/app/assets/stylesheets/ab_admin/components/_grid_view.scss +2 -2
- data/app/assets/stylesheets/ab_admin/components/_locale_tabs.scss +11 -23
- data/app/assets/stylesheets/ab_admin/components/_navigation.scss +0 -9
- data/app/assets/stylesheets/ab_admin/components/_table_view.scss +10 -2
- data/app/assets/stylesheets/ab_admin/components/_tooltip.scss +80 -0
- data/app/assets/stylesheets/ab_admin/components/_tree_view.scss +1 -1
- data/app/assets/stylesheets/ab_admin/devise.scss +2 -2
- data/app/assets/stylesheets/ab_admin/fileupload.scss +2 -9
- data/app/assets/stylesheets/ab_admin/main.scss +0 -1
- data/app/controllers/admin/base_controller.rb +67 -63
- data/app/controllers/admin/dashboards_controller.rb +2 -2
- data/app/controllers/admin/locators_controller.rb +8 -6
- data/app/controllers/admin/manager_controller.rb +2 -2
- data/app/controllers/admin/static_pages_controller.rb +0 -4
- data/app/controllers/admin/structures_controller.rb +2 -2
- data/app/views/admin/assets/batch_edit.html.slim +1 -1
- data/app/views/admin/base/_search_layout.html.slim +6 -5
- data/app/views/admin/base/create.js.erb +5 -2
- data/app/views/admin/base/index.html.slim +4 -4
- data/app/views/admin/base/update.js.erb +5 -0
- data/app/views/admin/fileupload/_asset_templates.html.slim +1 -2
- data/app/views/admin/fileupload/_image.html.slim +1 -2
- data/app/views/admin/locators/edit.html.slim +7 -6
- data/app/views/admin/manager/_map.html.slim +4 -0
- data/app/views/admin/manager/_table.html.slim +1 -1
- data/app/views/admin/shared/_content_actions.html.slim +19 -21
- data/app/views/admin/shared/_flash.html.slim +5 -4
- data/app/views/admin/shared/_locale_tabs.html.slim +2 -2
- data/app/views/admin/shared/_main_menu.html.slim +1 -1
- data/app/views/admin/structures/_form.html.slim +1 -1
- data/app/views/admin/users/_form.html.slim +1 -1
- data/app/views/admin/users/_search_form.html.slim +1 -1
- data/app/views/layouts/admin/_footer.html.slim +0 -1
- data/app/views/layouts/admin/_navigation.html.slim +1 -1
- data/app/views/layouts/admin/application.html.slim +2 -2
- data/config/locales/de.yml +1 -2
- data/config/locales/en.yml +1 -2
- data/config/locales/ru.yml +0 -1
- data/config/locales/uk.yml +0 -1
- data/lib/ab_admin.rb +34 -33
- data/lib/ab_admin/abstract_resource.rb +1 -1
- data/lib/ab_admin/carrierwave/base_uploader.rb +1 -2
- data/lib/ab_admin/concerns/admin_addition.rb +0 -30
- data/lib/ab_admin/concerns/translations_macro.rb +97 -0
- data/lib/ab_admin/concerns/utilities.rb +1 -1
- data/lib/ab_admin/config/base.rb +7 -0
- data/lib/ab_admin/controllers/callbacks.rb +3 -26
- data/lib/ab_admin/core_ext/array.rb +4 -48
- data/lib/ab_admin/core_ext/hash.rb +2 -31
- data/lib/ab_admin/core_ext/other.rb +0 -6
- data/lib/ab_admin/core_ext/string.rb +0 -80
- data/lib/ab_admin/engine.rb +1 -0
- data/lib/ab_admin/hooks/will_paginate_id_prefetch.rb +8 -6
- data/lib/ab_admin/hooks/will_paginate_no_uri.rb +1 -1
- data/lib/ab_admin/i18n_tools/google_translate.rb +3 -1
- data/lib/ab_admin/i18n_tools/model_translator.rb +1 -1
- data/lib/ab_admin/models/header.rb +2 -2
- data/lib/ab_admin/models/locator.rb +28 -2
- data/lib/ab_admin/models/user.rb +12 -48
- data/lib/ab_admin/utils/csv_document.rb +5 -3
- data/lib/ab_admin/utils/eval_helpers.rb +6 -3
- data/lib/ab_admin/utils/xls_document.rb +18 -16
- data/lib/ab_admin/version.rb +1 -1
- data/lib/ab_admin/views/admin_helpers.rb +10 -12
- data/lib/ab_admin/views/admin_navigation_helpers.rb +7 -8
- data/lib/ab_admin/views/form_builder.rb +7 -5
- data/lib/ab_admin/views/helpers.rb +0 -9
- data/lib/ab_admin/views/inputs/ckeditor_input.rb +4 -4
- data/lib/ab_admin/views/manager_helpers.rb +8 -5
- data/lib/ab_admin/views/search_form_builder.rb +2 -2
- data/lib/ab_admin/views/will_paginate_bootstrap_renderer.rb +60 -0
- data/lib/generators/ab_admin/glob/glob_generator.rb +4 -5
- data/lib/generators/ab_admin/glob/templates/migration.erb +10 -7
- data/lib/generators/ab_admin/install/templates/config/ab_admin.rb.erb +1 -1
- data/lib/generators/ab_admin/install/templates/models/user.rb +0 -11
- data/lib/generators/ab_admin/install/templates/spec/spec_helper.rb +0 -1
- data/lib/generators/ab_admin/install/templates/spec/support/database_cleaner.rb +8 -11
- data/lib/generators/ab_admin/model/model_generator.rb +3 -4
- data/lib/generators/ab_admin/model/templates/resource.erb +5 -2
- data/lib/generators/ab_admin/resource/templates/controller.erb +2 -2
- metadata +37 -79
- data/app/assets/images/admin/Jcrop.gif +0 -0
- data/app/assets/images/admin/flags/de.png +0 -0
- data/app/assets/images/admin/flags/en.png +0 -0
- data/app/assets/images/admin/flags/es.png +0 -0
- data/app/assets/images/admin/flags/fr.png +0 -0
- data/app/assets/images/admin/flags/it.png +0 -0
- data/app/assets/images/admin/flags/ja.png +0 -0
- data/app/assets/images/admin/flags/pl.png +0 -0
- data/app/assets/images/admin/flags/ru.png +0 -0
- data/app/assets/images/admin/flags/uk.png +0 -0
- data/app/assets/javascripts/ab_admin/components/croppable_image.js.coffee +0 -33
- data/app/assets/stylesheets/ab_admin/components/_columns_hider.scss +0 -5
- data/app/assets/stylesheets/ab_admin/components/_perms.scss +0 -39
- data/app/views/admin/shared/_columns_hider.html.slim +0 -9
- data/lib/ab_admin/hooks/globalize_locale_suffix_accessors.rb +0 -25
- data/lib/ab_admin/hooks/globalize_valid_locale.rb +0 -9
- data/lib/generators/ab_admin/ckeditor_assets/ckeditor_assets_generator.rb +0 -19
- data/lib/generators/template.rb +0 -96
data/lib/ab_admin/version.rb
CHANGED
@@ -1,7 +1,6 @@
|
|
1
1
|
module AbAdmin
|
2
2
|
module Views
|
3
3
|
module AdminHelpers
|
4
|
-
|
5
4
|
def admin_form_for(object, *args, &block)
|
6
5
|
record = Array(object).last
|
7
6
|
record.fallbacks_for_empty_translations = false if record.respond_to?(:fallbacks_for_empty_translations)
|
@@ -21,11 +20,11 @@ module AbAdmin
|
|
21
20
|
end
|
22
21
|
end
|
23
22
|
|
24
|
-
def editable_bool(item, attr, label: nil)
|
23
|
+
def editable_bool(item, attr, label: nil, wrapper_class: nil)
|
25
24
|
url = "/admin/#{item.class.model_name.plural}/#{item.id}.json"
|
26
25
|
html = check_box_tag("#{item.class.model_name.singular}[#{attr}]", '1', item.send(attr), class: 'js-auto-submit-checkbox', data: {url: url})
|
27
26
|
html = content_tag(:label, "#{label} #{html}".html_safe) if label
|
28
|
-
content_tag :div, html, class: 'auto-submit-checkbox-wrap white-space-nowrap'
|
27
|
+
content_tag :div, html, class: ['auto-submit-checkbox-wrap', 'white-space-nowrap', ('tool' unless label), wrapper_class], title: attr
|
29
28
|
end
|
30
29
|
|
31
30
|
def admin_editable(item, attr, opts=nil)
|
@@ -82,7 +81,7 @@ module AbAdmin
|
|
82
81
|
end
|
83
82
|
|
84
83
|
def options_for_ckeditor(options = {})
|
85
|
-
{width: 930, height: 200,
|
84
|
+
{width: 930, height: 200, namespace: ''}.update(options)
|
86
85
|
end
|
87
86
|
|
88
87
|
def admin_tree_item(item)
|
@@ -97,13 +96,13 @@ module AbAdmin
|
|
97
96
|
def admin_layout_css
|
98
97
|
css = []
|
99
98
|
css << 'content_with_sidebar' if settings[:sidebar] || content_for?(:sidebar)
|
100
|
-
css << 'well' if settings[:well] && current_index_view !=
|
101
|
-
css << "#{current_index_view}_view"
|
99
|
+
css << 'well' if !@settings[:well].is_a?(FalseClass) && (collection_action? || %w(show history).include?(action_name)) && @settings[:current_index_view] != :tree
|
100
|
+
css << "#{settings[:current_index_view]}_view"
|
102
101
|
css
|
103
102
|
end
|
104
103
|
|
105
104
|
def admin_title
|
106
|
-
base = @breadcrumbs ? @breadcrumbs.
|
105
|
+
base = @breadcrumbs ? @breadcrumbs.map{|b| b[:name] }.reverse : []
|
107
106
|
base << @page_title || 'Ab Admin'
|
108
107
|
base.join(' - ')
|
109
108
|
end
|
@@ -127,6 +126,10 @@ module AbAdmin
|
|
127
126
|
"<i class='icon-#{name} #{'icon-white' if white}'></i> ".html_safe
|
128
127
|
end
|
129
128
|
|
129
|
+
def locale_flag(code)
|
130
|
+
(AbAdmin.locale_to_country_code[code] || code).to_s[0..1].upcase.tr('A-Z', '🇦-🇿')
|
131
|
+
end
|
132
|
+
|
130
133
|
def admin_pretty_data(object)
|
131
134
|
case object
|
132
135
|
when String, Integer, BigDecimal, Float
|
@@ -167,10 +170,6 @@ module AbAdmin
|
|
167
170
|
image_tag_if(item.send(assoc).try(:url, size))
|
168
171
|
end
|
169
172
|
|
170
|
-
def per_page_variants
|
171
|
-
AbAdmin.per_page_variants.map{|variant| [variant, max_per_page].min }.uniq
|
172
|
-
end
|
173
|
-
|
174
173
|
# input_set 'title', legend_class: 'do_sort', label_class: 'label-info' do
|
175
174
|
def input_set(title, options={}, &block)
|
176
175
|
options.reverse_merge!(class: "inputs well well-small clearfix #{options.delete(:legend_class) || 'do_sort'}", id: options.delete(:legend_id))
|
@@ -191,7 +190,6 @@ module AbAdmin
|
|
191
190
|
exec = options[:exec].nil? ? true : options[:exec]
|
192
191
|
case symbol_or_proc
|
193
192
|
when String
|
194
|
-
ActiveSupport::Deprecation.warn('`call_method_or_proc_on` don\'t accept method name as String, use Symbol instead') if symbol_or_proc =~ /\A\w+\z/
|
195
193
|
symbol_or_proc
|
196
194
|
when Symbol
|
197
195
|
obj.send(symbol_or_proc.to_sym)
|
@@ -16,7 +16,7 @@ module AbAdmin
|
|
16
16
|
end
|
17
17
|
|
18
18
|
def list_sort_link(attribute, options={})
|
19
|
-
adapter = options[:adapter] ||
|
19
|
+
adapter = options[:adapter] || ransack_collection
|
20
20
|
if adapter && adapter.klass == resource_class
|
21
21
|
sort_link(adapter, attribute, options)
|
22
22
|
else
|
@@ -25,7 +25,7 @@ module AbAdmin
|
|
25
25
|
end
|
26
26
|
|
27
27
|
def sort_link(adapter, attribute, options={})
|
28
|
-
name = options
|
28
|
+
name = options.delete(:title) || (attribute.is_a?(Symbol) ? ha(attribute) : attribute)
|
29
29
|
return name unless adapter
|
30
30
|
search_params = (params[:q] || {}).to_h.with_indifferent_access
|
31
31
|
attr_name = (options.delete(:column) || attribute).to_s
|
@@ -48,7 +48,7 @@ module AbAdmin
|
|
48
48
|
html_options = options.delete(:html_options) || {}
|
49
49
|
html_options[:class] = ['sort_link', current_dir, html_options[:class]].compact.join(' ')
|
50
50
|
|
51
|
-
options.merge!(q: search_params.merge(s: "#{attr_name} #{new_dir}"), **
|
51
|
+
options.merge!(q: search_params.merge(s: "#{attr_name} #{new_dir}"), **collection_params)
|
52
52
|
link_to [name, order_indicator_for(current_dir)].join(' ').html_safe, url_for(options), html_options
|
53
53
|
end
|
54
54
|
|
@@ -62,8 +62,8 @@ module AbAdmin
|
|
62
62
|
end
|
63
63
|
end
|
64
64
|
|
65
|
-
def
|
66
|
-
params.slice(*button_scopes.map(&:first)).permit!.to_h.symbolize_keys
|
65
|
+
def collection_params
|
66
|
+
params.slice(:index_view, *button_scopes.map(&:first)).permit!.to_h.symbolize_keys
|
67
67
|
end
|
68
68
|
|
69
69
|
def short_action_link(action, item)
|
@@ -167,8 +167,7 @@ module AbAdmin
|
|
167
167
|
if total_entries.zero?
|
168
168
|
t('will_paginate.pagination_info_empty')
|
169
169
|
else
|
170
|
-
|
171
|
-
t('will_paginate.pagination_info', from: offset + 1, to: [offset + per_page, total_entries].min, count: total_entries).html_safe
|
170
|
+
t('will_paginate.pagination_info', from: offset + 1, to: [offset + settings[:per_page], total_entries].min, count: total_entries).html_safe
|
172
171
|
end
|
173
172
|
end
|
174
173
|
|
@@ -192,7 +191,7 @@ module AbAdmin
|
|
192
191
|
end
|
193
192
|
|
194
193
|
def admin_comments_button(item)
|
195
|
-
title = [icon('comment', true), item.
|
194
|
+
title = [icon('comment', true), (item.admin_comments_count unless item.admin_comments_count.zero?)].compact.join(' ').html_safe
|
196
195
|
link_to title, admin_admin_comments_path(resource_type: item.class.name, resource_id: item.id), remote: true,
|
197
196
|
class: 'btn btn-info list_admin_comments_link'
|
198
197
|
end
|
@@ -93,21 +93,23 @@ module AbAdmin
|
|
93
93
|
return if @disable_all
|
94
94
|
model = @object.class.reflect_on_association(assoc).klass
|
95
95
|
title = [@template.icon('plus', true), I18n.t('admin.add'), options[:title] || model.model_name.human].join(' ').html_safe
|
96
|
-
|
96
|
+
options[:class] = "btn btn-primary #{options[:class]}"
|
97
|
+
link_to_add title, assoc, options
|
97
98
|
end
|
98
99
|
|
99
|
-
def link_to_remove_assoc
|
100
|
+
def link_to_remove_assoc(options={})
|
100
101
|
return if @disable_all
|
101
|
-
|
102
|
+
options[:class] ||= 'btn btn-danger btn-mini pull-right'
|
103
|
+
link_to_remove @template.icon('trash', true) + I18n.t('admin.delete'), options
|
102
104
|
end
|
103
105
|
|
104
106
|
def locale_tabs(options={}, &block)
|
105
107
|
locale_html = {}
|
106
|
-
options[:locales] ||=
|
108
|
+
options[:locales] ||= AbAdmin.translated_locales
|
107
109
|
options[:locales].each do |l|
|
108
110
|
locale_html[l] = template.capture { block.call(l) }
|
109
111
|
end
|
110
|
-
template.render 'admin/shared/locale_tabs', locale_html: locale_html, locales: options[:locales]
|
112
|
+
template.render 'admin/shared/locale_tabs', locale_html: locale_html, locales: options[:locales], tab_nav: options[:tab_nav]
|
111
113
|
end
|
112
114
|
|
113
115
|
def save_buttons
|
@@ -1,15 +1,6 @@
|
|
1
1
|
module AbAdmin
|
2
2
|
module Views
|
3
3
|
module Helpers
|
4
|
-
|
5
|
-
def admin?
|
6
|
-
user_signed_in? && current_user.admin?
|
7
|
-
end
|
8
|
-
|
9
|
-
def moderator?
|
10
|
-
user_signed_in? && current_user.moderator?
|
11
|
-
end
|
12
|
-
|
13
4
|
def as_html(text)
|
14
5
|
return ''.html_safe if text.nil?
|
15
6
|
Nokogiri::HTML.fragment(text).to_html.html_safe
|
@@ -3,11 +3,11 @@ module AbAdmin
|
|
3
3
|
module Inputs
|
4
4
|
class CkeditorInput < ::SimpleForm::Inputs::Base
|
5
5
|
def input(wrapper_options=nil)
|
6
|
-
unless @builder.template.instance_variable_get(:@
|
7
|
-
@builder.template.concat @builder.template.javascript_include_tag(
|
8
|
-
@builder.template.instance_variable_set(:@
|
6
|
+
unless @builder.template.instance_variable_get(:@ckeditor_loaded)
|
7
|
+
@builder.template.concat @builder.template.javascript_include_tag(Ckeditor.cdn_url)
|
8
|
+
@builder.template.instance_variable_set(:@ckeditor_loaded, true)
|
9
9
|
end
|
10
|
-
input_html_options.reverse_merge!({width: 800, height: 200
|
10
|
+
input_html_options.reverse_merge!({width: 800, height: 200})
|
11
11
|
@builder.cktext_area(attribute_name, input_html_options)
|
12
12
|
end
|
13
13
|
end
|
@@ -1,9 +1,6 @@
|
|
1
1
|
module AbAdmin
|
2
2
|
module Views
|
3
3
|
module ManagerHelpers
|
4
|
-
|
5
|
-
INDEX_VIEW_ICONS = {table: 'list', tree: 'move', grid: 'th', chart: 'signal'}
|
6
|
-
|
7
4
|
def table_builder
|
8
5
|
manager.table ||= ::AbAdmin::Config::Table.default_for_model(resource_class)
|
9
6
|
end
|
@@ -20,6 +17,10 @@ module AbAdmin
|
|
20
17
|
manager.chart ||= ::AbAdmin::Config::Chart.default_for_model(resource_class)
|
21
18
|
end
|
22
19
|
|
20
|
+
def map_builder
|
21
|
+
manager.map ||= ::AbAdmin::Config::Map.default_for_model(resource_class)
|
22
|
+
end
|
23
|
+
|
23
24
|
def modal_form_builder
|
24
25
|
manager.modal_form ||= ::AbAdmin::Config::ModalForm.default_for_model(resource_class, skip: [:id, :created_at, :updated_at, :lft, :rgt, :depth])
|
25
26
|
end
|
@@ -52,10 +53,12 @@ module AbAdmin
|
|
52
53
|
end
|
53
54
|
end
|
54
55
|
|
56
|
+
INDEX_VIEW_ICONS = {table: 'list', tree: 'move', grid: 'th', chart: 'signal', map: 'map-marker', stats: 'eye-open'}
|
55
57
|
def index_view_link(index_view)
|
56
|
-
options = {class: "btn #{('active' if current_index_view == index_view)}", title: t("admin.index_view.#{index_view}", default: index_view.to_s)}
|
58
|
+
options = {class: "btn tool tool-bottom #{('active' if settings[:current_index_view] == index_view)}", title: t("admin.index_view.#{index_view}", default: index_view.to_s)}
|
57
59
|
url = url_for({index_view: index_view, q: params[:q]}.reject_blank)
|
58
|
-
|
60
|
+
title = INDEX_VIEW_ICONS[index_view.to_sym] ? icon(INDEX_VIEW_ICONS[index_view.to_sym]) : index_view
|
61
|
+
link_to title, url, options
|
59
62
|
end
|
60
63
|
end
|
61
64
|
end
|
@@ -59,7 +59,7 @@ module AbAdmin
|
|
59
59
|
def date_field(attr, options={})
|
60
60
|
label(attr, options[:label]) + content_tag(:div, class: 'controls') do
|
61
61
|
gt_param, lt_param = "#{attr}_gteq", "#{attr}_lteq"
|
62
|
-
text_field_tag("q[#{gt_param}]", params[:q][gt_param], class: 'input-small datepicker', autocomplete: 'off') +
|
62
|
+
text_field_tag("q[#{gt_param}]", params[:q][gt_param], class: 'input-small datepicker', autocomplete: 'off') +
|
63
63
|
text_field_tag("q[#{lt_param}]", params[:q][lt_param], class: 'input-small datepicker', autocomplete: 'off', id: "q_#{attr}")
|
64
64
|
end
|
65
65
|
end
|
@@ -68,7 +68,7 @@ module AbAdmin
|
|
68
68
|
if builder_options[:compact_labels]
|
69
69
|
options[:input_html] ||= {}
|
70
70
|
options[:input_html][:placeholder] ||= extract_label(attr, options)
|
71
|
-
wrapper_html = {'class' => 'controls
|
71
|
+
wrapper_html = {'class' => 'controls tool tool-left', 'data-placement' => 'left', 'title' => options[:input_html][:placeholder]}
|
72
72
|
content_tag(:div, wrapper_html, &block)
|
73
73
|
else
|
74
74
|
label(attr, options[:label]) + content_tag(:div, class: 'controls', &block)
|
@@ -0,0 +1,60 @@
|
|
1
|
+
# Extracted from `will_paginate-bootstrap` (v0.2.5 written by Nicholas Dainty) because of some deprecated staff
|
2
|
+
require "will_paginate/view_helpers/action_view"
|
3
|
+
module AbAdmin
|
4
|
+
module Views
|
5
|
+
class WillPaginateBootstrapRenderer < WillPaginate::ActionView::LinkRenderer
|
6
|
+
# Contains functionality shared by all renderer classes.
|
7
|
+
ELLIPSIS = "…"
|
8
|
+
|
9
|
+
def to_html
|
10
|
+
list_items = pagination.map do |item|
|
11
|
+
item.is_a?(Integer) ? page_number(item) : send(item)
|
12
|
+
end.join(@options[:link_separator])
|
13
|
+
|
14
|
+
if @options[:bootstrap].to_i >= 3
|
15
|
+
tag("ul", list_items, class: "pagination")
|
16
|
+
else
|
17
|
+
html_container(tag("ul", list_items))
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def container_attributes
|
22
|
+
@container_attributes ||= @options.except(*(WillPaginate::ViewHelpers.pagination_options.keys + [:renderer, :link_options] - [:class]))
|
23
|
+
end
|
24
|
+
|
25
|
+
protected
|
26
|
+
|
27
|
+
def page_number(page)
|
28
|
+
link_options = @options[:link_options] || {}
|
29
|
+
if page == current_page
|
30
|
+
tag("li", tag("span", page), class: "active")
|
31
|
+
else
|
32
|
+
tag("li", link(page, page, link_options.merge(rel: rel_value(page))))
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def gap
|
37
|
+
tag("li", link(ELLIPSIS, "#"), class: "disabled")
|
38
|
+
end
|
39
|
+
|
40
|
+
def previous_page
|
41
|
+
num = @collection.current_page > 1 && @collection.current_page - 1
|
42
|
+
previous_or_next_page(num, @options[:previous_label], "prev")
|
43
|
+
end
|
44
|
+
|
45
|
+
def next_page
|
46
|
+
num = @collection.current_page < @collection.total_pages && @collection.current_page + 1
|
47
|
+
previous_or_next_page(num, @options[:next_label], "next")
|
48
|
+
end
|
49
|
+
|
50
|
+
def previous_or_next_page(page, text, classname)
|
51
|
+
link_options = @options[:link_options] || {}
|
52
|
+
if page
|
53
|
+
tag("li", link(text, page, link_options), class: classname)
|
54
|
+
else
|
55
|
+
tag("li", tag("span", text), class: "%s disabled" % classname)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
@@ -2,7 +2,7 @@ require 'rails/generators/active_record'
|
|
2
2
|
module AbAdmin
|
3
3
|
module Generators
|
4
4
|
class GlobGenerator < ActiveRecord::Generators::Base
|
5
|
-
desc 'Generates migration for models without
|
5
|
+
desc 'Generates migration for models without translations tables'
|
6
6
|
|
7
7
|
source_root File.expand_path('../templates', __FILE__)
|
8
8
|
|
@@ -17,18 +17,18 @@ module AbAdmin
|
|
17
17
|
def model_attrs
|
18
18
|
@model_attrs ||= begin
|
19
19
|
models.each_with_object({}) do |m, h|
|
20
|
-
h[m.name] = m.translated_attribute_names.map { |attr|
|
20
|
+
h[m.name] = m.translated_attribute_names.map { |attr| [attr, get_type(attr)] }
|
21
21
|
end
|
22
22
|
end
|
23
23
|
end
|
24
24
|
|
25
25
|
def migration_name
|
26
|
-
"
|
26
|
+
"create_translations_#{models.map { |m| m.model_name.singular }.join('_')}"
|
27
27
|
end
|
28
28
|
|
29
29
|
def models
|
30
30
|
@models ||= begin
|
31
|
-
all_translated.reject { |m| conn.data_source_exists? m.
|
31
|
+
all_translated.reject { |m| conn.data_source_exists? m.translation_class.table_name }
|
32
32
|
end
|
33
33
|
end
|
34
34
|
|
@@ -53,7 +53,6 @@ module AbAdmin
|
|
53
53
|
:string
|
54
54
|
end
|
55
55
|
end
|
56
|
-
|
57
56
|
end
|
58
57
|
end
|
59
58
|
end
|
@@ -1,13 +1,16 @@
|
|
1
1
|
class <%= migration_class_name %> < ActiveRecord::Migration[<%= ActiveRecord::Migration.current_version %>]
|
2
|
-
def
|
2
|
+
def change
|
3
3
|
<%- models.each do |m| -%>
|
4
|
-
|
5
|
-
|
6
|
-
|
4
|
+
create_table :<%= m.model_name.singular %>_translations do |t|
|
5
|
+
t.references :<%= m.model_name.singular %>, null: false
|
6
|
+
t.string :locale, limit: 5, null: false
|
7
|
+
<%- model_attrs[m.name].each do |attr, type| -%>
|
8
|
+
t.<%= type %> :<%= attr %>
|
9
|
+
<%- end -%>
|
7
10
|
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
+
t.timestamps
|
12
|
+
end
|
13
|
+
add_index :<%= m.model_name.singular %>_translations, [:<%= m.model_name.singular %>_id, :locale], unique: true, name: '<%= m.table_name %>_ts_<%= m.model_name.singular %>_id_locale'
|
11
14
|
<%- end -%>
|
12
15
|
end
|
13
16
|
end
|
@@ -8,15 +8,4 @@ class User < ApplicationRecord
|
|
8
8
|
|
9
9
|
fileuploads :avatar
|
10
10
|
|
11
|
-
def init
|
12
|
-
set_default_role
|
13
|
-
self.locale ||= 'ru'
|
14
|
-
self.time_zone ||= 'Kiev'
|
15
|
-
end
|
16
|
-
|
17
|
-
def password_required?
|
18
|
-
return true if password.present?
|
19
|
-
return false if persisted? && password.blank?
|
20
|
-
super
|
21
|
-
end
|
22
11
|
end
|
@@ -1,17 +1,14 @@
|
|
1
|
-
|
2
|
-
config.use_transactional_fixtures = false
|
1
|
+
require 'database_cleaner'
|
3
2
|
|
4
|
-
|
3
|
+
RSpec.configure do |config|
|
4
|
+
config.before(:suite) do
|
5
5
|
DatabaseCleaner.strategy = :transaction
|
6
|
-
DatabaseCleaner.clean_with(:truncation)
|
6
|
+
DatabaseCleaner.clean_with(:truncation, except: %w(ar_internal_metadata countries country_translations))
|
7
7
|
end
|
8
8
|
|
9
|
-
config.
|
10
|
-
DatabaseCleaner.
|
9
|
+
config.around(:each) do |example|
|
10
|
+
DatabaseCleaner.cleaning do
|
11
|
+
example.run
|
12
|
+
end
|
11
13
|
end
|
12
|
-
|
13
|
-
config.after :each do
|
14
|
-
DatabaseCleaner.clean
|
15
|
-
end
|
16
|
-
|
17
14
|
end
|
@@ -31,17 +31,16 @@ module AbAdmin
|
|
31
31
|
protected
|
32
32
|
|
33
33
|
def model_instance
|
34
|
-
|
34
|
+
model.new
|
35
35
|
end
|
36
36
|
|
37
37
|
def translated_columns
|
38
|
-
|
38
|
+
model.respond_to?(:translated_attribute_names) ? model.translated_attribute_names.map(&:to_s) : []
|
39
39
|
end
|
40
40
|
|
41
41
|
def index_attrs
|
42
|
-
|
42
|
+
model_instance.attributes.keys.map(&:to_s)
|
43
43
|
end
|
44
|
-
|
45
44
|
end
|
46
45
|
end
|
47
46
|
end
|