solidus_admin_insights 2.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +54 -0
- data/Gemfile +2 -0
- data/LICENSE +26 -0
- data/README.md +71 -0
- data/Rakefile +21 -0
- data/app/assets/javascripts/spree/backend/jquery.tablesorter.min.js +4 -0
- data/app/assets/javascripts/spree/backend/solidus_admin_insights.js +2 -0
- data/app/assets/javascripts/spree/backend/solidus_admin_insights/paginator.js +128 -0
- data/app/assets/javascripts/spree/backend/solidus_admin_insights/report_loader.js +265 -0
- data/app/assets/javascripts/spree/backend/solidus_admin_insights/searcher.js +72 -0
- data/app/assets/javascripts/spree/backend/solidus_admin_insights/table_sorter.js +47 -0
- data/app/assets/javascripts/spree/backend/tmpl.js +87 -0
- data/app/assets/javascripts/spree/frontend/solidus_admin_insights.js +2 -0
- data/app/assets/stylesheets/spree/backend/override_pdf.css +71 -0
- data/app/assets/stylesheets/spree/backend/solidus_admin_insights.css +132 -0
- data/app/assets/stylesheets/spree/frontend/solidus_admin_insights.css +4 -0
- data/app/controllers/spree/admin/insights_controller.rb +103 -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/permissions/spree/permission_sets/insight_display.rb +9 -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 +82 -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 +5 -0
- data/app/views/spree/admin/shared/sub_menu/_insight.html.erb +7 -0
- data/app/views/spree/admin/templates/insights/_paginator.template +11 -0
- data/app/views/spree/admin/templates/insights/_search.template +76 -0
- data/app/views/spree/admin/templates/insights/_show.template +49 -0
- data/app/views/spree/layouts/pdf.html.erb +9 -0
- data/bin/rails +7 -0
- data/config/initializers/add_to_sidebar.rb +14 -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 +167 -0
- data/config/routes.rb +6 -0
- data/lib/generators/solidus_admin_insights/install/install_generator.rb +36 -0
- data/lib/generators/solidus_admin_insights/install/solidus_admin_insights.rb +22 -0
- data/lib/solidus_admin_insights.rb +14 -0
- data/lib/solidus_admin_insights/engine.rb +27 -0
- data/lib/solidus_admin_insights/factories.rb +6 -0
- data/solidus_admin_insights.gemspec +42 -0
- data/spec/spec_helper.rb +93 -0
- metadata +419 -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: SolidusAdminInsights::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,82 @@
|
|
1
|
+
<%= render :partial => 'spree/admin/shared/sub_menu/insight' %>
|
2
|
+
<% content_for :page_title do %>
|
3
|
+
<%= Spree.t(:heading, type: params[:type].to_s.titleize, scope: :insight) %>
|
4
|
+
<% end %>
|
5
|
+
|
6
|
+
<% content_for :title do %>
|
7
|
+
<%= Spree.t(:heading, type: params[:type].to_s.titleize, scope: :insight) %>
|
8
|
+
<% end %>
|
9
|
+
|
10
|
+
<div id='insights-div' class='container-fluid' data-hook="admin-insights">
|
11
|
+
<div class="row">
|
12
|
+
<%= 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: 'report-select' %>
|
13
|
+
</div>
|
14
|
+
</div>
|
15
|
+
<%= content_tag :div, class: 'hidden report-data', data: { report_data: @report_data_json } {} %>
|
16
|
+
|
17
|
+
<div id='report-container'>
|
18
|
+
<div id='search-div' class='hide'>
|
19
|
+
<div class="filter-wrap row">
|
20
|
+
<div class="col-sm-12">
|
21
|
+
<div id="table-filter" data-hook class="well filter-well">
|
22
|
+
</div>
|
23
|
+
</div>
|
24
|
+
</div>
|
25
|
+
|
26
|
+
<div class="table-active-filters js-filters"></div>
|
27
|
+
</div>
|
28
|
+
|
29
|
+
<%= render 'chart' %>
|
30
|
+
|
31
|
+
<div id="table-helpers" class="row move-right hide">
|
32
|
+
<span id="page-selector">
|
33
|
+
<span class="select-box-slide move-right button-group">
|
34
|
+
<%= select_tag :per_page, options_for_select(page_selector_options, params[:per_page] || Spree::Config[:records_per_page]), class: 'form-control text-right move-right page-select' %>
|
35
|
+
</span>
|
36
|
+
<span title="apply pagination" class="button-group hide move-right">
|
37
|
+
<%= link_to '#', class: 'button btn-link', id: 'apply-pagination' do %>
|
38
|
+
<span class="fa fa-eye"></span>
|
39
|
+
<% end %>
|
40
|
+
</span>
|
41
|
+
<span title="remove pagination" class="button-group move-right">
|
42
|
+
<%= link_to '#', class: 'button btn-link', id: 'remove-pagination' do %>
|
43
|
+
<span class="fa fa-eye-slash"></span>
|
44
|
+
<% end %>
|
45
|
+
</span>
|
46
|
+
</span>
|
47
|
+
<span id='page-helpers'>
|
48
|
+
<span title="reset" class="button-group move-right">
|
49
|
+
<%= link_to '#', class: 'button btn-link', id: 'reset' do %>
|
50
|
+
<span class="fa fa-undo"></span>
|
51
|
+
<% end %>
|
52
|
+
</span>
|
53
|
+
<span title="refresh" class="button-group move-right">
|
54
|
+
<%= link_to '#', class: 'button btn-link', id: 'refresh' do %>
|
55
|
+
<span class="fa fa-refresh"></span>
|
56
|
+
<% end %>
|
57
|
+
</span>
|
58
|
+
<span title="download" class="dropdown move-right button-group">
|
59
|
+
<%= link_to "javascript:void(0)", class: "toggle-btn button btn-link", data: { toggle: 'dropdown' } do %>
|
60
|
+
<span class="fa fa-download"></span>
|
61
|
+
<% end %>
|
62
|
+
<ul class="sub-menu">
|
63
|
+
<li class="dropdown-item"><%= link_to 'CSV', admin_insights_download_path(format: 'csv'), class: 'download-link', data: { url: admin_insights_download_path(format: 'csv') } %></li>
|
64
|
+
<li class="dropdown-item"><%= link_to 'Excel', admin_insights_download_path(format: 'xls'), class: 'download-link', data: { url: admin_insights_download_path(format: 'xls') }%></li>
|
65
|
+
<li class="dropdown-item"><%= link_to 'Text', admin_insights_download_path(format: 'text'), class: 'download-link', data: { url: admin_insights_download_path(format: 'text') }%></li>
|
66
|
+
<li class="dropdown-item"><%= link_to 'PDF', admin_insights_download_path(format: 'pdf'), class: 'download-link', data: { url: admin_insights_download_path(format: 'pdf') }%></li>
|
67
|
+
</ul>
|
68
|
+
</span>
|
69
|
+
</div>
|
70
|
+
</div>
|
71
|
+
|
72
|
+
<input id="narrow-down-report-data" name="narrow-down-report-data" type="text" value="" class="form-control input-lg" placeholder="Start typing to filter data"/>
|
73
|
+
<div id='report-div'>
|
74
|
+
</div>
|
75
|
+
|
76
|
+
<div id='paginator-div'>
|
77
|
+
</div>
|
78
|
+
</div>
|
79
|
+
|
80
|
+
<%= render partial: 'spree/admin/templates/insights/show', formats: [:template] %>
|
81
|
+
<%= render partial: 'spree/admin/templates/insights/paginator', formats: [:template] %>
|
82
|
+
<%= render partial: 'spree/admin/templates/insights/search', formats: [:template] %>
|
@@ -0,0 +1,13 @@
|
|
1
|
+
<% content_for :quick_search_form do %>
|
2
|
+
<div class="row">
|
3
|
+
<div class="col col-md-6">
|
4
|
+
<div data-hook="admin_property_index_search" class="form-group">
|
5
|
+
<%= label_tag :search_name, Spree.t(:name) %>
|
6
|
+
<%= text_field_tag 'search[name]', params.fetch(:search, {})[:name], class: "form-control js-quick-search-target js-filterable" %>
|
7
|
+
</div>
|
8
|
+
</div>
|
9
|
+
|
10
|
+
<div class="col-md-6">
|
11
|
+
</div>
|
12
|
+
</div>
|
13
|
+
<% end %>
|