quick_search-core 0.0.1.test

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.
Files changed (151) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.md +168 -0
  4. data/Rakefile +6 -0
  5. data/app/assets/images/quick_search/askus.gif +0 -0
  6. data/app/assets/images/quick_search/favicon.ico +0 -0
  7. data/app/assets/images/quick_search/greybox.png +0 -0
  8. data/app/assets/images/quick_search/homescreen-icon-64x64.png +0 -0
  9. data/app/assets/images/quick_search/ncsu-library-logo-white.png +0 -0
  10. data/app/assets/javascripts/quick_search/appstats.js +8 -0
  11. data/app/assets/javascripts/quick_search/event_tracking.js.erb +257 -0
  12. data/app/assets/javascripts/quick_search/google_analytics.js.erb +8 -0
  13. data/app/assets/javascripts/quick_search/opensearch.js +2 -0
  14. data/app/assets/javascripts/quick_search/pages.js.coffee +3 -0
  15. data/app/assets/javascripts/quick_search/quicksearch.js +33 -0
  16. data/app/assets/javascripts/quick_search/realtime.js.erb +12 -0
  17. data/app/assets/javascripts/quick_search/search.js +3 -0
  18. data/app/assets/javascripts/quick_search/xhr_search.js +82 -0
  19. data/app/assets/javascripts/quick_search.js.erb +20 -0
  20. data/app/assets/stylesheets/foundation_and_overrides.scss +1327 -0
  21. data/app/assets/stylesheets/quick_search/appstats.css.scss +7 -0
  22. data/app/assets/stylesheets/quick_search/opensearch.css.scss +3 -0
  23. data/app/assets/stylesheets/quick_search/pages.css.scss +3 -0
  24. data/app/assets/stylesheets/quick_search/quick_search.css.scss +248 -0
  25. data/app/assets/stylesheets/quick_search/search.css.scss +3 -0
  26. data/app/assets/stylesheets/quick_search.css.scss.erb +7 -0
  27. data/app/controllers/concerns/quick_search/auth.rb +22 -0
  28. data/app/controllers/concerns/quick_search/doi_trap.rb +43 -0
  29. data/app/controllers/concerns/quick_search/encode_utf8.rb +12 -0
  30. data/app/controllers/concerns/quick_search/on_campus.rb +43 -0
  31. data/app/controllers/concerns/quick_search/query_filter.rb +25 -0
  32. data/app/controllers/concerns/quick_search/query_parser.rb +54 -0
  33. data/app/controllers/concerns/quick_search/searcher_concern.rb +101 -0
  34. data/app/controllers/concerns/quick_search/searcher_config.rb +16 -0
  35. data/app/controllers/quick_search/application_controller.rb +7 -0
  36. data/app/controllers/quick_search/appstats_controller.rb +210 -0
  37. data/app/controllers/quick_search/opensearch_controller.rb +9 -0
  38. data/app/controllers/quick_search/pages_controller.rb +18 -0
  39. data/app/controllers/quick_search/search_controller.rb +250 -0
  40. data/app/helpers/quick_search/application_helper.rb +68 -0
  41. data/app/helpers/quick_search/appstats_helper.rb +2 -0
  42. data/app/helpers/quick_search/opensearch_helper.rb +2 -0
  43. data/app/helpers/quick_search/pages_helper.rb +2 -0
  44. data/app/helpers/quick_search/search_helper.rb +2 -0
  45. data/app/models/event.rb +2 -0
  46. data/app/models/search.rb +11 -0
  47. data/app/searchers/quick_search/best_bets_searcher.rb +102 -0
  48. data/app/searchers/quick_search/searcher.rb +43 -0
  49. data/app/views/layouts/quick_search/_best_bets.html.erb +18 -0
  50. data/app/views/layouts/quick_search/_common_searches.html.erb +15 -0
  51. data/app/views/layouts/quick_search/_found_types.html.erb +13 -0
  52. data/app/views/layouts/quick_search/_google_analytics.html.erb +24 -0
  53. data/app/views/layouts/quick_search/_more_options.html.erb +10 -0
  54. data/app/views/layouts/quick_search/_page_title.html.erb +8 -0
  55. data/app/views/layouts/quick_search/_related_topics.html.erb +8 -0
  56. data/app/views/layouts/quick_search/_search_form.html.erb +19 -0
  57. data/app/views/layouts/quick_search/_spelling_suggestion.html.erb +13 -0
  58. data/app/views/layouts/quick_search/_topic_snippet.html.erb +5 -0
  59. data/app/views/layouts/quick_search/application.html.erb +40 -0
  60. data/app/views/quick_search/appstats/_click_count_table.html.erb +23 -0
  61. data/app/views/quick_search/appstats/_datatables.html.erb +12 -0
  62. data/app/views/quick_search/appstats/_date_range.html.erb +15 -0
  63. data/app/views/quick_search/appstats/_menu.html.erb +16 -0
  64. data/app/views/quick_search/appstats/_top_spot_report_table.html.erb +33 -0
  65. data/app/views/quick_search/appstats/clicks_overview.html.erb +20 -0
  66. data/app/views/quick_search/appstats/index.html.erb +31 -0
  67. data/app/views/quick_search/appstats/module_click_detail.html.erb +32 -0
  68. data/app/views/quick_search/appstats/realtime.html.erb +15 -0
  69. data/app/views/quick_search/appstats/top_searches.html.erb +38 -0
  70. data/app/views/quick_search/appstats/top_spot.html.erb +14 -0
  71. data/app/views/quick_search/appstats/top_spot_detail.html.erb +35 -0
  72. data/app/views/quick_search/kaminari/_first_page.html.erb +12 -0
  73. data/app/views/quick_search/kaminari/_gap.html.erb +11 -0
  74. data/app/views/quick_search/kaminari/_last_page.html.erb +12 -0
  75. data/app/views/quick_search/kaminari/_next_page.html.erb +12 -0
  76. data/app/views/quick_search/kaminari/_page.html.erb +13 -0
  77. data/app/views/quick_search/kaminari/_paginator.html.erb +25 -0
  78. data/app/views/quick_search/kaminari/_prev_page.html.erb +11 -0
  79. data/app/views/quick_search/opensearch/opensearch.xml.builder +11 -0
  80. data/app/views/quick_search/pages/about.html.erb +9 -0
  81. data/app/views/quick_search/pages/home.html.erb +6 -0
  82. data/app/views/quick_search/pages/realtime.html.erb +15 -0
  83. data/app/views/quick_search/search/_citation.html.erb +18 -0
  84. data/app/views/quick_search/search/_module.html.erb +37 -0
  85. data/app/views/quick_search/search/_module_with_paging.html.erb +14 -0
  86. data/app/views/quick_search/search/_no_results.html.erb +11 -0
  87. data/app/views/quick_search/search/_result.html.erb +17 -0
  88. data/app/views/quick_search/search/_result_details.html.erb +45 -0
  89. data/app/views/quick_search/search/_result_no_thumbnail.html.erb +3 -0
  90. data/app/views/quick_search/search/_result_title.html.erb +4 -0
  91. data/app/views/quick_search/search/_result_with_thumbnail.html.erb +21 -0
  92. data/app/views/quick_search/search/_search_error.html.erb +9 -0
  93. data/app/views/quick_search/search/_see_all.html.erb +11 -0
  94. data/app/views/quick_search/search/_xhr_response.html.erb +15 -0
  95. data/app/views/quick_search/search/_xhr_response.json.erb +14 -0
  96. data/app/views/quick_search/search/_xhr_response_with_paging.html.erb +1 -0
  97. data/app/views/quick_search/search/index.html.erb +100 -0
  98. data/config/application.rb +25 -0
  99. data/config/best_bets.yml +86 -0
  100. data/config/boot.rb +4 -0
  101. data/config/database.yml.example +31 -0
  102. data/config/locales/en.yml +30 -0
  103. data/config/quicksearch_config.yml.example +69 -0
  104. data/config/routes.rb +81 -0
  105. data/db/migrate/20140130202859_create_events.rb +11 -0
  106. data/db/migrate/20140130202944_create_searches.rb +9 -0
  107. data/db/migrate/20140225145441_add_page_to_searches.rb +5 -0
  108. data/db/schema.rb +31 -0
  109. data/db/seeds.rb +7 -0
  110. data/lib/benchmark_logger.rb +2 -0
  111. data/lib/capistrano/tasks/access_check.cap +10 -0
  112. data/lib/generators/quick_search/install_generator.rb +49 -0
  113. data/lib/generators/quick_search/templates/kaminari.rb +5 -0
  114. data/lib/generators/quick_search/templates/post_install.txt +8 -0
  115. data/lib/generators/quick_search/templates/quick_search_config.yml +58 -0
  116. data/lib/quick_search/engine.rb +16 -0
  117. data/lib/quick_search/version.rb +3 -0
  118. data/lib/quick_search.rb +12 -0
  119. data/lib/tasks/best_bets.rake +29 -0
  120. data/test/controllers/appstats_controller_test.rb +7 -0
  121. data/test/controllers/concerns/doi_trap_test.rb +19 -0
  122. data/test/controllers/concerns/on_campus_test.rb +19 -0
  123. data/test/controllers/concerns/query_parser_test.rb +47 -0
  124. data/test/controllers/opensearch_controller_test.rb +13 -0
  125. data/test/controllers/pages_controller_test.rb +7 -0
  126. data/test/controllers/search_controller_test.rb +15 -0
  127. data/test/fixtures/events.yml +11 -0
  128. data/test/fixtures/searches.yml +7 -0
  129. data/test/helpers/appstats_helper_test.rb +4 -0
  130. data/test/helpers/opensearch_helper_test.rb +4 -0
  131. data/test/helpers/pages_helper_test.rb +4 -0
  132. data/test/helpers/search_helper_test.rb +4 -0
  133. data/test/integration/catalog_search_test.rb +8 -0
  134. data/test/integration/google_analytics_test.rb +23 -0
  135. data/test/integration/landing_page_test.rb +8 -0
  136. data/test/integration/searching_test.rb +40 -0
  137. data/test/integration/smart_subjects_test.rb +8 -0
  138. data/test/integration/website_search_test.rb +8 -0
  139. data/test/models/event_test.rb +7 -0
  140. data/test/models/search_test.rb +7 -0
  141. data/test/searcher/best_bets_test.rb +35 -0
  142. data/test/searcher/catalog_test.rb +35 -0
  143. data/test/searcher/ematrix_database_test.rb +27 -0
  144. data/test/searcher/ematrix_journal_test.rb +27 -0
  145. data/test/searcher/faq_test.rb +27 -0
  146. data/test/searcher/smart_subjects_test.rb +27 -0
  147. data/test/searcher/summon_test.rb +13 -0
  148. data/test/searcher/website_test.rb +34 -0
  149. data/test/support/vcr_test.rb +40 -0
  150. data/test/test_helper.rb +42 -0
  151. metadata +366 -0
