ab_admin 0.8.3 → 0.10.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (151) hide show
  1. checksums.yaml +4 -4
  2. data/MIT-LICENSE +1 -1
  3. data/README.md +11 -5
  4. data/app/assets/javascripts/ab_admin/components/admin_assets.js.coffee +0 -25
  5. data/app/assets/javascripts/ab_admin/components/google_translate.js.coffee +3 -5
  6. data/app/assets/javascripts/ab_admin/components/in_place_edit.js.coffee +33 -25
  7. data/app/assets/javascripts/ab_admin/core/batch_actions.js.coffee +1 -1
  8. data/app/assets/javascripts/ab_admin/core/columns_hider.js.coffee +24 -23
  9. data/app/assets/javascripts/ab_admin/core/init.js.coffee +7 -2
  10. data/app/assets/javascripts/ab_admin/core/search_form.js.coffee +1 -7
  11. data/app/assets/javascripts/ab_admin/core/ui_utils.js.coffee +23 -7
  12. data/app/assets/javascripts/ab_admin/core/utils.js.coffee +16 -2
  13. data/app/assets/javascripts/ab_admin/inputs/datetime_input.js.coffee +1 -0
  14. data/app/assets/javascripts/ab_admin/main.js +3 -4
  15. data/app/assets/stylesheets/ab_admin/bootstrap_and_overrides.scss +71 -25
  16. data/app/assets/stylesheets/ab_admin/components/_base.scss +21 -1
  17. data/app/assets/stylesheets/ab_admin/components/_colored_tabs.scss +1 -1
  18. data/app/assets/stylesheets/ab_admin/components/_form.scss +16 -18
  19. data/app/assets/stylesheets/ab_admin/components/_grid_view.scss +2 -2
  20. data/app/assets/stylesheets/ab_admin/components/_locale_tabs.scss +11 -23
  21. data/app/assets/stylesheets/ab_admin/components/_navigation.scss +7 -11
  22. data/app/assets/stylesheets/ab_admin/components/_table_view.scss +85 -11
  23. data/app/assets/stylesheets/ab_admin/components/_tooltip.scss +81 -0
  24. data/app/assets/stylesheets/ab_admin/components/_tree_view.scss +1 -1
  25. data/app/assets/stylesheets/ab_admin/devise.scss +2 -2
  26. data/app/assets/stylesheets/ab_admin/fileupload.scss +2 -9
  27. data/app/assets/stylesheets/ab_admin/main.scss +1 -2
  28. data/app/controllers/admin/assets_controller.rb +1 -1
  29. data/app/controllers/admin/base_controller.rb +133 -149
  30. data/app/controllers/admin/dashboards_controller.rb +2 -2
  31. data/app/controllers/admin/locators_controller.rb +8 -6
  32. data/app/controllers/admin/manager_controller.rb +19 -49
  33. data/app/controllers/admin/static_pages_controller.rb +0 -4
  34. data/app/controllers/admin/structures_controller.rb +2 -2
  35. data/app/views/ab_admin/devise/sessions/new.html.slim +2 -0
  36. data/app/views/admin/assets/batch_edit.html.slim +3 -2
  37. data/app/views/admin/base/_search_layout.html.slim +7 -6
  38. data/app/views/admin/base/create.js.erb +6 -3
  39. data/app/views/admin/base/edit.js.erb +1 -1
  40. data/app/views/admin/base/index.html.slim +4 -4
  41. data/app/views/admin/base/new.js.erb +1 -1
  42. data/app/views/admin/base/update.js.erb +7 -2
  43. data/app/views/admin/fileupload/_asset_templates.html.slim +1 -2
  44. data/app/views/admin/fileupload/_image.html.slim +1 -2
  45. data/app/views/admin/locators/edit.html.slim +7 -6
  46. data/app/views/admin/manager/_map.html.slim +4 -0
  47. data/app/views/admin/manager/_show_table.html.slim +1 -1
  48. data/app/views/admin/manager/_stats.html.slim +4 -0
  49. data/app/views/admin/manager/_table.html.slim +7 -4
  50. data/app/views/admin/shared/_content_actions.html.slim +35 -30
  51. data/app/views/admin/shared/_flash.html.slim +5 -4
  52. data/app/views/admin/shared/_locale_tabs.html.slim +2 -2
  53. data/app/views/admin/shared/_main_menu.html.slim +1 -1
  54. data/app/views/admin/shared/_save_buttons.html.slim +10 -1
  55. data/app/views/admin/structures/_form.html.slim +1 -1
  56. data/app/views/admin/users/_form.html.slim +3 -3
  57. data/app/views/admin/users/_search_form.html.slim +1 -1
  58. data/app/views/layouts/admin/_footer.html.slim +0 -1
  59. data/app/views/layouts/admin/_navigation.html.slim +1 -1
  60. data/app/views/layouts/admin/application.html.slim +2 -2
  61. data/config/locales/de.yml +1 -2
  62. data/config/locales/en.yml +9 -15
  63. data/config/locales/it.yml +1 -0
  64. data/config/locales/ru.yml +0 -1
  65. data/config/locales/uk.yml +0 -1
  66. data/db/migrate/20130101000001_create_users.rb +1 -4
  67. data/db/migrate/20130101000003_create_assets.rb +1 -1
  68. data/db/migrate/20130101000004_create_headers.rb +5 -5
  69. data/db/migrate/20130101000005_create_static_pages.rb +2 -5
  70. data/db/migrate/20130101000006_create_structures.rb +1 -1
  71. data/db/migrate/20130101000007_base_translations.rb +43 -12
  72. data/db/migrate/20130101000008_create_admin_comments.rb +2 -7
  73. data/db/migrate/20130101000009_create_tracks.rb +4 -8
  74. data/lib/ab_admin/abstract_resource.rb +6 -5
  75. data/lib/ab_admin/carrierwave/base_uploader.rb +87 -75
  76. data/lib/ab_admin/carrierwave/glue.rb +0 -5
  77. data/lib/ab_admin/concerns/admin_addition.rb +15 -27
  78. data/lib/ab_admin/concerns/translations_macro.rb +97 -0
  79. data/lib/ab_admin/concerns/utilities.rb +2 -2
  80. data/lib/ab_admin/config/base.rb +27 -4
  81. data/lib/ab_admin/controllers/callbacks.rb +3 -26
  82. data/lib/ab_admin/core_ext/array.rb +1 -50
  83. data/lib/ab_admin/core_ext/hash.rb +2 -31
  84. data/lib/ab_admin/core_ext/other.rb +0 -6
  85. data/lib/ab_admin/core_ext/string.rb +1 -86
  86. data/lib/ab_admin/devise.rb +7 -0
  87. data/lib/ab_admin/engine.rb +2 -1
  88. data/lib/ab_admin/hooks/ckeditor_lazy.rb +13 -0
  89. data/lib/ab_admin/hooks/will_paginate_id_prefetch.rb +8 -6
  90. data/lib/ab_admin/hooks/will_paginate_no_uri.rb +1 -1
  91. data/lib/ab_admin/i18n_tools/google_translate.rb +3 -1
  92. data/lib/ab_admin/i18n_tools/model_translator.rb +1 -1
  93. data/lib/ab_admin/menu/base_group.rb +0 -1
  94. data/lib/ab_admin/menu/group.rb +2 -4
  95. data/lib/ab_admin/menu/item.rb +4 -8
  96. data/lib/ab_admin/models/asset.rb +7 -10
  97. data/lib/ab_admin/models/header.rb +2 -2
  98. data/lib/ab_admin/models/locator.rb +29 -3
  99. data/lib/ab_admin/models/settings.rb +2 -2
  100. data/lib/ab_admin/models/structure.rb +3 -3
  101. data/lib/ab_admin/models/track.rb +15 -3
  102. data/lib/ab_admin/models/user.rb +12 -48
  103. data/lib/ab_admin/utils/csv_document.rb +8 -6
  104. data/lib/ab_admin/utils/eval_helpers.rb +0 -13
  105. data/lib/ab_admin/utils/logger.rb +12 -2
  106. data/lib/ab_admin/utils/mysql.rb +2 -3
  107. data/lib/ab_admin/utils/xls_document.rb +18 -18
  108. data/lib/ab_admin/utils.rb +0 -5
  109. data/lib/ab_admin/version.rb +1 -1
  110. data/lib/ab_admin/views/admin_helpers.rb +43 -28
  111. data/lib/ab_admin/views/admin_navigation_helpers.rb +18 -16
  112. data/lib/ab_admin/views/form_builder.rb +7 -5
  113. data/lib/ab_admin/views/helpers.rb +0 -9
  114. data/lib/ab_admin/views/inputs/ckeditor_input.rb +1 -5
  115. data/lib/ab_admin/views/manager_helpers.rb +15 -6
  116. data/lib/ab_admin/views/search_form_builder.rb +13 -13
  117. data/lib/ab_admin/views/will_paginate_bootstrap_renderer.rb +60 -0
  118. data/lib/ab_admin.rb +44 -32
  119. data/lib/generators/ab_admin/glob/glob_generator.rb +4 -5
  120. data/lib/generators/ab_admin/glob/templates/migration.erb +10 -7
  121. data/lib/generators/ab_admin/install/templates/config/ab_admin.rb.erb +1 -1
  122. data/lib/generators/ab_admin/install/templates/models/user.rb +1 -13
  123. data/lib/generators/ab_admin/install/templates/spec/spec_helper.rb +0 -1
  124. data/lib/generators/ab_admin/install/templates/spec/support/database_cleaner.rb +8 -11
  125. data/lib/generators/ab_admin/install/templates/uploaders/attachment_file_uploader.rb +1 -1
  126. data/lib/generators/ab_admin/install/templates/uploaders/avatar_uploader.rb +1 -1
  127. data/lib/generators/ab_admin/install/templates/uploaders/picture_uploader.rb +16 -3
  128. data/lib/generators/ab_admin/model/model_generator.rb +3 -4
  129. data/lib/generators/ab_admin/model/templates/resource.erb +5 -2
  130. data/lib/generators/ab_admin/resource/resource_generator.rb +0 -4
  131. data/lib/generators/ab_admin/resource/templates/controller.erb +2 -9
  132. data/lib/tasks/assets.rake +5 -5
  133. metadata +45 -85
  134. data/app/assets/images/admin/Jcrop.gif +0 -0
  135. data/app/assets/images/admin/flags/de.png +0 -0
  136. data/app/assets/images/admin/flags/en.png +0 -0
  137. data/app/assets/images/admin/flags/es.png +0 -0
  138. data/app/assets/images/admin/flags/fr.png +0 -0
  139. data/app/assets/images/admin/flags/it.png +0 -0
  140. data/app/assets/images/admin/flags/ja.png +0 -0
  141. data/app/assets/images/admin/flags/pl.png +0 -0
  142. data/app/assets/images/admin/flags/ru.png +0 -0
  143. data/app/assets/images/admin/flags/uk.png +0 -0
  144. data/app/assets/javascripts/ab_admin/components/croppable_image.js.coffee +0 -33
  145. data/app/assets/stylesheets/ab_admin/components/_columns_hider.scss +0 -5
  146. data/app/assets/stylesheets/ab_admin/components/_perms.scss +0 -39
  147. data/app/views/admin/shared/_columns_hider.html.slim +0 -9
  148. data/lib/ab_admin/hooks/globalize_locale_suffix_accessors.rb +0 -25
  149. data/lib/ab_admin/hooks/globalize_valid_locale.rb +0 -9
  150. data/lib/generators/ab_admin/ckeditor_assets/ckeditor_assets_generator.rb +0 -19
  151. data/lib/generators/template.rb +0 -96
