active-list 5.0.1 → 6.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (40) hide show
  1. data/README.rdoc +2 -40
  2. metadata +19 -130
  3. checksums.yaml +0 -7
  4. data/VERSION +0 -1
  5. data/app/assets/images/active-list.png +0 -0
  6. data/app/assets/images/active-list.svg +0 -415
  7. data/app/assets/javascripts/active_list.jquery.js +0 -136
  8. data/app/assets/stylesheets/active_list.css.scss +0 -7
  9. data/app/assets/stylesheets/active_list/background.scss +0 -39
  10. data/app/assets/stylesheets/active_list/minimal.scss +0 -87
  11. data/app/assets/stylesheets/active_list/theme.scss +0 -189
  12. data/lib/active-list.rb +0 -1
  13. data/lib/active_list.rb +0 -43
  14. data/lib/active_list/action_pack.rb +0 -46
  15. data/lib/active_list/definition.rb +0 -17
  16. data/lib/active_list/definition/abstract_column.rb +0 -54
  17. data/lib/active_list/definition/action_column.rb +0 -76
  18. data/lib/active_list/definition/association_column.rb +0 -80
  19. data/lib/active_list/definition/attribute_column.rb +0 -58
  20. data/lib/active_list/definition/check_box_column.rb +0 -17
  21. data/lib/active_list/definition/data_column.rb +0 -88
  22. data/lib/active_list/definition/empty_column.rb +0 -10
  23. data/lib/active_list/definition/field_column.rb +0 -20
  24. data/lib/active_list/definition/status_column.rb +0 -10
  25. data/lib/active_list/definition/table.rb +0 -159
  26. data/lib/active_list/definition/text_field_column.rb +0 -10
  27. data/lib/active_list/exporters.rb +0 -28
  28. data/lib/active_list/exporters/abstract_exporter.rb +0 -55
  29. data/lib/active_list/exporters/csv_exporter.rb +0 -32
  30. data/lib/active_list/exporters/excel_csv_exporter.rb +0 -38
  31. data/lib/active_list/exporters/open_document_spreadsheet_exporter.rb +0 -82
  32. data/lib/active_list/generator.rb +0 -122
  33. data/lib/active_list/generator/finder.rb +0 -150
  34. data/lib/active_list/helpers.rb +0 -33
  35. data/lib/active_list/rails/engine.rb +0 -13
  36. data/lib/active_list/renderers.rb +0 -25
  37. data/lib/active_list/renderers/abstract_renderer.rb +0 -29
  38. data/lib/active_list/renderers/simple_renderer.rb +0 -356
  39. data/locales/eng.yml +0 -25
  40. data/locales/fra.yml +0 -25