@@ -0,0 +1,43 @@
1
+ module QuickSearch
2
+ class Searcher
3
+ attr_accessor :response, :results_list, :total, :http, :q, :per_page, :loaded_link, :offset, :page, :scope
4
+
5
+ include QueryFilter
6
+
7
+ # TODO: What should the method signature be?
8
+ def initialize(http_client, q, per_page, offset = 0, page = 1, on_campus = false, scope = '', params = {})
9
+ @http = http_client
10
+ @q = q
11
+ @per_page = per_page
12
+ @page = page
13
+ @offset = offset
14
+ @on_campus = on_campus
15
+ @scope = scope
16
+ end
17
+
18
+ # a search must
19
+ def search
20
+ raise # FIXME: pick some good error
21
+ end
22
+
23
+ # results must create a @results_list attribute
24
+ def results
25
+ raise #FIXME: pick some good error
26
+ end
27
+
28
+ private
29
+
30
+ def http_request_queries
31
+ query = @q.dup
32
+ queries = {}
33
+
34
+ query = filter_query(query)
35
+
36
+ queries['not_escaped'] = query
37
+ queries['uri_escaped'] = CGI.escape(query.to_str)
38
+ queries['mysql_escaped'] = Mysql2::Client.escape(query)
39
+ queries
40
+ end
41
+
42
+ end
43
+ end
@@ -0,0 +1,18 @@
1
+ <% unless best_bets.blank? %>
2
+ <% if best_bets[:link].is_a?(String) %>
3
+ <div id="best-bets" class="row quicksearch-ga-serve-tracking quicksearch-ga-click-tracking">
4
+ <div class="small-12 columns best_bets module">
5
+ <h3 class='title'>
6
+ <%= link_to (best_bets[:link]),
7
+ :data => { :quicksearch_ga_action => best_bets[:id],
8
+ :quicksearch_ga_category => best_bets[:best_bets_type] } do %>
9
+ <i class='fa fa-angle-double-right'></i>
10
+ <%= best_bets[:title] %>
11
+ <% end %>
12
+ <span class='highlight'>Best&nbsp;Bet</span>
13
+ </h3>
14
+ <p><%= best_bets[:description] %></p>
15
+ </div>
16
+ </div>
17
+ <% end %>
18
+ <% end %>
@@ -0,0 +1,15 @@
1
+ <div class="row">
2
+ <div class="small-12 medium-7 columns">
3
+ <h2><%= @module_callout %></h2>
4
+ </div>
5
+ <% unless @common_searches.empty? %>
6
+ <div id="common-searches" class="small-12 medium-5 columns common-searches">
7
+ <h4><%= t('call_to_try_searches') %>:</h4>
8
+ <ul>
9
+ <% @common_searches.each do | search | %>
10
+ <li><%= link_to search, :q => search %></li>
11
+ <% end %>
12
+ </ul>
13
+ </div>
14
+ <% end %>
15
+ </div>
@@ -0,0 +1,13 @@
1
+ <ul class="inline-list">
2
+ <% for searcher in QuickSearch::Engine::APP_CONFIG['found_types'] %>
3
+ <% if @found_types.include? searcher %>
4
+ <li>
5
+ <a href="#<%= searcher.dasherize %>" data-quicksearch-ga-action="<%= searcher.dasherize %>">
6
+ <%= t("#{searcher}_search.display_name") %>
7
+ </a>
8
+ </li>
9
+ <% else %>
10
+ <li class="<%= searcher.dasherize %>"><span class="no-results-label"><%= t("#{searcher}_search.display_name") %></span></li>
11
+ <% end %>
12
+ <% end %>
13
+ </ul>
@@ -0,0 +1,24 @@
1
+ <% if Rails.env == 'production' or Rails.env == 'staging' %>
2
+ <script>
3
+ //Univeral Analytics
4
+ // (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
5
+ // (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
6
+ // m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
7
+ // })(window,document,'script','//www.google-analytics.com/analytics.js','ga');
8
+
9
+ // ga('create', "<%= APP_CONFIG['google_analytics_tracking_id'] %>", 'ncsu.edu'); //FIXME: Add id for quicksearch GA
10
+ // ga('send', 'pageview');
11
+
12
+ // Classic Analytics
13
+ var _gaq = _gaq || [];
14
+ _gaq.push(['_setAccount', "<%= QuickSearch::Engine::APP_CONFIG['google_analytics_tracking_id'] %>"]);
15
+ _gaq.push(['_trackPageview']);
16
+
17
+ (function() {
18
+ var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
19
+ ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
20
+ var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
21
+ })();
22
+
23
+ </script>
24
+ <% end %>
@@ -0,0 +1,10 @@
1
+ <% if @query %>
2
+ <h4>More search options for <span class="query">"<%= display_query %>"</span></h4>
3
+ <% else %>
4
+ <h4>A few more places to try:</h4>
5
+ <% end %>
6
+ <ul>
7
+ <% @search_services_for_display.each do |link| %>
8
+ <li><%= link_to link['name'], link['link'] %></li>
9
+ <% end %>
10
+ </ul>
@@ -0,0 +1,8 @@
1
+ <div class="row">
2
+ <div class="small-12 medium-6 large-9 columns">
3
+ <h1>Search <%= page_title %></h1>
4
+ </div>
5
+ <div class="medium-6 large-3 columns show-for-medium-up">
6
+ <p><%= link_to 'About this search tool', about_path, class: 'about' %></p>
7
+ </div>
8
+ </div>
@@ -0,0 +1,8 @@
1
+ <% unless related_topics.blank? %>
2
+ <h4>Related searches</h4>
3
+ <ul>
4
+ <% related_topics.each do |topic| %>
5
+ <li><%= link_to topic, root_path(q: topic) %></li>
6
+ <% end %>
7
+ </ul>
8
+ <% end %>
@@ -0,0 +1,19 @@
1
+ <div class="row main-search-form">
2
+ <div class="small-12 columns">
3
+ <%= form_for("search", method: :get, html: {id: 'main-search-form'}) do |f| %>
4
+ <div class="row collapse">
5
+ <div class="small-10 columns">
6
+ <% if @query %>
7
+ <input type="search" name="q" id="params-q" class="quicksearch-typeahead search-query" value="<%= @query %>" />
8
+ <% else %>
9
+ <input type="search" name="q" id="params-q" class="quicksearch-typeahead search-query" placeholder="<%= @search_form_placeholder %>" />
10
+ <% end %>
11
+ </div>
12
+ <div class="small-2 columns">
13
+ <button type="submit" class="button prefix show-for-small"><i class="fa fa-search"></i></button>
14
+ <button type="submit" class="button prefix show-for-medium-up">Search</button>
15
+ </div>
16
+ </div>
17
+ <% end %>
18
+ </div>
19
+ </div>
@@ -0,0 +1,13 @@
1
+ <% unless spelling_suggestion.blank? %>
2
+ <% unless @query.size > 100 %>
3
+ <div id='spelling-suggestion' class="row quicksearch-ga-serve-tracking quicksearch-ga-click-tracking">
4
+ <div class="small-12 large-8 columns spelling-suggestion module">
5
+ <h3 class="title">
6
+ Did you mean <%= link_to spelling_suggestion, "?q=#{spelling_suggestion}",
7
+ :data => { :quicksearch_ga_action => spelling_suggestion,
8
+ :quicksearch_ga_label => @query } %>?
9
+ </h2>
10
+ </div>
11
+ </div>
12
+ <% end %>
13
+ <% end %>
@@ -0,0 +1,5 @@
1
+ <% unless topic_snippet.blank? %>
2
+ <h2><a href="<%= topic_snippet['source_link'] %>"><%= topic_snippet['title'] %></a></h2>
3
+ <p><%= topic_snippet['snippet'] %></p>
4
+ <p>Source: <a href="<%= topic_snippet['source_link'] %>"><%= topic_snippet['source_name'] %></a></p>
5
+ <% end %>
@@ -0,0 +1,40 @@
1
+ <!DOCTYPE html>
2
+ <!--[if IE 8]><html class="no-js lt-ie9" lang="en"> <![endif]-->
3
+ <!--[if gt IE 8]><!--> <html class="no-js" lang="en"> <!--<![endif]-->
4
+ <head>
5
+ <title><%= content_for(:title) %></title>
6
+ <meta content="ie=edge, chrome=1" http-equiv="x-ua-compatible" />
7
+ <link rel="search" type="application/opensearchdescription+xml" href="<%= opensearch_path %>" title="<%= t('opensearch_description') %>" />
8
+ <!-- css -->
9
+ <%= stylesheet_link_tag 'application' %>
10
+
11
+ <!-- js -->
12
+ <%= javascript_include_tag 'application' %>
13
+ <%= render '/layouts/quick_search/head' %>
14
+ <%= render '/layouts/quick_search/google_analytics' %>
15
+ </head>
16
+ <body class="<%= body_class %>" data-quicksearch-ga-query="<%= strip_tags(@log_query) %>">
17
+ <div class="off-canvas-wrap">
18
+ <div class="inner-wrap">
19
+ <%= render '/layouts/quick_search/header' %>
20
+ <div id="content" role="document" class="page">
21
+ <main id="main-content" role="main" class="row l-main">
22
+ <div class="medium-12 main columns">
23
+ <div class="skip-link">
24
+ <a href="#main-content"></a>
25
+ </div>
26
+ <!-- CONTENT: enter content below this line -->
27
+ <div id="quicksearch">
28
+ <%= yield %>
29
+ </div>
30
+ </div>
31
+ </main>
32
+ </div>
33
+ <%= render '/layouts/quick_search/footer' %>
34
+ </div>
35
+ </div>
36
+ <script type="text/javascript">$(function() { $('body').hide().show(); });
37
+ window.I18n = <%= I18n.backend.send(:translations).to_json.html_safe %>
38
+ </script>
39
+ </body>
40
+ </html>
@@ -0,0 +1,23 @@
1
+ <table class="datatable">
2
+ <thead>
3
+ <tr>
4
+ <th>Rank</th>
5
+ <th>Category</th>
6
+ <th>Count</th>
7
+ <th>Percent</th>
8
+ </tr>
9
+ </thead>
10
+ <tbody>
11
+ <% iterations = 0 %>
12
+ <% clicks.each do |item, count| %>
13
+ <% iterations += 1 %>
14
+ <tr>
15
+ <td><%= iterations %></td>
16
+ <!-- <td><%# item %></td> -->
17
+ <td><%= link_to item, controller: "appstats", action: "detail", ga_scope: "category", ga_category: "#{item}" %></td>
18
+ <td><%= count %></td>
19
+ <td><%= number_to_percentage((count / total_clicks.to_f)*100, precision: 2) %></td>
20
+ </tr>
21
+ <% end %>
22
+ </tbody>
23
+ </table>
@@ -0,0 +1,12 @@
1
+ <%= stylesheet_link_tag('//cdn.datatables.net/1.10.0/css/jquery.dataTables.css') %>
2
+ <%= stylesheet_link_tag('//cdn.datatables.net/plug-ins/28e7751dbec/integration/foundation/dataTables.foundation.css') %>
3
+ <%= javascript_include_tag('//cdn.datatables.net/1.10.0/js/jquery.dataTables.js') %>
4
+ <%= javascript_include_tag('//cdn.datatables.net/plug-ins/28e7751dbec/integration/foundation/dataTables.foundation.js') %>
5
+ <script>
6
+ $(document).ready (function() {
7
+ $('.datatable').dataTable({
8
+ "paging": false,
9
+ "filter": false
10
+ });
11
+ })
12
+ </script>
@@ -0,0 +1,15 @@
1
+ <% title('Foo') %>
2
+ <div class="row">
3
+ <div class="small-12 columns">
4
+ <h1><%= @page_title %></h1>
5
+ <div id="appstats-date-filter">
6
+ <%= form_tag do %>
7
+ <p>Start Date: <%= select_date @start_date, prefix: :start_date %></p>
8
+ <p>End Date: <%= select_date @end_date, prefix: :end_date %></p>
9
+ <p><%= submit_tag("Update") %></p>
10
+ <% end %>
11
+ </div>
12
+ <p><%= "#{@start_date.to_formatted_s(:long) } to #{@end_date.to_formatted_s(:long)}" %> <a id="appstats-date-showhide">(Change start/end dates)</a></p>
13
+ <p><%= "#{@days_in_sample} days in sample" %></p>
14
+ </div>
15
+ </div>
@@ -0,0 +1,16 @@
1
+ <aside id="subnav" role="complementary" class="medium-3 columns sidebar">
2
+ <section class="block block-menu">
3
+ <h3>External Services</h2>
4
+ <ul class="side-nav">
5
+ <li><%= link_to "Google Analytics", "https://www.google.com/analytics/web/", :target => "_blank" %></li>
6
+ </ul>
7
+ <h3>Internal Reports</h2>
8
+ <ul class="side-nav">
9
+ <li><%= link_to "General Statistics", appstats_path(:start_date => params[:start_date], :end_date => params[:end_date]) %></li>
10
+ <li><%= link_to "Clicks Overview", clicks_overview_path(:start_date => params[:start_date], :end_date => params[:end_date]) %></li>
11
+ <li><%= link_to "Top Searches", top_searches_path(:start_date => params[:start_date], :end_date => params[:end_date]) %></li>
12
+ <li><%= link_to "Best Bets", top_spot_path(:start_date => params[:start_date], :end_date => params[:end_date], :ga_top_spot_module => 'best-bets-regular') %></li>
13
+ <li><%= link_to "Spelling Suggestions", top_spot_path(:start_date => params[:start_date], :end_date => params[:end_date], :ga_top_spot_module => 'spelling-suggestion') %></li>
14
+ </ul>
15
+ </section>
16
+ </aside>
@@ -0,0 +1,33 @@
1
+ <h3><%= report[:category_title] %></h3>
2
+ <table class="datatable">
3
+ <thead>
4
+ <tr>
5
+ <th>Rank</th>
6
+ <th>Action</th>
7
+ <th>Serve Count</th>
8
+ <th>Click Count</th>
9
+ <th>Click/Serve Ratio</th>
10
+ </tr>
11
+ </thead>
12
+ <tbody>
13
+ <% total_serves = 0 %>
14
+ <% total_clicks = 0 %>
15
+ <% iterations = 0 %>
16
+ <% report[:report].each do |row| %>
17
+ <% break if iterations > 99 %>
18
+ <% if row['clickcount'].nil? %>
19
+ <% row['clickcount'] = 0 %>
20
+ <% end %>
21
+ <% total_serves += row["servecount"] %>
22
+ <% total_clicks += row["clickcount"] %>
23
+ <% iterations += 1 %>
24
+ <tr>
25
+ <td><%= iterations %></td>
26
+ <td><%= link_to row["action"], controller: "appstats", action: "detail", ga_scope: "action", ga_category: report[:category], ga_action: URI.encode(row["action"], "./") %></td>
27
+ <td><%= number_with_delimiter(row["servecount"]) %></td>
28
+ <td><%= number_with_delimiter(row["clickcount"]) %></td>
29
+ <td><%= number_to_percentage((row["clickcount"] / row["servecount"].to_f)*100, precision: 2) %></td>
30
+ </tr>
31
+ <% end %>
32
+ </tbody>
33
+ </table>
@@ -0,0 +1,20 @@
1
+ <% title("#{@page_title} | ") %>
2
+ <%= render partial: 'datatables' %>
3
+ <div class="row">
4
+ <%= render partial: 'menu' %>
5
+ <div class="medium-9 columns">
6
+ <%= render partial: "date_range" %>
7
+ </div>
8
+ <div class="medium-9 columns">
9
+ <h2>Module Clicks</h2>
10
+ <%= render partial: 'click_count_table', locals: { :clicks => @module_clicks, :total_clicks => @module_click_total} %>
11
+ <h2>Result Types Guide Clicks</h2>
12
+ <%= render partial: 'click_count_table', locals: { :clicks => @result_types_clicks, :total_clicks => @result_types_click_total} %>
13
+ <table>
14
+ <tr>
15
+ <td>Result Type Guide Click/Search</td>
16
+ <td><%= number_to_percentage((@result_types_click_total / @searches_count.to_f)*100, precision: 2) %></td>
17
+ </tr>
18
+ </table>
19
+ </div>
20
+ </div>
@@ -0,0 +1,31 @@
1
+ <% title("#{@page_title} | ") %>
2
+ <%= render partial: 'datatables' %>
3
+ <div class="row">
4
+ <%= render partial: 'menu' %>
5
+ <div class="medium-8 columns">
6
+ <%= render partial: 'date_range' %>
7
+ <h2>General Statistics</h2>
8
+ <table>
9
+ <tr>
10
+ <td>Total Searches</td>
11
+ <td><%= number_with_delimiter(@searches_count) %></td>
12
+ </tr>
13
+ <tr>
14
+ <td>Total Clicks</td>
15
+ <td><%= number_with_delimiter(@clicks_count) %></td>
16
+ </tr>
17
+ <tr>
18
+ <td>Searches per Day</td>
19
+ <td><%= number_with_delimiter(@searches_count / @days_in_sample) %></td>
20
+ </tr>
21
+ <tr>
22
+ <td>Clicks per Day</td>
23
+ <td><%= number_with_delimiter(@clicks_count / @days_in_sample) %></td>
24
+ </tr>
25
+ <tr>
26
+ <td>Click/Search</td>
27
+ <td><%= number_to_percentage(@click_serve_ratio, precision: 2) %></td>
28
+ </tr>
29
+ </table>
30
+ </div>
31
+ </div>
@@ -0,0 +1,32 @@
1
+ <%= title("#{@page_title} | ") %>
2
+ <%= render partial: 'datatables' %>
3
+ <div class="row">
4
+ <%= render partial: "menu" %>
5
+ <div class="medium-9 columns">
6
+ <%= render partial: 'date_range' %>
7
+ <h2><%= @category %></h2>
8
+ <table class='datatable'>
9
+ <thead>
10
+ <tr>
11
+ <td>Rank</td>
12
+ <td>Link</td>
13
+ <td>Count</td>
14
+ <td>Percent</td>
15
+ </tr>
16
+ </thead>
17
+ <tbody>
18
+ <% count = 0 %>
19
+ <% @modules_clicks_report.each do |module_clicks| %>
20
+ <% count += 1 %>
21
+ <tr>
22
+ <td><%= count %></td>
23
+ <td><%= module_clicks[:module] %></td>
24
+ <td><%= module_clicks[:clicks] %></td>
25
+ <td><%= number_to_percentage(module_clicks[:percent], precision: 2) %></td>
26
+ </tr>
27
+ <% end %>
28
+ </tbody>
29
+ </table>
30
+ </div>
31
+ </div>
32
+
@@ -0,0 +1,15 @@
1
+ <% title %>
2
+ <div class="row">
3
+ <div class="small-12 columns">
4
+ <h1>Realtime Searches</h1>
5
+ <p>What you see below is a stream of searches as they happen in real time.</p>
6
+ <div id="realtime_searches">
7
+ <ul class="disc">
8
+
9
+ </ul>
10
+ </div>
11
+ </div>
12
+ </div>
13
+
14
+ <%= javascript_include_tag File.join(QuickSearch::Engine::APP_CONFIG['realtime_url'], '/socket.io/socket.io.js') %>
15
+ <%= javascript_include_tag 'realtime' %>
@@ -0,0 +1,38 @@
1
+ <% title("#{@page_title} | ") %>
2
+ <%= render partial: 'datatables' %>
3
+ <div class="row">
4
+ <%= render partial: "menu" %>
5
+ <div class="small-9 columns">
6
+ <%= render partial: "date_range" %>
7
+ </div>
8
+ <div class="small-9 columns">
9
+ <h2>Most Frequent Searches</h2>
10
+ <table class="datatable">
11
+ <thead>
12
+ <tr>
13
+ <th>Rank</th>
14
+ <th>Query</th>
15
+ <th>Total</th>
16
+ <th>Percent of Total</th>
17
+ <th>Cumulative Percent</th>
18
+ </tr>
19
+ </thead>
20
+ <tbody>
21
+ <% it_count = 0 %>
22
+ <% total_percent = 0 %>
23
+ <% @query_counts.each do |query, count| %>
24
+ <% it_count += 1 %>
25
+ <% term_percent = (count / @searches_count.to_f)*100 %>
26
+ <% total_percent += term_percent %>
27
+ <tr>
28
+ <td><%= it_count %></td>
29
+ <td><%= link_to query, root_path(q: query) %></td>
30
+ <td><%= number_with_delimiter(count) %></td>
31
+ <td><%= number_to_percentage(term_percent, precision: 2) %></td>
32
+ <td><%= number_to_percentage(total_percent, precision: 2)%></td>
33
+ </tr>
34
+ <% end %>
35
+ </tbody>
36
+ </table>
37
+ </div>
38
+ </div>
@@ -0,0 +1,14 @@
1
+ <% title("#{@page_title} | ") %>
2
+ <%= render partial: 'datatables' %>
3
+ <div class="row">
4
+ <%= render partial: "menu" %>
5
+ <div class="large-9 columns">
6
+ <%= render partial: "date_range" %>
7
+ </div>
8
+ <div class="large-9 columns">
9
+ <p>Displays top 100 in each category</p>
10
+ <% @top_spot_reporting.each do |report| %>
11
+ <%= render partial: 'top_spot_report_table', locals: { report: report } %>
12
+ <% end %>
13
+ </div>
14
+ </div>
@@ -0,0 +1,35 @@
1
+ <% title("#{@page_title} | ") %>
2
+ <%= render partial: 'datatables' %>
3
+ <div class="row">
4
+ <%= render partial: "menu" %>
5
+ <div class="medium-9 columns">
6
+ <%= render partial: 'date_range' %>
7
+ <table class='datatable'>
8
+ <thead>
9
+ <tr>
10
+ <th>Rank</th>
11
+ <th>Query</th>
12
+ <th>Serve Count</th>
13
+ <th>Click Count</th>
14
+ <th>Click/Serve %</th>
15
+ </tr>
16
+ </thead>
17
+ <tbody>
18
+ <% count = 0 %>
19
+ <% @top_spot_detail.each do |key, action| %>
20
+ <% count += 1 %>
21
+ <tr>
22
+ <td><%= count %></td>
23
+ <td><%= key %></td>
24
+ <td><%= action[0] %></td>
25
+ <td><%= action[1] %></td>
26
+ <td><%= number_to_percentage(action[2], precision: 2) %></td>
27
+ </tr>
28
+ <% end %>
29
+ </tbody>
30
+ </table>
31
+ </div>
32
+ </div>
33
+ <!-- FIXME: Should this be used to report Module Click details as well? -->
34
+ <!-- Remove reference to Best Bet here. Make more generic. -->
35
+
@@ -0,0 +1,12 @@
1
+ <%# Link to the "First" page
2
+ - available local variables
3
+ url: url to the first page
4
+ current_page: a page object for the currently displayed page
5
+ total_pages: total number of pages
6
+ per_page: number of items to fetch per page
7
+ remote: data-remote
8
+ -%>
9
+
10
+ <li>
11
+ <%= link_to_unless current_page.first?, raw(t 'views.pagination.first'), url, :remote => remote %>
12
+ </li>
@@ -0,0 +1,11 @@
1
+ <%# Non-link tag that stands for skipped pages...
2
+ - available local variables
3
+ current_page: a page object for the currently displayed page
4
+ total_pages: total number of pages
5
+ per_page: number of items to fetch per page
6
+ remote: data-remote
7
+ -%>
8
+
9
+ <li class="unavailable">
10
+ <%= link_to raw(t 'views.pagination.truncate'), '#' %>
11
+ </li>
@@ -0,0 +1,12 @@
1
+ <%# Link to the "Last" page
2
+ - available local variables
3
+ url: url to the last page
4
+ current_page: a page object for the currently displayed page
5
+ total_pages: total number of pages
6
+ per_page: number of items to fetch per page
7
+ remote: data-remote
8
+ -%>
9
+
10
+ <li>
11
+ <%= link_to_unless current_page.last?, raw(t 'views.pagination.last'), url, {:remote => remote} %>
12
+ </li>
@@ -0,0 +1,12 @@
1
+ <%# Link to the "Next" page
2
+ - available local variables
3
+ url: url to the next page
4
+ current_page: a page object for the currently displayed page
5
+ total_pages: total number of pages
6
+ per_page: number of items to fetch per page
7
+ remote: data-remote
8
+ -%>
9
+
10
+ <li>
11
+ <%= link_to_unless current_page.last?, raw(t 'views.pagination.next'), url, :rel => 'next', :remote => remote %>
12
+ </li>
@@ -0,0 +1,13 @@
1
+ <%# Link showing page number
2
+ - available local variables
3
+ page: a page object for "this" page
4
+ url: url to this page
5
+ current_page: a page object for the currently displayed page
6
+ total_pages: total number of pages
7
+ per_page: number of items to fetch per page
8
+ remote: data-remote
9
+ -%>
10
+
11
+ <li class="<%= 'current' if page.current? %>">
12
+ <%= link_to page, page.current? ? '#' : url, {:remote => remote, :rel => page.next? ? 'next' : page.prev? ? 'prev' : nil} %>
13
+ </li>
@@ -0,0 +1,25 @@
1
+ <%# The container tag
2
+ - available local variables
3
+ current_page: a page object for the currently displayed page
4
+ total_pages: total number of pages
5
+ per_page: number of items to fetch per page
6
+ remote: data-remote
7
+ paginator: the paginator that renders the pagination tags inside
8
+ -%>
9
+ <%= paginator.render do -%>
10
+ <div class="pagination-centered">
11
+ <ul class="pagination">
12
+ <%= first_page_tag unless current_page.first? %>
13
+ <%= prev_page_tag unless current_page.first? %>
14
+ <% each_page do |page| -%>
15
+ <% if page.left_outer? || page.right_outer? || page.inside_window? -%>
16
+ <%= page_tag page %>
17
+ <% elsif !page.was_truncated? -%>
18
+ <%= gap_tag %>
19
+ <% end -%>
20
+ <% end -%>
21
+ <%= next_page_tag unless current_page.last? %>
22
+ <%= last_page_tag unless current_page.last? %>
23
+ </ul>
24
+ </div>
25
+ <% end -%>
@@ -0,0 +1,11 @@
1
+ <%# Link to the "Previous" page
2
+ - available local variables
3
+ url: url to the previous page
4
+ current_page: a page object for the currently displayed page
5
+ total_pages: total number of pages
6
+ per_page: number of items to fetch per page
7
+ remote: data-remote
8
+ -%>
9
+ <li>
10
+ <%= link_to_unless current_page.first?, raw(t 'views.pagination.previous'), url, :rel => 'prev', :remote => remote %>
11
+ </li>