kanaui 0.5.0 → 0.5.1
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/app/assets/javascripts/kanaui/kiddo/axes.js +25 -25
- data/app/assets/javascripts/kanaui/kiddo/charts/line_chart.js +12 -7
- data/app/assets/javascripts/kanaui/kiddo/charts/utils/mouse_over.js +67 -39
- data/app/assets/javascripts/kanaui/kiddo/kiddo_initialize.js +19 -11
- data/app/assets/javascripts/kanaui/kiddo/renderer.js +7 -2
- data/app/assets/javascripts/kanaui/kiddo/settings.js +1 -1
- data/app/assets/stylesheets/kanaui/reports.css +1 -1
- data/app/controllers/kanaui/dashboard_controller.rb +82 -22
- data/app/controllers/kanaui/engine_controller.rb +10 -0
- data/app/controllers/kanaui/reports_controller.rb +60 -0
- data/app/helpers/kanaui/dashboard_helper.rb +28 -2
- data/app/views/kanaui/dashboard/index.html.erb +90 -15
- data/app/views/kanaui/reports/_form.html.erb +49 -0
- data/app/views/kanaui/reports/_reports_table.html.erb +60 -0
- data/app/views/kanaui/reports/edit.html.erb +10 -0
- data/app/views/kanaui/reports/index.html.erb +17 -0
- data/app/views/kanaui/reports/new.html.erb +10 -0
- data/config/routes.rb +5 -1
- data/lib/kanaui/version.rb +1 -1
- metadata +121 -121
- data/app/assets/javascripts/kanaui/killbill.js +0 -1114
- data/app/assets/javascripts/kanaui/purl.js +0 -271
- data/app/assets/javascripts/kanaui/reports.graphs.js +0 -190
- data/app/assets/javascripts/kanaui/reports.js +0 -201
- data/app/assets/javascripts/kanaui/reports.urls.js +0 -44
- data/app/assets/javascripts/kanaui/tests.js +0 -2
@@ -14,5 +14,15 @@ module Kanaui
|
|
14
14
|
Kanaui.current_tenant_user.call(session, user)
|
15
15
|
end
|
16
16
|
|
17
|
+
def options_for_klient
|
18
|
+
user = current_tenant_user
|
19
|
+
{
|
20
|
+
:username => user[:username],
|
21
|
+
:password => user[:password],
|
22
|
+
:session_id => user[:session_id],
|
23
|
+
:api_key => user[:api_key],
|
24
|
+
:api_secret => user[:api_secret]
|
25
|
+
}
|
26
|
+
end
|
17
27
|
end
|
18
28
|
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
module Kanaui
|
2
|
+
class ReportsController < Kanaui::EngineController
|
3
|
+
|
4
|
+
def index
|
5
|
+
@reports = JSON.parse(Kanaui::DashboardHelper::DashboardApi.available_reports(options_for_klient)).map(&:deep_symbolize_keys)
|
6
|
+
end
|
7
|
+
|
8
|
+
def new
|
9
|
+
@report = {}
|
10
|
+
end
|
11
|
+
|
12
|
+
def create
|
13
|
+
Kanaui::DashboardHelper::DashboardApi.create_report(report_from_params.to_json, options_for_klient)
|
14
|
+
|
15
|
+
flash[:notice] = 'Report successfully created'
|
16
|
+
redirect_to :action => :index
|
17
|
+
end
|
18
|
+
|
19
|
+
def edit
|
20
|
+
@report = JSON.parse(Kanaui::DashboardHelper::DashboardApi.available_reports(options_for_klient))
|
21
|
+
.find { |x| x['reportName'] == params.require(:id) }
|
22
|
+
.deep_symbolize_keys
|
23
|
+
end
|
24
|
+
|
25
|
+
def update
|
26
|
+
Kanaui::DashboardHelper::DashboardApi.update_report(params.require(:id), report_from_params.to_json, options_for_klient)
|
27
|
+
|
28
|
+
flash[:notice] = 'Report successfully updated'
|
29
|
+
redirect_to :action => :index
|
30
|
+
end
|
31
|
+
|
32
|
+
def refresh
|
33
|
+
Kanaui::DashboardHelper::DashboardApi.refresh_report(params.require(:id), options_for_klient)
|
34
|
+
|
35
|
+
flash[:notice] = 'Report refresh successfully scheduled'
|
36
|
+
redirect_to :action => :index
|
37
|
+
end
|
38
|
+
|
39
|
+
def destroy
|
40
|
+
Kanaui::DashboardHelper::DashboardApi.delete_report(params.require(:id), options_for_klient)
|
41
|
+
|
42
|
+
flash[:notice] = 'Report successfully deleted'
|
43
|
+
redirect_to :action => :index
|
44
|
+
end
|
45
|
+
|
46
|
+
private
|
47
|
+
|
48
|
+
def report_from_params
|
49
|
+
{
|
50
|
+
:reportName => params[:report_name],
|
51
|
+
:reportPrettyName => params[:report_pretty_name],
|
52
|
+
:reportType => params[:report_type],
|
53
|
+
:sourceTableName => params[:source_table_name],
|
54
|
+
:refreshProcedureName => params[:refresh_procedure_name],
|
55
|
+
:refreshFrequency => params[:refresh_frequency],
|
56
|
+
:refreshHourOfDayGmt => params[:refresh_hour_of_day_gmt]
|
57
|
+
}
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
@@ -13,13 +13,39 @@ module Kanaui
|
|
13
13
|
response.body
|
14
14
|
end
|
15
15
|
|
16
|
-
def reports(start_date, end_date, name, smooth, format, options = {})
|
17
|
-
path = "#{KILLBILL_ANALYTICS_PREFIX}/reports?format
|
16
|
+
def reports(start_date, end_date, name, smooth, sql_only, format, options = {})
|
17
|
+
path = "#{KILLBILL_ANALYTICS_PREFIX}/reports?format=#{format}&startDate=#{start_date}&endDate=#{end_date}&name=#{name}"
|
18
18
|
path = "#{path}&smooth=#{smooth}" if smooth
|
19
|
+
path = "#{path}&sqlOnly=true" unless sql_only.blank?
|
19
20
|
response = KillBillClient::API.get path, {}, options
|
20
21
|
response.body
|
21
22
|
end
|
22
23
|
|
24
|
+
def report_configuration(name, options = {})
|
25
|
+
path = "#{KILLBILL_ANALYTICS_PREFIX}/reports/#{name}"
|
26
|
+
response = KillBillClient::API.get path, {}, options
|
27
|
+
JSON.parse(response.body).symbolize_keys
|
28
|
+
end
|
29
|
+
|
30
|
+
def create_report(report, options = {})
|
31
|
+
path = "#{KILLBILL_ANALYTICS_PREFIX}/reports"
|
32
|
+
KillBillClient::API.post path, report, {}, options
|
33
|
+
end
|
34
|
+
|
35
|
+
def refresh_report(name, options = {})
|
36
|
+
path = "#{KILLBILL_ANALYTICS_PREFIX}/reports/#{name}?shouldRefresh=true"
|
37
|
+
KillBillClient::API.put path, {}, {}, options
|
38
|
+
end
|
39
|
+
|
40
|
+
def update_report(name, report, options = {})
|
41
|
+
path = "#{KILLBILL_ANALYTICS_PREFIX}/reports/#{name}"
|
42
|
+
KillBillClient::API.put path, report, {}, options
|
43
|
+
end
|
44
|
+
|
45
|
+
def delete_report(name, options = {})
|
46
|
+
path = "#{KILLBILL_ANALYTICS_PREFIX}/reports/#{name}"
|
47
|
+
KillBillClient::API.delete path, {}, {}, options
|
48
|
+
end
|
23
49
|
end
|
24
50
|
end
|
25
51
|
|
@@ -2,15 +2,19 @@
|
|
2
2
|
<!-- MENU -->
|
3
3
|
<div class="col-md-3 col-sm-12 col-lg-4 reports-options">
|
4
4
|
<div class="row">
|
5
|
-
<% if params['
|
5
|
+
<% if params[:name] && @report['reportType'] == 'TIMELINE' %>
|
6
6
|
<div id="date-picker" class="col-md-12">
|
7
7
|
<h4>End date</h4>
|
8
|
-
<%= form_tag kanaui_engine.dashboard_index_path
|
9
|
-
<input name="
|
8
|
+
<%= form_tag kanaui_engine.dashboard_index_path, :method => :get do %>
|
9
|
+
<input name="name" type="hidden" value="<%= @raw_name %>">
|
10
|
+
<input name="smooth" type="hidden" value="<%= params[:smooth] %>">
|
11
|
+
<input name="sql_only" type="hidden" value="<%= params[:sql_only] %>">
|
12
|
+
<input name="format" type="hidden" value="<%= params[:format] %>">
|
13
|
+
<input name="delta_days" type="hidden" value="<%= (@end_date.to_date - @start_date.to_date).to_i %>">
|
10
14
|
|
11
15
|
<div class="form-group">
|
12
16
|
<div class="col-md-5">
|
13
|
-
<input class="form-control" name="
|
17
|
+
<input class="form-control" name="end_date" type="text" data-provide="datepicker" data-date-format="yyyy-mm-dd" data-date-today-highlight="true" value="<%= @end_date %>">
|
14
18
|
</div>
|
15
19
|
</div>
|
16
20
|
<div class="form-group">
|
@@ -20,19 +24,19 @@
|
|
20
24
|
</div>
|
21
25
|
<% end %>
|
22
26
|
<div class="col-md-12 col-sm-8">
|
23
|
-
<h4
|
27
|
+
<h4><%= link_to 'Available Reports', kanaui_engine.url_for(:controller => :reports) %></h4>
|
24
28
|
<ul class="nav nav-tabs nav-stacked">
|
25
29
|
<% if Rails.env.development? %>
|
26
30
|
<li class="nav-element">
|
27
|
-
<%= link_to "Fake pie", kanaui_engine.dashboard_index_path(
|
31
|
+
<%= link_to "Fake pie", kanaui_engine.dashboard_index_path(:fake => 1, :name => 'fake_pie', :type => 'pie') %>
|
28
32
|
</li>
|
29
33
|
<li class="nav-element">
|
30
|
-
<%= link_to "Fake line", kanaui_engine.dashboard_index_path(
|
34
|
+
<%= link_to "Fake line", kanaui_engine.dashboard_index_path(:fake => 1, :name => 'fake_line', :type => 'line') %>
|
31
35
|
</li>
|
32
36
|
<% end %>
|
33
37
|
<% @reports.each do |r| %>
|
34
|
-
<% link = kanaui_engine.dashboard_index_path(:
|
35
|
-
<li class="nav-element <%= params[
|
38
|
+
<% link = kanaui_engine.dashboard_index_path(params.merge(:name => r['reportName'])) %>
|
39
|
+
<li class="nav-element <%= params[:name] == r['reportName'] ? 'current' : '' %>">
|
36
40
|
<%= link_to r['reportPrettyName'], link, :class => "truncate-text", title: r['reportName'].titleize %>
|
37
41
|
</li>
|
38
42
|
<% end %>
|
@@ -44,22 +48,93 @@
|
|
44
48
|
<!-- DASHBOARD -->
|
45
49
|
<div class="col-md-9 col-sm-12 col-lg-8">
|
46
50
|
<div class="row">
|
47
|
-
<% if params[
|
51
|
+
<% if params[:name] %>
|
48
52
|
<h2 class="chart-title">
|
49
|
-
<%=
|
53
|
+
<%= @raw_name.titleize %>
|
50
54
|
</h2>
|
51
55
|
<div id="loading-spinner"></div>
|
52
|
-
<div id="chartAnchor" data-reports-path="<%= kanaui_engine.reports_path(params
|
53
|
-
<div id="date-controls">
|
56
|
+
<div id="chartAnchor" data-reports-path="<%= kanaui_engine.reports_path(params) %>"></div>
|
57
|
+
<div id="date-controls" style="display: none;">
|
54
58
|
<ul class="nav nav-pills nav-justified">
|
55
59
|
<% @available_start_dates.each do |key, value| %>
|
56
|
-
<li><%= link_to key, kanaui_engine.dashboard_index_path(params.merge
|
60
|
+
<li><%= link_to key, kanaui_engine.dashboard_index_path(params.merge(:start_date => value)) %></li>
|
57
61
|
<% end %>
|
58
62
|
</ul>
|
59
63
|
</div>
|
60
64
|
<hr>
|
61
65
|
<div class="pull-right">
|
62
|
-
<%= link_to 'Download raw data', kanaui_engine.reports_path(params.merge
|
66
|
+
<%= link_to 'Download raw data', kanaui_engine.reports_path(params.merge(:format => 'csv')), class: 'btn btn-default' %>
|
67
|
+
</div>
|
68
|
+
<a class="btn btn-default" role="button" data-toggle="collapse" href="#advanced-controls" aria-expanded="false" aria-controls="advanced-controls">
|
69
|
+
Advanced controls
|
70
|
+
</a>
|
71
|
+
<div class="collapse" id="advanced-controls">
|
72
|
+
<div class="well">
|
73
|
+
<ul>
|
74
|
+
<% if @report['reportType'] == 'TIMELINE' %>
|
75
|
+
<% at_least_two_months = params[:start_date].blank? || params[:end_date].blank? || (params[:end_date].to_date.beginning_of_month - 1.month > params[:start_date].to_date) %>
|
76
|
+
<% at_least_two_weeks = params[:start_date].blank? || params[:end_date].blank? || (params[:end_date].to_date.beginning_of_week - 1.week > params[:start_date].to_date) %>
|
77
|
+
<% if params[:smooth] != 'AVERAGE_WEEKLY' && at_least_two_weeks %>
|
78
|
+
<li><%= link_to 'Weekly average', kanaui_engine.dashboard_index_path(params.merge(:smooth => 'AVERAGE_WEEKLY')) %></li>
|
79
|
+
<% end %>
|
80
|
+
<% if params[:smooth] != 'AVERAGE_MONTHLY' && at_least_two_months %>
|
81
|
+
<li><%= link_to 'Monthly average', kanaui_engine.dashboard_index_path(params.merge(:smooth => 'AVERAGE_MONTHLY')) %></li>
|
82
|
+
<% end %>
|
83
|
+
<% if params[:smooth] != 'SUM_WEEKLY' && at_least_two_weeks %>
|
84
|
+
<li><%= link_to 'Weekly sum', kanaui_engine.dashboard_index_path(params.merge(:smooth => 'SUM_WEEKLY')) %></li>
|
85
|
+
<% end %>
|
86
|
+
<% if params[:smooth] != 'SUM_MONTHLY' && at_least_two_months %>
|
87
|
+
<li><%= link_to 'Monthly sum', kanaui_engine.dashboard_index_path(params.merge(:smooth => 'SUM_MONTHLY')) %></li>
|
88
|
+
<% end %>
|
89
|
+
<% end %>
|
90
|
+
<% filter_fields = ((@report['schema'] || {})['fields'] || []).select { |field| !field['distinctValues'].blank? && field['dataType'] =~ /char/ } # To ignore tenant_record_id %>
|
91
|
+
<% unless filter_fields.empty? %>
|
92
|
+
<li>Slicing & Dicing:
|
93
|
+
<%= form_tag kanaui_engine.dashboard_index_path(params), :method => :get, :class => 'form-horizontal' do %>
|
94
|
+
<input name="start_date" type="hidden" value="<%= @start_date %>">
|
95
|
+
<input name="end_date" type="hidden" value="<%= @end_date %>">
|
96
|
+
<input name="name" type="hidden" value="<%= @raw_name %>">
|
97
|
+
<input name="smooth" type="hidden" value="<%= params[:smooth] %>">
|
98
|
+
<input name="sql_only" type="hidden" value="<%= params[:sql_only] %>">
|
99
|
+
<input name="format" type="hidden" value="<%= params[:format] %>">
|
100
|
+
|
101
|
+
<fieldset class="form-group">
|
102
|
+
<legend>Filters</legend>
|
103
|
+
<% filter_fields.each do |field| %>
|
104
|
+
<div class="form-group">
|
105
|
+
<%= label_tag "filter_#{field['name']}", field['name'], :class => 'col-sm-2 control-label' %>
|
106
|
+
<div class="col-sm-10">
|
107
|
+
<%= select_tag "filter_#{field['name']}", options_for_select(field['distinctValues']), :multiple => true, :class => 'form-control' %>
|
108
|
+
</div>
|
109
|
+
</div>
|
110
|
+
<% end %>
|
111
|
+
</fieldset>
|
112
|
+
<fieldset class="form-group">
|
113
|
+
<legend>Dimensions to plot</legend>
|
114
|
+
<% filter_fields.each do |field| %>
|
115
|
+
<div class="form-group">
|
116
|
+
<%= label_tag "group_#{field['name']}", field['name'], :class => 'col-sm-2 control-label' %>
|
117
|
+
<div class="col-sm-10">
|
118
|
+
<%= select_tag "group_#{field['name']}", options_for_select(field['distinctValues']), :multiple => true, :class => 'form-control' %>
|
119
|
+
</div>
|
120
|
+
</div>
|
121
|
+
<% end %>
|
122
|
+
</fieldset>
|
123
|
+
|
124
|
+
<div class="form-group">
|
125
|
+
<div class="col-sm-offset-2 col-sm-10">
|
126
|
+
<%= submit_tag 'Refresh', :class => 'btn btn-default' %>
|
127
|
+
</div>
|
128
|
+
</div>
|
129
|
+
<% end %>
|
130
|
+
</li>
|
131
|
+
<li>Current Analytics query: <%= link_to '<i class="fa fa-question-circle"></i>'.html_safe, 'http://docs.killbill.io/latest/userguide_analytics.html#_dashboard_api', :target => '_blank' %>
|
132
|
+
<pre><%= params[:name] -%></pre>
|
133
|
+
</li>
|
134
|
+
<% end %>
|
135
|
+
<li><%= link_to 'SQL query', kanaui_engine.reports_path(params.merge(:sql_only => true)) %></li>
|
136
|
+
</ul>
|
137
|
+
</div>
|
63
138
|
</div>
|
64
139
|
<% end %>
|
65
140
|
</div>
|
@@ -0,0 +1,49 @@
|
|
1
|
+
<%= form_tag @report[:reportName].blank? ? url_for(:controller => :reports, :action => :create) : report_path(@report[:reportName]), :method => (@report[:reportName].blank? ? :post : :put), :class => 'form-horizontal' do %>
|
2
|
+
<div class="form-group">
|
3
|
+
<%= label_tag :report_name, 'Report name', :class => 'col-sm-2 control-label' %>
|
4
|
+
<div class="col-sm-10">
|
5
|
+
<%= text_field_tag :report_name, @report[:reportName], :class => 'form-control', :disabled => !@report[:reportName].blank?, :read_only => !@report[:reportName].blank? %>
|
6
|
+
</div>
|
7
|
+
</div>
|
8
|
+
<div class="form-group">
|
9
|
+
<%= label_tag :report_pretty_name, 'Pretty name', :class => 'col-sm-2 control-label' %>
|
10
|
+
<div class="col-sm-10">
|
11
|
+
<%= text_field_tag :report_pretty_name, @report[:reportPrettyName], :class => 'form-control' %>
|
12
|
+
</div>
|
13
|
+
</div>
|
14
|
+
<div class="form-group">
|
15
|
+
<%= label_tag :report_type, 'Type', :class => 'col-sm-2 control-label' %>
|
16
|
+
<div class="col-sm-10">
|
17
|
+
<%= select_tag :report_type, options_for_select(%w(TIMELINE COUNTERS TABLE), @report[:reportType] || 'TABLE'), :class => 'form-control' %>
|
18
|
+
</div>
|
19
|
+
</div>
|
20
|
+
<div class="form-group">
|
21
|
+
<%= label_tag :source_table_name, 'Source', :class => 'col-sm-2 control-label' %>
|
22
|
+
<div class="col-sm-10">
|
23
|
+
<%= text_field_tag :source_table_name, @report[:sourceTableName], :class => 'form-control' %>
|
24
|
+
</div>
|
25
|
+
</div>
|
26
|
+
<div class="form-group">
|
27
|
+
<%= label_tag :refresh_procedure_name, 'Refresh procedure', :class => 'col-sm-2 control-label' %>
|
28
|
+
<div class="col-sm-10">
|
29
|
+
<%= text_field_tag :refresh_procedure_name, @report[:refreshProcedureName], :class => 'form-control' %>
|
30
|
+
</div>
|
31
|
+
</div>
|
32
|
+
<div class="form-group">
|
33
|
+
<%= label_tag :refresh_frequency, 'Refresh frequency', :class => 'col-sm-2 control-label' %>
|
34
|
+
<div class="col-sm-10">
|
35
|
+
<%= select_tag :refresh_frequency, options_for_select(%w(HOURLY DAILY), @report[:refreshFrequency] || 'HOURLY'), :class => 'form-control' %>
|
36
|
+
</div>
|
37
|
+
</div>
|
38
|
+
<div class="form-group">
|
39
|
+
<%= label_tag :refresh_hour_of_day_gmt, 'Refresh hour (GMT)', :class => 'col-sm-2 control-label' %>
|
40
|
+
<div class="col-sm-10">
|
41
|
+
<%= number_field_tag :refresh_hour_of_day_gmt, @report[:refreshHourOfDayGmt], {:min => 1, :max => 23, :class => 'form-control'} %>
|
42
|
+
</div>
|
43
|
+
</div>
|
44
|
+
<div class="form-group">
|
45
|
+
<div class="col-sm-offset-2 col-sm-10">
|
46
|
+
<%= submit_tag 'Save', :class => 'btn btn-default' %>
|
47
|
+
</div>
|
48
|
+
</div>
|
49
|
+
<% end %>
|
@@ -0,0 +1,60 @@
|
|
1
|
+
<table id="reports-table" class="table table-condensed table-striped mobile-data">
|
2
|
+
<thead>
|
3
|
+
<tr>
|
4
|
+
<th>Name</th>
|
5
|
+
<th>Pretty name</th>
|
6
|
+
<th>Type</th>
|
7
|
+
<th>Source</th>
|
8
|
+
<th>Refresh procedure</th>
|
9
|
+
<th>Refresh frequency</th>
|
10
|
+
<th>Refresh hour (GMT)</th>
|
11
|
+
<th>Fields</th>
|
12
|
+
<th></th>
|
13
|
+
</tr>
|
14
|
+
</thead>
|
15
|
+
<tbody>
|
16
|
+
<% reports.each do |report| %>
|
17
|
+
<tr>
|
18
|
+
<td><%= report[:reportName] %></td>
|
19
|
+
<td><%= report[:reportPrettyName] %></td>
|
20
|
+
<td><%= report[:reportType] %></td>
|
21
|
+
<td><%= report[:sourceTableName] %></td>
|
22
|
+
<td><%= report[:refreshProcedureName] %></td>
|
23
|
+
<td><%= report[:refreshFrequency] %></td>
|
24
|
+
<td><%= report[:refreshHourOfDayGmt] %></td>
|
25
|
+
<td>
|
26
|
+
<ul>
|
27
|
+
<% report[:schema][:fields].each do |field| %>
|
28
|
+
<li><%= field[:name] %> (<%= field[:dataType] %>)</li>
|
29
|
+
<% end %>
|
30
|
+
</ul>
|
31
|
+
</td>
|
32
|
+
<td>
|
33
|
+
<%= link_to '<i class="fa fa-refresh"></i>'.html_safe, refresh_report_path(report[:reportName]), :method => :put %>
|
34
|
+
<%= link_to '<i class="fa fa-pencil"></i>'.html_safe, edit_report_path(report[:reportName]) %>
|
35
|
+
<%= link_to ' <i class="fa fa-times"></i>'.html_safe, report_path(report[:reportName]), :method => :delete %>
|
36
|
+
</td>
|
37
|
+
</tr>
|
38
|
+
<% end %>
|
39
|
+
</tbody>
|
40
|
+
</table>
|
41
|
+
|
42
|
+
<%= javascript_tag do %>
|
43
|
+
$(document).ready(function() {
|
44
|
+
$('#reports-table').dataTable({
|
45
|
+
"dom": "t",
|
46
|
+
"paging": false,
|
47
|
+
"columns": [
|
48
|
+
null,
|
49
|
+
null,
|
50
|
+
null,
|
51
|
+
null,
|
52
|
+
null,
|
53
|
+
null,
|
54
|
+
null,
|
55
|
+
{ "orderable": false },
|
56
|
+
{ "orderable": false }
|
57
|
+
]
|
58
|
+
});
|
59
|
+
});
|
60
|
+
<% end %>
|
@@ -0,0 +1,17 @@
|
|
1
|
+
<div class="search">
|
2
|
+
|
3
|
+
<div class="column-block">
|
4
|
+
|
5
|
+
<h1>Configured reports
|
6
|
+
<%= link_to ' <i class="fa fa-plus-square"></i>'.html_safe, new_report_path %>
|
7
|
+
</h1>
|
8
|
+
|
9
|
+
<%= render :partial => 'kanaui/reports/reports_table', :locals => {:reports => @reports} %>
|
10
|
+
|
11
|
+
</div>
|
12
|
+
|
13
|
+
<hr/>
|
14
|
+
|
15
|
+
<h1><%= link_to 'Dashboard', dashboard_index_path %></h1>
|
16
|
+
|
17
|
+
</div>
|
data/config/routes.rb
CHANGED
@@ -1,10 +1,14 @@
|
|
1
1
|
Kanaui::Engine.routes.draw do
|
2
2
|
|
3
3
|
root to: 'dashboard#index'
|
4
|
-
resources :dashboard, :only => [
|
4
|
+
resources :dashboard, :only => [:index]
|
5
5
|
scope "/dashboard" do
|
6
6
|
match "/available_reports" => "dashboard#available_reports", :via => :get, :as => "available_reports"
|
7
7
|
match "/reports" => "dashboard#reports", :via => :get, :as => "reports"
|
8
8
|
end
|
9
9
|
|
10
|
+
resources :reports, :only => [:index, :new, :create, :edit, :update, :destroy]
|
11
|
+
scope "/reports" do
|
12
|
+
match "/refresh/:id" => "reports#refresh", :via => :put, :as => "refresh_report"
|
13
|
+
end
|
10
14
|
end
|
data/lib/kanaui/version.rb
CHANGED
metadata
CHANGED
@@ -1,323 +1,323 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: kanaui
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.5.
|
4
|
+
version: 0.5.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kill Bill core team
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2017-02-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name: rails
|
15
|
-
version_requirements: !ruby/object:Gem::Requirement
|
16
|
-
requirements:
|
17
|
-
- - ~>
|
18
|
-
- !ruby/object:Gem::Version
|
19
|
-
version: 4.2.1
|
20
14
|
requirement: !ruby/object:Gem::Requirement
|
21
15
|
requirements:
|
22
|
-
- - ~>
|
16
|
+
- - "~>"
|
23
17
|
- !ruby/object:Gem::Version
|
24
18
|
version: 4.2.1
|
19
|
+
name: rails
|
25
20
|
prerelease: false
|
26
21
|
type: :runtime
|
27
|
-
- !ruby/object:Gem::Dependency
|
28
|
-
name: js-routes
|
29
22
|
version_requirements: !ruby/object:Gem::Requirement
|
30
23
|
requirements:
|
31
|
-
- - ~>
|
24
|
+
- - "~>"
|
32
25
|
- !ruby/object:Gem::Version
|
33
|
-
version:
|
26
|
+
version: 4.2.1
|
27
|
+
- !ruby/object:Gem::Dependency
|
34
28
|
requirement: !ruby/object:Gem::Requirement
|
35
29
|
requirements:
|
36
|
-
- - ~>
|
30
|
+
- - "~>"
|
37
31
|
- !ruby/object:Gem::Version
|
38
32
|
version: '1.1'
|
33
|
+
name: js-routes
|
39
34
|
prerelease: false
|
40
35
|
type: :runtime
|
41
|
-
- !ruby/object:Gem::Dependency
|
42
|
-
name: jquery-rails
|
43
36
|
version_requirements: !ruby/object:Gem::Requirement
|
44
37
|
requirements:
|
45
|
-
- - ~>
|
38
|
+
- - "~>"
|
46
39
|
- !ruby/object:Gem::Version
|
47
|
-
version:
|
40
|
+
version: '1.1'
|
41
|
+
- !ruby/object:Gem::Dependency
|
48
42
|
requirement: !ruby/object:Gem::Requirement
|
49
43
|
requirements:
|
50
|
-
- - ~>
|
44
|
+
- - "~>"
|
51
45
|
- !ruby/object:Gem::Version
|
52
46
|
version: 3.0.4
|
47
|
+
name: jquery-rails
|
53
48
|
prerelease: false
|
54
49
|
type: :runtime
|
55
|
-
- !ruby/object:Gem::Dependency
|
56
|
-
name: jquery-datatables-rails
|
57
50
|
version_requirements: !ruby/object:Gem::Requirement
|
58
51
|
requirements:
|
59
|
-
- - ~>
|
52
|
+
- - "~>"
|
60
53
|
- !ruby/object:Gem::Version
|
61
|
-
version: 3.
|
54
|
+
version: 3.0.4
|
55
|
+
- !ruby/object:Gem::Dependency
|
62
56
|
requirement: !ruby/object:Gem::Requirement
|
63
57
|
requirements:
|
64
|
-
- - ~>
|
58
|
+
- - "~>"
|
65
59
|
- !ruby/object:Gem::Version
|
66
60
|
version: 3.3.0
|
61
|
+
name: jquery-datatables-rails
|
67
62
|
prerelease: false
|
68
63
|
type: :runtime
|
69
|
-
- !ruby/object:Gem::Dependency
|
70
|
-
name: money-rails
|
71
64
|
version_requirements: !ruby/object:Gem::Requirement
|
72
65
|
requirements:
|
73
|
-
- - ~>
|
66
|
+
- - "~>"
|
74
67
|
- !ruby/object:Gem::Version
|
75
|
-
version:
|
68
|
+
version: 3.3.0
|
69
|
+
- !ruby/object:Gem::Dependency
|
76
70
|
requirement: !ruby/object:Gem::Requirement
|
77
71
|
requirements:
|
78
|
-
- - ~>
|
72
|
+
- - "~>"
|
79
73
|
- !ruby/object:Gem::Version
|
80
74
|
version: 1.3.0
|
75
|
+
name: money-rails
|
81
76
|
prerelease: false
|
82
77
|
type: :runtime
|
83
|
-
- !ruby/object:Gem::Dependency
|
84
|
-
name: d3_rails
|
85
78
|
version_requirements: !ruby/object:Gem::Requirement
|
86
79
|
requirements:
|
87
|
-
- - ~>
|
80
|
+
- - "~>"
|
88
81
|
- !ruby/object:Gem::Version
|
89
|
-
version: 3.
|
82
|
+
version: 1.3.0
|
83
|
+
- !ruby/object:Gem::Dependency
|
90
84
|
requirement: !ruby/object:Gem::Requirement
|
91
85
|
requirements:
|
92
|
-
- - ~>
|
86
|
+
- - "~>"
|
93
87
|
- !ruby/object:Gem::Version
|
94
88
|
version: 3.2.8
|
89
|
+
name: d3_rails
|
95
90
|
prerelease: false
|
96
91
|
type: :runtime
|
97
|
-
- !ruby/object:Gem::Dependency
|
98
|
-
name: twitter-bootstrap-rails
|
99
92
|
version_requirements: !ruby/object:Gem::Requirement
|
100
93
|
requirements:
|
101
|
-
- - ~>
|
94
|
+
- - "~>"
|
102
95
|
- !ruby/object:Gem::Version
|
103
|
-
version: 3.2.
|
96
|
+
version: 3.2.8
|
97
|
+
- !ruby/object:Gem::Dependency
|
104
98
|
requirement: !ruby/object:Gem::Requirement
|
105
99
|
requirements:
|
106
|
-
- - ~>
|
100
|
+
- - "~>"
|
107
101
|
- !ruby/object:Gem::Version
|
108
102
|
version: 3.2.0
|
103
|
+
name: twitter-bootstrap-rails
|
109
104
|
prerelease: false
|
110
105
|
type: :runtime
|
111
|
-
- !ruby/object:Gem::Dependency
|
112
|
-
name: spinjs-rails
|
113
106
|
version_requirements: !ruby/object:Gem::Requirement
|
114
107
|
requirements:
|
115
|
-
- - ~>
|
108
|
+
- - "~>"
|
116
109
|
- !ruby/object:Gem::Version
|
117
|
-
version:
|
110
|
+
version: 3.2.0
|
111
|
+
- !ruby/object:Gem::Dependency
|
118
112
|
requirement: !ruby/object:Gem::Requirement
|
119
113
|
requirements:
|
120
|
-
- - ~>
|
114
|
+
- - "~>"
|
121
115
|
- !ruby/object:Gem::Version
|
122
116
|
version: '1.4'
|
117
|
+
name: spinjs-rails
|
123
118
|
prerelease: false
|
124
119
|
type: :runtime
|
125
|
-
- !ruby/object:Gem::Dependency
|
126
|
-
name: bootstrap-datepicker-rails
|
127
120
|
version_requirements: !ruby/object:Gem::Requirement
|
128
121
|
requirements:
|
129
|
-
- - ~>
|
122
|
+
- - "~>"
|
130
123
|
- !ruby/object:Gem::Version
|
131
|
-
version: 1.4
|
124
|
+
version: '1.4'
|
125
|
+
- !ruby/object:Gem::Dependency
|
132
126
|
requirement: !ruby/object:Gem::Requirement
|
133
127
|
requirements:
|
134
|
-
- - ~>
|
128
|
+
- - "~>"
|
135
129
|
- !ruby/object:Gem::Version
|
136
130
|
version: 1.4.0
|
131
|
+
name: bootstrap-datepicker-rails
|
137
132
|
prerelease: false
|
138
133
|
type: :runtime
|
139
|
-
- !ruby/object:Gem::Dependency
|
140
|
-
name: momentjs-rails
|
141
134
|
version_requirements: !ruby/object:Gem::Requirement
|
142
135
|
requirements:
|
143
|
-
- - ~>
|
136
|
+
- - "~>"
|
144
137
|
- !ruby/object:Gem::Version
|
145
|
-
version:
|
138
|
+
version: 1.4.0
|
139
|
+
- !ruby/object:Gem::Dependency
|
146
140
|
requirement: !ruby/object:Gem::Requirement
|
147
141
|
requirements:
|
148
|
-
- - ~>
|
142
|
+
- - "~>"
|
149
143
|
- !ruby/object:Gem::Version
|
150
144
|
version: 2.10.6
|
145
|
+
name: momentjs-rails
|
151
146
|
prerelease: false
|
152
147
|
type: :runtime
|
153
|
-
- !ruby/object:Gem::Dependency
|
154
|
-
name: killbill-client
|
155
148
|
version_requirements: !ruby/object:Gem::Requirement
|
156
149
|
requirements:
|
157
|
-
- - ~>
|
150
|
+
- - "~>"
|
158
151
|
- !ruby/object:Gem::Version
|
159
|
-
version:
|
152
|
+
version: 2.10.6
|
153
|
+
- !ruby/object:Gem::Dependency
|
160
154
|
requirement: !ruby/object:Gem::Requirement
|
161
155
|
requirements:
|
162
|
-
- - ~>
|
156
|
+
- - "~>"
|
163
157
|
- !ruby/object:Gem::Version
|
164
158
|
version: '1.0'
|
159
|
+
name: killbill-client
|
165
160
|
prerelease: false
|
166
161
|
type: :runtime
|
167
|
-
- !ruby/object:Gem::Dependency
|
168
|
-
name: devise
|
169
162
|
version_requirements: !ruby/object:Gem::Requirement
|
170
163
|
requirements:
|
171
|
-
- - ~>
|
164
|
+
- - "~>"
|
172
165
|
- !ruby/object:Gem::Version
|
173
|
-
version:
|
166
|
+
version: '1.0'
|
167
|
+
- !ruby/object:Gem::Dependency
|
174
168
|
requirement: !ruby/object:Gem::Requirement
|
175
169
|
requirements:
|
176
|
-
- - ~>
|
170
|
+
- - "~>"
|
177
171
|
- !ruby/object:Gem::Version
|
178
172
|
version: 3.4.1
|
173
|
+
name: devise
|
179
174
|
prerelease: false
|
180
175
|
type: :runtime
|
181
|
-
- !ruby/object:Gem::Dependency
|
182
|
-
name: cancan
|
183
176
|
version_requirements: !ruby/object:Gem::Requirement
|
184
177
|
requirements:
|
185
|
-
- - ~>
|
178
|
+
- - "~>"
|
186
179
|
- !ruby/object:Gem::Version
|
187
|
-
version:
|
180
|
+
version: 3.4.1
|
181
|
+
- !ruby/object:Gem::Dependency
|
188
182
|
requirement: !ruby/object:Gem::Requirement
|
189
183
|
requirements:
|
190
|
-
- - ~>
|
184
|
+
- - "~>"
|
191
185
|
- !ruby/object:Gem::Version
|
192
186
|
version: 1.6.10
|
187
|
+
name: cancan
|
193
188
|
prerelease: false
|
194
189
|
type: :runtime
|
195
|
-
- !ruby/object:Gem::Dependency
|
196
|
-
name: carmen-rails
|
197
190
|
version_requirements: !ruby/object:Gem::Requirement
|
198
191
|
requirements:
|
199
|
-
- - ~>
|
192
|
+
- - "~>"
|
200
193
|
- !ruby/object:Gem::Version
|
201
|
-
version: 1.
|
194
|
+
version: 1.6.10
|
195
|
+
- !ruby/object:Gem::Dependency
|
202
196
|
requirement: !ruby/object:Gem::Requirement
|
203
197
|
requirements:
|
204
|
-
- - ~>
|
198
|
+
- - "~>"
|
205
199
|
- !ruby/object:Gem::Version
|
206
200
|
version: 1.0.0
|
201
|
+
name: carmen-rails
|
207
202
|
prerelease: false
|
208
203
|
type: :runtime
|
209
|
-
- !ruby/object:Gem::Dependency
|
210
|
-
name: symmetric-encryption
|
211
204
|
version_requirements: !ruby/object:Gem::Requirement
|
212
205
|
requirements:
|
213
|
-
- - ~>
|
206
|
+
- - "~>"
|
214
207
|
- !ruby/object:Gem::Version
|
215
|
-
version:
|
208
|
+
version: 1.0.0
|
209
|
+
- !ruby/object:Gem::Dependency
|
216
210
|
requirement: !ruby/object:Gem::Requirement
|
217
211
|
requirements:
|
218
|
-
- - ~>
|
212
|
+
- - "~>"
|
219
213
|
- !ruby/object:Gem::Version
|
220
214
|
version: 3.6.0
|
215
|
+
name: symmetric-encryption
|
221
216
|
prerelease: false
|
222
217
|
type: :runtime
|
223
|
-
- !ruby/object:Gem::Dependency
|
224
|
-
name: fakeweb
|
225
218
|
version_requirements: !ruby/object:Gem::Requirement
|
226
219
|
requirements:
|
227
|
-
- - ~>
|
220
|
+
- - "~>"
|
228
221
|
- !ruby/object:Gem::Version
|
229
|
-
version:
|
222
|
+
version: 3.6.0
|
223
|
+
- !ruby/object:Gem::Dependency
|
230
224
|
requirement: !ruby/object:Gem::Requirement
|
231
225
|
requirements:
|
232
|
-
- - ~>
|
226
|
+
- - "~>"
|
233
227
|
- !ruby/object:Gem::Version
|
234
228
|
version: '1.3'
|
229
|
+
name: fakeweb
|
235
230
|
prerelease: false
|
236
231
|
type: :development
|
237
|
-
- !ruby/object:Gem::Dependency
|
238
|
-
name: rake
|
239
232
|
version_requirements: !ruby/object:Gem::Requirement
|
240
233
|
requirements:
|
241
|
-
- -
|
234
|
+
- - "~>"
|
242
235
|
- !ruby/object:Gem::Version
|
243
|
-
version:
|
236
|
+
version: '1.3'
|
237
|
+
- !ruby/object:Gem::Dependency
|
244
238
|
requirement: !ruby/object:Gem::Requirement
|
245
239
|
requirements:
|
246
|
-
- -
|
240
|
+
- - ">="
|
247
241
|
- !ruby/object:Gem::Version
|
248
242
|
version: 0.8.7
|
243
|
+
name: rake
|
249
244
|
prerelease: false
|
250
245
|
type: :development
|
251
|
-
- !ruby/object:Gem::Dependency
|
252
|
-
name: simplecov
|
253
246
|
version_requirements: !ruby/object:Gem::Requirement
|
254
247
|
requirements:
|
255
|
-
- -
|
248
|
+
- - ">="
|
256
249
|
- !ruby/object:Gem::Version
|
257
|
-
version:
|
250
|
+
version: 0.8.7
|
251
|
+
- !ruby/object:Gem::Dependency
|
258
252
|
requirement: !ruby/object:Gem::Requirement
|
259
253
|
requirements:
|
260
|
-
- -
|
254
|
+
- - ">="
|
261
255
|
- !ruby/object:Gem::Version
|
262
256
|
version: '0'
|
257
|
+
name: simplecov
|
263
258
|
prerelease: false
|
264
259
|
type: :development
|
265
|
-
- !ruby/object:Gem::Dependency
|
266
|
-
name: activerecord-jdbc-adapter
|
267
260
|
version_requirements: !ruby/object:Gem::Requirement
|
268
261
|
requirements:
|
269
|
-
- -
|
262
|
+
- - ">="
|
270
263
|
- !ruby/object:Gem::Version
|
271
|
-
version:
|
264
|
+
version: '0'
|
265
|
+
- !ruby/object:Gem::Dependency
|
272
266
|
requirement: !ruby/object:Gem::Requirement
|
273
267
|
requirements:
|
274
|
-
- - ~>
|
268
|
+
- - "~>"
|
275
269
|
- !ruby/object:Gem::Version
|
276
270
|
version: 1.3.9
|
271
|
+
name: activerecord-jdbc-adapter
|
277
272
|
prerelease: false
|
278
273
|
type: :development
|
279
|
-
- !ruby/object:Gem::Dependency
|
280
|
-
name: activerecord-jdbcmysql-adapter
|
281
274
|
version_requirements: !ruby/object:Gem::Requirement
|
282
275
|
requirements:
|
283
|
-
- - ~>
|
276
|
+
- - "~>"
|
284
277
|
- !ruby/object:Gem::Version
|
285
278
|
version: 1.3.9
|
279
|
+
- !ruby/object:Gem::Dependency
|
286
280
|
requirement: !ruby/object:Gem::Requirement
|
287
281
|
requirements:
|
288
|
-
- - ~>
|
282
|
+
- - "~>"
|
289
283
|
- !ruby/object:Gem::Version
|
290
284
|
version: 1.3.9
|
285
|
+
name: activerecord-jdbcmysql-adapter
|
291
286
|
prerelease: false
|
292
287
|
type: :development
|
293
|
-
- !ruby/object:Gem::Dependency
|
294
|
-
name: activerecord-jdbcsqlite3-adapter
|
295
288
|
version_requirements: !ruby/object:Gem::Requirement
|
296
289
|
requirements:
|
297
|
-
- - ~>
|
290
|
+
- - "~>"
|
298
291
|
- !ruby/object:Gem::Version
|
299
292
|
version: 1.3.9
|
293
|
+
- !ruby/object:Gem::Dependency
|
300
294
|
requirement: !ruby/object:Gem::Requirement
|
301
295
|
requirements:
|
302
|
-
- - ~>
|
296
|
+
- - "~>"
|
303
297
|
- !ruby/object:Gem::Version
|
304
298
|
version: 1.3.9
|
299
|
+
name: activerecord-jdbcsqlite3-adapter
|
305
300
|
prerelease: false
|
306
301
|
type: :development
|
307
|
-
- !ruby/object:Gem::Dependency
|
308
|
-
name: jdbc-mysql
|
309
302
|
version_requirements: !ruby/object:Gem::Requirement
|
310
303
|
requirements:
|
311
|
-
- - ~>
|
304
|
+
- - "~>"
|
312
305
|
- !ruby/object:Gem::Version
|
313
|
-
version:
|
306
|
+
version: 1.3.9
|
307
|
+
- !ruby/object:Gem::Dependency
|
314
308
|
requirement: !ruby/object:Gem::Requirement
|
315
309
|
requirements:
|
316
|
-
- - ~>
|
310
|
+
- - "~>"
|
317
311
|
- !ruby/object:Gem::Version
|
318
312
|
version: 5.1.25
|
313
|
+
name: jdbc-mysql
|
319
314
|
prerelease: false
|
320
315
|
type: :development
|
316
|
+
version_requirements: !ruby/object:Gem::Requirement
|
317
|
+
requirements:
|
318
|
+
- - "~>"
|
319
|
+
- !ruby/object:Gem::Version
|
320
|
+
version: 5.1.25
|
321
321
|
description: Rails UI plugin for the Analytics plugin.
|
322
322
|
email: killbilling-users@googlegroups.com
|
323
323
|
executables: []
|
@@ -350,24 +350,24 @@ files:
|
|
350
350
|
- app/assets/javascripts/kanaui/kiddo/kiddo_initialize.js
|
351
351
|
- app/assets/javascripts/kanaui/kiddo/renderer.js
|
352
352
|
- app/assets/javascripts/kanaui/kiddo/settings.js
|
353
|
-
- app/assets/javascripts/kanaui/killbill.js
|
354
|
-
- app/assets/javascripts/kanaui/purl.js
|
355
353
|
- app/assets/javascripts/kanaui/reports.dataTables.js
|
356
|
-
- app/assets/javascripts/kanaui/reports.graphs.js
|
357
|
-
- app/assets/javascripts/kanaui/reports.js
|
358
|
-
- app/assets/javascripts/kanaui/reports.urls.js
|
359
|
-
- app/assets/javascripts/kanaui/tests.js
|
360
354
|
- app/assets/stylesheets/application.css
|
361
355
|
- app/assets/stylesheets/bootstrap_and_overrides.css
|
362
356
|
- app/assets/stylesheets/kanaui/kanaui.css
|
363
357
|
- app/assets/stylesheets/kanaui/reports.css
|
364
358
|
- app/controllers/kanaui/dashboard_controller.rb
|
365
359
|
- app/controllers/kanaui/engine_controller.rb
|
360
|
+
- app/controllers/kanaui/reports_controller.rb
|
366
361
|
- app/helpers/kanaui/application_helper.rb
|
367
362
|
- app/helpers/kanaui/dashboard_helper.rb
|
368
363
|
- app/models/kanaui/dashboard.rb
|
369
364
|
- app/views/kanaui/dashboard/index.html.erb
|
370
365
|
- app/views/kanaui/layouts/kanaui_application.html.erb
|
366
|
+
- app/views/kanaui/reports/_form.html.erb
|
367
|
+
- app/views/kanaui/reports/_reports_table.html.erb
|
368
|
+
- app/views/kanaui/reports/edit.html.erb
|
369
|
+
- app/views/kanaui/reports/index.html.erb
|
370
|
+
- app/views/kanaui/reports/new.html.erb
|
371
371
|
- config/locales/en.bootstrap.yml
|
372
372
|
- config/routes.rb
|
373
373
|
- lib/kanaui.rb
|
@@ -418,17 +418,17 @@ require_paths:
|
|
418
418
|
- lib
|
419
419
|
required_ruby_version: !ruby/object:Gem::Requirement
|
420
420
|
requirements:
|
421
|
-
- -
|
421
|
+
- - ">="
|
422
422
|
- !ruby/object:Gem::Version
|
423
423
|
version: '0'
|
424
424
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
425
425
|
requirements:
|
426
|
-
- -
|
426
|
+
- - ">="
|
427
427
|
- !ruby/object:Gem::Version
|
428
428
|
version: '0'
|
429
429
|
requirements: []
|
430
430
|
rubyforge_project:
|
431
|
-
rubygems_version: 2.4.
|
431
|
+
rubygems_version: 2.4.8
|
432
432
|
signing_key:
|
433
433
|
specification_version: 4
|
434
434
|
summary: Kill Bill Analytics UI mountable engine
|