active_list 6.0.1 → 6.1.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.
data/lib/active_list.rb CHANGED
@@ -3,11 +3,10 @@ require 'action_dispatch'
3
3
  require 'rails'
4
4
  # require 'compass-rails'
5
5
  require 'code_string'
6
+ require 'i18n-complements'
6
7
 
7
8
  module ActiveList
8
9
 
9
- CSV = ::CSV
10
-
11
10
  # Build and returns a short UID
12
11
  def self.new_uid
13
12
  @@last_uid ||= 0
@@ -22,7 +21,6 @@ module ActiveList
22
21
  autoload :Renderers, 'active_list/renderers'
23
22
  autoload :Exporters, 'active_list/exporters'
24
23
  autoload :Generator, 'active_list/generator'
25
- autoload :ActionPack, 'active_list/action_pack'
26
24
 
27
25
  mattr_reader :renderers
28
26
  @@renderers = {}
@@ -58,4 +56,4 @@ unless "string".respond_to? :dig
58
56
  end
59
57
 
60
58
 
61
- require 'active_list/rails/engine'
59
+ require 'active_list/rails'
@@ -6,25 +6,68 @@ module ActiveList
6
6
  class ActionColumn < AbstractColumn
7
7
  include ActiveList::Helpers
8
8
 
9
+ USE_MODES = [:none, :single, :many, :both]
10
+
11
+ def initialize(table, name, options = {})
12
+ super(table, name, options)
13
+ @use_mode = (@options.delete(:on) || :single).to_sym
14
+ unless USE_MODES.include?(@use_mode)
15
+ raise "Invalid use mode: #{@use_mode.inspect}"
16
+ end
17
+ if @name.to_s == "destroy" and !@options.has_key?(:method)
18
+ @options[:method] = :delete
19
+ end
20
+ if @name.to_s == "destroy" and !@options.has_key?(:confirm)
21
+ @options[:confirm] ||= :are_you_sure_you_want_to_delete
22
+ end
23
+ @options[:if] ||= :destroyable? if @name.to_s == "destroy"
24
+ @options[:if] ||= :editable? if @name.to_s == "edit"
25
+ @options[:confirm] = :are_you_sure if @options[:confirm].is_a?(TrueClass)
26
+ end
27
+
28
+ def use_single?
29
+ @use_mode == :single or @use_mode == :both
30
+ end
31
+
32
+ def use_many?
33
+ @use_mode == :many or @use_mode == :both
34
+ end
35
+
36
+ def use_none?
37
+ @use_mode == :none
38
+ end
39
+
40
+ def global?
41
+ self.use_none? or self.use_many?
42
+ end
43
+
9
44
  def header_code
10
45
  "''".c
11
46
  end
12
47
 
48
+ def default_url(use_mode = :many)
49
+ url = @options[:url] ||= {}
50
+ url[:controller] ||= (@options[:controller] || table.model.name.tableize)
51
+ url[:action] ||= @name.to_s
52
+ if @options.has_key? :format
53
+ url[:format] = @options[:format]
54
+ end
55
+ if use_many? and use_mode == :many
56
+ url[:id] ||= "##IDS##"
57
+ end
58
+ return url
59
+ end
60
+
13
61
  def operation(record = 'record_of_the_death')
14
- @options[:method] = :delete if @name.to_s == "destroy" and !@options.has_key?(:method)
15
- @options[:confirm] ||= :are_you_sure_you_want_to_delete if @name.to_s == "destroy" and !@options.has_key?(:confirm)
16
- @options[:if] ||= :destroyable? if @name.to_s == "destroy"
17
- @options[:if] ||= :editable? if @name.to_s == "edit"
18
- @options[:confirm] = :are_you_sure if @options[:confirm].is_a?(TrueClass)
19
62
  link_options = ""
20
63
  if @options[:confirm]
21
64
  link_options << ", 'data-confirm' => #{(@options[:confirm]).inspect}.t(scope: 'labels')"
22
65
  end
23
- if @options['data-method'] or @options[:method]
24
- link_options << ", :method => h('#{(@options['data-method']||@options[:method])}')"
66
+ if @options[:method]
67
+ link_options << ", method: :#{@options[:method].to_s.underscore}"
25
68
  end
