simple_drilldown 0.15.1 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +7 -5
- data/Rakefile +1 -1
- data/app/views/simple_drilldown/_chart.html.erb +3 -2
- data/app/views/simple_drilldown/_excel_record_list_xlsx.xlsx.axlsx +2 -3
- data/app/views/simple_drilldown/data_0.builder +1 -1
- data/app/views/simple_drilldown/data_1.builder +1 -1
- data/app/views/simple_drilldown/data_2.builder +1 -1
- data/app/views/simple_drilldown/data_3.builder +1 -1
- data/app/views/simple_drilldown/excel_export_xlsx.xlsx.axlsx +4 -4
- data/lib/simple_drilldown/controller.rb +13 -13
- data/lib/simple_drilldown/engine.rb +1 -1
- data/lib/simple_drilldown/helper.rb +9 -8
- data/lib/simple_drilldown/routing.rb +2 -2
- data/lib/simple_drilldown/search.rb +5 -5
- data/lib/simple_drilldown/version.rb +1 -1
- data/lib/tasks/simple_drilldown_tasks.rake +1 -0
- metadata +6 -15
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 7b7bb3f55e6765cce2fded62fc1688d92601072b82fa760595d8ed24feb253d6
|
|
4
|
+
data.tar.gz: 94a9cc7ae437e28ac7ff8bfdf9bf290fb15aa735a012f42fee30d1831f7171fe
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 8dd8264f046e74f5f7fb54bf5dc3fcf9f7af38dbb2469f36705f508184558522406cc5e548d65ff61d59c2ef94fe23f91bdc896612d9f90ee177799fa9a6b48a
|
|
7
|
+
data.tar.gz: 36e0928ca87085994297cd52d617060ada565c2036832090a9655261b1779f88a29d359fc39b7b0137a467f76d4cbd5f9ed0b34cf0748d8f16e5d5625e371303
|
data/README.md
CHANGED
|
@@ -1,8 +1,4 @@
|
|
|
1
|
-
# SimpleDrilldown
|
|
2
|
-
|
|
3
|
-
<a href="https://travis-ci.org/DatekWireless/simple_drilldown">
|
|
4
|
-
<img align="right" src="https://travis-ci.org/DatekWireless/simple_drilldown.svg?branch=master" alt="Build Status">
|
|
5
|
-
</a>
|
|
1
|
+
# SimpleDrilldown [](https://github.com/DatekWireless/simple_drilldown/actions/workflows/test.yml)
|
|
6
2
|
|
|
7
3
|
`simple_drilldown` offers a simple way to define axis to filter and group records
|
|
8
4
|
for analysis. The result is a record count for the selected filter and
|
|
@@ -159,3 +155,9 @@ $ gem install simple_drilldown
|
|
|
159
155
|
|
|
160
156
|
## License
|
|
161
157
|
The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
|
|
158
|
+
|
|
159
|
+
## Release
|
|
160
|
+
|
|
161
|
+
```bash
|
|
162
|
+
$ rake release
|
|
163
|
+
```
|
data/Rakefile
CHANGED
|
@@ -87,7 +87,8 @@
|
|
|
87
87
|
firstPoint = chart.getElementsAtEventForMode(e, 'nearest', { intersect: true }, false)[0]
|
|
88
88
|
if (firstPoint) {
|
|
89
89
|
label = chart.data.labels[firstPoint.index];
|
|
90
|
-
|
|
90
|
+
const values = <%== @result[:rows].map { |r| r[:value] }.to_json %>;
|
|
91
|
+
value = values[firstPoint.index];
|
|
91
92
|
new_location = new URL(window.location.toString());
|
|
92
93
|
new_location.hash = '';
|
|
93
94
|
params = new_location.searchParams;
|
|
@@ -101,7 +102,7 @@
|
|
|
101
102
|
}
|
|
102
103
|
}
|
|
103
104
|
params.delete('search[filter][<%= @dimensions[0][:url_param_name] %>][]');
|
|
104
|
-
params.set('search[filter][<%= @dimensions[0][:url_param_name] %>][]',
|
|
105
|
+
params.set('search[filter][<%= @dimensions[0][:url_param_name] %>][]', value);
|
|
105
106
|
new_location.searchParams = params;
|
|
106
107
|
window.location = new_location.href;
|
|
107
108
|
}
|
|
@@ -9,7 +9,7 @@ def excel_header_row(sheet)
|
|
|
9
9
|
sheet.add_row row
|
|
10
10
|
end
|
|
11
11
|
|
|
12
|
-
def excel_row(sheet,
|
|
12
|
+
def excel_row(sheet, _wrap, transaction:)
|
|
13
13
|
padding_cells = @dimensions.empty? ? 1 : @dimensions.size
|
|
14
14
|
row = (1..(padding_cells - 1)).map { |_n| nil }
|
|
15
15
|
|
|
@@ -25,8 +25,7 @@ def excel_row(sheet, wrap, transaction:)
|
|
|
25
25
|
|
|
26
26
|
field_def = controller.c_fields[field.to_sym]
|
|
27
27
|
if @search.list_change_times && field_def[:list_change_times] && transaction.assignment.try(:order)
|
|
28
|
-
changes = transaction.assignment.order.send("#{field}_changes")
|
|
29
|
-
.map do |al|
|
|
28
|
+
changes = transaction.assignment.order.send("#{field}_changes").map do |al|
|
|
30
29
|
[al.created_at.localtime.strftime('%H:%M'),
|
|
31
30
|
PacMan.yaml_load(al.new_values).symbolize_keys[field.to_sym]]
|
|
32
31
|
end
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
xml.chart(xAxisName: 'Elections',
|
|
4
|
-
showValues: '1', caption
|
|
4
|
+
showValues: '1', caption:, subcaption:,
|
|
5
5
|
yAxisName: "Election #{t(@search.select_value.downcase)}", numberSuffix: '') do
|
|
6
6
|
xml.set(
|
|
7
7
|
name: @result[:value0],
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
xml.chart(xAxisName: (@dimensions[0][:pretty_name] || 'Elections').gsub("'", ''),
|
|
4
|
-
showValues: '1', caption
|
|
4
|
+
showValues: '1', caption:, subcaption:,
|
|
5
5
|
yAxisName: "Election #{t(@search.select_value.downcase)}", numberSuffix: '') do
|
|
6
6
|
@result[:rows].each do |res|
|
|
7
7
|
xml.set name: @dimensions[0][:label_method] ? @dimensions[0][:label_method].call(res[:value]) : res[:value],
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
xml.chart(
|
|
4
4
|
xAxisName: (@dimensions[0][:pretty_name] || 'Elections').gsub("'", ''), palette: '2',
|
|
5
|
-
caption
|
|
5
|
+
caption:, subcaption:,
|
|
6
6
|
showNames: '1',
|
|
7
7
|
showValues: @result[:rows].size > 15 || (@result[:rows][0] && @result[:rows][0][:rows].size > 4) ? 0 : 1,
|
|
8
8
|
decimals: '0',
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
xml.chart(
|
|
4
4
|
xAxisName: (@dimensions[0][:pretty_name] || 'Elections').gsub("'", ''), palette: '2',
|
|
5
|
-
caption
|
|
5
|
+
caption:, subcaption:,
|
|
6
6
|
showNames: '1',
|
|
7
7
|
showValues:
|
|
8
8
|
@result[:rows].size > 15 || (@result[:rows][0] && @result[:rows][0][:rows].size > 4) ? 0 : 1,
|
|
@@ -21,19 +21,19 @@ def excel_summary_row_xlsx(sheet, result, parent_result = nil, dimension = 0, he
|
|
|
21
21
|
end
|
|
22
22
|
else
|
|
23
23
|
render(partial: '/simple_drilldown/excel_summary_row_xlsx',
|
|
24
|
-
locals: { sheet
|
|
25
|
-
dimension:
|
|
24
|
+
locals: { sheet:, result:, parent_result:, headers: headers.dup,
|
|
25
|
+
dimension: })
|
|
26
26
|
|
|
27
27
|
if @search.list
|
|
28
28
|
render(partial: '/simple_drilldown/excel_record_list_xlsx',
|
|
29
|
-
locals: { sheet
|
|
29
|
+
locals: { sheet:, result: })
|
|
30
30
|
end
|
|
31
31
|
end
|
|
32
32
|
|
|
33
33
|
return if dimension >= @dimensions.size
|
|
34
34
|
|
|
35
35
|
render(partial: '/simple_drilldown/excel_summary_total_row_xlsx', locals: {
|
|
36
|
-
sheet
|
|
36
|
+
sheet:, result:, headers: headers.dup, dimension:
|
|
37
37
|
})
|
|
38
38
|
end
|
|
39
39
|
|
|
@@ -105,7 +105,7 @@ module SimpleDrilldown
|
|
|
105
105
|
conditions = options.delete(:where)
|
|
106
106
|
queries = [{
|
|
107
107
|
select: select_expression,
|
|
108
|
-
includes
|
|
108
|
+
includes:,
|
|
109
109
|
where: conditions
|
|
110
110
|
}]
|
|
111
111
|
end
|
|
@@ -135,15 +135,15 @@ module SimpleDrilldown
|
|
|
135
135
|
a.concat(*i)
|
|
136
136
|
end
|
|
137
137
|
end,
|
|
138
|
-
interval
|
|
139
|
-
label_method
|
|
140
|
-
legal_values
|
|
141
|
-
pretty_name
|
|
142
|
-
queries
|
|
143
|
-
reverse
|
|
138
|
+
interval:,
|
|
139
|
+
label_method:,
|
|
140
|
+
legal_values:,
|
|
141
|
+
pretty_name:,
|
|
142
|
+
queries:,
|
|
143
|
+
reverse:,
|
|
144
144
|
select_expression:
|
|
145
145
|
queries.size == 1 ? queries[0][:select] : "COALESCE(#{queries.map { |q| q[:select] }.join(',')})",
|
|
146
|
-
row_class
|
|
146
|
+
row_class:,
|
|
147
147
|
url_param_name: name.to_s
|
|
148
148
|
}
|
|
149
149
|
end
|
|
@@ -292,7 +292,7 @@ module SimpleDrilldown
|
|
|
292
292
|
"LEFT JOIN #{include_table} #{include_alias} ON #{include_alias}.#{pk_col} = #{model_table}.#{fk_col}"
|
|
293
293
|
when :has_one, :has_many
|
|
294
294
|
fk_col = ass.options[:foreign_key] || "#{model}_id"
|
|
295
|
-
sql =
|
|
295
|
+
sql = "LEFT JOIN #{include_table} #{include_alias} ON #{include_alias}.#{fk_col} = #{model_table}.id"
|
|
296
296
|
sql << " AND #{include_alias}.deleted_at IS NULL" if ass.klass.paranoid?
|
|
297
297
|
if ass.scope && (base_ass_order = ScopeHolder.new(ass.scope).to_s)
|
|
298
298
|
/^(?<ass_order>.*?)(?<ass_order_desc>\s+DESC)?$/i =~ base_ass_order
|
|
@@ -321,8 +321,8 @@ module SimpleDrilldown
|
|
|
321
321
|
end
|
|
322
322
|
end
|
|
323
323
|
|
|
324
|
-
def merge_includes(*
|
|
325
|
-
hash = hash_includes(*
|
|
324
|
+
def merge_includes(*)
|
|
325
|
+
hash = hash_includes(*)
|
|
326
326
|
result = hash.dup.map do |k, v|
|
|
327
327
|
if v.blank?
|
|
328
328
|
hash.delete(k)
|
|
@@ -368,7 +368,7 @@ module SimpleDrilldown
|
|
|
368
368
|
end
|
|
369
369
|
|
|
370
370
|
def initialize
|
|
371
|
-
super
|
|
371
|
+
super
|
|
372
372
|
@history_fields = c_fields.select { |_k, v| v[:list_change_times] }.map { |k, _v| k.to_s }
|
|
373
373
|
end
|
|
374
374
|
|
|
@@ -427,7 +427,7 @@ module SimpleDrilldown
|
|
|
427
427
|
@remaining_dimensions = c_dimension_defs.dup
|
|
428
428
|
@remaining_dimensions.each_key do |dim_name|
|
|
429
429
|
if (@search.filter[dim_name] && @search.filter[dim_name].size == 1) ||
|
|
430
|
-
|
|
430
|
+
@dimensions.any? { |d| d[:url_param_name] == dim_name }
|
|
431
431
|
@remaining_dimensions.delete(dim_name)
|
|
432
432
|
end
|
|
433
433
|
end
|
|
@@ -9,7 +9,7 @@ module SimpleDrilldown
|
|
|
9
9
|
config.autoload_paths << File.dirname(__dir__)
|
|
10
10
|
|
|
11
11
|
initializer 'simple_drilldown.assets.precompile' do |app|
|
|
12
|
-
app.config.try(:assets)&.precompile&.
|
|
12
|
+
app.config.try(:assets)&.precompile&.push('simple_drilldown/application.css', 'chartkick.js')
|
|
13
13
|
end
|
|
14
14
|
|
|
15
15
|
ActionDispatch::Routing::Mapper.include SimpleDrilldown::Routing
|
|
@@ -5,6 +5,7 @@ module SimpleDrilldown
|
|
|
5
5
|
module Helper
|
|
6
6
|
# FIXME(uwe): Should not be necessary: https://github.com/rails/rails/issues/41038
|
|
7
7
|
include Rails.application.routes.url_helpers
|
|
8
|
+
|
|
8
9
|
# EMXIF
|
|
9
10
|
|
|
10
11
|
def value_label(dimension_index, value)
|
|
@@ -25,8 +26,8 @@ module SimpleDrilldown
|
|
|
25
26
|
|
|
26
27
|
def summary_row(result, parent_result = nil, dimension = 0, headers = [], new_row: true)
|
|
27
28
|
html = render(partial: '/simple_drilldown/summary_row', locals: {
|
|
28
|
-
result
|
|
29
|
-
headers
|
|
29
|
+
result:, parent_result:, new_row:, dimension:,
|
|
30
|
+
headers:, with_results: !result[:rows]
|
|
30
31
|
})
|
|
31
32
|
if result[:rows]
|
|
32
33
|
sub_headers = headers + [{
|
|
@@ -38,12 +39,12 @@ module SimpleDrilldown
|
|
|
38
39
|
html << summary_row(r, result, dimension + 1, sub_headers, new_row: i.positive?)
|
|
39
40
|
end
|
|
40
41
|
elsif @search.list
|
|
41
|
-
html << render(partial: '/simple_drilldown/record_list', locals: { result
|
|
42
|
+
html << render(partial: '/simple_drilldown/record_list', locals: { result:, dimension: })
|
|
42
43
|
end
|
|
43
44
|
if dimension < @dimensions.size
|
|
44
45
|
html << render(partial: '/simple_drilldown/summary_total_row',
|
|
45
46
|
locals: {
|
|
46
|
-
result
|
|
47
|
+
result:, parent_result:, headers: headers.dup, dimension:
|
|
47
48
|
})
|
|
48
49
|
end
|
|
49
50
|
|
|
@@ -72,15 +73,15 @@ module SimpleDrilldown
|
|
|
72
73
|
end
|
|
73
74
|
else
|
|
74
75
|
xml << render(partial: '/simple_drilldown/excel_summary_row',
|
|
75
|
-
locals: { result
|
|
76
|
-
dimension:
|
|
76
|
+
locals: { result:, parent_result:, headers: headers.dup,
|
|
77
|
+
dimension: })
|
|
77
78
|
|
|
78
|
-
xml << render(partial: '/simple_drilldown/excel_record_list', locals: { result:
|
|
79
|
+
xml << render(partial: '/simple_drilldown/excel_record_list', locals: { result: }) if @search.list
|
|
79
80
|
end
|
|
80
81
|
|
|
81
82
|
if dimension < @dimensions.size
|
|
82
83
|
xml << render(partial: '/simple_drilldown/excel_summary_total_row', locals: {
|
|
83
|
-
result
|
|
84
|
+
result:, headers: headers.dup, dimension:
|
|
84
85
|
})
|
|
85
86
|
end
|
|
86
87
|
xml
|
|
@@ -7,9 +7,9 @@ module SimpleDrilldown
|
|
|
7
7
|
path = "#{path}_drilldown" unless /_drilldown$/.match?(path)
|
|
8
8
|
controller ||= path
|
|
9
9
|
get "#{path}(.:format)" => "#{controller}#index", as: path
|
|
10
|
-
scope path, controller
|
|
10
|
+
scope path, controller:, as: path do
|
|
11
11
|
{ excel_export: :xlsx, excel_export_records: :xlsx, html_export: :html }.each do |action, format|
|
|
12
|
-
get action, defaults: { format:
|
|
12
|
+
get action, defaults: { format: }
|
|
13
13
|
end
|
|
14
14
|
get 'choices/:dimension_name', action: :choices, as: :choices
|
|
15
15
|
yield if block_given?
|
|
@@ -51,7 +51,7 @@ module SimpleDrilldown
|
|
|
51
51
|
@dimensions.delete_if(&:empty?)
|
|
52
52
|
@filter = attributes && attributes[:filter] ? attributes[:filter] : {}
|
|
53
53
|
@filter.keys.dup.each { |k| @filter[k] = Array(@filter[k]) }
|
|
54
|
-
@filter.
|
|
54
|
+
@filter.each_value do |v|
|
|
55
55
|
v.delete('')
|
|
56
56
|
v.delete('Select Some Options')
|
|
57
57
|
end
|
|
@@ -80,13 +80,13 @@ module SimpleDrilldown
|
|
|
80
80
|
def url_options
|
|
81
81
|
o = {
|
|
82
82
|
search: {
|
|
83
|
-
title
|
|
83
|
+
title:,
|
|
84
84
|
list: list ? '1' : '0',
|
|
85
85
|
percent: percent ? '1' : '0',
|
|
86
86
|
list_change_times: list_change_times ? '1' : '0',
|
|
87
|
-
filter
|
|
88
|
-
dimensions
|
|
89
|
-
display_type:
|
|
87
|
+
filter:,
|
|
88
|
+
dimensions:,
|
|
89
|
+
display_type:
|
|
90
90
|
}
|
|
91
91
|
}
|
|
92
92
|
o[:search][:fields] = fields unless fields == @default_fields
|
metadata
CHANGED
|
@@ -1,14 +1,13 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: simple_drilldown
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 1.0.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Uwe Kubosch
|
|
8
|
-
autorequire:
|
|
9
8
|
bindir: bin
|
|
10
9
|
cert_chain: []
|
|
11
|
-
date:
|
|
10
|
+
date: 1980-01-02 00:00:00.000000000 Z
|
|
12
11
|
dependencies:
|
|
13
12
|
- !ruby/object:Gem::Dependency
|
|
14
13
|
name: caxlsx_rails
|
|
@@ -44,20 +43,14 @@ dependencies:
|
|
|
44
43
|
requirements:
|
|
45
44
|
- - ">="
|
|
46
45
|
- !ruby/object:Gem::Version
|
|
47
|
-
version: '
|
|
48
|
-
- - "<"
|
|
49
|
-
- !ruby/object:Gem::Version
|
|
50
|
-
version: '8'
|
|
46
|
+
version: '7.2'
|
|
51
47
|
type: :runtime
|
|
52
48
|
prerelease: false
|
|
53
49
|
version_requirements: !ruby/object:Gem::Requirement
|
|
54
50
|
requirements:
|
|
55
51
|
- - ">="
|
|
56
52
|
- !ruby/object:Gem::Version
|
|
57
|
-
version: '
|
|
58
|
-
- - "<"
|
|
59
|
-
- !ruby/object:Gem::Version
|
|
60
|
-
version: '8'
|
|
53
|
+
version: '7.2'
|
|
61
54
|
description: simple_drilldown offers a simple way to define axis to filter and group
|
|
62
55
|
records for analysis.
|
|
63
56
|
email:
|
|
@@ -130,7 +123,6 @@ licenses:
|
|
|
130
123
|
metadata:
|
|
131
124
|
allowed_push_host: https://rubygems.org/
|
|
132
125
|
rubygems_mfa_required: 'true'
|
|
133
|
-
post_install_message:
|
|
134
126
|
rdoc_options: []
|
|
135
127
|
require_paths:
|
|
136
128
|
- lib
|
|
@@ -138,15 +130,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
|
138
130
|
requirements:
|
|
139
131
|
- - ">="
|
|
140
132
|
- !ruby/object:Gem::Version
|
|
141
|
-
version: '
|
|
133
|
+
version: '3.3'
|
|
142
134
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
143
135
|
requirements:
|
|
144
136
|
- - ">="
|
|
145
137
|
- !ruby/object:Gem::Version
|
|
146
138
|
version: '0'
|
|
147
139
|
requirements: []
|
|
148
|
-
rubygems_version: 3.
|
|
149
|
-
signing_key:
|
|
140
|
+
rubygems_version: 3.6.9
|
|
150
141
|
specification_version: 4
|
|
151
142
|
summary: Simple data warehouse and drilldown.
|
|
152
143
|
test_files: []
|