ab_admin 0.6.0 → 0.6.1

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: f4b41478c7820e45d9a9deae90db880543e42050
4
- data.tar.gz: 7c53e52bcde99999c83faf3105c3f7be082176be
3
+ metadata.gz: 07cf0aa2ce7c13f970015d489ec04b5d6bbb3e99
4
+ data.tar.gz: 568de144f99ceb62940e015ee41379ce70d76002
5
5
  SHA512:
6
- metadata.gz: 0e43c703029a62700cf443d0460991011e5a3520569a03640d3e08afe30c59584c4fd5429bff961ce4575efb6630fa1f9fa8066b2afaf394a6298845aaf4a2a4
7
- data.tar.gz: 520fbc9ebf7047fa5b9dff9ed8f433d2b15dc7e1feef02d933d5839ffe511b4fcc74b02fc2a8f0d92552cc5079b674a3443e1a86a7c5dccc3a6c06b43a3e0bae
6
+ metadata.gz: 4cb44209d391674ea609b3a3b154d1103f3bbcf56aed44f3f13a6f5a06a176f2189c17ad4fd65f7a9bf5325e542c9d6c2794b7411b11cf769dda97fd0fc0f5d1
7
+ data.tar.gz: 426d9d87810a841b6b04b2429d26ba548aae20e8f5e59f38224707d54c57affadf38d1533d5d307b96ac58b72f85e4fc90140cf756a718a202acafc235fda562
@@ -10,8 +10,9 @@ class window.CroppableImage
10
10
  _.defaults(@options, CroppableImage.crop_defaults)
11
11
  @options.onSelect = @setCropData
12
12
  @options.onChange = @setCropData
13
-
14
- $('.fancybox-image:first').Jcrop @options
13
+ $img = $('.fancybox-image:first')
14
+ @options.trueSize = [$img[0].naturalWidth, $img[0].naturalHeight]
15
+ $img.Jcrop @options
15
16
  $('.fancybox-nav').hide()
16
17
 
17
18
  $cont = $('.fancybox-outer:first')
@@ -24,9 +25,9 @@ class window.CroppableImage
24
25
 
25
26
  cropHandler: (e) =>
26
27
  e.preventDefault()