26
69
  action = @name
27
- format = @options[:format] ? ", :format => '#{@options[:format]}'" : ""
70
+ format = @options[:format] ? ", format: '#{@options[:format]}'" : ""
28
71
  if @options[:remote]
29
72
  raise StandardError, "Sure to use :remote ?"
30
73
  # remote_options = @options.dup
@@ -39,6 +82,9 @@ module ActiveList
39
82
  # code += ", {title: #{action.inspect}.tl}"
40
83
  # code += ")"
41
84
  elsif @options[:actions]
85
+ unless use_single?
86
+ raise StandardError, "Only compatible with single actions"
87
+ end
42
88
  unless @options[:actions].is_a? Hash
43
89
  raise StandardError, "options[:actions] have to be a Hash."
44
90
  end
@@ -58,8 +104,8 @@ module ActiveList
58
104
  url[:id] ||= "RECORD.id".c
59
105
  url.delete_if{|k, v| v.nil?}
60
106
  url = "{" + url.collect{|k, v| "#{k}: " + urlify(v, record)}.join(", ")+format+"}"
61
- code = "{class: '#{@name}'"+link_options+"}"
62
- code = "link_to(content_tag(:i) + h('#{action}'.t(scope: 'labels')), "+url+", "+code+")"
107
+ code = "{class: '#{@name}'" + link_options+"}"
108
+ code = "link_to(content_tag(:i) + h(' ' + '#{action}'.t(scope: 'labels')), " + url + ", " + code + ")"
63
109
  end
64
110
  if @options[:if]
65
111
  code = "if " + recordify!(@options[:if], record) + "\n" + code.dig + "end"
@@ -13,6 +13,7 @@ module ActiveList
13
13
  @options[:renderer] ||= :simple_renderer
14
14
  @options[:per_page] = 20 if @options[:per_page].to_i <= 0
15
15
  @options[:page] = 1 if @options[:page].to_i <= 0
16
+ @selector = @options.delete(:selector)
16
17
  @columns = []
17
18
  @id = ActiveList.new_uid
18
19
  end
@@ -44,6 +45,22 @@ module ActiveList
44
45
  @paginate
45
46
  end
46
47
 
48
+ def has_many_records_action?
49
+ many_records_action_columns.any?
50
+ end
51
+
52
+ def many_records_action_columns
53
+ action_columns.select(&:use_many?)
54
+ end
55
+
56
+ def global_action_columns
57
+ action_columns.select(&:global?)
58
+ end
59
+
60
+ def selectable?
61
+ @selector
62
+ end
63
+
47
64
  # Retrieves all columns in database
48
65
  def table_columns
49
66
  cols = self.model_columns.map(&:name)
@@ -54,6 +71,10 @@ module ActiveList
54
71
  @columns.select{|c| c.is_a? DataColumn}
55
72
  end
56
73
 
74
+ def action_columns
75
+ @columns.select{|c| c.is_a? ActionColumn}
76
+ end
77
+
57
78
  def hidden_columns
58
79
  self.data_columns.select(&:hidden?)
59
80
  end
@@ -15,13 +15,13 @@ module ActiveList
15
15
  def send_data_code
16
16
  record = "r"
17
17
  code = generator.select_data_code(paginate: false)
18
- code << "data = ActiveList::CSV.generate do |csv|\n"
18
+ code << "data = ::CSV.generate do |csv|\n"
19
19
  code << " csv << [#{columns_to_array(:header).join(', ')}]\n"
20
20
  code << " for #{record} in #{generator.records_variable_name}\n"
21
21
  code << " csv << [#{columns_to_array(:body, record: record).join(', ')}]\n"
22
22
  code << " end\n"
23
23
  code << "end\n"
24
- code << "send_data(data, type: #{self.mime_type.to_s.inspect}, disposition: 'inline', filename: #{table.model.name}.model_name.human.gsub(/[^a-z0-9]/i,'_') + '.#{self.file_extension}')\n"
24
+ code << "send_data(data, type: #{self.mime_type.to_s.inspect}, disposition: 'inline', filename: #{table.model.name}.model_name.human.gsub(/[^a-z0-9]/i, '_') + '.#{self.file_extension}')\n"
25
25
  return code.c
