simple_drilldown 0.0.3 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/{LICENSE.txt → MIT-LICENSE} +1 -3
- data/README.md +15 -16
- data/Rakefile +32 -0
- data/app/assets/config/simple_drilldown_manifest.js +1 -0
- data/app/assets/stylesheets/simple_drilldown/application.css +121 -0
- data/app/controllers/simple_drilldown/application_controller.rb +7 -0
- data/app/helpers/simple_drilldown/application_helper.rb +6 -0
- data/app/jobs/simple_drilldown/application_job.rb +6 -0
- data/app/mailers/simple_drilldown/application_mailer.rb +8 -0
- data/app/models/simple_drilldown/application_record.rb +7 -0
- data/app/views/drilldown/_chart.html.erb +57 -0
- data/app/views/drilldown/_excel_record_list.builder +7 -0
- data/app/views/drilldown/_excel_row.builder +24 -0
- data/app/views/drilldown/_excel_row_header.builder +10 -0
- data/app/views/drilldown/_excel_styles.builder +69 -0
- data/app/views/drilldown/_excel_summary_row.builder +16 -0
- data/app/views/drilldown/_excel_summary_total_row.builder +14 -0
- data/app/views/drilldown/_field.html.erb +39 -0
- data/app/views/drilldown/_fields.html.erb +12 -0
- data/app/views/drilldown/_filter.html.erb +20 -0
- data/app/views/drilldown/_record_list.html.erb +12 -0
- data/app/views/drilldown/_row.html.erb +13 -0
- data/app/views/drilldown/_row_header.html.erb +8 -0
- data/app/views/drilldown/_summary_row.html.erb +18 -0
- data/app/views/drilldown/_summary_table.html.erb +12 -0
- data/app/views/drilldown/_summary_total_row.html.erb +4 -0
- data/app/views/drilldown/_tab_buttons.html.erb +5 -0
- data/app/views/drilldown/data_0.builder +10 -0
- data/app/views/drilldown/data_1.builder +11 -0
- data/app/views/drilldown/data_2.builder +37 -0
- data/app/views/drilldown/data_3.builder +37 -0
- data/app/views/drilldown/excel_export.builder +42 -0
- data/app/views/drilldown/excel_export_transactions.builder +90 -0
- data/app/views/drilldown/html_export.html.erb +6 -0
- data/app/views/drilldown/index.html.erb +107 -0
- data/app/views/drilldown/print.html.erb +18 -0
- data/app/views/layouts/simple_drilldown/application.html.erb +15 -0
- data/config/locales/en.yml +23 -0
- data/config/locales/nb.yml +20 -0
- data/config/routes.rb +4 -0
- data/lib/generators/drilldown_controller/USAGE +8 -0
- data/lib/generators/drilldown_controller/drilldown_controller_generator.rb +8 -0
- data/lib/generators/drilldown_controller/templates/drilldown_controller.rb.erb +41 -0
- data/lib/simple_drilldown.rb +3 -3
- data/lib/simple_drilldown/drilldown_controller.rb +389 -274
- data/lib/simple_drilldown/drilldown_helper.rb +68 -0
- data/lib/simple_drilldown/engine.rb +11 -0
- data/lib/simple_drilldown/search.rb +12 -1
- data/lib/simple_drilldown/version.rb +1 -1
- data/lib/tasks/simple_drilldown_tasks.rake +5 -0
- metadata +85 -34
- data/.document +0 -5
- data/.gitignore +0 -22
- data/Gemfile +0 -3
- data/Gemfile.lock +0 -89
- data/README.rdoc +0 -19
- data/lib/sample_drilldown_controller.rb +0 -95
- data/lib/simple_drilldown/simple_drilldown_helper.rb +0 -66
- data/simple_drilldown.gemspec +0 -24
- data/test/helper.rb +0 -18
- data/test/test_simple_drilldown.rb +0 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 69ddf461c2a4468488cbc463a59aa94229bb26f85e248e712da54545865c669e
|
4
|
+
data.tar.gz: 33af8b7b6cf86b22c17e4db5193b3c0cc8db3e228f2dfbc2a376f5b0e534b2fa
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1adc008b5dd8e53570735de90939ed33ad7e4e0f16067c177c60bb05ff6b189097f4c2057376fcfb99bc931b05579189f276167b204397aee46f990830362913
|
7
|
+
data.tar.gz: f45aa0e99c1df10b9a6ce8dfb0f2782e3535f80c75294b7c0c2a7e0396b532cef6f626e7859c6e1f9d2455e2f6858e40197dee458c77659e53756832d31f5819
|
data/{LICENSE.txt → MIT-LICENSE}
RENAMED
data/README.md
CHANGED
@@ -1,29 +1,28 @@
|
|
1
1
|
# SimpleDrilldown
|
2
|
+
Short description and motivation.
|
2
3
|
|
3
|
-
|
4
|
+
## Usage
|
5
|
+
How to use my plugin.
|
4
6
|
|
5
7
|
## Installation
|
6
|
-
|
7
8
|
Add this line to your application's Gemfile:
|
8
9
|
|
9
|
-
|
10
|
+
```ruby
|
11
|
+
gem 'simple_drilldown'
|
12
|
+
```
|
10
13
|
|
11
14
|
And then execute:
|
12
|
-
|
13
|
-
|
15
|
+
```bash
|
16
|
+
$ bundle
|
17
|
+
```
|
14
18
|
|
15
19
|
Or install it yourself as:
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
## Usage
|
20
|
-
|
21
|
-
TODO: Write usage instructions here
|
20
|
+
```bash
|
21
|
+
$ gem install simple_drilldown
|
22
|
+
```
|
22
23
|
|
23
24
|
## Contributing
|
25
|
+
Contribution directions go here.
|
24
26
|
|
25
|
-
|
26
|
-
|
27
|
-
3. Commit your changes (`git commit -am 'Add some feature'`)
|
28
|
-
4. Push to the branch (`git push origin my-new-feature`)
|
29
|
-
5. Create new Pull Request
|
27
|
+
## License
|
28
|
+
The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
|
data/Rakefile
CHANGED
@@ -1 +1,33 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
begin
|
4
|
+
require 'bundler/setup'
|
5
|
+
rescue LoadError
|
6
|
+
puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
|
7
|
+
end
|
8
|
+
|
9
|
+
APP_RAKEFILE = File.expand_path('test/dummy/Rakefile', __dir__)
|
10
|
+
load 'rails/tasks/engine.rake'
|
11
|
+
load 'rails/tasks/statistics.rake'
|
12
|
+
|
1
13
|
require 'bundler/gem_tasks'
|
14
|
+
require 'rake/testtask'
|
15
|
+
|
16
|
+
Rake::TestTask.new(:test) do |t|
|
17
|
+
t.libs << 'test'
|
18
|
+
t.pattern = 'test/**/*_test.rb'
|
19
|
+
t.verbose = false
|
20
|
+
end
|
21
|
+
|
22
|
+
task default: :test
|
23
|
+
|
24
|
+
require 'rubocop/rake_task'
|
25
|
+
RuboCop::RakeTask.new
|
26
|
+
|
27
|
+
namespace :test do
|
28
|
+
desc 'Run Rubocop and all tests'
|
29
|
+
task full: %i[rubocop:auto_correct test]
|
30
|
+
|
31
|
+
desc 'Run all tests except system tests'
|
32
|
+
task quick: :test
|
33
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
//= link_directory ../stylesheets/simple_drilldown .css
|
@@ -0,0 +1,121 @@
|
|
1
|
+
table {
|
2
|
+
border: none;
|
3
|
+
}
|
4
|
+
|
5
|
+
th {
|
6
|
+
border: 1px solid #dfded2;
|
7
|
+
padding: 2px;
|
8
|
+
font-size: 10pt;
|
9
|
+
font-weight: bold;
|
10
|
+
background-color: #dddddd;
|
11
|
+
text-align: center;
|
12
|
+
}
|
13
|
+
|
14
|
+
th.header {
|
15
|
+
font-weight: bold;
|
16
|
+
text-align: center;
|
17
|
+
}
|
18
|
+
|
19
|
+
td {
|
20
|
+
border: 1px solid #dfded2;
|
21
|
+
padding: 2px;
|
22
|
+
font-size: 10px;
|
23
|
+
}
|
24
|
+
|
25
|
+
td.numeric {
|
26
|
+
text-align: right;
|
27
|
+
}
|
28
|
+
|
29
|
+
tr.sum {
|
30
|
+
text-align: right;
|
31
|
+
border-top: 2px solid black;
|
32
|
+
}
|
33
|
+
|
34
|
+
tr.summary {
|
35
|
+
background-color: #eeeeee;
|
36
|
+
font-weight: bold;
|
37
|
+
}
|
38
|
+
|
39
|
+
tr.credit_record {
|
40
|
+
color: orange;
|
41
|
+
}
|
42
|
+
|
43
|
+
tr.deleted {
|
44
|
+
background-color: #ffff88;
|
45
|
+
}
|
46
|
+
|
47
|
+
tr.reading {
|
48
|
+
background-color: #fffff0;
|
49
|
+
font-weight: bold;
|
50
|
+
}
|
51
|
+
|
52
|
+
tr.context_record {
|
53
|
+
background-color: #eeeeee;
|
54
|
+
}
|
55
|
+
|
56
|
+
table.border_table {
|
57
|
+
border: 2px solid black;
|
58
|
+
border-spacing: 1em;
|
59
|
+
border-collapse: collapse;
|
60
|
+
}
|
61
|
+
|
62
|
+
table.border_table td {
|
63
|
+
border: 1px solid #dfded2;
|
64
|
+
border-bottom-width: 0;
|
65
|
+
}
|
66
|
+
|
67
|
+
table.border_table th {
|
68
|
+
border: 2px solid black;
|
69
|
+
}
|
70
|
+
|
71
|
+
#stock_report tr.month th {
|
72
|
+
border-bottom: 0;
|
73
|
+
}
|
74
|
+
|
75
|
+
table.border_table tr.year td {
|
76
|
+
border-top: 0;
|
77
|
+
}
|
78
|
+
|
79
|
+
table.border_table tr.year th {
|
80
|
+
border-top: 0;
|
81
|
+
}
|
82
|
+
|
83
|
+
form.search {
|
84
|
+
padding: 0;
|
85
|
+
}
|
86
|
+
|
87
|
+
form.search label, form.search .label {
|
88
|
+
min-width: inherit;
|
89
|
+
font-size: inherit;
|
90
|
+
}
|
91
|
+
|
92
|
+
table#search th {
|
93
|
+
border: 0;
|
94
|
+
}
|
95
|
+
|
96
|
+
table#search td {
|
97
|
+
border: 0;
|
98
|
+
}
|
99
|
+
|
100
|
+
table#drill_down_layout > tbody > tr > td {
|
101
|
+
border: none;
|
102
|
+
font-size: 13px
|
103
|
+
}
|
104
|
+
|
105
|
+
table#drill_down_layout td {
|
106
|
+
padding: 2px;
|
107
|
+
margin: 0;
|
108
|
+
line-height: 18px
|
109
|
+
}
|
110
|
+
|
111
|
+
table#drill_down_layout table{
|
112
|
+
border: none;
|
113
|
+
}
|
114
|
+
|
115
|
+
table#drill_down_layout {
|
116
|
+
border: none;
|
117
|
+
}
|
118
|
+
|
119
|
+
table#search_fields td {
|
120
|
+
border: none;
|
121
|
+
}
|
@@ -0,0 +1,57 @@
|
|
1
|
+
<%
|
2
|
+
# The xml is obtained as a string from builder template.
|
3
|
+
str_xml = render :file => "drilldown/data_#{@dimensions.size}"
|
4
|
+
str_xml = str_xml.gsub("\n", "").gsub("\r", "").gsub("&", "&").gsub("'", "").html_safe
|
5
|
+
|
6
|
+
type = nil
|
7
|
+
case @search.display_type
|
8
|
+
when SimpleDrilldown::Search::DisplayType::PIE
|
9
|
+
type = 'Pie3D'
|
10
|
+
when SimpleDrilldown::Search::DisplayType::BAR
|
11
|
+
type = (@search.dimensions && @search.dimensions.size >= 2) ? 'MSCombi3D' : 'Column2D'
|
12
|
+
when SimpleDrilldown::Search::DisplayType::LINE
|
13
|
+
type = (@search.dimensions && @search.dimensions.size >= 2) ? 'MSLine' : 'Line'
|
14
|
+
end
|
15
|
+
if type %>
|
16
|
+
<div id="chartdiv" align="center">Chart will load here</div>
|
17
|
+
<script type="text/javascript">
|
18
|
+
var chart = new FusionCharts("<%= asset_path(type + '.swf') %>", "ChartId_Election", "650", "400", "0", "1");
|
19
|
+
chart.setXMLData('<%= str_xml %>');
|
20
|
+
chart.render("chartdiv");
|
21
|
+
</script>
|
22
|
+
<% else %>
|
23
|
+
<div id="drilldown_area">
|
24
|
+
<h2><%= caption %></h2>
|
25
|
+
<h3><%= subcaption %></h3>
|
26
|
+
<br/>
|
27
|
+
</div>
|
28
|
+
<% end %>
|
29
|
+
<div id="drilldown_search_area" style="margin-left: auto; margin-right: auto; text-align: center">
|
30
|
+
<% (0..2).each do |i| %>
|
31
|
+
<%
|
32
|
+
options = [['', '']]
|
33
|
+
options << [@dimensions[i][:pretty_name], @dimensions[i][:url_param_name]] if @dimensions[i]
|
34
|
+
options += @remaining_dimensions.keys.map { |name| [@dimension_defs[name][:pretty_name], name] }
|
35
|
+
%>
|
36
|
+
<%= t(i == 0 ? :group_by : :then_by) %>:
|
37
|
+
<%= form.select 'dimensions', options, {:selected => @search.dimensions && @search.dimensions[i]},
|
38
|
+
{:onChange => 'form.submit()', :name => 'search[dimensions][]', :id => "search_dimensions_#{i}"}
|
39
|
+
%>
|
40
|
+
<% end %>
|
41
|
+
<br/>
|
42
|
+
<%= t :chart_type %>:
|
43
|
+
<%= form.radio_button 'display_type', SimpleDrilldown::Search::DisplayType::BAR, {:onChange => 'form.submit()'} %>
|
44
|
+
<%= form.label :display_type_bar, t(:bar) %>
|
45
|
+
<%= form.radio_button 'display_type', SimpleDrilldown::Search::DisplayType::PIE, {:disabled => @search.dimensions.size >= 2, :onChange => 'form.submit()'} %>
|
46
|
+
<%= form.label :display_type_pie, t(:pie) %>
|
47
|
+
<%= form.radio_button 'display_type', SimpleDrilldown::Search::DisplayType::LINE, {:onChange => 'form.submit()'} %>
|
48
|
+
<%= form.label :display_type_line, t(:line) %>
|
49
|
+
<%= form.radio_button 'display_type', SimpleDrilldown::Search::DisplayType::NONE, {:onChange => 'form.submit()'} %>
|
50
|
+
<%= form.label :display_type_none, t(:none) %>
|
51
|
+
|
52
|
+
<%= form.check_box :order_by_value, {:onChange => 'form.submit()'} %>
|
53
|
+
<%= form.label :order_by_value, t(:order_by_value) %>
|
54
|
+
|
55
|
+
<%= form.check_box :list, {:onChange => 'form.submit()'} %>
|
56
|
+
<%= form.label :list, t(:list) %>
|
57
|
+
</div>
|
@@ -0,0 +1,7 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
xml << render(partial: '/drilldown/excel_row_header')
|
4
|
+
|
5
|
+
result[:transactions].each do |t|
|
6
|
+
xml << render(partial: '/drilldown/excel_row', locals: { transaction: t, previous_transaction: nil, errors: [], error_row: false, meter1_errors: false })
|
7
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
xml.Row do
|
4
|
+
padding_cells = @dimensions.empty? ? 1 : @dimensions.size
|
5
|
+
1.upto(padding_cells - 1) { |_n| xml.Cell('ss:StyleID' => 'Outer') }
|
6
|
+
|
7
|
+
@search.fields.each_with_index do |field, i|
|
8
|
+
if field == 'time'
|
9
|
+
value = (transaction.respond_to?(:completed_at) ? transaction.completed_at : transaction.created_at).localtime.strftime('%Y-%m-%d %H:%M')
|
10
|
+
else
|
11
|
+
value = if @transaction_fields_map[field.to_sym][:attr_method]
|
12
|
+
@transaction_fields_map[field.to_sym][:attr_method].call(transaction)
|
13
|
+
else
|
14
|
+
transaction.send(field)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
field_def = @transaction_fields_map[field.to_sym]
|
19
|
+
|
20
|
+
xml.Cell('ss:Index' => (padding_cells + i).to_s) do
|
21
|
+
xml.Data value, 'ss:Type' => 'String'
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
xml.Row do
|
4
|
+
padding_cells = @dimensions.empty? ? 1 : @dimensions.size
|
5
|
+
1.upto(padding_cells - 1) { |_n| xml.Cell('ss:StyleID' => 'Outer') }
|
6
|
+
|
7
|
+
@search.fields.each_with_index do |field, i|
|
8
|
+
xml.Cell('ss:Index' => (padding_cells + i).to_s) { xml.Data t(field), 'ss:Type' => 'String' }
|
9
|
+
end
|
10
|
+
end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
xml.Styles do
|
4
|
+
xml.Style 'ss:ID' => 'Default', 'ss:Name' => 'Normal' do
|
5
|
+
xml.Alignment 'ss:Vertical' => 'Center'
|
6
|
+
xml.Borders
|
7
|
+
xml.Font 'ss:FontName' => 'Calibri', 'x:Family' => 'Swiss', 'ss:Size' => '11', 'ss:Color' => '#000000'
|
8
|
+
xml.Interior
|
9
|
+
xml.NumberFormat
|
10
|
+
xml.Protection
|
11
|
+
end
|
12
|
+
xml.Style 'ss:ID' => 'MainTitle' do
|
13
|
+
xml.Alignment 'ss:Horizontal' => 'Center', 'ss:Vertical' => 'Bottom'
|
14
|
+
xml.Font 'ss:Size' => '14', 'ss:Bold' => '1'
|
15
|
+
end
|
16
|
+
xml.Style 'ss:ID' => 'SubTitle' do
|
17
|
+
xml.Alignment 'ss:Horizontal' => 'Center', 'ss:Vertical' => 'Bottom'
|
18
|
+
xml.Font 'ss:Size' => '12', 'ss:Bold' => '1'
|
19
|
+
end
|
20
|
+
xml.Style 'ss:ID' => 'Heading' do
|
21
|
+
xml.Font 'ss:Bold' => '1'
|
22
|
+
xml.Alignment 'ss:Horizontal' => 'Center', 'ss:Vertical' => 'Bottom'
|
23
|
+
end
|
24
|
+
xml.Style 'ss:ID' => 'DimensionHeading' do
|
25
|
+
xml.Font 'ss:Bold' => '1'
|
26
|
+
end
|
27
|
+
xml.Style 'ss:ID' => 'StandardNumberFormat' do
|
28
|
+
xml.NumberFormat 'ss:Format' => 'Standard'
|
29
|
+
end
|
30
|
+
xml.Style 'ss:ID' => 'ThreeDecimalNumberFormat' do
|
31
|
+
xml.NumberFormat 'ss:Format' => '0.000'
|
32
|
+
end
|
33
|
+
xml.Style 'ss:ID' => 'NoDecimalNumberFormat' do
|
34
|
+
xml.NumberFormat 'ss:Format' => "\#,\#\#0"
|
35
|
+
end
|
36
|
+
xml.Style 'ss:ID' => 'Percent' do
|
37
|
+
xml.NumberFormat 'ss:Format' => '0%'
|
38
|
+
end
|
39
|
+
xml.Style 'ss:ID' => 'Sum' do
|
40
|
+
xml.Borders do
|
41
|
+
%w[Top Left Right].each do |pos|
|
42
|
+
xml.Border 'ss:Position' => pos
|
43
|
+
end
|
44
|
+
xml.Border 'ss:Position' => 'Bottom', 'ss:Weight' => '1'
|
45
|
+
end
|
46
|
+
xml.Interior 'ss:Color' => '#dedede', 'ss:Pattern' => 'Solid'
|
47
|
+
xml.NumberFormat 'ss:Format' => "\#,\#\#0"
|
48
|
+
end
|
49
|
+
xml.Style 'ss:ID' => 'Outer' do
|
50
|
+
end
|
51
|
+
xml.Style 'ss:ID' => 'ShortDate' do
|
52
|
+
xml.NumberFormat 'ss:Format' => 'Short Date'
|
53
|
+
end
|
54
|
+
xml.Style 'ss:ID' => 'NormalDate' do
|
55
|
+
xml.NumberFormat 'ss:Format' => 'Long Date'
|
56
|
+
end
|
57
|
+
xml.Style 'ss:ID' => 'DateOnlyFormat' do
|
58
|
+
xml.NumberFormat 'ss:Format' => 'd/m/yyyy;@'
|
59
|
+
end
|
60
|
+
xml.Style 'ss:ID' => 'TimeOnlyFormat' do
|
61
|
+
xml.NumberFormat 'ss:Format' => 'hh:mm;@'
|
62
|
+
end
|
63
|
+
xml.Style 'ss:ID' => 'LongDate' do
|
64
|
+
xml.NumberFormat 'ss:Format' => 'dd/mm/yyyy\\ hh:mm:ss'
|
65
|
+
end
|
66
|
+
xml.Style 'ss:ID' => 'VerticalCenter' do
|
67
|
+
xml.Alignment 'ss:Vertical' => 'Center'
|
68
|
+
end
|
69
|
+
end
|