active_list 6.6.2 → 6.7.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/assets/javascripts/active_list.jquery.js.coffee +70 -23
- data/lib/active_list/definition/abstract_column.rb +4 -0
- data/lib/active_list/definition/attribute_column.rb +6 -1
- data/lib/active_list/definition/data_column.rb +1 -1
- data/lib/active_list/definition/table.rb +1 -1
- data/lib/active_list/locales/ar.yml +3 -0
- data/lib/active_list/locales/en.yml +3 -0
- data/lib/active_list/locales/es.yml +3 -0
- data/lib/active_list/locales/fr.yml +3 -0
- data/lib/active_list/locales/jp.yml +3 -0
- data/lib/active_list/renderers/simple_renderer.rb +35 -1
- data/lib/active_list/version.rb +1 -1
- metadata +5 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 775b3110948e7e0da35e95a8e44f6c0ffe2e01c0
|
4
|
+
data.tar.gz: a5d9ae7e758ea41b87666316ddcd35be1510283e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bd143bcd93b403eef747ba74b118d5c30f5ffec7beee2625ece0a6272e0a54180f83329790f2fab3c99c9cf0e26cfc76dfdec4977cc4ee5ab60d278c700d0407
|
7
|
+
data.tar.gz: 77cd8e43c60e2d63cc95eeb6c681a66bb21193c26184c556e3717e5be642ec6e0dad8a4d7fb00cd1b8f97a677dc460427ab32a0adb8d0a0c05b0f8175e4b5f14
|
@@ -2,7 +2,7 @@ ActiveList = {}
|
|
2
2
|
|
3
3
|
(($, AL) ->
|
4
4
|
"use strict"
|
5
|
-
|
5
|
+
|
6
6
|
# Main function which reload table with specified data parameters
|
7
7
|
AL.refresh = (list, options) ->
|
8
8
|
table = list.find("table[data-current-page]").first()
|
@@ -25,16 +25,14 @@ ActiveList = {}
|
|
25
25
|
list_control = content.find(".list-control")
|
26
26
|
for type in ["actions", "pagination", "settings"]
|
27
27
|
$("*[data-list-ref='#{list_id}'].list-#{type}").replaceWith list_control.find(".list-#{type}")
|
28
|
-
|
29
28
|
list.find(".list-data").html(list_data)
|
30
|
-
|
31
|
-
# list.html data
|
32
29
|
selection = list.prop('selection')
|
33
30
|
if selection?
|
34
|
-
for id in selection
|
31
|
+
for id in Object.keys(selection)
|
35
32
|
list.find("input[data-list-selector='#{id}']")
|
36
33
|
.attr('checked', 'checked')
|
37
34
|
.closest('tr').addClass('selected')
|
35
|
+
AL.updateResults list
|
38
36
|
AL.checkGlobalButtons list
|
39
37
|
list.trigger('page:change')
|
40
38
|
$(document).trigger('list:page:change')
|
@@ -42,35 +40,86 @@ ActiveList = {}
|
|
42
40
|
|
43
41
|
false
|
44
42
|
|
43
|
+
values_for_computation_of_rows = (list, row, existing_hash) ->
|
44
|
+
computes = {}
|
45
|
+
computes = existing_hash if existing_hash?
|
46
|
+
for cell in row.find('td')
|
47
|
+
continue unless AL.computation_for(list, cell)?
|
48
|
+
col_number = AL.column_number(list, cell)
|
49
|
+
computes[col_number] = [] unless computes[col_number]?
|
50
|
+
computes[col_number].push parseFloat(AL.unaltered_value(cell))
|
51
|
+
computes
|
52
|
+
|
53
|
+
AL.column_for = (list, cell) ->
|
54
|
+
if typeof(cell) == "string"
|
55
|
+
column = cell
|
56
|
+
else
|
57
|
+
column = $(cell).data('list-column-header')
|
58
|
+
list.find("th[data-list-column-cells='#{column}']")
|
59
|
+
|
60
|
+
AL.computation_for = (list, cell) ->
|
61
|
+
AL.column_for(list, cell).data('list-column-computation')
|
62
|
+
|
63
|
+
AL.column_number = (list, cell) ->
|
64
|
+
AL.column_for(list, cell).data('list-column-cells')
|
65
|
+
|
66
|
+
AL.unaltered_value = (cell) ->
|
67
|
+
$(cell).data('list-cell-value')
|
45
68
|
|
46
69
|
# Select a row of "many" buttons
|
47
70
|
AL.select = (checkbox) ->
|
48
71
|
list = checkbox.closest('*[data-list-source]')
|
49
72
|
row = checkbox.closest('tr')
|
50
|
-
if list.prop('selection')?
|
51
|
-
selection = list.prop('selection')
|
52
|
-
else
|
53
|
-
selection = []
|
73
|
+
selection = if list.prop('selection')? then list.prop('selection') else {}
|
54
74
|
key = checkbox.data('list-selector')
|
55
|
-
|
75
|
+
present = String(key) in Object.keys(selection)
|
56
76
|
if checkbox.is ":checked"
|
57
|
-
|
58
|
-
selection.push(key)
|
77
|
+
selection[key] = values_for_computation_of_rows(list, row, selection[key]) unless present
|
59
78
|
row.addClass("selected")
|
60
79
|
else
|
61
|
-
|
62
|
-
selection.splice(index, 1)
|
80
|
+
delete selection[key] if present
|
63
81
|
row.removeClass("selected")
|
64
82
|
list.prop('selection', selection)
|
83
|
+
|
84
|
+
AL.updateResults list
|
65
85
|
AL.checkGlobalButtons list
|
66
86
|
|
87
|
+
AL.updateResults = (list) ->
|
88
|
+
results = {}
|
89
|
+
selection = if list.prop('selection')? then list.prop('selection') else {}
|
90
|
+
for key, columns of selection
|
91
|
+
for column, values of columns
|
92
|
+
computation = AL.computation_for(list, column)
|
93
|
+
unless computation == 'sum' || computation == 'average'
|
94
|
+
console.log "Don't know how to handle computation #{computation}. Skipping."
|
95
|
+
continue
|
96
|
+
results[column] = [] if typeof(results[column]) == "undefined"
|
97
|
+
results[column] = results[column].concat values
|
98
|
+
|
99
|
+
for column, values of results
|
100
|
+
float_values = (parseFloat(e) for e in values)
|
101
|
+
total = values.reduce (t, s) -> t + s
|
102
|
+
total /= values.length if AL.computation_for(list, column) == 'average'
|
103
|
+
list.attr("data-list-result-#{column}", total)
|
104
|
+
currency_precision = parseInt(AL.column_for(list, column).data('list-column-currency-precision'))
|
105
|
+
currency_symbol = AL.column_for(list, column).data('list-column-currency-symbol')
|
106
|
+
if currency_precision and currency_symbol
|
107
|
+
magnitude = Math.pow(10, currency_precision)
|
108
|
+
rounded = Math.round(total * magnitude) / magnitude
|
109
|
+
displayable_total = "#{rounded} #{currency_symbol}"
|
110
|
+
list.find("#computation-results td[data-list-result-for=\"#{column}\"] #list-computation-result").html(displayable_total)
|
111
|
+
for column in list.find("th[data-list-column-computation]")
|
112
|
+
col_number = $(column).data('list-column-cells')
|
113
|
+
continue unless typeof(results[col_number]) == "undefined" or results[col_number].length == 0
|
114
|
+
list.removeAttr("data-list-result-#{col_number}")
|
115
|
+
list.find("#computation-results td[data-list-result-for=\"#{col_number}\"] #list-computation-result").html('')
|
67
116
|
|
68
117
|
# Hide/show needed global buttons
|
69
|
-
AL.checkGlobalButtons = (list) ->
|
118
|
+
AL.checkGlobalButtons = (list) ->
|
70
119
|
selection = list.prop('selection')
|
71
120
|
list_id = list.attr('id')
|
72
121
|
actions = $("*[data-list-ref='#{list_id}']")
|
73
|
-
if selection.length > 0
|
122
|
+
if Object.keys(selection).length > 0
|
74
123
|
actions.find("*[data-list-actioner='none']:visible").hide()
|
75
124
|
actions.find("*[data-list-actioner='none']:visible").hide()
|
76
125
|
actions.find("*[data-list-actioner='many']:hidden").show()
|
@@ -82,7 +131,7 @@ ActiveList = {}
|
|
82
131
|
unless button.prop('hrefPattern')?
|
83
132
|
button.prop('hrefPattern', button.attr('href'))
|
84
133
|
pattern = button.prop('hrefPattern')
|
85
|
-
url = pattern.replace(encodeURIComponent("##IDS##"), selection.join(','), 'g')
|
134
|
+
url = pattern.replace(encodeURIComponent("##IDS##"), Object.keys(selection).join(','), 'g')
|
86
135
|
button.attr("href", url)
|
87
136
|
|
88
137
|
# Move to given page
|
@@ -107,15 +156,15 @@ ActiveList = {}
|
|
107
156
|
$(document).on "click", "*[data-list-source] input[data-list-selector]", (event) ->
|
108
157
|
AL.select $(this)
|
109
158
|
true
|
110
|
-
|
159
|
+
|
111
160
|
# Adds title attribute based on link name
|
112
161
|
$(document).on "hover", "*[data-list-source] tbody tr td.act a", (event) ->
|
113
162
|
element = $(this)
|
114
163
|
title = element.attr("title")
|
115
164
|
element.attr "title", element.html() unless title?
|
116
|
-
return
|
165
|
+
return
|
166
|
+
|
117
167
|
|
118
|
-
|
119
168
|
# Change number of item per page
|
120
169
|
$(document).on "click", "*[data-list-ref] *[data-list-change-page-size]", (event) ->
|
121
170
|
sizer = $(this)
|
@@ -128,7 +177,6 @@ ActiveList = {}
|
|
128
177
|
per_page: per_page
|
129
178
|
false
|
130
179
|
|
131
|
-
|
132
180
|
# Toggle visibility of a column
|
133
181
|
$(document).on "click", "*[data-list-ref] *[data-list-toggle-column]", (event) ->
|
134
182
|
toggler = $(this)
|
@@ -136,7 +184,7 @@ ActiveList = {}
|
|
136
184
|
columnId = toggler.data("list-toggle-column")
|
137
185
|
list = $("##{toggler.closest('*[data-list-ref]').data('list-ref')}")
|
138
186
|
column = list.find("th[data-list-column=\"#{columnId}\"]")
|
139
|
-
|
187
|
+
|
140
188
|
className = column.data("list-column-cells")
|
141
189
|
className = columnId unless className?
|
142
190
|
search = ".#{className}"
|
@@ -159,7 +207,6 @@ ActiveList = {}
|
|
159
207
|
column: columnId
|
160
208
|
false
|
161
209
|
|
162
|
-
|
163
210
|
# Change page of table on link clicks
|
164
211
|
$(document).on "click", "*[data-list-ref] a[data-list-move-to-page]", (event) ->
|
165
212
|
pager = $(this)
|
@@ -1,7 +1,7 @@
|
|
1
1
|
module ActiveList
|
2
2
|
module Definition
|
3
3
|
class AttributeColumn < DataColumn
|
4
|
-
attr_reader :column, :label_method, :sort_column
|
4
|
+
attr_reader :column, :label_method, :sort_column, :computation_method
|
5
5
|
|
6
6
|
def initialize(table, name, options = {})
|
7
7
|
super(table, name, options)
|
@@ -15,6 +15,7 @@ module ActiveList
|
|
15
15
|
@sort_column = nil
|
16
16
|
end
|
17
17
|
end
|
18
|
+
@computation_method = options[:on_select]
|
18
19
|
@column = @table.model.columns_hash[@label_method.to_s]
|
19
20
|
end
|
20
21
|
|
@@ -42,6 +43,10 @@ module ActiveList
|
|
42
43
|
!sort_column.nil?
|
43
44
|
end
|
44
45
|
|
46
|
+
def computable?
|
47
|
+
!computation_method.nil?
|
48
|
+
end
|
49
|
+
|
45
50
|
def enumerize?
|
46
51
|
table.model.send(@label_method).send(:values)
|
47
52
|
return true
|
@@ -70,6 +70,31 @@ module ActiveList
|
|
70
70
|
# code << " end\n"
|
71
71
|
# end
|
72
72
|
code << " end\n"
|
73
|
+
|
74
|
+
if table.columns.any?(&:computable?)
|
75
|
+
code << " #{var_name(:tbody)} << content_tag(:tr, id: :'computation-results') do\n"
|
76
|
+
code << " computation_row = ''\n"
|
77
|
+
code << " computation_row << '<td></td>'\n" if table.selectable?
|
78
|
+
table.columns.each do |column|
|
79
|
+
classes = []
|
80
|
+
value = ''
|
81
|
+
code << " computation_row << \"<td"
|
82
|
+
if column.computable?
|
83
|
+
code << " data-list-result-for='#{column.short_id}'"
|
84
|
+
value = "<div><span><strong>#{I18n.translate("list.results.#{column.computation_method}")}:</strong></span>"
|
85
|
+
value << "<span id='list-computation-result'></span></div>"
|
86
|
+
end
|
87
|
+
if column.is_a? ActiveList::Definition::DataColumn
|
88
|
+
code << "\#\{' class=hidden' if #{var_name(:params)}[:hidden_columns].include?(:#{column.name})\}"
|
89
|
+
end
|
90
|
+
code << ">"
|
91
|
+
code << value
|
92
|
+
code << "</td>\"\n"
|
93
|
+
end
|
94
|
+
code << " computation_row.html_safe\n"
|
95
|
+
code << " end\n"
|
96
|
+
end
|
97
|
+
|
73
98
|
code << "else\n"
|
74
99
|
code << " #{var_name(:tbody)} << '<tr class=\"empty\"><td colspan=\"#{table.columns.size + 1}\">' + ::I18n.translate('list.no_records') + '</td></tr>'\n"
|
75
100
|
code << "end\n"
|
@@ -108,6 +133,7 @@ module ActiveList
|
|
108
133
|
|
109
134
|
# Build whole
|
110
135
|
code << "return ('<div id=\"#{uid}\" data-list-source=\"'+h(url_for(options.merge(:action => '#{generator.controller_method_name}')))+'\" data-list-redirect=\"' + params[:redirect].to_s + '\" class=\"active-list\">' + #{var_name(:content)} + '</div>').html_safe\n"
|
136
|
+
# File.open('debug-activelist', 'w') { |file| file.write code }
|
111
137
|
code
|
112
138
|
end
|
113
139
|
|
@@ -210,7 +236,10 @@ module ActiveList
|
|
210
236
|
else
|
211
237
|
value_code = "' ∅ '.html_safe"
|
212
238
|
end
|
213
|
-
code << "content_tag(:td, :class => \"#{column_classes(column)}\"
|
239
|
+
code << "content_tag(:td, :class => \"#{column_classes(column)}\","
|
240
|
+
code << " data: { \"list-column-header\": \"#{column.short_id}\","
|
241
|
+
code << " \"list-cell-value\": \"\#{#{column.datum_code(record, children_mode)}}\"" if column.computable?
|
242
|
+
code << " } ) do\n"
|
214
243
|
code << value_code.dig
|
215
244
|
code << "end +\n"
|
216
245
|
end
|
@@ -271,6 +300,11 @@ module ActiveList
|
|
271
300
|
code << "<th data-list-column=\"#{column.sort_id}\""
|
272
301
|
code << " data-list-column-cells=\"#{column.short_id}\""
|
273
302
|
code << " data-list-column-sort=\"'+(#{var_name(:params)}[:sort] != '#{column.sort_id}' ? 'asc' : #{var_name(:params)}[:dir] == 'asc' ? 'desc' : 'asc')+'\"" if column.sortable?
|
303
|
+
code << " data-list-column-computation=\"#{column.computation_method}\"" if column.computable?
|
304
|
+
if column.is_a?(ActiveList::Definition::DataColumn) && column.options[:currency]
|
305
|
+
code << " data-list-column-currency-symbol=\"' + Nomen::Currencies[#{generator.records_variable_name}.first.currency].symbol + '\""
|
306
|
+
code << " data-list-column-currency-precision=\"' + Nomen::Currencies[#{generator.records_variable_name}.first.currency].precision.to_s + '\""
|
307
|
+
end
|
274
308
|
code << " class=\"#{column_classes(column, true, true)}\""
|
275
309
|
code << '>'
|
276
310
|
code << "' + h(#{column.header_code}) + '"
|
data/lib/active_list/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: active_list
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 6.
|
4
|
+
version: 6.7.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Brice Texier
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-12-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -19,7 +19,7 @@ dependencies:
|
|
19
19
|
version: '3.2'
|
20
20
|
- - "<"
|
21
21
|
- !ruby/object:Gem::Version
|
22
|
-
version:
|
22
|
+
version: 5.1.0
|
23
23
|
type: :runtime
|
24
24
|
prerelease: false
|
25
25
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -29,7 +29,7 @@ dependencies:
|
|
29
29
|
version: '3.2'
|
30
30
|
- - "<"
|
31
31
|
- !ruby/object:Gem::Version
|
32
|
-
version:
|
32
|
+
version: 5.1.0
|
33
33
|
- !ruby/object:Gem::Dependency
|
34
34
|
name: arel
|
35
35
|
requirement: !ruby/object:Gem::Requirement
|
@@ -228,7 +228,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
228
228
|
version: '0'
|
229
229
|
requirements: []
|
230
230
|
rubyforge_project:
|
231
|
-
rubygems_version: 2.5.1
|
231
|
+
rubygems_version: 2.4.5.1
|
232
232
|
signing_key:
|
233
233
|
specification_version: 4
|
234
234
|
summary: Simple interactive tables for Rails app
|