26
26
  end
27
27
 
@@ -1,5 +1,3 @@
1
- # encoding: UTF-8
2
-
3
1
  # Register XCSV format unless is already set
4
2
  Mime::Type.register("text/csv", :xcsv) unless defined? Mime::XCSV
5
3
 
@@ -21,7 +19,7 @@ module ActiveList
21
19
  record = "r"
22
20
  code = generator.select_data_code(paginate: false)
23
21
  encoding = "CP1252"
24
- code << "data = ActiveList::CSV.generate(:col_sep => ';') do |csv|\n"
22
+ code << "data = ::CSV.generate(col_sep: ';') do |csv|\n"
25
23
  code << " csv << [#{columns_to_array(:header, encoding: encoding).join(', ')}]\n"
26
24
  code << " for #{record} in #{generator.records_variable_name}\n"
27
25
  code << " csv << [#{columns_to_array(:body, record: record, encoding: encoding).join(', ')}]\n"
@@ -0,0 +1,2 @@
1
+ require 'active_list/rails/integration'
2
+ require 'active_list/rails/engine'
@@ -1,13 +1,15 @@
1
1
  module ActiveList
2
2
  module Rails
3
+
3
4
  class Engine < ::Rails::Engine
4
5
  engine_name "active_list"
5
6
  initializer "active_list.integrate_methods" do |app|
6
- ::ActionController::Base.send(:include, ActiveList::ActionPack::ActionController)
7
- ::ActionView::Base.send(:include, ActiveList::ActionPack::ViewsHelper)
7
+ ::ActionController::Base.send(:include, ActiveList::Rails::Integration::ActionController)
8
+ ::ActionView::Base.send(:include, ActiveList::Rails::Integration::ViewsHelper)
8
9
  files = Dir[File.join(File.dirname(__FILE__), "..", "..", "..", "locales", "*.yml")]
9
10
  ::I18n.load_path.concat(files)
10
11
  end
11
12
  end
13
+
12
14
  end
13
15
  end
@@ -0,0 +1,46 @@
1
+ module ActiveList
2
+ module Rails
3
+ module Integration
4
+
5
+ module ActionController
6
+
7
+ def self.included(base) #:nodoc:
8
+ base.extend(ClassMethods)
9
+ end
10
+
11
+ module ClassMethods
12
+
13
+ # Permits to define and generate methods to manage dynamic
14
+ # table ActiveList
15
+ def list(*args, &block)
16
+ options = args.extract_options!
17
+ options[:controller] = self
18
+ args << options
19
+ generator = ActiveList::Generator.new(*args, &block)
20
+ class_eval(generator.controller_method_code, __FILE__, __LINE__)
21
+ ActionView::Base.send(:class_eval, generator.view_method_code, __FILE__, __LINE__)
22
+ end
23
+
24
+ end
25
+
26
+ end
27
+
28
+ module ViewsHelper
29
+
30
+ # Calls the generated view helper
31
+ def list(*args, &block)
32
+ options = args.extract_options!
33
+ name = args.shift
34
+ kontroller = self.controller.class
35
+ begin
36
+ helper_method = "_#{kontroller.controller_name}_#{__method__}_#{name || kontroller.controller_name}_tag".to_sym
37
+ kontroller = kontroller.superclass
38
+ end until self.respond_to?(helper_method)
39
+ return self.send(helper_method, &block)
40
+ end
41
+
42
+ end
43
+
44
+ end
45
+ end
46
+ end
@@ -75,25 +75,27 @@ module ActiveList
75
75
  code << "end\n"
76
76
 
77
77
  code << "#{var_name(:tbody)} << '</tbody>'\n"