@@ -1,13 +1,16 @@
1
+ <% if params[:flash] %>
2
+ flash("<%= t("flash.admin.actions.#{action_name}.notice", resource_name: resource_class.model_name.human(count: 1)) %>")
3
+ <% end %>
4
+
1
5
  <% unless params[:modal] %>
2
6
  <%
3
7
  form_wrap_id = dom_id(resource_class.new, 'list_edit')
4
8
  html = render('table', collection: [resource]).match(/<tbody>(.*)<\/tbody>/m)[1].html_safe
5
9
  %>
6
10
  $('#<%= form_wrap_id %>').remove();
7
- $('#list tbody').prepend('<%= j html %>');
11
+ $('#list tbody:first').prepend('<%= j html %>');
8
12
  $(document).trigger('admin:list_init');
9
- $('#<%= dom_id(resource, 'list') %>').addClass('success').scrollToEl();
13
+ $('#<%= dom_id(resource, 'list') %>').addClass('bg-lemon');
10
14
  <% end %>
11
15
 
12
-
13
16
  window.ab_admin_last_created = <%= raw resource.for_input_token.to_json %>;
@@ -10,7 +10,7 @@
10
10
  %>
11
11
  $('#<%= form_wrap_id %>').remove();
12
12
  $('#<%= el_id %>').after('<%= j html %>');
13
- $('#<%= form_wrap_id %> td:first').attr('colspan', $('#<%= form_wrap_id %>').prev('tr').find('> td').length);
13
+ $('#<%= form_wrap_id %> > td').attr('colspan', $('#list > thead > tr:first th').length);
14
14
  $('#<%= form_wrap_id %> form').trigger('admin:form_init');
15
15
  $('#<%= el_id %>').scrollToEl();
16
16
  <% end %>
@@ -2,14 +2,14 @@
2
2
  input name='batch_action' id='batch_action' type='hidden'
3
3
  = render 'admin/shared/content_actions'
4
4
 
5
- #content= render current_index_view
6
- - unless settings[:skip_pagination]
5
+ #content= render settings[:current_index_view].to_s
6
+ - if settings[:pagination]
7
7
  .pagination-wrap.pull-left
8
- = will_paginate collection, renderer: BootstrapPagination::Rails
8
+ = will_paginate collection, renderer: AbAdmin::Views::WillPaginateBootstrapRenderer
9
9
  .pagination_info= pagination_info collection
10
10
  .btn-toolbar.pull-right.pjax_links
11
11
  .btn-group
12
- - per_page_variants.each do |c|
12
+ - settings[:per_page_variants].each do |c|
13
13
  a.btn.per_page data-val=c href=url_for(params_for_links.merge(per_page: c)) class=('active' if c == collection.per_page) = c
14
14
 
15
15
  - if pjax? && flash.present?
@@ -9,7 +9,7 @@
9
9
  %>
10
10
  $('#<%= form_wrap_id %>').remove();
11
11
  $('#list tbody:first').prepend('<%= j html %>');
12
- $('#<%= form_wrap_id %> td:first').attr('colspan', $('#list tr:first th').length);
12
+ $('#<%= form_wrap_id %> > td').attr('colspan', $('#list > thead > tr > th').length);
13
13
  $('#<%= form_wrap_id %> form').trigger('admin:form_init');
14
14
  <% end %>
15
15
 
@@ -1,3 +1,9 @@
1
+ <%= render 'admin/shared/flash' %>
2
+
3
+ <% if params[:flash] %>
4
+ flash("<%= t("flash.admin.actions.#{action_name}.notice", resource_name: resource_class.model_name.human(count: 1)) %>")
5
+ <% end %>
6
+
1
7
  <% unless params[:modal] %>
2
8
  <%
3
9
  form_wrap_id = dom_id(resource, 'list_edit')
@@ -7,8 +13,7 @@
7
13
  $('#<%= dom_id(resource, 'list') %>').replaceWith('<%= j html %>');
8
14
  var $el = $('#<%= dom_id(resource, 'list') %>');
9
15
  $(document).trigger('admin:list_init');
10
- if (!$el[0].className) $el.addClass('success');
11
- $el.scrollToEl();
16
+ $el.addClass('bg-lemon');
12
17
  <% end %>
13
18
 
14
19
  window.ab_admin_last_updated = <%= raw resource.for_input_token.to_json %>;
@@ -3,9 +3,8 @@ script#image_template type='text/x-handlebars-template'
3
3
  = link_to icon('remove', true), '/admin/assets/{{id}}', remote: true, method: :delete, title: t('admin.delete'), class: 'destroy_asset', \
4
4
  data: {confirm: t('admin.delete_confirmation')}
5
5
  .main_image title=t('admin.fileupload.main_image') = icon('home', true)
6
- .crop_image title=t('admin.fileupload.crop') = icon('resize-full', true)
7
6
  .rotate_image title=t('admin.fileupload.rotate') = icon('repeat', true)
8
- a.fileupload-file.fancybox href='{{url}}' rel='fancybox'
7
+ a.fileupload-file href='{{url}}' target='_blank' data-fancybox=1
9
8
  img src='{{thumb_url}}' title='{{name}}' alt="{{alt}}"
10
9
 
11
10
 
@@ -2,8 +2,7 @@
2
2
  = link_to icon('remove', true), admin_asset_path(image), remote: true, method: :delete, title: t('admin.delete'), class: 'destroy_asset', \
3
3
  data: {confirm: t('admin.delete_confirmation')}
4
4
  .main_image title=t('admin.fileupload.main_image') = icon('home', true)
5
- .crop_image title=t('admin.fileupload.crop') = icon('resize-full', true)
6
5
  .rotate_image title=t('admin.fileupload.rotate') = icon('repeat', true)
7
- a.fileupload-file.fancybox href=image.url rel='fancybox'
6
+ a.fileupload-file href=image.url target='_blank' data-fancybox=1
8
7
  - I18n.with_locale(image.assetable.try(:locale)) do
9
8
  img src=image.thumb_url title=image.name alt=image.alt
@@ -12,13 +12,14 @@
12
12
 
13
13
  button#translate_incomplete.btn.btn-danger.pull-left type="button" = t 'admin.locators.translate_incomplete'
14
14
 
15
+ - master_locale = params[:master_locale].try!(:to_sym) || I18n.default_locale
15
16
  - locale_file = Locator.prepare_data(@file)
16
17
  table.table.table-bordered.table-striped
17
18
  thead
18
19
  tr
19
- th = t 'admin.locators.key'
20
- th = locale_file.locale
21
- th = I18n.default_locale
20
+ th= t 'admin.locators.key'
21
+ th= locale_file.locale
22
+ th= master_locale
22
23
  tr
23
24
  - [:key_contains, :edit_locale_contains, :main_locale_contains].each do |param|
24
25
  th
@@ -26,7 +27,7 @@ table.table.table-bordered.table-striped
26
27
  = form_tag(admin_locators_path, method: :put) do
27
28
  tbody#locale_data
28
29
  = hidden_field_tag 'edit_locale_name', locale_file.locale
29
- = hidden_field_tag 'main_locale_name', I18n.default_locale
30
+ = hidden_field_tag 'main_locale_name', master_locale
30
31
  = hidden_field_tag 'filename', locale_file.filename
31
32
 
32
33
  - locale_file.flat_data.each do |keys, value|
@@ -34,8 +35,8 @@ table.table.table-bordered.table-striped
34
35
  td.locale_keys
35
36
  div== keys.join(' > ')
36
37
  .btn.btn-mini.btn-inverse.auto_translate.pull-right google translate
37
- td = text_area_tag 'locale_hash' + keys.map{|k| "[#{k}]" }.join, value
38
- td = text_area_tag 'fake', t(keys.join('.'), locale: I18n.default_locale), disabled: true
38
+ td= text_area_tag 'locale_hash' + keys.map{|k| "[#{k}]" }.join, value
39
+ td= text_area_tag 'fake', t(keys.join('.'), locale: master_locale), disabled: true
39
40
  tbody
40
41
  tr
41
42
  td colspan=3 = submit_tag t('admin.form.save'), class: 'btn btn-primary'
@@ -0,0 +1,4 @@
1
+ - if tmpl = admin_partial_name(map_builder)
2
+ = render partial: tmpl, locals: local_assigns
3
+ - else
4
+ h2 Generic map template is not implemented yet. It can be here `admin/#{resource_collection_name}/_map.html.slim`
@@ -4,4 +4,4 @@
4
4
  - show_builder.fields.each do |field|
5
5
  tr
6
6
  td= ha(field.name)
7
- td= admin_pretty_data call_method_or_proc_on(resource, field.data)
7
+ td= admin_pretty_data method_or_proc_on(field.data, resource)
@@ -0,0 +1,4 @@
1
+ - if tmpl = admin_partial_name(stats_builder)
2
+ = render partial: tmpl, locals: local_assigns
3
+ - else
4
+ h2 Generic stats template is not implemented yet. It can be here `admin/#{resource_collection_name}/_stats.html.slim`
@@ -19,14 +19,17 @@
19
19
  tbody
20
20
  - is_edit_link = manager.actions.include?(:edit)
21
21
  - collection.each do |item|
22
- tr id=dom_id(item, 'list') class=(call_method_or_proc_on(item, table_builder.options[:row_class]) if table_builder.options[:row_class])
22
+ tr id=dom_id(item, 'list') class=method_or_proc_on(table_builder.row_html_class, item)
23
23
  = batch_action_item(item)
24
- td= id_link(item, edit: is_edit_link)
24
+ td
25
+ = id_link(item, edit: is_edit_link)
26
+ - if settings[:id_column_with_created_at]
27
+ div: i= l(item.created_at, format: AbAdmin.datetime_format)
25
28
  = item_index_actions_panel(item)
26
29
  - table_builder.fields.each do |field|
27
- td class=(field.options[:cell_class] if field.options[:cell_class])
30
+ td class=field.options[:cell_html_class]
28
31
  - field_content = table_item_field(item, field)
29
- - if field.options[:copy_button]
32
+ - if field_content.present? && field.options[:copy_button]
30
33
  - field_id = dom_id(item, field.name)
31
34
  span> id=field_id = field_content
32
35
  .btn.btn-mini> class='js-copy' data-clipboard-target="##{field_id}" = icon('share')
@@ -1,63 +1,68 @@
1
1
  .content_actions.clearfix
2
- - if settings[:batch] && current_index_view =~ /table/
2
+ - if settings[:batch] && settings[:current_index_view] == :table
3
3
  .btn-group
4
4
  a.btn.dropdown-toggle data-toggle="dropdown" href="#"
5
5
  = t 'admin.batch_actions.title'
6
6
  span.caret
7
7
  ul.dropdown-menu
8
- - batch_action_list.each do |batch_action|
9
- li
10
- a.batch_action_link(
11
- href='#'
12
- data-form=batch_action.form
13
- data-action=batch_action.name
14
- data-confirm=batch_action.confirm
15
- )
16
- = batch_action.title
17
- - unless button_scopes.blank?
8
+ - batch_actions.each do |ba|
9
+ li: a.batch_action_link href='#' data-form=ba.form data-action=ba.name data-confirm=ba.confirm = ba.title
10
+ - if settings[:button_scopes] && button_scopes.present?
18
11
  .btn-group
19
- - button_scopes.each do |name, opts|
20
- - next if opts[:if] && !call_method_or_proc_on(controller, opts[:if])
21
- - param_name = opts[:as] || name
22
- - active = params[param_name]
23
- a.btn href=url_for(param_name => (active ? nil : 1)) class=('active' if active)
24
- = opts[:title] || t("admin.scopes.#{name}", default: name.to_s.titleize)
25
- - if opts[:badge]
26
- - scope = opts[:block] ? opts[:block].call(controller, resource_class) : resource_class.send(name)
27
- - scope_count = scope.send(*[opts[:badge][:value_type] || :count, opts[:badge][:column]].compact)
12
+ - button_scopes.each do |s|
13
+ - next unless option_conditions_met?(s.options)
14
+ - active = params[s.param_name]
15
+ - url = url_for(s.param_name => (active ? nil : 1), index_view: params[:index_view])
16
+ a.btn href=url title=s.options[:title] class=[s.options[:class], ('active' if active), ('tool tool-bottom' if s.options[:title])]
17
+ = s.options[:label] || s.options[:title] || t("admin.scopes.#{s.name}", default: s.name.to_s.titleize)
18
+ - if s.options[:badge]
19
+ - scope = s.apply(self, resource_class.accessible_by(current_ability))
20
+ - scope_count = scope.send(*[s.options[:badge][:value_type] || :count, s.options[:badge][:column]].compact)
28
21
  - unless scope_count.zero?
29
- span.badge< class=("badge-#{opts[:badge].try(:[], :type) || 'important'}") = scope_count
22
+ span.badge< class=("badge-#{s.options.dig(:badge, :type) || 'important'} #{'pulse' if s.options.dig(:badge, :pulse)}") = scope_count
30
23
 
31
- a.btn.pull-left#columns_hider_show href="#columns_hider" data-toggle='modal' = t 'admin.columns_hider.button'
24
+ - if settings[:current_index_view] == :table
25
+ .btn-group#columns_hider_wrap
26
+ a.btn.dropdown-toggle data-toggle="dropdown" href="#"
27
+ = t 'admin.columns_hider.button'
28
+ span.caret
29
+ .dropdown-menu
32
30
 
33
31
  .btn-group#view_layout
34
32
  .btn data-css='main_wide' = icon('align-left')
35
33
  .btn data-css='main_reverse' = icon('align-right')
36
34
 
37
- - if normalized_index_views.length > 1
35
+ - if settings[:index_views].length > 1
38
36
  .btn-group#index_views
39
- - normalized_index_views.each do |index_view|
37
+ - settings[:index_views].each do |index_view|
40
38
  = index_view_link(index_view)
41
39
 
42
- - if can?(:export, resource_class) && !settings[:skip_export]
40
+ - if settings[:export] && can?(:export, resource_class)
43
41
  .btn-group.downloads
44
42
  = icon('download-alt')
45
- /- %w(csv xls json).each do |format|
46
43
  - %w(csv xlsx).each do |format|
47
44
  - next if format == 'xlsx' && !Mime[:xlsx]
48
45
  = link_to format, params_for_links.merge(per_page: 10_000, format: format), id: "export_#{format}"
49
46
 
50
- - if @search && settings[:sort_buttons]
47
+ - if ransack_collection && settings[:sort_buttons]
51
48
  .btn-group
52
49
  - settings[:sort_buttons].each do |opts|
53
50
  = list_sort_link(opts[:title], column: opts[:column], html_options: {class: 'btn'})
54
51
 
55
- - if @search_collection && settings[:aggregations]
52
+ - if collection_action? && settings[:aggregations]
56
53
  .aggregations
57
54
  - settings[:aggregations].each do |ag|
58
55
  .label> class=(ag[:css] || 'label-success')
59
56
  => ag[:label] || "#{ag[:column].to_s.humanize}:"
60
57
  - if !ag[:type] || ag[:type] == :sum
61
- = @search_collection.distinct(false).sum(ag[:column]).try!(:round, 2)
58
+ - res = search_collection.unscope(:includes).distinct(false).sum(ag[:column])
59
+ = number_with_delimiter(res.round(2), delimiter: ' ') if res
62
60
  - elsif ag[:type] == :average
63
- = @search_collection.average(ag[:column]).try!(:round, 2)
61
+ - res = search_collection.unscope(:includes).average(ag[:column])
62
+ = number_with_delimiter(res.round(2), delimiter: ' ') if res
63
+ - elsif ag[:type] == :pct
64
+ - sc_count = search_collection.count
65
+ - if sc_count.zero?
66
+ | 0%
67
+ - else
68
+ = "#{(search_collection.where.not(ag[:column] => nil).count.to_f / search_collection.count * 100).try!(:round, 2)}%"
@@ -1,4 +1,5 @@
1
- - flash.each do |type, message|
2
- .alert class="alert-#{type}"
3
- a.close(data-dismiss='alert') ×
4
- == message
1
+ #flash
2
+ - flash.each do |type, message|
3
+ .alert class="alert-#{type}"
4
+ a.close(data-dismiss='alert') ×
5
+ == message
@@ -3,8 +3,8 @@
3
3
  - active_locale = params[:edit_locale].present? ? params[:edit_locale].to_sym : locales.first
4
4
  - locales.each_with_index do |l, i|
5
5
  li class=('active' if l == active_locale)
6
- a data-toggle="tab" href="##{l}" class="ico_#{l}" title=l
7
- img src=image_path("admin/flags/#{l}.png")
6
+ a data-toggle="tab" href="##{l}" class="ico_#{l}" title=l = locale_flag(l)
7
+ = tab_nav.call(l) if tab_nav
8
8
  .tab-content
9
9
  - locales.each_with_index do |l, i|
10
10
  .tab-pane id=l class="tab_#{l} #{'active' if l == active_locale}" = locale_html[l]
@@ -6,7 +6,7 @@ nav.navbar-inner
6
6
  span.icon-bar
7
7
  a.brand href=(AbAdmin.root_path || root_path) target='_blank' = admin_site_name
8
8
  .nav-collapse.collapse
9
- = AdminMenu.render(self)
9
+ = (current_user.admin_menu_builder || AdminMenu).render(self)
10
10
 
11
11
  .btn-group.pull-right
12
12
  a.btn.dropdown-toggle data-toggle="dropdown" href="#"
@@ -1,10 +1,19 @@
1
1
  - return_to = params[:return_to].presence || request.referer || collection_path
2
- - return_to = "#{return_to}##{dom_id(resource, 'list')}" if resource.persisted?
2
+ - return_to = "#{return_to.split('#', 2).first}##{dom_id(resource, 'list')}" if resource.persisted?
3
3
  input type='hidden' name='return_to' value=return_to
4
+ - if settings[:safe_save] && resource.updated_at
5
+ input type='hidden' name='last_updated_timestamp' value=(resource.last_updated_timestamp || resource.updated_timestamp.to_i)
4
6
  .form-actions
5
7
  button.btn.btn-primary type="submit" name="_save" data-disable-with=t('admin.form.save')
6
8
  = icon('ok', true)
7
9
  = t('admin.form.save')
10
+ - if resource.errors.of_kind?(:base, :changed)
11
+ a.btn href=edit_resource_path(resource, return_to: params[:return_to])
12
+ = icon('repeat')
13
+ = t('admin.form.refresh')
14
+ button.btn.btn-warning type="submit" name="_force_save" data-disable-with='Force'
15
+ = icon('fire', true)
16
+ = t('admin.form.force_save')
8
17
  span.extra_buttons
9
18
  - unless resource.new_record?
10
19
  span.next_prev_buttons
@@ -3,7 +3,7 @@
3
3
  = f.input :title, locale: l
4
4
  = f.input :redirect_url, locale: l, as: :string
5
5
 
6
- - Structure.simple_slug_columns.each do |column|
6
+ - Structure.simple_slug_adapter.column_names.each do |column|
7
7
  = f.input column
8
8
  - if @structure.moveable?
9
9
  = f.input :parent, as: :tree_select
@@ -15,11 +15,11 @@
15
15
  = f.input :gender, collection: GenderType.all, include_blank: false, as: :radio_buttons, item_wrapper_class: 'inline'
16
16
 
17
17
  = f.input :time_zone, fancy: true, priority: %w(Moscow Kyiv).map{|t| ActiveSupport::TimeZone[t] }
18
- = f.input :locale, collection: Globalize.available_locales
18
+ = f.input :locale, collection: AbAdmin.translated_locales
19
19
  = f.input :bg_color, as: :color
20
20
 
21
- = f.input :password, input_html: {autocomplete: 'off'}
22
- = f.input :password_confirmation, input_html: {autocomplete: 'off'}
21
+ = f.input :password, input_html: {autocomplete: 'new-password'}
22
+ = f.input :password_confirmation, input_html: {autocomplete: 'new-password'}
23
23
 
24
24
  = f.input :avatar, as: :uploader, edit_meta: true
25
25
 
@@ -10,7 +10,7 @@
10
10
  = f.input :user_role_id, collection: UserRoleType.all
11
11
 
12
12
  = f.input :gender, collection: GenderType.all
13
- = f.input :locale, collection: Globalize.available_locales
13
+ = f.input :locale, collection: AbAdmin.translated_locales
14
14
 
15
15
  = f.input :updated_at
16
16
  = f.input :created_at
@@ -6,7 +6,6 @@
6
6
  .muted.footer-notes= AbAdmin.footer_notes
7
7
 
8
8
  = render 'admin/fileupload/asset_templates'
9
- = render 'admin/shared/columns_hider'
10
9
 
11
10
  - unless admin?
12
11
  css:
@@ -1,6 +1,6 @@
1
1
  header.navbar.navbar-inverse
2
2
  = render 'admin/shared/main_menu'
3
- ul.breadcrumb
3
+ ul.breadcrumb.clearfix
4
4
  li.resource_actions= render 'admin/shared/action_items'
5
5
  = render 'admin/shared/breadcrumbs'
6
6
 
@@ -16,13 +16,13 @@ html id="controller_#{controller_name}"
16
16
  = render 'layouts/admin/navigation'
17
17
  #main role="main"
18
18
  .container-fluid
19
- = render('admin/shared/flash', flash: flash) if flash
20
19
  #container.row-fluid
21
20
  .wrap_content
22
21
  .clearfix data-pjax-container=true class=admin_layout_css = yield
23
22
  - if collection_action? && settings[:search]
24
- .sidebar.well= render 'search_layout'
23
+ .sidebar.well.well-tiny= render 'search_layout'
25
24
  = yield :sidebar
25
+ = render('admin/shared/flash', flash: flash) if flash
26
26
  #modal_form.modal.hide
27
27
  #loading.label.label-warning= t 'admin.loading'
28
28
  #push
@@ -89,7 +89,7 @@ de:
89
89
  choose: Select %{attr}
90
90
  close: Close
91
91
  columns_hider:
92
- button: Adjust the table
92
+ button: Columns
93
93
  title: Setting the display of columns
94
94
  comments:
95
95
  add: Comment
@@ -105,7 +105,6 @@ de:
105
105
  drop_here: Drag and drop files here
106
106
  main_image: Set Main
107
107
  max_size: Max size
108
- crop: Crop
109
108
  rotate: Rotate
110
109
  form:
111
110
  cancel: Cancel
@@ -18,22 +18,13 @@ en:
18
18
  actions:
19
19
  activate:
20
20
  link: Activate
21
- batch_destroy:
22
- confirmation: Are you sure you want to delete the selected records?
23
- link: Delete selected
24
- title: Multi-remove
25
- batch_publish:
26
- link: Publish selected
27
- title: Multi-publish
28
- batch_un_publish:
29
- link: Unpublish selected
30
- title: Multi-hiding
31
21
  create:
32
22
  link: Create
33
23
  title: Creation
34
24
  destroy:
35
- link: Remove
36
- title: Removal
25
+ link: Destroy
26
+ title: Destroy
27
+ confirmation: Are you sure you want to delete the selected records?
37
28
  edit:
38
29
  link: Edit
39
30
  title: Editing
@@ -89,12 +80,12 @@ en:
89
80
  choose: Select %{attr}
90
81
  close: Close
91
82
  columns_hider:
92
- button: Adjust the table
83
+ button: Columns
93
84
  title: Setting the display of columns
94
85
  comments:
95
86
  add: Comment
96
87
  title_content: Comments (%{count})
97
- delete: Remove
88
+ delete: Destroy
98
89
  delete_confirmation: Are you sure you want to delete this?
99
90
  empty: Empty
100
91
  exit: Output
@@ -105,11 +96,12 @@ en:
105
96
  drop_here: Drag and drop files here
106
97
  main_image: Set Main
107
98
  max_size: Max size
108
- crop: Crop
109
99
  rotate: Rotate
110
100
  form:
111
101
  cancel: Cancel
112
102
  save: Save
103
+ force_save: Force save
104
+ refresh: Refresh
113
105
  save_and_add_another: Save and add new
114
106
  save_and_edit: Save and continue editing
115
107
  save_and_edit_next: Save and next.
@@ -246,6 +238,7 @@ en:
246
238
  updater_id: 'Updater'
247
239
  remember_me: Remember
248
240
  password: Password
241
+ otp_attempt: OTP
249
242
  flash:
250
243
  admin:
251
244
  actions:
@@ -291,5 +284,6 @@ en:
291
284
  size_too_big: is too big (should be at most %{file_size})
292
285
  carrierwave_processing_error: Cannot resize image.
293
286
  carrierwave_integrity_error: Not an image.
287
+ changed: 'Record was changed by someone else, "Refresh" to get the latest version and repeat changes or "Force save" to overwrite'
294
288
  unauthorized:
295
289
  default: You are not authorized to access this page.
@@ -103,6 +103,7 @@ it:
103
103
  form:
104
104
  cancel: Cancellazione
105
105
  save: Salvare
106
+ force_save: Force save
106
107
  save_and_add_another: Salva e aggiungere nuovi
107
108
  save_and_edit: Salva e continuare a modificare
108
109
  save_and_edit_next: Salva e traccia.
@@ -105,7 +105,6 @@ ru:
105
105
  drop_here: или бросьте файл(ы) сюда
106
106
  main_image: Сделать главным
107
107
  max_size: Макс разм.
108
- crop: Обрезать
109
108
  rotate: Повернуть
110
109
  form:
111
110
  cancel: Отмена
@@ -105,7 +105,6 @@ uk:
105
105
  drop_here: "или бросьте файл(ы) сюда"
106
106
  main_image: "Сделать главным"
107
107
  max_size: "Макс разм."
108
- crop: "Обрезать"
109
108
  rotate: "Повернуть"
110
109
  form:
111
110
  cancel: "Отмена"
@@ -1,4 +1,4 @@
1
- class CreateUsers < ActiveRecord::Migration
1
+ class CreateUsers < ActiveRecord::Migration[5.2]
2
2
  def change
3
3
  create_table(:users) do |t|
4
4
  t.string :login
@@ -35,9 +35,6 @@ class CreateUsers < ActiveRecord::Migration
35
35
  t.string :current_sign_in_ip
36
36
  t.string :last_sign_in_ip
37
37
 
38
- ## Encryptable
39
- t.string :password_salt
40
-
41
38
  ## Confirmable
42
39
  t.string :confirmation_token
43
40
  t.datetime :confirmed_at
@@ -1,4 +1,4 @@
1
- class CreateAssets < ActiveRecord::Migration
1
+ class CreateAssets < ActiveRecord::Migration[5.2]
2
2
  def change
3
3
  create_table :assets do |t|
4
4
  t.string :data_file_name, null: false
@@ -1,12 +1,12 @@
1
- class CreateHeaders < ActiveRecord::Migration
1
+ class CreateHeaders < ActiveRecord::Migration[5.2]
2
2
  def change
3
3
  create_table :headers do |t|
4
- t.string :headerable_type, limit: 50, null: false
5
- t.integer :headerable_id, null: false
6
-
4
+ t.string :headerable_type, limit: 50, null: false
5
+ t.integer :headerable_id, null: false
6
+
7
7
  t.timestamps
8
8
  end
9
-
9
+
10
10
  add_index :headers, [:headerable_type, :headerable_id], unique: true
11
11
  end
12
12
  end
@@ -1,14 +1,11 @@
1
- class CreateStaticPages < ActiveRecord::Migration
1
+ class CreateStaticPages < ActiveRecord::Migration[5.2]
2
2
  def change
3
3
  create_table :static_pages do |t|
4
- t.integer :structure_id, null: false
4
+ t.references :structure, null: false
5
5
  t.references :user
6
6
  t.boolean :is_visible, default: true, null: false
7
7
 
8
8
  t.timestamps
9
9
  end
10
-
11
- add_index :static_pages, :user_id
12
- add_index :static_pages, :structure_id
13
10
  end
14
11
  end
@@ -1,4 +1,4 @@
1
- class CreateStructures < ActiveRecord::Migration
1
+ class CreateStructures < ActiveRecord::Migration[5.2]
2
2
  def change
3
3
  create_table :structures do |t|
4
4
  t.string :slug, null: false