active_list 6.0.1 → 6.1.0

Sign up to get free protection for your applications and to get access to all the features.
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