78
- code << "return #{var_name(:tbody)}.html_safe if options[:only] == 'body' or options[:only] == 'tbody'\n"
79
-
80
- code << "html = ''\n"
81
- code << "html << '<div id=\"#{table.name}\" data-list-source=\"'+h(url_for(options.merge(:action => '#{generator.controller_method_name}')))+'\" class=\"active-list\""
78
+ code << "return #{var_name(:tbody)}.html_safe if options[:only] == 'table-body'\n"
79
+
80
+ # Build content
81
+ code << "#{var_name(:content)} = ''\n"
82
+ code << "#{var_name(:content)} << #{extras}\n" unless extras.blank?
83
+ code << "#{var_name(:content)} << '<table class=\"list\""
82
84
  if table.paginate?
83
85
  code << " data-list-current-page=\"' + #{var_name(:page)}.to_s + '\" data-list-page-size=\"' + #{var_name(:limit)}.to_s + '\""
84
86
  end
85
87
  code << " data-list-sort-by=\"' + #{var_name(:params)}[:sort].to_s + '\" data-list-sort-dir=\"' + #{var_name(:params)}[:dir].to_s + '\""
86
88
  code << ">'\n"
87
- code << "html << '<table class=\"list\">'\n"
88
- code << "html << (#{header})\n"
89
+ code << "#{var_name(:content)} << (#{header})\n"
89
90
  code << "if block_given?\n"
90
- code << " html << '<tfoot>' + capture(" + table.columns.collect{|c| {name: c.name, id: c.id}}.inspect + ", &block).to_s + '</tfoot>'\n"
91
+ code << " #{var_name(:content)} << '<tfoot>' + capture(" + table.columns.collect{|c| {name: c.name, id: c.id}}.inspect + ", &block).to_s + '</tfoot>'\n"
91
92
  code << "end\n"
92
- code << "html << #{var_name(:tbody)}\n"
93
- code << "html << '</table>'\n"
94
- code << "html << #{extras}\n" if extras
95
- code << "html << '</div>'\n"
96
- code << "return html.html_safe\n"
93
+ code << "#{var_name(:content)} << #{var_name(:tbody)}\n"
94
+ code << "#{var_name(:content)} << '</table>'\n"
95
+ code << "return #{var_name(:content)}.html_safe if options[:only] == 'content'\n"
96
+
97
+ # Build whole
98
+ code << "return ('<div id=\"#{table.name}\" data-list-source=\"'+h(url_for(options.merge(:action => '#{generator.controller_method_name}')))+'\" class=\"active-list\">' + #{var_name(:content)} + '</div>').html_safe\n"
97
99
  return code
98
100
  end
99
101
 
@@ -104,10 +106,16 @@ module ActiveList
104
106
  unless [:body, :children].include?(nature)
105
107
  raise ArgumentError, "Nature is invalid"
106
108
  end
109
+ record = options[:record] || 'record_of_the_death'
110
+ if table.selectable?
111
+ code << "content_tag(:td, class: 'list-selector') do\n"
112
+ code << " tag(:input, type: 'checkbox', value: #{record}.id, data: {list_selector: #{record}.id})\n"
113
+ code << "end +\n"
114
+ end
115
+
107
116
  children_mode = !!(nature == :children)
108
117
  for column in table.columns
109
118
  value_code = ""
110
- record = options[:record] || 'record_of_the_death'
111
119
  if column.is_a? ActiveList::Definition::EmptyColumn
112
120
  value_code = 'nil'
113
121
  elsif column.is_a? ActiveList::Definition::StatusColumn
@@ -187,6 +195,7 @@ module ActiveList
187
195
  form_name = column.form_name || "'#{table.name}[' + #{record}.id.to_s + '][#{column.name}]'".c
188
196
  value_code = (nature == :body ? "text_field_tag(#{form_name.inspect}, #{recordify!(column.options[:value] || column.name, record)}#{column.options[:size] ? ', size: ' + column.options[:size].to_s : ''})" : "nil") # , id: '#{table.name}_'+#{record}.id.to_s + '_#{column.name}'
189
197
  elsif column.is_a?(ActiveList::Definition::ActionColumn)
198
+ next unless column.use_single?
190
199
  value_code = (nature == :body ? column.operation(record) : "nil")
191
200
  else
192
201
  value_code = "'&#160;&#8709;&#160;'.html_safe"
