ab_admin 0.8.3 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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