active-list 4.2.4 → 5.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/VERSION +1 -1
- data/{lib → app}/assets/images/active-list.png +0 -0
- data/app/assets/images/active-list.svg +415 -0
- data/{lib/assets/javascripts/active-list.jquery.js → app/assets/javascripts/active_list.jquery.js} +2 -2
- data/app/assets/stylesheets/active_list.css.scss +7 -0
- data/{lib/active-list/compass/stylesheets/active-list/_background.scss → app/assets/stylesheets/active_list/background.scss} +10 -8
- data/{lib/active-list/compass/stylesheets/active-list/_minimal.scss → app/assets/stylesheets/active_list/minimal.scss} +16 -16
- data/{lib/active-list/compass/stylesheets/active-list/_theme.scss → app/assets/stylesheets/active_list/theme.scss} +37 -37
- data/lib/active-list.rb +1 -37
- data/lib/active_list.rb +43 -0
- data/lib/active_list/action_pack.rb +46 -0
- data/lib/active_list/definition.rb +17 -0
- data/lib/active_list/definition/abstract_column.rb +54 -0
- data/lib/active_list/definition/action_column.rb +76 -0
- data/lib/active_list/definition/association_column.rb +80 -0
- data/lib/active_list/definition/attribute_column.rb +58 -0
- data/lib/active_list/definition/check_box_column.rb +17 -0
- data/lib/active_list/definition/data_column.rb +88 -0
- data/lib/active_list/definition/empty_column.rb +10 -0
- data/lib/active_list/definition/field_column.rb +20 -0
- data/lib/active_list/definition/status_column.rb +10 -0
- data/lib/active_list/definition/table.rb +159 -0
- data/lib/active_list/definition/text_field_column.rb +10 -0
- data/lib/active_list/exporters.rb +28 -0
- data/lib/active_list/exporters/abstract_exporter.rb +55 -0
- data/lib/active_list/exporters/csv_exporter.rb +32 -0
- data/lib/active_list/exporters/excel_csv_exporter.rb +38 -0
- data/lib/active_list/exporters/open_document_spreadsheet_exporter.rb +82 -0
- data/lib/active_list/generator.rb +122 -0
- data/lib/active_list/generator/finder.rb +150 -0
- data/lib/active_list/helpers.rb +33 -0
- data/lib/{active-list → active_list}/rails/engine.rb +3 -2
- data/lib/active_list/renderers.rb +25 -0
- data/lib/active_list/renderers/abstract_renderer.rb +29 -0
- data/lib/active_list/renderers/simple_renderer.rb +356 -0
- metadata +74 -55
- data/lib/active-list/action_pack.rb +0 -48
- data/lib/active-list/columns/action_column.rb +0 -83
- data/lib/active-list/columns/data_column.rb +0 -151
- data/lib/active-list/columns/field_column.rb +0 -29
- data/lib/active-list/compass/stylesheets/_active-list.scss +0 -7
- data/lib/active-list/definition.rb +0 -103
- data/lib/active-list/exporters.rb +0 -71
- data/lib/active-list/exporters/csv_exporter.rb +0 -30
- data/lib/active-list/exporters/excel_csv_exporter.rb +0 -36
- data/lib/active-list/exporters/open_document_spreadsheet_exporter.rb +0 -81
- data/lib/active-list/finder.rb +0 -134
- data/lib/active-list/generator.rb +0 -88
- data/lib/active-list/renderers.rb +0 -28
- data/lib/active-list/renderers/simple_renderer.rb +0 -335
- data/lib/assets/stylesheets/active-list.css.scss +0 -7
@@ -0,0 +1,33 @@
|
|
1
|
+
module ActiveList
|
2
|
+
module Helpers
|
3
|
+
|
4
|
+
def recordify!(value, record_name)
|
5
|
+
if value.is_a?(Symbol)
|
6
|
+
return record_name + "." + value.to_s
|
7
|
+
elsif value.is_a?(Code)
|
8
|
+
return "(" + value.gsub(/RECORD/, record_name) + ")"
|
9
|
+
else
|
10
|
+
raise ArgumentError, "Code or Symbol must be given to be recordified)"
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def recordify(value, record_name)
|
15
|
+
if value.is_a?(Symbol)
|
16
|
+
return record_name + "." + value.to_s
|
17
|
+
elsif value.is_a?(Code)
|
18
|
+
return "(" + value.gsub(/RECORD/, record_name) + ")"
|
19
|
+
else
|
20
|
+
return value.inspect
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def urlify(value, record_name)
|
25
|
+
if value.is_a?(Code)
|
26
|
+
return "(" + value.gsub(/RECORD/, record_name) + ")"
|
27
|
+
else
|
28
|
+
return value.inspect
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
end
|
@@ -3,8 +3,9 @@ module ActiveList
|
|
3
3
|
class Engine < ::Rails::Engine
|
4
4
|
engine_name "active_list"
|
5
5
|
initializer "active_list.integrate_methods" do |app|
|
6
|
-
::ActionController::Base.send(:include, ActiveList::ActionController)
|
7
|
-
::ActionView::Base.send(:include, ActiveList::ViewsHelper)
|
6
|
+
::ActionController::Base.send(:include, ActiveList::ActionPack::ActionController)
|
7
|
+
::ActionView::Base.send(:include, ActiveList::ActionPack::ViewsHelper)
|
8
|
+
::I18n.load_path += Dir[File.join(File.expand_path(File.dirname(__FILE__)), "..", "..", "..", "locales", "*.yml")]
|
8
9
|
end
|
9
10
|
end
|
10
11
|
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# require 'active_support/core_ext/module/attribute_accessors'
|
2
|
+
|
3
|
+
module ActiveList
|
4
|
+
|
5
|
+
module Renderers
|
6
|
+
|
7
|
+
def self.[](name)
|
8
|
+
ActiveList.renderers[name]
|
9
|
+
end
|
10
|
+
|
11
|
+
autoload :AbstractRenderer, 'active_list/renderers/abstract_renderer'
|
12
|
+
autoload :SimpleRenderer, 'active_list/renderers/simple_renderer'
|
13
|
+
end
|
14
|
+
|
15
|
+
mattr_reader :renderers
|
16
|
+
@@renderers = {}
|
17
|
+
|
18
|
+
def self.register_renderer(name, renderer)
|
19
|
+
raise ArgumentError.new("A renderer must be ActiveList::Renderers::Renderer") unless renderer < ActiveList::Renderers::AbstractRenderer
|
20
|
+
@@renderers[name] = renderer
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
|
25
|
+
ActiveList.register_renderer(:simple_renderer, ActiveList::Renderers::SimpleRenderer)
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module ActiveList
|
2
|
+
|
3
|
+
module Renderers
|
4
|
+
|
5
|
+
class AbstractRenderer
|
6
|
+
attr_reader :generator, :table
|
7
|
+
|
8
|
+
def initialize(generator)
|
9
|
+
@generator = generator
|
10
|
+
@table = generator.table
|
11
|
+
end
|
12
|
+
|
13
|
+
def var_name(name)
|
14
|
+
@generator.var_name(name)
|
15
|
+
end
|
16
|
+
|
17
|
+
def remote_update_code
|
18
|
+
raise NotImplementedError, "#{self.class.name}#remote_update_code is not implemented."
|
19
|
+
end
|
20
|
+
|
21
|
+
def build_data_code
|
22
|
+
raise NotImplementedError, "#{self.class.name}#build_table_code is not implemented."
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
@@ -0,0 +1,356 @@
|
|
1
|
+
module ActiveList
|
2
|
+
|
3
|
+
module Renderers
|
4
|
+
|
5
|
+
class SimpleRenderer < AbstractRenderer
|
6
|
+
include ActiveList::Helpers
|
7
|
+
|
8
|
+
|
9
|
+
DATATYPE_ABBREVIATION = {
|
10
|
+
:binary => :bin,
|
11
|
+
:boolean => :bln,
|
12
|
+
:date => :dat,
|
13
|
+
:datetime => :dtt,
|
14
|
+
:decimal => :dec,
|
15
|
+
:measure => :dec,
|
16
|
+
:float => :flt,
|
17
|
+
:integer => :int,
|
18
|
+
:string => :str,
|
19
|
+
:text => :txt,
|
20
|
+
:time => :tim,
|
21
|
+
:timestamp => :dtt
|
22
|
+
}
|
23
|
+
|
24
|
+
def remote_update_code
|
25
|
+
code = "if params[:column] and params[:visibility]\n"
|
26
|
+
code << " column = params[:column].to_sym\n"
|
27
|
+
# Removes potentially unwanted columns
|
28
|
+
code << " #{var_name(:params)}[:hidden_columns].delete_if{|c| !#{table.data_columns.map(&:name).inspect}.include?(c)}\n"
|
29
|
+
code << " #{var_name(:params)}[:hidden_columns].delete(column) if params[:visibility] == 'shown'\n"
|
30
|
+
code << " #{var_name(:params)}[:hidden_columns] << column if params[:visibility] == 'hidden'\n"
|
31
|
+
code << " head :ok\n"
|
32
|
+
code << "elsif params[:only]\n"
|
33
|
+
code << " render(:inline => '<%=#{generator.view_method_name}(:only => params[:only])-%>')\n"
|
34
|
+
code << "else\n"
|
35
|
+
code << " render(:inline => '<%=#{generator.view_method_name}-%>')\n"
|
36
|
+
code << "end\n"
|
37
|
+
return code
|
38
|
+
end
|
39
|
+
|
40
|
+
def build_table_code
|
41
|
+
record = "r"
|
42
|
+
child = "c"
|
43
|
+
|
44
|
+
# colgroup = columns_definition_code
|
45
|
+
header = header_code
|
46
|
+
extras = extras_code
|
47
|
+
|
48
|
+
code = generator.select_data_code
|
49
|
+
code << "#{var_name(:tbody)} = '<tbody data-total=\"'+#{var_name(:count)}.to_s+'\""
|
50
|
+
if table.paginate?
|
51
|
+
code << " data-per-page=\"'+#{var_name(:limit)}.to_s+'\""
|
52
|
+
code << " data-pages-count=\"'+#{var_name(:last)}.to_s+'\""
|
53
|
+
end
|
54
|
+
code << ">'\n"
|
55
|
+
code << "if #{var_name(:count)} > 0\n"
|
56
|
+
code << " for #{record} in #{generator.records_variable_name}\n"
|
57
|
+
line_class = ""
|
58
|
+
if table.options[:line_class]
|
59
|
+
line_class = ", class: (" + recordify!(table.options[:line_class], record) + ").to_s"
|
60
|
+
end
|
61
|
+
code << " #{var_name(:tbody)} << content_tag(:tr, id: 'r' + #{record}.id.to_s#{line_class}) do\n"
|
62
|
+
code << columns_to_cells(:body, record: record).dig(3)
|
63
|
+
code << " end\n"
|
64
|
+
# if table.options[:children].is_a? Symbol
|
65
|
+
# children = table.options[:children].to_s
|
66
|
+
# code << " for #{child} in #{record}.#{children}\n"
|
67
|
+
# code << " #{var_name(:tbody)} << content_tag(:tr, :class => #{line_class}+' child') do\n"
|
68
|
+
# code << columns_to_cells(:children, table.children, record: child).dig(4)
|
69
|
+
# code << " end\n"
|
70
|
+
# code << " end\n"
|
71
|
+
# end
|
72
|
+
code << " end\n"
|
73
|
+
code << "else\n"
|
74
|
+
code << " #{var_name(:tbody)} << '<tr class=\"empty\"><td colspan=\"#{table.columns.size+1}\">' + ::I18n.translate('list.no_records') + '</td></tr>'\n"
|
75
|
+
code << "end\n"
|
76
|
+
|
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\""
|
82
|
+
if table.paginate?
|
83
|
+
code << " data-list-current-page=\"' + #{var_name(:page)}.to_s + '\" data-list-page-size=\"' + #{var_name(:limit)}.to_s + '\""
|
84
|
+
end
|
85
|
+
code << " data-list-sort-by=\"' + #{var_name(:params)}[:sort].to_s + '\" data-list-sort-dir=\"' + #{var_name(:params)}[:dir].to_s + '\""
|
86
|
+
code << ">'\n"
|
87
|
+
code << "html << '<table class=\"list\">'\n"
|
88
|
+
code << "html << (#{header})\n"
|
89
|
+
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 << "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"
|
97
|
+
return code
|
98
|
+
end
|
99
|
+
|
100
|
+
|
101
|
+
|
102
|
+
def columns_to_cells(nature, options={})
|
103
|
+
code = ''
|
104
|
+
unless [:body, :children].include?(nature)
|
105
|
+
raise ArgumentError, "Nature is invalid"
|
106
|
+
end
|
107
|
+
children_mode = !!(nature == :children)
|
108
|
+
for column in table.columns
|
109
|
+
value_code = ""
|
110
|
+
record = options[:record] || 'record_of_the_death'
|
111
|
+
if column.is_a? ActiveList::Definition::EmptyColumn
|
112
|
+
value_code = 'nil'
|
113
|
+
elsif column.is_a? ActiveList::Definition::StatusColumn
|
114
|
+
|
115
|
+
value_code = column.datum_code(record, children_mode)
|
116
|
+
levels = %w(go caution stop)
|
117
|
+
lights = levels.collect do |light|
|
118
|
+
"content_tag(:span, '', :class => #{light.inspect})"
|
119
|
+
end.join(" + ")
|
120
|
+
# Expected value are :valid, :warning, :error
|
121
|
+
value_code = "content_tag(:span, #{lights}, :class => 'lights lights-' + (#{levels.inspect}.include?(#{value_code}.to_s) ? #{value_code}.to_s : 'undefined'))"
|
122
|
+
|
123
|
+
elsif column.is_a? ActiveList::Definition::DataColumn
|
124
|
+
if column.options[:children].is_a? FalseClass and children_mode
|
125
|
+
value_code = 'nil'
|
126
|
+
else
|
127
|
+
value_code = column.datum_code(record, children_mode)
|
128
|
+
if column.datatype == :boolean
|
129
|
+
value_code = "content_tag(:div, '', :class => 'checkbox-'+("+value_code.to_s+" ? 'true' : 'false'))"
|
130
|
+
elsif [:date, :datetime, :timestamp, :measure].include? column.datatype
|
131
|
+
value_code = "(#{value_code}.nil? ? '' : #{value_code}.l)"
|
132
|
+
elsif [:item].include? column.datatype
|
133
|
+
value_code = "(#{value_code}.nil? ? '' : #{value_code}.human_name)"
|
134
|
+
end
|
135
|
+
if !column.options[:currency].is_a?(FalseClass) and currency = column.options[:currency]
|
136
|
+
currency = currency[nature] if currency.is_a?(Hash)
|
137
|
+
currency = :currency if currency.is_a?(TrueClass)
|
138
|
+
# currency = "#{record}.#{currency}".c if currency.is_a?(Symbol)
|
139
|
+
currency = "#{column.record_expr(record)}.#{currency}".c if currency.is_a?(Symbol)
|
140
|
+
value_code = "(#{value_code}.nil? ? '' : #{value_code}.l(currency: #{currency.inspect}))"
|
141
|
+
elsif column.datatype == :decimal
|
142
|
+
value_code = "(#{value_code}.nil? ? '' : #{value_code}.l)"
|
143
|
+
elsif column.enumerize?
|
144
|
+
value_code = "(#{value_code}.nil? ? '' : #{value_code}.text)"
|
145
|
+
end
|
146
|
+
if column.options[:url] and nature == :body
|
147
|
+
column.options[:url] = {} unless column.options[:url].is_a?(Hash)
|
148
|
+
column.options[:url][:id] ||= (column.record_expr(record)+'.id').c
|
149
|
+
column.options[:url][:action] ||= :show
|
150
|
+
column.options[:url][:controller] ||= column.class_name.tableize.to_sym # (self.generator.collection? ? "RECORD.class.name.tableize".c : column.class_name.tableize.to_sym)
|
151
|
+
# column.options[:url][:controller] ||= "#{value_code}.class.name.tableize".c
|
152
|
+
url = column.options[:url].collect{|k, v| "#{k}: " + urlify(v, record)}.join(", ")
|
153
|
+
value_code = "(#{value_code}.blank? ? '' : link_to(#{value_code}.to_s, #{url}))"
|
154
|
+
elsif column.options[:mode]||column.label_method == :email
|
155
|
+
value_code = "(#{value_code}.blank? ? '' : mail_to(#{value_code}))"
|
156
|
+
elsif column.options[:mode]||column.label_method == :website
|
157
|
+
value_code = "(#{value_code}.blank? ? '' : link_to("+value_code+", "+value_code+"))"
|
158
|
+
elsif column.label_method == :color
|
159
|
+
value_code = "content_tag(:div, #{column.datum_code(record)}, style: 'background: #'+"+column.datum_code(record)+")"
|
160
|
+
elsif column.label_method.to_s.match(/(^|\_)currency$/) and column.datatype == :string
|
161
|
+
value_code = "(Nomen::Currencies[#{value_code}] ? Nomen::Currencies[#{value_code}].human_name : #{value_code})"
|
162
|
+
elsif column.label_method.to_s.match(/(^|\_)language$/) and column.datatype == :string
|
163
|
+
value_code = "(Nomen::Languages[#{value_code}] ? Nomen::Languages[#{value_code}].human_name : #{value_code})"
|
164
|
+
elsif column.label_method.to_s.match(/(^|\_)country$/) and column.datatype == :string
|
165
|
+
value_code = "(Nomen::Countries[#{value_code}] ? (image_tag('countries/' + #{value_code}.to_s + '.png') + ' ' + Nomen::Countries[#{value_code}].human_name).html_safe : #{value_code})"
|
166
|
+
else # if column.datatype == :string
|
167
|
+
value_code = "h(" + value_code + ".to_s)"
|
168
|
+
end
|
169
|
+
|
170
|
+
value_code = "if #{record}\n" + value_code.dig + "end" if column.is_a?(ActiveList::Definition::AssociationColumn)
|
171
|
+
end
|
172
|
+
elsif column.is_a?(ActiveList::Definition::CheckBoxColumn)
|
173
|
+
if nature == :body
|
174
|
+
form_name = column.form_name || "'#{table.name}[' + #{record}.id.to_s + '][#{column.name}]'".c
|
175
|
+
value = "nil"
|
176
|
+
if column.form_value
|
177
|
+
value = recordify(column.form_value, record)
|
178
|
+
else
|
179
|
+
value = 1
|
180
|
+
value_code << "hidden_field_tag(#{form_name.inspect}, 0, id: nil) + \n"
|
181
|
+
end
|
182
|
+
value_code << "check_box_tag(#{form_name.inspect}, #{value}, #{recordify!(column.options[:value] || column.name, record)})" # , id: '#{table.name}_'+#{record}.id.to_s+'_#{column.name}'
|
183
|
+
else
|
184
|
+
value_code << "nil"
|
185
|
+
end
|
186
|
+
elsif column.is_a?(ActiveList::Definition::TextFieldColumn)
|
187
|
+
form_name = column.form_name || "'#{table.name}[' + #{record}.id.to_s + '][#{column.name}]'".c
|
188
|
+
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
|
+
elsif column.is_a?(ActiveList::Definition::ActionColumn)
|
190
|
+
value_code = (nature == :body ? column.operation(record) : "nil")
|
191
|
+
else
|
192
|
+
value_code = "' ∅ '.html_safe"
|
193
|
+
end
|
194
|
+
code << "content_tag(:td, :class => \"#{column_classes(column)}\") do\n"
|
195
|
+
code << value_code.dig
|
196
|
+
code << "end +\n"
|
197
|
+
end
|
198
|
+
# if nature == :header
|
199
|
+
# code << "'<th class=\"spe\">#{menu_code}</th>'"
|
200
|
+
# else
|
201
|
+
# code << "content_tag(:td)"
|
202
|
+
# end
|
203
|
+
|
204
|
+
code << "content_tag(:td)"
|
205
|
+
return code.c
|
206
|
+
end
|
207
|
+
|
208
|
+
|
209
|
+
# Produces main menu code
|
210
|
+
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(/\'/,''')) + '</span></a>"
|
213
|
+
menu << "<ul>"
|
214
|
+
if table.paginate?
|
215
|
+
# Per page
|
216
|
+
list = [5, 10, 20, 50, 100, 200]
|
217
|
+
list << table.options[:per_page].to_i if table.options[:per_page].to_i > 0
|
218
|
+
list = list.uniq.sort
|
219
|
+
menu << "<li class=\"parent\">"
|
220
|
+
menu << "<a class=\"pages\"><span class=\"icon\"></span><span class=\"text\">' + ::I18n.translate('list.items_per_page').gsub(/\'/,''') + '</span></a><ul>"
|
221
|
+
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>"
|
223
|
+
end
|
224
|
+
menu << "</ul></li>"
|
225
|
+
end
|
226
|
+
|
227
|
+
# Column selector
|
228
|
+
menu << "<li class=\"parent\">"
|
229
|
+
menu << "<a class=\"columns\"><span class=\"icon\"></span><span class=\"text\">' + ::I18n.translate('list.columns').gsub(/\'/,''') + '</span></a><ul>"
|
230
|
+
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>"
|
232
|
+
end
|
233
|
+
menu << "</ul></li>"
|
234
|
+
|
235
|
+
# Separator
|
236
|
+
menu << "<li class=\"separator\"></li>"
|
237
|
+
# Exports
|
238
|
+
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(/\'/,'''), :class => 'text')} + '</li>"
|
240
|
+
end
|
241
|
+
menu << "</ul></div>"
|
242
|
+
return menu
|
243
|
+
end
|
244
|
+
|
245
|
+
# Produces the code to create the header line using top-end menu for columns
|
246
|
+
# and pagination management
|
247
|
+
def header_code
|
248
|
+
code = "'<thead><tr>"
|
249
|
+
for column in table.columns
|
250
|
+
code << "<th data-list-column=\"#{column.sort_id}\""
|
251
|
+
code << " data-list-column-cells=\"#{column.short_id}\""
|
252
|
+
code << " data-list-column-sort=\"'+(#{var_name(:params)}[:sort] != '#{column.sort_id}' ? 'asc' : #{var_name(:params)}[:dir] == 'asc' ? 'desc' : 'asc')+'\"" if column.sortable?
|
253
|
+
code << " class=\"#{column_classes(column, true, true)}\""
|
254
|
+
code << ">"
|
255
|
+
code << "<span class=\"text\">'+h(#{column.header_code})+'</span>"
|
256
|
+
code << "<span class=\"icon\"></span>"
|
257
|
+
code << "</th>"
|
258
|
+
end
|
259
|
+
code << "<th class=\"spe\">#{menu_code}</th>"
|
260
|
+
code << "</tr></thead>'"
|
261
|
+
return code
|
262
|
+
end
|
263
|
+
|
264
|
+
# Produces the code to create bottom menu and pagination
|
265
|
+
def extras_code
|
266
|
+
code, pagination = nil, ''
|
267
|
+
|
268
|
+
if table.paginate?
|
269
|
+
current_page = "#{var_name(:page)}"
|
270
|
+
last_page = "#{var_name(:last)}"
|
271
|
+
|
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>"
|
275
|
+
|
276
|
+
x = '@@PAGE-NUMBER@@'
|
277
|
+
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>"
|
279
|
+
|
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>"
|
282
|
+
|
283
|
+
pagination << "<span class=\"separator\"></span>"
|
284
|
+
|
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>"
|
287
|
+
|
288
|
+
code = "(#{var_name(:last)} > 1 ? '<div class=\"extras\">#{pagination}</div>' : '').html_safe"
|
289
|
+
end
|
290
|
+
|
291
|
+
return code
|
292
|
+
end
|
293
|
+
|
294
|
+
|
295
|
+
# # Not used
|
296
|
+
# def columns_definition_code
|
297
|
+
# code = table.columns.collect do |column|
|
298
|
+
# "<col id=\\\"#{column.unique_id}\\\" class=\\\"#{column_classes(column, true)}\\\" data-cells-class=\\\"#{column.short_id}\\\" href=\\\"\#\{url_for(:action => :#{generator.controller_method_name}, :column => #{column.id.to_s.inspect})\}\\\" />"
|
299
|
+
# end.join
|
300
|
+
# return "\"#{code}\""
|
301
|
+
# end
|
302
|
+
|
303
|
+
# Finds all default styles for column
|
304
|
+
def column_classes(column, without_id = false, without_interpolation = false)
|
305
|
+
classes, conds = [], []
|
306
|
+
conds << [:sor, "#{var_name(:params)}[:sort] == '#{column.sort_id}'".c] if column.sortable?
|
307
|
+
conds << [:hidden, "#{var_name(:params)}[:hidden_columns].include?(:#{column.name})".c] if column.is_a? ActiveList::Definition::DataColumn
|
308
|
+
classes << column.options[:class].to_s.strip unless column.options[:class].blank?
|
309
|
+
classes << column.short_id unless without_id
|
310
|
+
if column.is_a? ActiveList::Definition::ActionColumn
|
311
|
+
classes << :act
|
312
|
+
elsif column.is_a? ActiveList::Definition::StatusColumn
|
313
|
+
classes << :status
|
314
|
+
elsif column.is_a? ActiveList::Definition::DataColumn
|
315
|
+
classes << :col
|
316
|
+
classes << DATATYPE_ABBREVIATION[column.datatype]
|
317
|
+
classes << :url if column.options[:url].is_a?(Hash)
|
318
|
+
classes << column.label_method if [:code, :color].include? column.label_method.to_sym
|
319
|
+
if column.options[:mode] == :download
|
320
|
+
classes << :dld
|
321
|
+
elsif column.options[:mode]||column.label_method == :email
|
322
|
+
classes << :eml
|
323
|
+
elsif column.options[:mode]||column.label_method == :website
|
324
|
+
classes << :web
|
325
|
+
end
|
326
|
+
elsif column.is_a? ActiveList::Definition::TextFieldColumn
|
327
|
+
classes << :tfd
|
328
|
+
elsif column.is_a? ActiveList::Definition::CheckBoxColumn
|
329
|
+
classes << :chk
|
330
|
+
else
|
331
|
+
classes << :unk
|
332
|
+
end
|
333
|
+
html = classes.join(' ').strip
|
334
|
+
if conds.size > 0
|
335
|
+
if without_interpolation
|
336
|
+
html << "' + "
|
337
|
+
html << conds.collect do |c|
|
338
|
+
"(#{c[1]} ? ' #{c[0]}' : '')"
|
339
|
+
end.join(' + ')
|
340
|
+
html << " + '"
|
341
|
+
else
|
342
|
+
html << conds.collect do |c|
|
343
|
+
"\#\{' #{c[0]}' if #{c[1]}\}"
|
344
|
+
end.join
|
345
|
+
end
|
346
|
+
end
|
347
|
+
return html
|
348
|
+
end
|
349
|
+
|
350
|
+
|
351
|
+
end
|
352
|
+
|
353
|
+
|
354
|
+
end
|
355
|
+
|
356
|
+
end
|