@@ -201,15 +210,16 @@ module ActiveList
201
210
  # code << "content_tag(:td)"
202
211
  # end
203
212
 
204
- code << "content_tag(:td)"
213
+ code << "''.html_safe"
214
+ # code << "content_tag(:td)"
205
215
  return code.c
206
216
  end
207
217
 
208
218
 
209
219
  # Produces main menu code
210
220
  def menu_code
211
- menu = "<div class=\"list-menu\">"
212
- menu << "<a class=\"list-menu-start\"><span class=\"icon\"></span><span class=\"text\">' + h(::I18n.translate('list.menu').gsub(/\'/,'&#39;')) + '</span></a>"
221
+ menu = "<span class=\"settings\">"
222
+ menu << "<a class=\"settings-start\"><i></i>' + h('list.menu'.t) + '</a>"
213
223
  menu << "<ul>"
214
224
  if table.paginate?
215
225
  # Per page
@@ -217,18 +227,18 @@ module ActiveList
217
227
  list << table.options[:per_page].to_i if table.options[:per_page].to_i > 0
218
228
  list = list.uniq.sort
219
229
  menu << "<li class=\"parent\">"
220
- menu << "<a class=\"pages\"><span class=\"icon\"></span><span class=\"text\">' + ::I18n.translate('list.items_per_page').gsub(/\'/,'&#39;') + '</span></a><ul>"
230
+ menu << "<a class=\"pages\"><i></i>' + h('list.items_per_page'.t) + '</a><ul>"
221
231
  for n in list
222
- menu << "<li data-list-change-page-size=\"#{n}\" '+(#{var_name(:params)}[:per_page] == #{n} ? ' class=\"check\"' : '')+'><a><span class=\"icon\"></span><span class=\"text\">'+h(::I18n.translate('list.x_per_page', :count => #{n}))+'</span></a></li>"
232
+ menu << "<li data-list-change-page-size=\"#{n}\" '+(#{var_name(:params)}[:per_page] == #{n} ? ' class=\"check\"' : '') + '><a><i></i>' + h('list.x_per_page'.t(count: #{n})) + '</a></li>"
223
233
  end
224
234
  menu << "</ul></li>"
225
235
  end
226
236
 
227
237
  # Column selector
228
238
  menu << "<li class=\"parent\">"
229
- menu << "<a class=\"columns\"><span class=\"icon\"></span><span class=\"text\">' + ::I18n.translate('list.columns').gsub(/\'/,'&#39;') + '</span></a><ul>"
239
+ menu << "<a class=\"columns\"><i></i>' + h('list.columns'.t) + '</a><ul>"
230
240
  for column in table.data_columns
231
- menu << "<li data-list-toggle-column=\"#{column.name}\" class=\"'+(#{var_name(:params)}[:hidden_columns].include?(:#{column.name}) ? 'unchecked' : 'checked')+'\"><a><span class=\"icon\"></span><span class=\"text\">'+h(#{column.header_code})+'</span></a></li>"
241
+ menu << "<li data-list-toggle-column=\"#{column.name}\" class=\"' + (#{var_name(:params)}[:hidden_columns].include?(:#{column.name}) ? 'unchecked' : 'checked') + '\"><a><i></i>' + h(#{column.header_code}) + '</a></li>"
232
242
  end
233
243
  menu << "</ul></li>"
234
244
 
@@ -236,9 +246,9 @@ module ActiveList
236
246
  menu << "<li class=\"separator\"></li>"
237
247
  # Exports
238
248
  for format, exporter in ActiveList.exporters
239
- menu << "<li class=\"export #{exporter.name}\">' + link_to(params.merge(:action => :#{generator.controller_method_name}, :sort => #{var_name(:params)}[:sort], :dir => #{var_name(:params)}[:dir], :format => '#{format}')) { '<span class=\"icon\"></span>'.html_safe + content_tag('span', ::I18n.translate('list.export_as', :exported => ::I18n.translate('list.export.formats.#{format}')).gsub(/\'/,'&#39;'), :class => 'text')} + '</li>"
249
+ menu << "<li class=\"export export-#{format}\">' + link_to(content_tag(:i) + h('list.export_as'.t(exported: :#{format}.t(scope: 'list.export.formats'))), params.merge(action: :#{generator.controller_method_name}, sort: #{var_name(:params)}[:sort], dir: #{var_name(:params)}[:dir], format: '#{format}')) + '</li>"
240
250
  end