@@ -1,122 +0,0 @@
1
- # encoding: UTF-8
2
- module ActiveList
3
-
4
- class Generator
5
-
6
- attr_accessor :table, :controller, :controller_method_name, :view_method_name, :records_variable_name
7
-
8
- def initialize(*args, &block)
9
- options = args.extract_options!
10
- @controller = options[:controller]
11
- name = args.shift || @controller.controller_name.to_sym
12
- model = (options[:model]||name).to_s.classify.constantize
13
- @collection = !!(model.name == @controller.controller_name.to_s.classify)
14
- @controller_method_name = "list#{'_'+name.to_s if name != @controller.controller_name.to_sym}"
15
- @view_method_name = "_#{@controller.controller_name}_list_#{name}_tag"
16
- @records_variable_name = "@#{name}"
17
- @table = ActiveList::Definition::Table.new(name, model, options)
18
- if block_given?
19
- yield @table
20
- else
21
- @table.load_default_columns
22
- end
23
- @parameters = {:sort => :to_s, :dir => :to_s}
24
- @parameters.merge!(:page => :to_i, :per_page => :to_i) if @table.paginate?
25
- end
26
-
27
- def collection?
28
- @collection
29
- end
30
-
31
- def var_name(name)
32
- "_#{name}"
33
- end
34
-
35
- def renderer
36
- ActiveList::Renderers[@table.options[:renderer]].new(self)
37
- end
38
-
39
- def controller_method_code
40
- code = "# encoding: utf-8\n"
41
- code << "def #{self.controller_method_name}\n"
42
- code << self.session_initialization_code.dig
43
- code << " respond_to do |format|\n"
44
- code << " format.html do\n"
45
- code << " if request.xhr?\n"
46
- code << self.renderer.remote_update_code.dig(4)
47
- code << " else\n"
48
- code << " render(inline: '<%=#{self.view_method_name}-%>')\n" # , layout: action_has_layout?
49
- code << " end\n"
50
- code << " end\n"
51
- for format, exporter in ActiveList::Exporters.hash
52
- code << " format.#{format} do\n"
53
- code << exporter.new(self).send_data_code.dig(3)
54
- code << " end\n"
55
- end
56
- code << " end\n"
57
- # Save preferences of user
58
- if defined? User and User.instance_methods.include? :pref
59
- code << " p = current_user.pref('list.#{self.view_method_name}', YAML::dump({}))\n"
60
- code << " p.set! YAML::dump(#{var_name(:params)}.stringify_keys)\n"
61
- end
62
- code << "end\n"
63
- # code.split("\n").each_with_index{|l, x| puts((x+1).to_s.rjust(4)+": "+l)}
64
- unless ::Rails.env.production?
65
- file = ::Rails.root.join("tmp", "code", "active_list", "controllers", self.controller.controller_path, self.controller_method_name + ".rb")
66
- FileUtils.mkdir_p(file.dirname)
67
- File.write(file, code)
68
- end
69
- return code
70
- end
71
-
72
- def view_method_code
73
- code = "# encoding: utf-8\n"
74
- code << "def #{self.view_method_name}(options={}, &block)\n"
75
- code << self.session_initialization_code.dig
76
- code << self.renderer.build_table_code.dig
77
- code << "end\n"
78
- # code.split("\n").each_with_index{|l, x| puts((x+1).to_s.rjust(4)+": "+l)}
79
- unless ::Rails.env.production?
80
- file = ::Rails.root.join("tmp", "code", "active_list", "views", self.controller.controller_path, self.view_method_name + ".rb")
81
- FileUtils.mkdir_p(file.dirname)
82
- File.write(file, code)
83
- end
84
- return code
85
- end
86
-
87
- def session_initialization_code
88
- code = "options = {} unless options.is_a? Hash\n"
89
- code << "options.update(params)\n"
90
- if defined? User and User.instance_methods.include? :pref
91
- code << "#{var_name(:params)} = YAML::load(current_user.pref('list.#{self.view_method_name}', YAML::dump({})).value).symbolize_keys\n"
92
- code << "#{var_name(:params)} = {} unless #{var_name(:params)}.is_a?(Hash)\n"
93
- else
94
- code << "#{var_name(:params)} = {}\n"
95
- end
96
- code << "#{var_name(:params)}.update(options.symbolize_keys)\n"
97
- code << "unless #{var_name(:params)}[:hidden_columns].is_a? Array\n"
98
- code << " #{var_name(:params)}[:hidden_columns] = #{@table.hidden_columns.map(&:name).map(&:to_sym).inspect}\n"
99
- code << "end\n"
100
- for parameter, convertor in @parameters.sort{|a,b| a[0].to_s <=> b[0].to_s}
101
- # expr = "options.delete('#{@table.name}_#{parameter}') || options.delete('#{parameter}') || #{var_name(:params)}[:#{parameter}]"
102
- # expr += " || #{@table.options[parameter]}" unless @table.options[parameter].blank?
103
- # code << "#{var_name(:params)}[:#{parameter}] = (#{expr}).#{convertor}\n"
104
- expr = "#{var_name(:params)}[:#{parameter}]"
105
- expr = "(#{expr} || #{@table.options[parameter]})" unless @table.options[parameter].blank?
106
- code << "#{var_name(:params)}[:#{parameter}] = #{expr}.#{convertor}\n"
107
- end
108
- # Order
109
- code << "#{var_name(:order)} = #{@table.options[:order] ? @table.options[:order].inspect : 'nil'}\n"
110
- code << "if #{var_name(:col)} = {" + @table.sortable_columns.collect{|c| "'#{c.sort_id}' => '#{c.sort_expression}'"}.join(', ') + "}[#{var_name(:params)}[:sort]]\n"
111
- code << " #{var_name(:params)}[:dir] = 'asc' unless #{var_name(:params)}[:dir] == 'asc' or #{var_name(:params)}[:dir] == 'desc'\n"
112
- code << " #{var_name(:order)} = #{var_name(:col)} + ' ' + #{var_name(:params)}[:dir]\n"
113
- code << "end\n"
114
-
115
- return code
116
- end
117
-
118
- end
119
-
120
- end
121
-
122
- require "active_list/generator/finder"
@@ -1,150 +0,0 @@
1
- module ActiveList
2
-
3
- # Manage data query
4
- class Generator
5
-
6
- # Generate select code for the table taking all parameters in account
7
- def select_data_code(options = {})
8
- paginate = (options.has_key?(:paginate) ? options[:paginate] : @table.paginate?)
9
- # Check order
10
- unless @table.options.keys.include?(:order)
11
- columns = @table.table_columns
12
- @table.options[:order] = (columns.size > 0 ? columns.first.name.to_sym : {id: :desc}) # "#{@table.model.table_name}.id DESC"
13
- end
14
-
15
- class_name = @table.model.name
16
- class_name = "(controller_name != '#{class_name.tableize}' ? controller_name.to_s.classify.constantize : #{class_name})" if self.collection?
17
-
18
- # Find data
19
- query_code = "#{class_name}"
20
- query_code << self.scope_code if self.scope_code
21
- query_code << ".select(#{self.select_code})" if self.select_code
22
- query_code << ".where(#{self.conditions_code})" unless @table.options[:conditions].blank?
23
- query_code << ".joins(#{@table.options[:joins].inspect})" unless @table.options[:joins].blank?
24
- unless self.includes_reflections.empty?
25
- expr = self.includes_reflections.inspect[1..-2]
26
- query_code << ".includes(#{expr})"
27
- query_code << ".references(#{expr})"
28
- end
29
-
30
- code = ""
31
- code << "#{var_name(:count)} = #{query_code}.count\n"
32
- if paginate
33
- code << "#{var_name(:limit)} = (#{var_name(:params)}[:per_page] || 25).to_i\n"
34
- code << "#{var_name(:page)} = (#{var_name(:params)}[:page] || 1).to_i\n"
35
- code << "#{var_name(:page)} = 1 if #{var_name(:page)} < 1\n"
36
- code << "#{var_name(:offset)} = (#{var_name(:page)} - 1) * #{var_name(:limit)}\n"
37
- code << "#{var_name(:last)} = (#{var_name(:count)}.to_f / #{var_name(:limit)}).ceil.to_i\n"
38
- code << "#{var_name(:last)} = 1 if #{var_name(:last)} < 1\n"
39
- code << "return #{self.view_method_name}(options.merge(page: 1)) if 1 > #{var_name(:page)}\n"
40
- code << "return #{self.view_method_name}(options.merge(page: #{var_name(:last)})) if #{var_name(:page)} > #{var_name(:last)}\n"
41
- end
42
- code << "#{self.records_variable_name} = #{query_code}"
43
- code << ".reorder(#{var_name(:order)})"
44
- if paginate
45
- code << ".offset(#{var_name(:offset)})"
46
- code << ".limit(#{var_name(:limit)})"
47
- end
48
- code << " || {}\n"
49
- return code
50
- end
51
-
52
- protected
53
-
54
- # Compute includes Hash
55
- def includes_reflections
56
- hash = []
57
- for column in @table.columns
58
- if column.respond_to?(:reflection)
59
- hash << column.reflection.name
60
- end
61
- end
62
- return hash
63
- end
64
-
65
-
66
- def scope_code
67
- return nil unless scopes = @table.options[:scope]
68
- scopes = [scopes].flatten
69
- code = ""
70
- for scope in scopes
71
- code << ".#{scope}"
72
- end
73
- return code
74
- end
75
-
76
-
77
- # Generate the code from a conditions option
78
- def conditions_code
79
- conditions = @table.options[:conditions]
80
- code = ''
81
- case conditions
82
- when Array
83
- case conditions[0]
84
- when String # SQL
85
- code << '[' + conditions.first.inspect
86
- code << conditions[1..-1].collect{|p| ", " + sanitize_condition(p)}.join if conditions.size > 1
87
- code << ']'
88
- when Symbol # Method
89
- raise "What?"
90
- code << conditions.first.to_s + '('
91
- code << conditions[1..-1].collect{|p| sanitize_condition(p)}.join(', ') if conditions.size > 1
92
- code << ')'
93
- else
94
- raise ArgumentError.new("First element of an Array can only be String or Symbol.")
95
- end
96
- when Hash # SQL
97
- code << '{' + conditions.collect{|key, value| key.to_s + ': ' + sanitize_condition(value)}.join(',') + '}'
98
- when Symbol # Method
99
- code << conditions.to_s + "(options)"
100
- when Code
101
- code << "(" + conditions.gsub(/\s*\n\s*/, ';') + ")"
102
- when String
103
- code << conditions.inspect
104
- else
105
- raise ArgumentError.new("Unsupported type for conditions: #{conditions.inspect}")
106
- end
107
- return code
108
- end
109
-
110
- def select_code
111
- return nil unless @table.options[:distinct] or @table.options[:select]
112
- code = ""
113
- code << "DISTINCT " if @table.options[:distinct]
114
- code << "#{@table.model.table_name}.*"
115
- if @table.options[:select]
116
- code << @table.options[:select].collect{|k, v| ", #{k[0].to_s+'.'+k[1].to_s} AS #{v}" }.join
117
- end
118
- return ("'" + code + "'").c
119
- end
120
-
121
-
122
- def sanitize_condition(value)
123
- # if value.is_a? Array
124
- # # if value.size==1 and value[0].is_a? String
125
- # # value[0].to_s
126
- # # else
127
- # value.inspect
128
- # # end
129
- # elsif value.is_a? Code
130
- # value.inspect
131
- # elsif value.is_a? String
132
- # '"' + value.gsub('"', '\"') + '"'
133
- # els
134
- if [Date, DateTime].include? value.class
135
- '"' + value.to_formatted_s(:db) + '"'
136
- elsif value.is_a? NilClass
137
- 'nil'
138
- else
139
- value.inspect
140
- end
141
- end
142
-
143
-
144
- end
145
-
146
-
147
- end
148
-
149
-
150
-
@@ -1,33 +0,0 @@
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
@@ -1,13 +0,0 @@
1
- module ActiveList
2
- module Rails
3
- class Engine < ::Rails::Engine
4
- engine_name "active_list"
5
- initializer "active_list.integrate_methods" do |app|
6
- ::ActionController::Base.send(:include, ActiveList::ActionPack::ActionController)
7
- ::ActionView::Base.send(:include, ActiveList::ActionPack::ViewsHelper)
8
- files = Dir[File.join(File.dirname(__FILE__), "..", "..", "..", "locales", "*.yml")]
9
- ::I18n.load_path.concat(files)
10
- end
11
- end
12
- end
13
- end
@@ -1,25 +0,0 @@
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)
@@ -1,29 +0,0 @@
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
@@ -1,356 +0,0 @@
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 = "'&#160;&#8709;&#160;'.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(/\'/,'&#39;')) + '</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(/\'/,'&#39;') + '</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(/\'/,'&#39;') + '</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(/\'/,'&#39;'), :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