27
- asset_id = to_i($('.fancybox-image:first').attr('src').match(/\/[\d\/]{2,}\//)[0].replace(/\//g, ''))
28
- $asset = $("#asset_#{asset_id}")
28
+ asset_id = to_i($('.fancybox-image:first').attr('src').match(/\/[\d\/]{1,}\//)[0].replace(/\//g, ''))
29
+ $asset = $(@options.asset_selector || "#asset_#{asset_id}")
29
30
  geometry = [@cropData['w'], @cropData['h'], @cropData['x'], @cropData['y']].join(',')
30
- $.post "/admin/assets/#{$asset.data('id')}/crop", {geometry: geometry}, (data) =>
31
+ $.post "/admin/assets/#{asset_id}/crop", {geometry: geometry}, (data) =>
31
32
  $asset.replaceWith @el.data('assets').template(data.asset)
32
33
  $.fancybox.close()
@@ -168,5 +168,12 @@ class window.Select2Bridge
168
168
  value = @el.closest(selectors[1] || 'html').find(selectors[0]).val()
169
169
  cond[kind_key][attr] = value if value
170
170
 
171
- data = {q: term, class: @el.data('class'), token: true, page: page}
171
+ data =
172
+ q: term
173
+ class: @el.data('class')
174
+ token: true
175
+ page: page,
176
+ order: @el.data('order')
177
+ sort_mode: @el.data('sortMode')
178
+
172
179
  _.extend(data, cond)
@@ -84,8 +84,52 @@ table.index_table {
84
84
  form.simple_form {
85
85
  margin: 0;
86
86
  }
87
+
88
+ .actions_panel {
89
+ width: 0px !important;
90
+ vertical-align: bottom !important;
91
+ padding: 0;
92
+ margin: 0;
93
+ border: none;
94
+ .actions_panel-wrap_outer {
95
+ position: relative;
96
+ top: 0px;
97
+ bottom: 0px;
98
+ height: 100%;
99
+ padding: 0 0 20px 0
100
+ }
101
+
102
+ .actions_panel-wrap_inner {
103
+ display: none;
104
+ position: absolute;
105
+ left: 100px;
106
+ width: auto;
107
+ height: 20px;
108
+ margin-top: 20px;
109
+ padding: 5px 12px;
110
+ background: #f6f6f6;
111
+ border-radius: 0 0 10px 10px;
112
+ box-shadow: 0 3px 5px #bbb;
113
+ border: #ccc 1px solid;
114
+ border-top: none;
115
+ z-index: 10;
116
+ text-align: center;
117
+ white-space: nowrap;
118
+ > * {
119
+ margin-top: -10px;
120
+ }
121
+ .hide_pane {
122
+ display: none;
123
+ }
124
+ }
125
+ }
126
+
127
+ tr:hover > td > .actions_panel-wrap_outer > .actions_panel-wrap_inner {
128
+ display: block;
129
+ }
87
130
  }
88
131
 
89
132
  #batch_action_form {
90
133
  margin-bottom: 10px;
91
- }
134
+ }
135
+
@@ -93,7 +93,13 @@ class Admin::BaseController < ::InheritedResources::Base
93
93
  raise 'No ids specified for batch action' unless params[:by_ids].present?
94
94
  batch_action = params[:batch_action].to_sym
95
95
  if allow_batch_action?(batch_action) && collection.all?{|item| can?(batch_action, item) }
96
- count = collection.inject(0) { |c, item| apply_batch_action(item, batch_action) ? c + 1 : c }
96
+ if batch_action.to_s.end_with?('_collection')
97
+ count = collection.size
98
+ resource_class.public_send(batch_action, collection)
99
+ collection.each { |item| track_action!("batch_#{batch_action}", item) } if settings[:history]
100
+ else
101
+ count = collection.inject(0) { |c, item| apply_batch_action(item, batch_action) ? c + 1 : c }
102
+ end
97
103
  batch_action_name = I18n.t("admin.actions.batch_#{batch_action}.title", default: batch_action.to_s.humanize)
98
104
  flash[:success] = I18n.t('admin.batch_actions.status', count: count, action: batch_action_name)
99
105
  else
@@ -247,7 +253,8 @@ class Admin::BaseController < ::InheritedResources::Base
247
253
 
248
254
  def search_collection
249
255
  params[:q] ||= {}
250
- params[:q][:s] ||= settings[:default_order] || 'id desc'
256
+ nested = resource_class.respond_to?(:acts_as_nested_set_options) && current_index_view == 'tree'
257
+ params[:q][:s] ||= settings[:default_order] || ('id desc' unless nested)
251
258
  @search = end_of_association_chain.accessible_by(current_ability).admin.ransack(params[:q].no_blank)
252
259
  @search.result(distinct: @search.object.joins_values.present?)
253
260
  end
@@ -363,11 +370,11 @@ class Admin::BaseController < ::InheritedResources::Base
363
370
  end
364
371
 
365
372
  def bind_current_user(*args)
366
- resource.user_id = current_user.id if resource.respond_to?(:user_id)
373
+ resource.user_id = current_user.id if !settings[:skip_bind_current_user] && resource.respond_to?(:user_id)
367
374
  end
368
375
 
369
376
  def bind_current_updater(*args)
370
- resource.updater_id = current_user.id if resource.respond_to?(:updater_id)
377
+ resource.updater_id = current_user.id if !settings[:skip_bind_current_updater] && resource.respond_to?(:updater_id)
371
378
  end
372
379
 
373
380
  # roles logic
@@ -413,4 +420,4 @@ class Admin::BaseController < ::InheritedResources::Base
413
420
  {root: false}
414
421
  end
415
422
  end
416
- end
423
+ end
@@ -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', $('#list tr:first th').length);
13
+ $('#<%= form_wrap_id %> td:first').attr('colspan', $('#<%= form_wrap_id %>').prev('tr').find('> td').length);
14
14
  $('#<%= form_wrap_id %> form').trigger('admin:form_init');
15
15
  $('#<%= el_id %>').scrollToEl();
16
16
  <% end %>
@@ -1,5 +1,5 @@
1
1
  - if tmpl = admin_partial_name(form_builder)
2
- = render tmpl
2
+ = render partial: tmpl, locals: local_assigns
3
3
  - else
4
4
  = admin_form_for resource do |f|
5
5
  - form_builder.fields.each do |node|
@@ -39,4 +39,4 @@
39
39
  - resource.tracks.recently.each do |a|
40
40
  tr
41
41
  td= l(a.created_at, format: :short)
42
- td= auto_show_link a.user
42
+ td= auto_show_link a.user
@@ -1,5 +1,5 @@
1
1
  - if tmpl = admin_partial_name(show_builder)
2
- = render tmpl
2
+ = render partial: tmpl, locals: local_assigns
3
3
  - else
4
4
  - show_builder.fields.each do |field|
5
5
  tr
@@ -1,11 +1,12 @@
1
1
  - if tmpl = admin_partial_name(table_builder)
2
- = render tmpl
2
+ = render partial: tmpl, locals: local_assigns
3
3
  - else
4
4
  table.table.table-striped.index_table#list
5
5
  thead
6
6
  tr.pjax_links
7
7
  = batch_action_toggle
8
8
  th= list_sort_link(:id)
9
+ th.actions_panel
9
10
  - table_builder.fields.each do |field|
10
11
  th class=('hide_cell' if field.options[:hidden])
11
12
  - if field.options[:sortable] && !field.options[:image]
@@ -16,13 +17,13 @@
16
17
  = list_sort_link field.name, opts
17
18
  - else
18
19
  = field.name.is_a?(Symbol) ? ha(field.name) : field.name
19
- th= t 'admin.table.actions'
20
20
  tbody
21
21
  - is_edit_link = manager.actions.include?(:edit)
22
22
  - collection.each do |item|
23
23
  tr id=dom_id(item, 'list') class=(table_builder.options[:row_class].call(item) if table_builder.options[:row_class])
24
24
  = batch_action_item(item)
25
25
  td= id_link(item, edit: is_edit_link)
26
+ = item_index_actions_panel(item)
26
27
  - table_builder.fields.each do |field|
27
28
  td
28
29
  - if field.options[:editable] && field.data.is_a?(Symbol)
@@ -31,4 +32,3 @@
31
32
  = item_image_link(item, assoc: field.name)
32
33
  - else
33
34
  = admin_pretty_data call_method_or_proc_on(item, field.data)
34
- td.actions= item_index_actions(item)
@@ -12,7 +12,7 @@
12
12
  .btn-group.pjax_links
13
13
  - button_scopes.each do |name, opts|
14
14
  - active = params[opts[:as]]
15
- a.btn href=url_for(opts[:as] => (active ? nil : 1)) class=('active' if active) = t "admin.scopes.#{name}"
15
+ a.btn href=url_for(opts[:as] => (active ? nil : 1)) class=('active' if active) = t "admin.scopes.#{name}", default: name
16
16
 
17
17
  a.btn.pull-left#columns_hider_show href="#columns_hider" data-toggle='modal' = t 'admin.columns_hider.button'
18
18
 
@@ -2,7 +2,7 @@
2
2
  ul.nav.nav-tabs
3
3
  - Globalize.available_locales.each_with_index do |l, i|
4
4
  li class=('active' if i.zero?)
5
- a data-toggle="tab" href="##{l}" class="ico_#{l}" = t("admin.langs.#{l}")
5
+ a data-toggle="tab" href="##{l}" class="ico_#{l}" = t("admin.langs.#{l}", default: l.to_s)
6
6
  .tab-content
7
7
  - Globalize.available_locales.each_with_index do |l, i|
8
8
  .tab-pane id=l class="tab_#{l} #{'active' if i.zero?}" = loc_html[l]
@@ -3,6 +3,7 @@ table.table.table-striped.index_table#list
3
3
  tr.pjax_links
4
4
  = batch_action_toggle
5
5
  th= list_sort_link(:id)
6
+ th.actions_panel
6
7
  th= list_sort_link(:email)
7
8
  th= ha :avatar
8
9
  th= list_sort_link(:user_role_id)
@@ -11,12 +12,16 @@ table.table.table-striped.index_table#list
11
12
  th= list_sort_link(:phone)
12
13
  th= list_sort_link(:skype)
13
14
  th= list_sort_link(:created_at)
14
- th=t 'admin.table.actions'
15
15
  tbody
16
16
  - collection.each do |item|
17
17
  tr
18
18
  = batch_action_item(item)
19
19
  td= id_link(item)
20
+ = item_index_actions_panel(item) do
21
+ - if item.active?
22
+ = link_to t('admin.actions.suspend.link'), suspend_admin_user_path(item), method: :post, class: 'btn btn-warning'
23
+ - else
24
+ = link_to icon('ok', true), activate_admin_user_path(item), method: :post, class: 'btn btn-success', title: t('admin.actions.activate.link')
20
25
  td= mail_to item.email
21
26
  td= item_image_link(item, assoc: :avatar)
22
27
  td= item.user_role_type.try(:title)
@@ -24,10 +29,4 @@ table.table.table-striped.index_table#list
24
29
  td= item.last_name
25
30
  td= item.phone
26
31
  td= skype_link item.skype
27
- td= pretty_data item.created_at
28
- td.actions
29
- = item_index_actions(item)
30
- - if item.active?
31
- = link_to t('admin.actions.suspend.link'), suspend_admin_user_path(item), method: :post, class: 'btn btn-warning'
32
- - else
33
- = link_to icon('ok', true), activate_admin_user_path(item), method: :post, class: 'btn btn-success', title: t('admin.actions.activate.link')
32
+ td= pretty_data item.created_at
@@ -9,7 +9,7 @@ html id="controller_#{controller_name}"
9
9
  = javascript_include_tag 'ab_admin/application'
10
10
  = csrf_meta_tags
11
11
  = yield(:head)
12
- body id="action_#{action_name}" class="resource_#{resource_collection_name}"
12
+ body id="action_#{action_name}" class="resource_#{resource_collection_name} #{AbAdmin.body_css_class}"
13
13
  #wrap
14
14
  = render 'layouts/admin/navigation'
15
15
  #main role="main"
data/lib/ab_admin.rb CHANGED
@@ -132,6 +132,8 @@ module AbAdmin
132
132
  mattr_accessor :site_name
133
133
  @@site_name = 'AbAdmin'
134
134
 
135
+ mattr_accessor :body_css_class
136
+
135
137
  mattr_accessor :devise_layout
136
138
  @@devise_layout = 'admin/devise'
137
139
 
@@ -68,12 +68,17 @@ module AbAdmin
68
68
  end
69
69
  end
70
70
  add_cond << "#{assoc.klass.quoted_table_name}.#{assoc.type} = '#{name}'" if assoc.type
71
- add_cond += assoc.klass.instance_exec(&assoc.scope).where_values.map(&:to_sql) if assoc.scope
71
+ add_cond << assoc.klass.instance_exec(&assoc.scope).to_sql[/WHERE(.*?)(?:(?:ORDER|LIMIT).*)?$/, 1] if assoc.scope
72
+ if assoc.klass.default_scopes.present?
73
+ assoc.klass.default_scopes.each do |scope|
74
+ add_cond << scope.call.to_sql[/WHERE(.*?)(?:(?:ORDER|LIMIT).*)?$/, 1]
75
+ end
76
+ end
72
77
  count_klass = assoc_count.klass
73
78
  query = <<-SQL
74
79
  UPDATE #{quoted_table_name} SET #{col} = (SELECT COUNT(#{count_klass.quoted_table_name}.id)
75
80
  FROM #{count_klass.quoted_table_name} #{add_from}
76
- WHERE #{quoted_table_name}.id = #{count_klass.quoted_table_name}.#{assoc_count.foreign_key} AND #{add_cond.join(' AND ')})
81
+ WHERE #{quoted_table_name}.id = #{count_klass.quoted_table_name}.#{assoc_count.foreign_key} AND #{add_cond.reject(&:blank?).join(' AND ')})
77
82
  SQL
78
83
  connection.execute(query)
79
84
  end
@@ -18,6 +18,7 @@ module AbAdmin
18
18
  ActiveRecord::Base.send :extend, AbAdmin::Concerns::Silencer
19
19
  ActiveRecord::Base.send :include, AbAdmin::Concerns::Validations
20
20
  ActiveRecord::Base.send :include, AbAdmin::Concerns::Fileuploads
21
+ ActiveRecord::Base.send :extend, EnumField::EnumeratedAttribute
21
22
  end
22
23
 
23
24
  ActiveSupport.on_load :action_mailer do
@@ -32,7 +32,7 @@ module AbAdmin
32
32
  end
33
33
 
34
34
  def activate!
35
- confirm! unless confirmed?
35
+ confirm unless confirmed?
36
36
  unlock_access! if access_locked?
37
37
  end
38
38
 
@@ -1,3 +1,3 @@
1
1
  module AbAdmin
2
- VERSION = '0.6.0'
2
+ VERSION = '0.6.1'
3
3
  end
@@ -158,6 +158,17 @@ module AbAdmin
158
158
  end
159
159
  end
160
160
 
161
+ def item_index_actions_panel(item)
162
+ content = "#{item_index_actions(item)}#{capture{yield item} if block_given?}"
163
+ <<-HTML.html_safe
164
+ <td class="actions_panel">
165
+ <div class="actions_panel-wrap_outer">
166
+ <div class="actions_panel-wrap_inner">#{content}</div>
167
+ </div>
168
+ </td>
169
+ HTML
170
+ end
171
+
161
172
  def item_index_actions(item)
162
173
  actions = resource_action_items.map do |act|
163
174
  short_action_link(act, item)
@@ -72,7 +72,7 @@ module AbAdmin
72
72
  opts = [['=', 'eq'], ['>', 'gt'], ['<', 'lt']].map { |m| [m[0], "#{attr}_#{m[1]}"] }
73
73
  current_filter = (opts.detect { |m| params[:q][m[1]].present? } || opts.first)[1]
74
74
  select_tag('', options_for_select(opts, current_filter), class: 'input-small predicate-select') +
75
- text_field_tag("q[#{current_filter}]", params[:q][current_filter], class: 'input-small')
75
+ text_field_tag("q[#{current_filter}]", params[:q][current_filter], class: 'input-small', type: :number)
76
76
  end
77
77
  end
78
78
 
@@ -89,11 +89,11 @@ module AbAdmin
89
89
  end
90
90
 
91
91
  def presence_field(attr, options={})
92
- yes_no_field(attr, {yes: %w(present 1), no: %w(present 0)}, options)
92
+ yes_no_field(attr, options.merge(predicates: {yes: %w(present 1), no: %w(present 0)}))
93
93
  end
94
94
 
95
95
  def null_field(attr, options={})
96
- yes_no_field(attr, {yes: %w(null 0), no: %w(null 1)}, options)
96
+ yes_no_field(attr, options.merge(predicates: {yes: %w(null 0), no: %w(null 1)}))
97
97
  end
98
98
 
99
99
 
@@ -134,9 +134,8 @@ module AbAdmin
134
134
  end
135
135
  end
136
136
 
137
- private
138
-
139
- def yes_no_field(attr, predicates, options={})
137
+ def yes_no_field(attr, options={})
138
+ predicates = options[:predicates]
140
139
  content_tag(:div, class: 'pull-left') do
141
140
  content_tag(:label, class: 'checkbox inline') do
142
141
  param = "#{attr}_#{predicates[:yes][0]}"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ab_admin
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.0
4
+ version: 0.6.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alex Leschenko
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-05-11 00:00:00.000000000 Z
11
+ date: 2015-09-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -364,16 +364,16 @@ dependencies:
364
364
  name: mysql2
365
365
  requirement: !ruby/object:Gem::Requirement
366
366
  requirements:
367
- - - ">="
367
+ - - "~>"
368
368
  - !ruby/object:Gem::Version
369
- version: '0'
369
+ version: 0.3.19
370
370
  type: :development
371
371
  prerelease: false
372
372
  version_requirements: !ruby/object:Gem::Requirement
373
373
  requirements:
374
- - - ">="
374
+ - - "~>"
375
375
  - !ruby/object:Gem::Version
376
- version: '0'
376
+ version: 0.3.19
377
377
  description: Simple and real-life tested Rails::Engine admin interface
378
378
  email:
379
379
  - leschenko.al@gmail.com