241
- menu << "</ul></div>"
251
+ menu << "</ul></span>"
242
252
  return menu
243
253
  end
244
254
 
@@ -246,46 +256,71 @@ module ActiveList
246
256
  # and pagination management
247
257
  def header_code
248
258
  code = "'<thead><tr>"
259
+ if table.selectable?
260
+ code << "<th class=\"list-selector\"></th>"
261
+ end
249
262
  for column in table.columns
263
+ next if column.is_a?(ActiveList::Definition::ActionColumn) and !column.use_single?
250
264
  code << "<th data-list-column=\"#{column.sort_id}\""
251
265
  code << " data-list-column-cells=\"#{column.short_id}\""
252
266
  code << " data-list-column-sort=\"'+(#{var_name(:params)}[:sort] != '#{column.sort_id}' ? 'asc' : #{var_name(:params)}[:dir] == 'asc' ? 'desc' : 'asc')+'\"" if column.sortable?
253
267
  code << " class=\"#{column_classes(column, true, true)}\""
254
268
  code << ">"
255
- code << "<span class=\"text\">'+h(#{column.header_code})+'</span>"
256
- code << "<span class=\"icon\"></span>"
269
+ code << "' + h(#{column.header_code}) + '"
270
+ code << "<i></i>"
257
271
  code << "</th>"
258
272
  end
259
- code << "<th class=\"spe\">#{menu_code}</th>"
273
+ # code << "<th class=\"spe\">#{menu_code}</th>"
260
274
  code << "</tr></thead>'"
261
275
  return code
262
276
  end
263
277
 
264
278
  # Produces the code to create bottom menu and pagination
265
279
  def extras_code
266
- code, pagination = nil, ''
280
+ code = []
281
+
282
+ if table.global_action_columns.any?
283
+ actioner = ""
284
+ actioner << "<span class=\"actioner\">'"
285
+ for column in table.global_action_columns
286
+ actioner << " + link_to(content_tag(:i) + h(' ' + :#{column.name.to_s}.t(scope: 'labels')), #{column.default_url.inspect}, class: 'btn btn-#{column.name}'#{', style: "display: none"' unless column.use_none?}#{', method: "' + column.options[:method].to_s + '"' if column.options[:method]}, data: {list_actioner: :#{column.use_none? ? 'none' : 'many'}#{', confirm: :' + column.options[:confirm].to_s + '.t(scope: "labels")' if column.options[:confirm]}})"
287
+ end
288
+ actioner << " + '</span>"
289
+ code << "'#{actioner}'"
290
+ end
291
+
292
+ code << "'#{menu_code}'"
267
293
 
268
294
  if table.paginate?
295
+ pagination = ""
269
296
  current_page = "#{var_name(:page)}"
270
297
  last_page = "#{var_name(:last)}"
271
298
 
272
- pagination << "<div class=\"pagination\">"
273
- pagination << "<a href=\"#\" data-list-move-to-page=\"1\" class=\"first-page\"' + (#{current_page} != 1 ? '' : ' disabled=\"true\"') + '><i></i>' + ::I18n.translate('list.pagination.first') + '</a>"
274
- pagination << "<a href=\"#\" data-list-move-to-page=\"' + (#{current_page} - 1).to_s + '\" class=\"previous-page\"' + (#{current_page} != 1 ? '' : ' disabled=\"true\"') + '><i></i>' + ::I18n.translate('list.pagination.previous') + '</a>"
299
+ pagination << "<span class=\"pagination\">"
300
+ pagination << "<span class=\"status\">' + 'list.pagination.x_to_y_of_total'.t(x: (#{var_name(:offset)} + 1), y: ((#{var_name(:last)} == #{var_name(:page)}) ? #{var_name(:count)} : #{var_name(:offset)} + #{var_name(:limit)}), total: #{var_name(:count)}) + '</span>"
301
+
302
+ pagination << "<span class=\"paginator\">"
303
+
304
+ pagination << "<a href=\"#\" data-list-move-to-page=\"1\" class=\"btn first-page\"' + (#{current_page} != 1 ? '' : ' disabled=\"true\"') + '><i></i>' + ::I18n.translate('list.pagination.first') + '</a>"
305
+ pagination << "<a href=\"#\" data-list-move-to-page=\"' + (#{current_page} - 1).to_s + '\" class=\"btn previous-page\"' + (#{current_page} != 1 ? '' : ' disabled=\"true\"') + '><i></i>' + ::I18n.translate('list.pagination.previous') + '</a>"
275
306
 
