spree_admin_insights 3.2.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 +7 -0
- data/.gitignore +54 -0
- data/Gemfile +6 -0
- data/LICENSE +26 -0
- data/README.md +96 -0
- data/Rakefile +21 -0
- data/app/assets/javascripts/spree/backend/jquery.tablesorter.min.js +4 -0
- data/app/assets/javascripts/spree/backend/spree_admin_insights.js +2 -0
- data/app/assets/javascripts/spree/backend/spree_admin_insights/paginator.js +128 -0
- data/app/assets/javascripts/spree/backend/spree_admin_insights/report_loader.js +228 -0
- data/app/assets/javascripts/spree/backend/spree_admin_insights/searcher.js +103 -0
- data/app/assets/javascripts/spree/backend/spree_admin_insights/table_sorter.js +47 -0
- data/app/assets/javascripts/spree/backend/tmpl.js +87 -0
- data/app/assets/javascripts/spree/frontend/spree_admin_insights.js +2 -0
- data/app/assets/stylesheets/spree/backend/override_pdf.css +71 -0
- data/app/assets/stylesheets/spree/backend/spree_admin_insights.css +40 -0
- data/app/assets/stylesheets/spree/frontend/spree_admin_insights.css +4 -0
- data/app/controllers/spree/admin/insights_controller.rb +112 -0
- data/app/helpers/spree/admin/base_helper_decorator.rb +17 -0
- data/app/models/spree/app_configuration_decorator.rb +3 -0
- data/app/models/spree/product_decorator.rb +3 -0
- data/app/models/spree/promotion_action_decorator.rb +3 -0
- data/app/models/spree/return_authorization_decorator.rb +4 -0
- data/app/models/spree/user_decorator.rb +3 -0
- data/app/overrides/add_insights_to_admin_side_menu.html.rb +5 -0
- data/app/reports/spree/best_selling_products_report.rb +42 -0
- data/app/reports/spree/cart_additions_report.rb +36 -0
- data/app/reports/spree/cart_removals_report.rb +36 -0
- data/app/reports/spree/cart_updations_report.rb +40 -0
- data/app/reports/spree/payment_method_transactions_conversion_rate_report.rb +74 -0
- data/app/reports/spree/payment_method_transactions_conversion_rate_report/payment_method_state_distribution_chart.rb +39 -0
- data/app/reports/spree/payment_method_transactions_report.rb +60 -0
- data/app/reports/spree/payment_method_transactions_report/payment_method_revenue_distribution_chart.rb +36 -0
- data/app/reports/spree/product_views_report.rb +46 -0
- data/app/reports/spree/product_views_to_cart_additions_report.rb +53 -0
- data/app/reports/spree/product_views_to_purchases_report.rb +54 -0
- data/app/reports/spree/promotional_cost_report.rb +84 -0
- data/app/reports/spree/promotional_cost_report/promotional_cost_chart.rb +37 -0
- data/app/reports/spree/promotional_cost_report/usage_count_chart.rb +41 -0
- data/app/reports/spree/report.rb +131 -0
- data/app/reports/spree/report/chart.rb +11 -0
- data/app/reports/spree/report/configuration.rb +40 -0
- data/app/reports/spree/report/date_slicer.rb +61 -0
- data/app/reports/spree/report/observation.rb +49 -0
- data/app/reports/spree/report/query_fragments.rb +45 -0
- data/app/reports/spree/report/query_time_scale.rb +19 -0
- data/app/reports/spree/report/result.rb +100 -0
- data/app/reports/spree/report/timed_observation.rb +47 -0
- data/app/reports/spree/report/timed_result.rb +48 -0
- data/app/reports/spree/returned_products_report.rb +37 -0
- data/app/reports/spree/sales_performance_report.rb +107 -0
- data/app/reports/spree/sales_performance_report/profit_loss_chart.rb +37 -0
- data/app/reports/spree/sales_performance_report/profit_loss_percent_chart.rb +36 -0
- data/app/reports/spree/sales_performance_report/sale_cost_price_chart.rb +48 -0
- data/app/reports/spree/sales_tax_report.rb +64 -0
- data/app/reports/spree/sales_tax_report/monthly_sales_tax_comparison_chart.rb +39 -0
- data/app/reports/spree/shipping_cost_report.rb +89 -0
- data/app/reports/spree/shipping_cost_report/shipping_cost_distribution_chart.rb +38 -0
- data/app/reports/spree/trending_search_report.rb +50 -0
- data/app/reports/spree/trending_search_report/frequency_distribution_pie_chart.rb +41 -0
- data/app/reports/spree/unique_purchases_report.rb +39 -0
- data/app/reports/spree/user_pool_report.rb +66 -0
- data/app/reports/spree/user_pool_report/distribution_column_chart.rb +65 -0
- data/app/reports/spree/users_not_converted_report.rb +48 -0
- data/app/reports/spree/users_who_recently_purchased_report.rb +69 -0
- data/app/services/spree/report_generation_service.rb +27 -0
- data/app/views/spree/admin/insights/_chart.html.erb +4 -0
- data/app/views/spree/admin/insights/download.pdf.erb +27 -0
- data/app/views/spree/admin/insights/index.html.erb +91 -0
- data/app/views/spree/admin/insights/search/_product_views_search.html.erb +13 -0
- data/app/views/spree/admin/insights/search/_search_form.html.erb +39 -0
- data/app/views/spree/admin/insights/search/_trending_searches_search.html.erb +13 -0
- data/app/views/spree/admin/insights/search/_users_not_converted_search.html.erb +13 -0
- data/app/views/spree/admin/insights/search/_users_who_have_not_purchased_recently_search.html.erb +13 -0
- data/app/views/spree/admin/insights/search/_users_who_recently_purchased_search.html.erb +13 -0
- data/app/views/spree/admin/shared/_insights_side_menu.html.erb +16 -0
- data/app/views/spree/admin/templates/insights/_paginator.template +9 -0
- data/app/views/spree/admin/templates/insights/_search.template +75 -0
- data/app/views/spree/admin/templates/insights/_show.template +48 -0
- data/app/views/spree/layouts/pdf.html.erb +9 -0
- data/bin/rails +7 -0
- data/config/initializers/assets.rb +1 -0
- data/config/initializers/mime_types.rb +2 -0
- data/config/initializers/wicked_pdf.rb +21 -0
- data/config/locales/en.yml +169 -0
- data/config/locales/pl.yml +164 -0
- data/config/routes.rb +6 -0
- data/lib/generators/spree_admin_insights/install/install_generator.rb +35 -0
- data/lib/generators/spree_admin_insights/install/spree_admin_insights.rb +22 -0
- data/lib/spree_admin_insights.rb +14 -0
- data/lib/spree_admin_insights/engine.rb +26 -0
- data/lib/spree_admin_insights/factories.rb +6 -0
- data/spec/spec_helper.rb +93 -0
- data/spree_admin_insights.gemspec +41 -0
- metadata +420 -0
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
module Spree
|
|
2
|
+
class UniquePurchasesReport < Spree::Report
|
|
3
|
+
DEFAULT_SORTABLE_ATTRIBUTE = :product_name
|
|
4
|
+
HEADERS = { sku: :string, product_name: :string, sold_count: :integer, users: :integer }
|
|
5
|
+
SEARCH_ATTRIBUTES = { start_date: :orders_completed_from, end_date: :orders_completed_till }
|
|
6
|
+
SORTABLE_ATTRIBUTES = [:product_name, :sku, :sold_count, :users]
|
|
7
|
+
|
|
8
|
+
deeplink product_name: { template: %Q{<a href="/admin/products/{%# o.product_slug %}" target="_blank">{%# o.product_name %}</a>} }
|
|
9
|
+
|
|
10
|
+
class Result < Spree::Report::Result
|
|
11
|
+
class Observation < Spree::Report::Observation
|
|
12
|
+
observation_fields [:product_name, :product_slug, :sku, :sold_count, :users]
|
|
13
|
+
|
|
14
|
+
def sku
|
|
15
|
+
@sku.presence || @product_name
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def report_query
|
|
21
|
+
user_count_sql = '(COUNT(DISTINCT(spree_orders.user_id)) + COUNT(spree_orders.id) - COUNT(spree_orders.user_id))'
|
|
22
|
+
purchases_by_variant =
|
|
23
|
+
Spree::LineItem
|
|
24
|
+
.joins(:order)
|
|
25
|
+
.joins(:variant)
|
|
26
|
+
.joins(:product)
|
|
27
|
+
.where(spree_orders: { state: 'complete', completed_at: reporting_period })
|
|
28
|
+
.group('variant_id', 'spree_variants.sku', 'spree_products.slug', 'spree_products.name')
|
|
29
|
+
.select(
|
|
30
|
+
'spree_variants.sku as sku',
|
|
31
|
+
'spree_products.slug as product_slug',
|
|
32
|
+
'spree_products.name as product_name',
|
|
33
|
+
'SUM(quantity) as sold_count',
|
|
34
|
+
"#{ user_count_sql } as users"
|
|
35
|
+
)
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
end
|
|
39
|
+
end
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
module Spree
|
|
2
|
+
class UserPoolReport < Spree::Report
|
|
3
|
+
HEADERS = { guest_users: :integer, active_users: :integer, new_sign_ups: :integer }
|
|
4
|
+
SEARCH_ATTRIBUTES = { start_date: :users_created_from, end_date: :users_created_till }
|
|
5
|
+
SORTABLE_ATTRIBUTES = []
|
|
6
|
+
|
|
7
|
+
class Result < Spree::Report::TimedResult
|
|
8
|
+
charts DistributionColumnChart
|
|
9
|
+
|
|
10
|
+
class Observation < Spree::Report::TimedObservation
|
|
11
|
+
observation_fields active_users: 0, guest_users: 0, new_sign_ups: 0
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def report_query
|
|
16
|
+
Report::QueryFragments
|
|
17
|
+
.from_union(grouped_sign_ups, grouped_visitors)
|
|
18
|
+
.group(*time_scale_columns)
|
|
19
|
+
.order(*time_scale_columns_to_s)
|
|
20
|
+
.project(
|
|
21
|
+
*time_scale_columns,
|
|
22
|
+
'SUM(active_users) as active_users',
|
|
23
|
+
'SUM(guest_users) as guest_users',
|
|
24
|
+
'SUM(new_sign_ups) as new_sign_ups'
|
|
25
|
+
)
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
private def grouped_sign_ups
|
|
29
|
+
sign_ups = Spree::User.where(created_at: reporting_period).select(:id, *time_scale_selects)
|
|
30
|
+
|
|
31
|
+
Report::QueryFragments.from_subquery(sign_ups)
|
|
32
|
+
.group(*time_scale_columns, 'guest_users', 'active_users')
|
|
33
|
+
.order(*time_scale_columns_to_s)
|
|
34
|
+
.project(
|
|
35
|
+
*time_scale_columns,
|
|
36
|
+
'0 as guest_users',
|
|
37
|
+
'0 as active_users',
|
|
38
|
+
'COUNT(id) as new_sign_ups'
|
|
39
|
+
)
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
private def grouped_visitors
|
|
43
|
+
guest_count_sql = '(COUNT(DISTINCT(session)) - COUNT(DISTINCT(user)))'
|
|
44
|
+
Report::QueryFragments.from_subquery(visitors)
|
|
45
|
+
.group(*time_scale_columns, 'new_sign_ups')
|
|
46
|
+
.order(*time_scale_columns_to_s)
|
|
47
|
+
.project(
|
|
48
|
+
*time_scale_columns,
|
|
49
|
+
"#{ guest_count_sql } as guest_users",
|
|
50
|
+
'COUNT(DISTINCT(user)) as active_users',
|
|
51
|
+
'0 as new_sign_ups'
|
|
52
|
+
)
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
private def visitors
|
|
56
|
+
Spree::PageEvent
|
|
57
|
+
.where(created_at: reporting_period)
|
|
58
|
+
.select(
|
|
59
|
+
*time_scale_selects,
|
|
60
|
+
'actor_id as user',
|
|
61
|
+
'session_id as session'
|
|
62
|
+
)
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
end
|
|
66
|
+
end
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
class Spree::UserPoolReport::DistributionColumnChart
|
|
2
|
+
def initialize(result)
|
|
3
|
+
@chart_data = {
|
|
4
|
+
active_users: [],
|
|
5
|
+
guest_users: [],
|
|
6
|
+
new_sign_ups: []
|
|
7
|
+
}
|
|
8
|
+
@time_dimension = result.time_dimension
|
|
9
|
+
@chart_data[@time_dimension] = []
|
|
10
|
+
@result = result
|
|
11
|
+
process_chart_data
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def process_chart_data
|
|
15
|
+
chart_keys = @chart_data.keys
|
|
16
|
+
@result.observations.each do |observation|
|
|
17
|
+
chart_keys.each do |key|
|
|
18
|
+
@chart_data[key] << observation.public_send(key)
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def to_h
|
|
24
|
+
{
|
|
25
|
+
id: 'user-pool',
|
|
26
|
+
json: {
|
|
27
|
+
chart: { type: 'column' },
|
|
28
|
+
title: {
|
|
29
|
+
useHTML: true,
|
|
30
|
+
text: %Q(
|
|
31
|
+
<span class="chart-title">User Pool</span>
|
|
32
|
+
<span class="fa fa-question-circle"
|
|
33
|
+
data-toggle="tooltip"
|
|
34
|
+
title=" Keep a track of different type of users such as guest users, registered users and newly signed up users">
|
|
35
|
+
</span>
|
|
36
|
+
)
|
|
37
|
+
},
|
|
38
|
+
xAxis: { categories: @chart_data[@time_dimension] },
|
|
39
|
+
yAxis: {
|
|
40
|
+
title: { text: 'Count' }
|
|
41
|
+
},
|
|
42
|
+
legend: {
|
|
43
|
+
layout: 'vertical',
|
|
44
|
+
align: 'right',
|
|
45
|
+
verticalAlign: 'middle',
|
|
46
|
+
borderWidth: 0
|
|
47
|
+
},
|
|
48
|
+
series: [
|
|
49
|
+
{
|
|
50
|
+
name: Spree.t('user_pool.new_sign_ups'),
|
|
51
|
+
data: @chart_data[:new_sign_ups].map(&:to_i)
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
name: Spree.t('user_pool.active_users'),
|
|
55
|
+
data: @chart_data[:active_users].map(&:to_i)
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
name: Spree.t('user_pool.guest_users'),
|
|
59
|
+
data: @chart_data[:guest_users].map(&:to_i)
|
|
60
|
+
}
|
|
61
|
+
]
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
end
|
|
65
|
+
end
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
module Spree
|
|
2
|
+
class UsersNotConvertedReport < Spree::Report
|
|
3
|
+
DEFAULT_SORTABLE_ATTRIBUTE = :user_email
|
|
4
|
+
HEADERS = { user_email: :string, signup_date: :date }
|
|
5
|
+
SEARCH_ATTRIBUTES = { start_date: :users_created_from, end_date: :users_created_till, email_cont: :email }
|
|
6
|
+
SORTABLE_ATTRIBUTES = [:user_email, :signup_date]
|
|
7
|
+
|
|
8
|
+
def paginated?
|
|
9
|
+
true
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
class Result < Spree::Report::Result
|
|
13
|
+
class Observation < Spree::Report::Observation
|
|
14
|
+
observation_fields [:user_email, :signup_date]
|
|
15
|
+
|
|
16
|
+
def signup_date
|
|
17
|
+
@signup_date.to_date.strftime("%B %d, %Y")
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def paginated_report_query
|
|
23
|
+
report_query
|
|
24
|
+
.limit(records_per_page)
|
|
25
|
+
.offset(current_page)
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def record_count_query
|
|
29
|
+
Spree::Report::QueryFragments.from_subquery(report_query).project(Arel.star.count)
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def report_query
|
|
33
|
+
Spree::User
|
|
34
|
+
.where(created_at: reporting_period)
|
|
35
|
+
.where(Spree::User.arel_table[:email].matches(email_search))
|
|
36
|
+
.left_joins(:spree_orders)
|
|
37
|
+
.where(spree_orders: { completed_at: nil, number: nil })
|
|
38
|
+
.select(
|
|
39
|
+
"spree_users.email as user_email",
|
|
40
|
+
"spree_users.created_at as signup_date")
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
private def email_search
|
|
44
|
+
search[:email_cont].present? ? "%#{ search[:email_cont] }%" : '%'
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
end
|
|
48
|
+
end
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
module Spree
|
|
2
|
+
class UsersWhoRecentlyPurchasedReport < Spree::Report
|
|
3
|
+
DEFAULT_SORTABLE_ATTRIBUTE = :user_email
|
|
4
|
+
HEADERS = { user_email: :string, purchase_count: :integer, last_purchase_date: :date, last_purchased_order_number: :string }
|
|
5
|
+
SEARCH_ATTRIBUTES = { start_date: :start_date, end_date: :end_date, email_cont: :email }
|
|
6
|
+
SORTABLE_ATTRIBUTES = [:user_email, :purchase_count, :last_purchase_date]
|
|
7
|
+
|
|
8
|
+
def paginated?
|
|
9
|
+
true
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
class Result < Spree::Report::Result
|
|
13
|
+
class Observation < Spree::Report::Observation
|
|
14
|
+
observation_fields [:user_email, :last_purchased_order_number, :last_purchase_date, :purchase_count]
|
|
15
|
+
|
|
16
|
+
def last_purchase_date
|
|
17
|
+
@last_purchase_date.to_date.strftime("%B %d, %Y")
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def record_count_query
|
|
23
|
+
Spree::Report::QueryFragments.from_subquery(report_query).project(Arel.star.count)
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def report_query
|
|
27
|
+
Spree::Report::QueryFragments
|
|
28
|
+
.from_subquery(all_orders_with_users)
|
|
29
|
+
.project(
|
|
30
|
+
"user_email",
|
|
31
|
+
"last_purchased_order_number",
|
|
32
|
+
"last_purchase_date",
|
|
33
|
+
"COUNT(user_email) as purchase_count")
|
|
34
|
+
.group(
|
|
35
|
+
"user_email",
|
|
36
|
+
"last_purchased_order_number",
|
|
37
|
+
"last_purchase_date"
|
|
38
|
+
)
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def paginated_report_query
|
|
43
|
+
report_query
|
|
44
|
+
.take(records_per_page)
|
|
45
|
+
.skip(current_page)
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
private def all_orders_with_users
|
|
49
|
+
Spree::User
|
|
50
|
+
.where(Spree::User.arel_table[:email].matches(email_search))
|
|
51
|
+
.left_joins(:spree_orders)
|
|
52
|
+
.where(spree_orders: { completed_at: reporting_period })
|
|
53
|
+
.order("spree_orders.completed_at desc")
|
|
54
|
+
.select(
|
|
55
|
+
"spree_users.email as user_email",
|
|
56
|
+
"spree_orders.number as last_purchased_order_number",
|
|
57
|
+
"spree_orders.completed_at as last_purchase_date"
|
|
58
|
+
).group(
|
|
59
|
+
'user_email',
|
|
60
|
+
"spree_orders.number",
|
|
61
|
+
"spree_orders.completed_at"
|
|
62
|
+
)
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
private def email_search
|
|
66
|
+
search[:email_cont].present? ? "%#{ search[:email_cont] }%" : '%'
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
end
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
module Spree
|
|
2
|
+
class ReportGenerationService
|
|
3
|
+
|
|
4
|
+
class << self
|
|
5
|
+
delegate :reports, :report_exists?, :reports_for_category, :default_report_category, to: :configuration
|
|
6
|
+
delegate :configuration, to: SpreeAdminInsights::Config
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def self.generate_report(report_name, options)
|
|
10
|
+
klass = Spree.const_get((report_name.to_s + '_report').classify)
|
|
11
|
+
resource = klass.new(options)
|
|
12
|
+
dataset = resource.generate
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def self.download(report, options = {})
|
|
16
|
+
headers = report.headers
|
|
17
|
+
stats = report.observations
|
|
18
|
+
::CSV.generate(options) do |csv|
|
|
19
|
+
csv << headers.map { |head| head[:name] }
|
|
20
|
+
stats.each do |record|
|
|
21
|
+
csv << headers.map { |head| record.public_send(head[:value]) }
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
end
|
|
27
|
+
end
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
<div class='spree-head'>
|
|
2
|
+
<figure>
|
|
3
|
+
<%= pdf_logo %>
|
|
4
|
+
</figure>
|
|
5
|
+
</div>
|
|
6
|
+
<h3 id="report-head">
|
|
7
|
+
<%= Spree.t(@report_name) %>
|
|
8
|
+
</h3>
|
|
9
|
+
|
|
10
|
+
<table class="table table-bordered" id="admin-insight" data-hook>
|
|
11
|
+
<thead>
|
|
12
|
+
<tr>
|
|
13
|
+
<% @report.headers.each do |_header_| %>
|
|
14
|
+
<th><%= Spree.t(_header_[:value], scope: [:insight, @report_name], default: _header_[:name]) %></th>
|
|
15
|
+
<% end %>
|
|
16
|
+
</tr>
|
|
17
|
+
</thead>
|
|
18
|
+
<tbody>
|
|
19
|
+
<% @report.observations.each do |stat| %>
|
|
20
|
+
<tr>
|
|
21
|
+
<% @report.headers.each do |head|%>
|
|
22
|
+
<td><%= stat.public_send(head[:value]) %></td>
|
|
23
|
+
<% end %>
|
|
24
|
+
</tr>
|
|
25
|
+
<% end %>
|
|
26
|
+
</tbody>
|
|
27
|
+
</table>
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
<% content_for :page_title do %>
|
|
2
|
+
<%= Spree.t(:heading, type: params[:report_category].to_s.titleize, scope: :insight) %>
|
|
3
|
+
<% end %>
|
|
4
|
+
|
|
5
|
+
<% content_for :title do %>
|
|
6
|
+
<%= Spree.t(:heading, type: params[:report_category].to_s.titleize, scope: :insight) %>
|
|
7
|
+
<% end %>
|
|
8
|
+
|
|
9
|
+
<div id='insights-div' class='container-fluid' >
|
|
10
|
+
<div class="row">
|
|
11
|
+
<%= select_tag :reports, options_for_select(@reports.map { |report_name| [ Spree.t(:title, scope: [:insight, report_name]), report_name, data: { url: admin_insight_url(report_name, report_category: params[:report_category]) }] }.unshift(['Select a report', '', data: { url: admin_insights_url(report_category: params[:report_category]) }, disabled: true]), @report_name || ''), class: 'select2' %>
|
|
12
|
+
</div>
|
|
13
|
+
</div>
|
|
14
|
+
<%= content_tag :div, class: 'hidden report-data', data: { report_data: @report_data_json } {} %>
|
|
15
|
+
|
|
16
|
+
<div id='report-container'>
|
|
17
|
+
<div id='search-div' class='hide'>
|
|
18
|
+
<div class="filter-wrap row">
|
|
19
|
+
<div class="col-sm-12">
|
|
20
|
+
<div class="input-group index-filter-button">
|
|
21
|
+
<span class="input-group-btn">
|
|
22
|
+
<button class="btn btn-default js-show-index-filters" type="button">
|
|
23
|
+
<span class="icon icon-chevron-right"></span>
|
|
24
|
+
<%= Spree.t(:filter) %>
|
|
25
|
+
</button>
|
|
26
|
+
</span>
|
|
27
|
+
<%= form_tag form_action(@report_name, params[:report_category]), id: "quick-search" do %>
|
|
28
|
+
<%= text_field_tag :quick_search, nil, class: "form-control js-quick-search", placeholder: Spree.t(:quick_search) %>
|
|
29
|
+
<% end %>
|
|
30
|
+
</div>
|
|
31
|
+
<div id="table-filter" data-hook class="well filter-well">
|
|
32
|
+
</div>
|
|
33
|
+
</div>
|
|
34
|
+
</div>
|
|
35
|
+
|
|
36
|
+
<div class="table-active-filters js-filters"></div>
|
|
37
|
+
</div>
|
|
38
|
+
|
|
39
|
+
<%= render 'chart' %>
|
|
40
|
+
|
|
41
|
+
<div id="table-helpers" class="row pull-right hide">
|
|
42
|
+
<span id="page-selector">
|
|
43
|
+
<span class="select-box-slide pull-right">
|
|
44
|
+
<%= select_tag :per_page, options_for_select(page_selector_options, params[:per_page] || Spree::Config[:records_per_page]), class: 'form-control text-right pull-right page-select' %>
|
|
45
|
+
</span>
|
|
46
|
+
<span title="apply pagination" class="col-md-2 hide pull-right">
|
|
47
|
+
<%= link_to '#', class: 'btn btn-default', id: 'apply-pagination' do %>
|
|
48
|
+
<span class="glyphicon glyphicon-eye-open"></span>
|
|
49
|
+
<% end %>
|
|
50
|
+
</span>
|
|
51
|
+
<span title="remove pagination" class="col-md-2 pull-right">
|
|
52
|
+
<%= link_to '#', class: 'btn btn-default', id: 'remove-pagination' do %>
|
|
53
|
+
<span class="glyphicon glyphicon-eye-close"></span>
|
|
54
|
+
<% end %>
|
|
55
|
+
</span>
|
|
56
|
+
</span>
|
|
57
|
+
<span id='page-helpers'>
|
|
58
|
+
<span title="reset" class="col-md-2 pull-right">
|
|
59
|
+
<%= link_to '#', class: 'btn btn-default', id: 'reset' do %>
|
|
60
|
+
<span class="glyphicon glyphicon-repeat"></span>
|
|
61
|
+
<% end %>
|
|
62
|
+
</span>
|
|
63
|
+
<span title="refresh" class="col-md-2 pull-right">
|
|
64
|
+
<%= link_to '#', class: 'btn btn-default', id: 'refresh' do %>
|
|
65
|
+
<span class="glyphicon glyphicon-refresh"></span>
|
|
66
|
+
<% end %>
|
|
67
|
+
</span>
|
|
68
|
+
<span title="download" class="col-md-2 pull-right">
|
|
69
|
+
<%= link_to '#', class: "btn btn-default dropdown-toggle", data: { toggle: 'dropdown' } do %>
|
|
70
|
+
<span class="glyphicon glyphicon-download"></span>
|
|
71
|
+
<% end %>
|
|
72
|
+
<ul class="dropdown-menu">
|
|
73
|
+
<li><%= link_to 'CSV', admin_insights_download_path(format: 'csv'), class: 'download-link', data: { url: admin_insights_download_path(format: 'csv') } %></li>
|
|
74
|
+
<li><%= link_to 'Excel', admin_insights_download_path(format: 'xls'), class: 'download-link', data: { url: admin_insights_download_path(format: 'xls') }%></li>
|
|
75
|
+
<li><%= link_to 'Text', admin_insights_download_path(format: 'text'), class: 'download-link', data: { url: admin_insights_download_path(format: 'text') }%></li>
|
|
76
|
+
<li><%= link_to 'PDF', admin_insights_download_path(format: 'pdf'), class: 'download-link', data: { url: admin_insights_download_path(format: 'pdf') }%></li>
|
|
77
|
+
</ul>
|
|
78
|
+
</span>
|
|
79
|
+
</div>
|
|
80
|
+
</div>
|
|
81
|
+
|
|
82
|
+
<div id='report-div'>
|
|
83
|
+
</div>
|
|
84
|
+
|
|
85
|
+
<div id='paginator-div'>
|
|
86
|
+
</div>
|
|
87
|
+
</div>
|
|
88
|
+
|
|
89
|
+
<%= render partial: 'spree/admin/templates/insights/show', formats: [:template] %>
|
|
90
|
+
<%= render partial: 'spree/admin/templates/insights/paginator', formats: [:template] %>
|
|
91
|
+
<%= render partial: 'spree/admin/templates/insights/search', formats: [:template] %>
|