quick_search-core 0.0.1.test

Sign up to get free protection for your applications and to get access to all the features.
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>