276
307
  x = '@@PAGE-NUMBER@@'
277
308
  y = '@@PAGE-COUNT@@'
278
- pagination << "<span class=\"paginator\">'+::I18n.translate('list.page_x_on_y', :default => '%{x} / %{y}', :x => '#{x}', :y => '#{y}').html_safe.gsub('#{x}', ('<input type=\"number\" size=\"4\" data-list-move-to-page=\"value\" value=\"'+#{var_name(:page)}.to_s+'\">').html_safe).gsub('#{y}', #{var_name(:last)}.to_s) + '</span>"
309
+ # pagination << "<span class=\"paginator\">'+::I18n.translate('list.page_x_on_y', :default => '%{x} / %{y}', :x => '#{x}', :y => '#{y}').html_safe.gsub('#{x}', ('<input type=\"number\" size=\"4\" data-list-move-to-page=\"value\" value=\"'+#{var_name(:page)}.to_s+'\">').html_safe).gsub('#{y}', #{var_name(:last)}.to_s) + '</span>"
310
+ # pagination << "<input type=\"number\" size=\"4\" data-list-move-to-page=\"value\" value=\"' + #{var_name(:page)}.to_s + '\">"
311
+
312
+ pagination << "<a href=\"#\" data-list-move-to-page=\"' + (#{current_page} + 1).to_s + '\" class=\"btn next-page\"' + (#{current_page} != #{last_page} ? '' : ' disabled=\"true\"') + '><i></i>' + ::I18n.translate('list.pagination.next')+'</a>"
313
+ pagination << "<a href=\"#\" data-list-move-to-page=\"' + (#{last_page}).to_s + '\" class=\"btn last-page\"' + (#{current_page} != #{last_page} ? '' : ' disabled=\"true\"') + '><i></i>' + ::I18n.translate('list.pagination.last')+'</a>"
314
+ pagination << "</span>"
279
315
 
280
- pagination << "<a href=\"#\" data-list-move-to-page=\"' + (#{current_page} + 1).to_s + '\" class=\"next-page\"' + (#{current_page} != #{last_page} ? '' : ' disabled=\"true\"') + '><i></i>' + ::I18n.translate('list.pagination.next')+'</a>"
281
- pagination << "<a href=\"#\" data-list-move-to-page=\"' + (#{last_page}).to_s + '\" class=\"last-page\"' + (#{current_page} != #{last_page} ? '' : ' disabled=\"true\"') + '><i></i>' + ::I18n.translate('list.pagination.last')+'</a>"
316
+ # pagination << "<span class=\"separator\"></span>"
282
317
 
283
- pagination << "<span class=\"separator\"></span>"
284
318
 
285
- pagination << "<span class=\"status\">'+::I18n.translate('list.pagination.showing_x_to_y_of_total', :x => (#{var_name(:offset)} + 1), :y => ((#{var_name(:last)} == #{var_name(:page)}) ? #{var_name(:count)} : #{var_name(:offset)}+#{var_name(:limit)}), :total => #{var_name(:count)})+'</span>"
286
- pagination << "</div>"
319
+ code << "'#{pagination}'"
320
+ end
287
321
 
288
- code = "(#{var_name(:last)} > 1 ? '<div class=\"extras\">#{pagination}</div>' : '').html_safe"
322
+ unless code.empty?
323
+ code = "content_tag(:div, (#{code.join(' + ')}).html_safe, class: 'list-control')"
289
324
  end
290
325
 
291
326
  return code