quick_search-core 0.1.1 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (136) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +7 -6
  3. data/app/assets/javascripts/quick_search.js.erb +9 -0
  4. data/app/assets/javascripts/quick_search/appstats.js.erb +73 -0
  5. data/app/assets/javascripts/quick_search/appstats_best_bets.js.erb +905 -0
  6. data/app/assets/javascripts/quick_search/appstats_clicks_overview.js.erb +719 -0
  7. data/app/assets/javascripts/quick_search/appstats_general_statistics.js.erb +908 -0
  8. data/app/assets/javascripts/quick_search/appstats_sessions_details.js.erb +660 -0
  9. data/app/assets/javascripts/quick_search/appstats_sessions_overview.js.erb +481 -0
  10. data/app/assets/javascripts/quick_search/appstats_spelling_suggestions.js.erb +902 -0
  11. data/app/assets/javascripts/quick_search/appstats_top_searches.js.erb +633 -0
  12. data/app/assets/javascripts/quick_search/event_tracking.js.erb +22 -33
  13. data/app/assets/javascripts/quick_search/xhr_search.js +7 -3
  14. data/app/assets/stylesheets/quick_search/appstats.scss +148 -0
  15. data/app/assets/stylesheets/quick_search/quick_search.scss +0 -16
  16. data/app/controllers/concerns/quick_search/doi_trap.rb +1 -1
  17. data/app/controllers/quick_search/appstats_controller.rb +267 -144
  18. data/app/controllers/quick_search/logging_controller.rb +165 -0
  19. data/app/controllers/quick_search/search_controller.rb +1 -23
  20. data/app/controllers/quick_search/typeahead_controller.rb +48 -0
  21. data/app/models/event.rb +6 -0
  22. data/app/models/search.rb +7 -0
  23. data/app/models/session.rb +9 -0
  24. data/app/searchers/quick_search/best_bets_searcher.rb +1 -1
  25. data/app/views/layouts/quick_search/_google_analytics.html.erb +4 -9
  26. data/app/views/layouts/quick_search/_search_form.html.erb +2 -2
  27. data/app/views/layouts/quick_search/application.html.erb +4 -0
  28. data/app/views/quick_search/appstats/_date_range.html.erb +14 -13
  29. data/app/views/quick_search/appstats/_graph_best_bets.html.erb +6 -0
  30. data/app/views/quick_search/appstats/_graph_clicks_overview.html.erb +12 -0
  31. data/app/views/quick_search/appstats/_graph_general_statistics.html.erb +19 -0
  32. data/app/views/quick_search/appstats/_graph_sessions_details.html.erb +19 -0
  33. data/app/views/quick_search/appstats/_graph_sessions_overview.html.erb +9 -0
  34. data/app/views/quick_search/appstats/_graph_spelling_suggestions.html.erb +6 -0
  35. data/app/views/quick_search/appstats/_graph_top_searches.html.erb +6 -0
  36. data/app/views/quick_search/appstats/_menu.html.erb +16 -3
  37. data/app/views/quick_search/appstats/_sessions_details_device_filters.html.erb +9 -0
  38. data/app/views/quick_search/appstats/_sessions_details_location_filters.html.erb +9 -0
  39. data/app/views/quick_search/appstats/_sessions_overview_graph_filters.html.erb +9 -0
  40. data/app/views/quick_search/appstats/clicks_overview.html.erb +3 -14
  41. data/app/views/quick_search/appstats/index.html.erb +3 -23
  42. data/app/views/quick_search/appstats/sessions_details.html.erb +9 -0
  43. data/app/views/quick_search/appstats/sessions_overview.html.erb +9 -0
  44. data/app/views/quick_search/appstats/top_searches.html.erb +3 -32
  45. data/app/views/quick_search/appstats/top_spot.html.erb +7 -7
  46. data/app/views/quick_search/search/_module_with_paging.html.erb +1 -1
  47. data/app/views/quick_search/search/_result_title.html.erb +1 -1
  48. data/config/quicksearch_config.yml.example +3 -0
  49. data/config/routes.rb +31 -3
  50. data/db/migrate/20161201141003_create_sessions.rb +12 -0
  51. data/db/migrate/20161201142811_change_event_columns.rb +11 -0
  52. data/db/migrate/20161201143901_add_session_id_to_searches.rb +5 -0
  53. data/db/migrate/20161212192454_add_date_string_columns.rb +11 -0
  54. data/db/seeds.rb +83 -7
  55. data/lib/generators/quick_search/templates/quick_search_typeahead.js +253 -0
  56. data/lib/generators/quick_search/typeahead_generator.rb +162 -0
  57. data/lib/quick_search/engine.rb +1 -0
  58. data/lib/quick_search/version.rb +1 -1
  59. data/test/dummy/db/schema.rb +25 -6
  60. data/test/dummy/log/benchmark.log +121 -241
  61. data/test/dummy/log/development.log +236 -0
  62. data/test/dummy/tmp/cache/assets/sprockets/v3.0/0b/0bXp2nnjPLNuYQRAMo1RkhNr8RSC8vqZo_7soo0XZTE.cache +1 -0
  63. data/test/dummy/tmp/cache/assets/sprockets/v3.0/3p/3pAfj3gt9c9rLmOrDkMvW2r6Swm5YhuGQ1EN3va9LDE.cache +6 -0
  64. data/test/dummy/tmp/cache/assets/sprockets/v3.0/3r/3r7qg-LCIcD5882b6GKgRTZycpAlhoSNJccVH06yRCQ.cache +3 -0
  65. data/test/dummy/tmp/cache/assets/sprockets/v3.0/{UA/UAOIipK_ejTAUFI6XxASoweyUiC3t64VfVzV-MfsFD8.cache → 4h/4hLiHzJdffGLMZCeIkbisOdFQSyqs54YkoZpBpGotVk.cache} +0 -0
  66. data/test/dummy/tmp/cache/assets/sprockets/v3.0/{Hr/Hr-kCuPY72nIKAdnsDTz9JqXd_z1WL6FSGMAq4HppZg.cache → 5Y/5Yh8GnSzywqhuMWMloKnL9FnuIxa9rBw6hN2Ecv0urw.cache} +0 -0
  67. data/test/dummy/tmp/cache/assets/sprockets/v3.0/8h/8hHsBZ0Il3GVKNj0HgTh-s-XpPVkHrcSY0EJ4v548sk.cache +4 -0
  68. data/test/dummy/tmp/cache/assets/sprockets/v3.0/{fI/fInu_Gja7ik39t207tqj4CtlL0akQRbjD2T7qEtd0zE.cache → 8n/8nKAboU_CeVIX30-Q9BtSV5TXdE07WU8hO0OQ0N3KOs.cache} +0 -0
  69. data/test/dummy/tmp/cache/assets/sprockets/v3.0/{dz/dzCaa80YgyvJINTgsyrVhKv9UQ1OC82GfAsA-IP96iQ.cache → Af/Afug8duevWkZFPkOMnZ5z_IbRT6JMZo4jw1QFmLiXXA.cache} +0 -0
  70. data/test/dummy/tmp/cache/assets/sprockets/v3.0/C2/C24SLDoUbdiHRmPZx5lIZ3XPXmn9FDq7j7gZmbpDtcE.cache +1 -0
  71. data/test/dummy/tmp/cache/assets/sprockets/v3.0/CH/CHuDjj47dHGqRD3uN1JNwnlFyjjEKB09KR6WVsLj2Do.cache +3 -0
  72. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Ci/Cif3NOwhu5i6Qm3iRv2gNJLi_cu8yDVz0Nrq8TZu1tc.cache +3 -0
  73. data/test/dummy/tmp/cache/assets/sprockets/v3.0/FQ/FQWd8V-Pek1LBAfW9vzcG-FpWySsPRhMVzH9DlPxLWU.cache +1 -0
  74. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Fa/FaYEz8CfLTkxVZvnbgKGvJMhhBwNvEgsZgUwaHNRlaQ.cache +0 -0
  75. data/test/dummy/tmp/cache/assets/sprockets/v3.0/IA/IALQq6ICbs3VBSRsaUmGuN73Qv5wDfWTP86VmMh_sVs.cache +0 -0
  76. data/test/dummy/tmp/cache/assets/sprockets/v3.0/K1/K1jnTrW-_s64kqCA6fnoQ-ID-rDaGX34J-TNPyzDbLs.cache +1 -0
  77. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Mz/MzXE1Go_GKyu6AvJPhw394BtPM_jVTf0hMwobBi15tk.cache +1 -0
  78. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Os/OsIhoBDw5N2AWGQ-EMK79tgwPS1AC6Dy_gMSJdOv2Ss.cache +0 -0
  79. data/test/dummy/tmp/cache/assets/sprockets/v3.0/{B5/B5ptGSZGmgHvoK2UDCAtpMhWxJEKxKFhyL9ACeBfzQk.cache → PC/PCth9nzoRrp5GI3Ut8FxlGpXjH63V7k2p4PRwfyu2sQ.cache} +0 -0
  80. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Pw/Pw3Jv2p7MsQz6pttCZig6VMVQ30sRyIDRS-2nM32yqY.cache +3 -0
  81. data/test/dummy/tmp/cache/assets/sprockets/v3.0/RI/RIOgtcuvLAJZl62RvAzqine3jCO3i2qyhswiW2G1bw8.cache +3 -0
  82. data/test/dummy/tmp/cache/assets/sprockets/v3.0/R_/R_6WhfFaPUAOAFfFd4bgUonI5aB4Fa6iOMY2J6G3U98.cache +4 -0
  83. data/test/dummy/tmp/cache/assets/sprockets/v3.0/{pj/pjJDYrBipDo6Tr9_-W4UDzfZZ4UPTy9YpXrBQFRXnlo.cache → S3/S3gPdA-Zqya5r6wNhnlwqGV3B3-GDaA8i1fL_jo66AI.cache} +0 -0
  84. data/test/dummy/tmp/cache/assets/sprockets/v3.0/SS/SS3eYrFE6ghi5G_3POW760Y4BWo5OAaK5QjDrRGXOcs.cache +1 -0
  85. data/test/dummy/tmp/cache/assets/sprockets/v3.0/{jj/jjdQCKZsewws2eRP7b2AVxRMvseOp8djjlDkB8UOtac.cache → Sq/SqjdxmYsdurpx9xk1ks32WEtf3D9_2BysE7RMxnOlmU.cache} +1 -1
  86. data/test/dummy/tmp/cache/assets/sprockets/v3.0/{os/os0qWv3yDfep0e7vVSGTgfn_n3xc4C4QZgmMzLQn0Ks.cache → Ta/TaJnQ_l0sfSsDOyVoi-S-KZQ6vIwzBhmS6hmNA_n8ug.cache} +0 -0
  87. data/test/dummy/tmp/cache/assets/sprockets/v3.0/{o6/o6ZQbq1aBFuVrE2xLbSbyZH2736sWM3Yj4ky9chT1bI.cache → X_/X_CxFXEdZo2C_in7FopAuAbplHn6W_V0SXyVQAMnTzI.cache} +0 -0
  88. data/test/dummy/tmp/cache/assets/sprockets/v3.0/{sR/sRU-UT8qK_38kkiFDXKBPogO1oOZuSvJFH-pgqPL_Ms.cache → Yh/YhRWll6bzgYE6Dmc5fVKbHyv5om4y3-27UrWeUbQcGk.cache} +0 -0
  89. data/test/dummy/tmp/cache/assets/sprockets/v3.0/{OD/ODHapE0li3WI1laVJoksoI5nmQd-8dDJXq_VxS4XefE.cache → _u/_uiA10I5HyJR94Tbc4a06CzdrQCAXX7Iz86WS5PKDQo.cache} +0 -0
  90. data/test/dummy/tmp/cache/assets/sprockets/v3.0/ai/ainCVF4dxXf85KoOLUSHvMMGg0qBNc7Vg-s-9v2ENJI.cache +4 -0
  91. data/test/dummy/tmp/cache/assets/sprockets/v3.0/cQ/cQqt0ri9GFvVnIs1pJUugIJs5tDuGQMMntW5CwpK6YY.cache +1 -0
  92. data/test/dummy/tmp/cache/assets/sprockets/v3.0/{1n/1nStVaWIQEwAlksUpB1fInwq6v3TikPvuRaSwwCnCLQ.cache → e0/e0Y2Gz8ftaW2O0RjoN2iWguitI-JQZckScAZqlQYkng.cache} +0 -0
  93. data/test/dummy/tmp/cache/assets/sprockets/v3.0/iH/iHnlNNY3rfdbVqt8LZBfcDQYONR8dA8LmxA9fv5paro.cache +2 -0
  94. data/test/dummy/tmp/cache/assets/sprockets/v3.0/{F0/F0oWBwLHpGFYNNtnGav-dJFH8rMDpNA5L8_aWm5Wq34.cache → ir/irxgIDPIY6Wz6fHWYp1dIrqAT1_8oa6-oiwqbFE_e-w.cache} +0 -0
  95. data/test/dummy/tmp/cache/assets/sprockets/v3.0/kn/knUtyVrg7nMIPldZa4MHhe7cC9eMchLZS4mc5HDWgDY.cache +1 -0
  96. data/test/dummy/tmp/cache/assets/sprockets/v3.0/ks/ks4DoIuUV6oUzoiXoPh7sW1k5ExNoUkR7ICjwuRnAT0.cache +1 -0
  97. data/test/dummy/tmp/cache/assets/sprockets/v3.0/m3/m375QQakjXd_2Trpvdot-i90nmeCCh0HWtzS66ZvxUU.cache +1 -0
  98. data/test/dummy/tmp/cache/assets/sprockets/v3.0/rQ/rQ_FgYkT2hdw9A6XmJKGgVb2dMtCrWWHwtS0X1_kdl0.cache +1 -0
  99. data/test/dummy/tmp/cache/assets/sprockets/v3.0/{pw/pwiIhcWPwTuy5Miz5zqOQGYFx-K3TbaCVQ6ls7EBkk0.cache → rU/rUqFWwHqrT5jeIFCEezOPsMMZiAU7ri6RKBGS2ezAfg.cache} +0 -0
  100. data/test/dummy/tmp/cache/assets/sprockets/v3.0/{pO/pO8hHVwybv1ZJBdPa2YC6bjqmk020OYFl85TYxtmrWQ.cache → rq/rqf5-J6k_zLc9ZlUgMj28nviKtRsko3-iEp_m_uNeY0.cache} +0 -0
  101. data/test/dummy/tmp/cache/assets/test/sprockets/13fe41fee1fe35b49d145bcc06610705 +0 -0
  102. data/test/dummy/tmp/cache/assets/test/sprockets/2f5173deea6c795b8fdde723bb4b63af +0 -0
  103. data/test/dummy/tmp/cache/assets/test/sprockets/357970feca3ac29060c1e3861e2c0953 +0 -0
  104. data/test/dummy/tmp/cache/assets/test/sprockets/cffd775d018f68ce5dba1ee0d951a994 +0 -0
  105. data/test/dummy/tmp/cache/assets/test/sprockets/d771ace226fc8215a3572e0aa35bb0d6 +0 -0
  106. data/test/dummy/tmp/cache/assets/test/sprockets/f7cbd26ba1d28d48de824f0e94586655 +0 -0
  107. metadata +143 -119
  108. data/app/assets/javascripts/quick_search/appstats.js +0 -8
  109. data/app/views/quick_search/appstats/_click_count_table.html.erb +0 -23
  110. data/app/views/quick_search/appstats/_top_spot_report_table.html.erb +0 -33
  111. data/app/views/quick_search/appstats/module_click_detail.html.erb +0 -32
  112. data/app/views/quick_search/appstats/top_spot_detail.html.erb +0 -35
  113. data/test/dummy/tmp/cache/assets/sprockets/v3.0/0_/0_w_ydOOEFQOoETxJa-IxKppQocaiDwM5V08djCPYso.cache +0 -3
  114. data/test/dummy/tmp/cache/assets/sprockets/v3.0/3m/3mWfBeEpm_bJvaPQZYvnnAVtE_2helOWh_Tv-cEflrk.cache +0 -5
  115. data/test/dummy/tmp/cache/assets/sprockets/v3.0/4s/4sg52OgD5l4qx4GnojCVxg2itqwqb-KRanEdmdMus3Y.cache +0 -0
  116. data/test/dummy/tmp/cache/assets/sprockets/v3.0/5U/5UPnsccuZFLk9OqbmFMvB55mbvGptApx9Z55HWjEN90.cache +0 -3
  117. data/test/dummy/tmp/cache/assets/sprockets/v3.0/9a/9acKNgyVD8_WK401tMy6Ce98g-LS4VpwFvGQdzCV9mI.cache +0 -0
  118. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Ba/BaymviI8cwAJQMOIzWCf6Lt-PM2sNFTvY9hQKsfDNNw.cache +0 -3
  119. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Dd/DdFHg3C_voetfvKGKX7t8PGzZlkO45-huHNtaou5rxg.cache +0 -1
  120. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Fp/FprCQeeZguht46WNSpA3Y3JHKehovFXrj63nDrvvwFE.cache +0 -1
  121. data/test/dummy/tmp/cache/assets/sprockets/v3.0/GJ/GJrfWiarIi0Dt6sdKVMfUF1cdZ6NbqZxXHhzNbFtpBw.cache +0 -1
  122. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Gp/GpoziOxxB-hisco0rl7Nnsnw0UWud7R9Yge2Q3o1eN4.cache +0 -2
  123. data/test/dummy/tmp/cache/assets/sprockets/v3.0/It/It5VkJv-53-LICLKZWWyp2WcbD86DGotAL0MY3hhfpg.cache +0 -6
  124. data/test/dummy/tmp/cache/assets/sprockets/v3.0/O6/O6dw148Xya7NYlsRFMEzJyvRcySM6iOL1jRUpdQo9B8.cache +0 -1
  125. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Oj/OjMkKTW7OkthjJAQHDID8GV30IZC9F0dJ1zGiFame9U.cache +0 -4
  126. data/test/dummy/tmp/cache/assets/sprockets/v3.0/SU/SUtZ_ltPqy9A9A-_zqNPhNPvjxCOnrdqXHSZv5S9mOk.cache +0 -1
  127. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Tv/TvZgmm69VEMHUJQIBoij61oXMkgzp6whVo7l8mJ9qpw.cache +0 -3
  128. data/test/dummy/tmp/cache/assets/sprockets/v3.0/YJ/YJZdK01T1KTS84Mb6p_2TasmJNZeGZc4FMtBPCKGr_M.cache +0 -3
  129. data/test/dummy/tmp/cache/assets/sprockets/v3.0/ah/ahhhd3ysbQmVDNzq2L_rb4t6rqqdnqeY6ujztBoZDA8.cache +0 -1
  130. data/test/dummy/tmp/cache/assets/sprockets/v3.0/gv/gvZKkbgiExbcQrT4eo0HB-j4JoDRAxdmDjKRxeEdK0Y.cache +0 -1
  131. data/test/dummy/tmp/cache/assets/sprockets/v3.0/hj/hj_r-O1QjHJIPcZVnlB_FGPdIRAi9NkxpT2oXDRIsGE.cache +0 -1
  132. data/test/dummy/tmp/cache/assets/sprockets/v3.0/o2/o2V1ahk8vFR6sXWNh5BB7w6MBj04zCyX-o1xFZONydE.cache +0 -1
  133. data/test/dummy/tmp/cache/assets/sprockets/v3.0/tE/tEO71oPPFXN_2c4p39nU0OiF9ARg13fjdQlnPqAx1KY.cache +0 -4
  134. data/test/dummy/tmp/cache/assets/sprockets/v3.0/tW/tWFRsAv4WWu2ch-x3AJZd3KOvBXG3MwH6Q6Xn-tFBtw.cache +0 -1
  135. data/test/dummy/tmp/cache/assets/sprockets/v3.0/x6/x6W754ylumshr3wBUHHmcgyWs8UR3Od7FaI6tqvjKmk.cache +0 -1
  136. data/test/dummy/tmp/cache/assets/sprockets/v3.0/yy/yyJ1P7RQciOiW8TgQiu1RMDdbWd4rqxd2BGU9HkY3L8.cache +0 -0
@@ -0,0 +1,481 @@
1
+ <% url_helper = QuickSearch::Engine.routes.url_helpers %>
2
+
3
+ (function() {
4
+ var Globals = {};
5
+
6
+ $(document).on("turbolinks:load", function() {
7
+ if ($("#graph_sessions_overview").length) {
8
+ d3.select("#sessIconContainer").append("i")
9
+ .attr("class", "fa fa-spinner fa-spin fa-5x fa-fw big-icon")
10
+ .attr("id", "sessIcon");
11
+ // Redraw graph if the date range is changed
12
+ document.getElementById("dateButton").addEventListener("click", function() {
13
+ var from = $("#from").datepicker("getDate");
14
+ var to = new Date($("#to").datepicker("getDate").getTime() + 1000*60*60*24);
15
+ document.getElementById("numDays").innerHTML = "" + parseInt((to-from)/(1000*60*60*24));
16
+ $.ajax({
17
+ type: "GET",
18
+ contentType: "application/json; charset=utf-8",
19
+ url: '<%= url_helper.data_sessions_overview_path %>',
20
+ dataType: "json",
21
+ data: {
22
+ "start_date": from,
23
+ "end_date": to
24
+ },
25
+ success: function(sessionsDataSet) {
26
+ var dataMain = _.cloneDeep(sessionsDataSet);
27
+ draw_graph_sessions_overview(dataMain, false, true);
28
+ },
29
+ error: function(result) {
30
+ error();
31
+ }
32
+ });
33
+ });
34
+ $.ajax({
35
+ type: "GET",
36
+ contentType: "application/json; charset=utf-8",
37
+ url: '<%= url_helper.data_sessions_overview_path %>',
38
+ dataType: "json",
39
+ success: function(sessionsDataSet) {
40
+ d3.select("#sessIcon").transition().duration(250)
41
+ .style("opacity", .000001)
42
+ .remove();
43
+ var dataMain = _.cloneDeep(sessionsDataSet);
44
+
45
+ draw_graph_sessions_overview(dataMain, false, false);
46
+
47
+ if ($("#graph_sessions_overview").length) {
48
+ document.getElementById("onCampus").addEventListener("click", process_filters);
49
+ document.getElementById("offCampus").addEventListener("click", process_filters);
50
+ document.getElementById("isMobile").addEventListener("click", process_filters);
51
+ document.getElementById("notMobile").addEventListener("click", process_filters);
52
+ }
53
+ },
54
+ error: function(result) {
55
+ error();
56
+ }
57
+ });
58
+ }
59
+ });
60
+
61
+ function error() {
62
+ console.log("Error retrieving data");
63
+ }
64
+
65
+ function draw_graph_sessions_overview(dataShared, transitioning, dateUpdated) {
66
+ if ($("#graph_sessions_overview").length) {
67
+ // General Variables
68
+ var svg; // SVG to contain graph
69
+ var dataInt; // Internal reference to graph dataset
70
+ // Dimension Variables
71
+ var margin; // Blank space around top graph (focus)
72
+ var margin2; // Blank space around bottom graph (context)
73
+ var width; // Drawable width of focus/context (not including margins)
74
+ var height; // Drawable height of focus (not including margins)
75
+ var height2; // Drawable height of context (not including margins)
76
+ // Date Variables
77
+ var parseDate; // Function to parse dates into proper format
78
+ var dateRange; // Range of dates in data set
79
+ var numDays; // Number of days in range
80
+ // Scale Variables
81
+ var x; // X-scale for focus graph
82
+ var x2; // X-scale for context graph
83
+ var y; // Y-scale for focus graph
84
+ var y2; // Y-scale for context graph
85
+ // Brush and Zoom Variables
86
+ var brush; // Object that allows domain selection by brush movement
87
+ var zoom; // Object that allows domain selection by zooming
88
+ // Axis Variables
89
+ var xAxis; // X-axis for focus graph
90
+ var xAxis2; // X-axis for context graph
91
+ var yAxis; // Y-axis for focus graph
92
+ // Area Variables
93
+ var area; // Area for focus graph
94
+ var area2; // Area for context graph
95
+ // Selection Variables
96
+ var gAllSelection; // Selection for overarching group
97
+ var gAll; // Group containing all elements
98
+ var focusSelection; // Selection for focus group
99
+ var focus; // Group containing all focus elements
100
+ var contextSelection; // Selection for context group
101
+ var context; // Group containing all context elements
102
+ var clipSelection; // Selection for clip path
103
+ var xAxisSelection; // Selection for xAxis
104
+ var yAxisSelection; // Selection for yAxis
105
+ var titleSelection; // Selection for title
106
+ var focusPathSelection; // Selection for focus path (area)
107
+ var xAxis2Selection; // Selection for xAxis2
108
+ var contextPathSelection; // Selection for context path (area)
109
+ var brushSelection; // Selection for brush
110
+ var zoomSelection; // Selection for zoom
111
+
112
+ // Initialize General Variables ///////////////////////////////////////////////////////////
113
+ svg = d3.select("#graph_sessions_overview");
114
+
115
+ dataInt = dataShared;
116
+
117
+ // Initialize Dimension Variables /////////////////////////////////////////////////////////
118
+ margin = {
119
+ top: 40,
120
+ right: 20,
121
+ bottom: 110,
122
+ left: 40
123
+ };
124
+ margin2 = {
125
+ top: 430,
126
+ right: 20,
127
+ bottom: 30,
128
+ left: 40
129
+ };
130
+ width = +svg.attr("width") - margin.left - margin.right;
131
+ height = +svg.attr("height") - margin.top - margin.bottom;
132
+ height2 = +svg.attr("height") - margin2.top - margin2.bottom;
133
+
134
+ // Initialize Date Variables and Parse Dates //////////////////////////////////////////////
135
+ parseDate = d3.timeParse("%Y-%m-%d");
136
+
137
+ dataInt.forEach(function(d) {
138
+ d.date = parseDate(d.date);
139
+ });
140
+
141
+ // Initialize Scale Variables /////////////////////////////////////////////////////////////
142
+ x = d3.scaleTime().range([0, width]);
143
+ x2 = d3.scaleTime().range([0, width]);
144
+ y = d3.scaleLinear().range([height, 0]);
145
+ y2 = d3.scaleLinear().range([height2, 0]);
146
+
147
+ // Set domains
148
+ x2.domain(d3.extent(dataInt, function(d) {
149
+ return d.date;
150
+ }));
151
+ if (_.isEqual(undefined, Globals.Domain)) {
152
+ x.domain(d3.extent(dataInt, function(d) {
153
+ return d.date;
154
+ }));
155
+ } else {
156
+ var lb, ub;
157
+ if (Globals.Domain[0] < x2.domain()[0]) {
158
+ lb = x2.domain()[0];
159
+ } else {
160
+ lb = Globals.Domain[0];
161
+ }
162
+ if (Globals.Domain[1] > x2.domain()[1]) {
163
+ ub = x2.domain()[1];
164
+ } else {
165
+ ub = Globals.Domain[1];
166
+ }
167
+ if(Globals.Domain[0]>x2.domain()[1] || Globals.Domain[1]<x2.domain()[0]) {
168
+ lb = x2.domain()[0];
169
+ ub = x2.domain()[1];
170
+ }
171
+ x.domain([lb, ub]);
172
+ }
173
+ y.domain([0, d3.max(dataInt, function(d) {
174
+ return d.count;
175
+ })]);
176
+ y2.domain(y.domain());
177
+
178
+
179
+ // Initialize Brush and Zoom Variables ////////////////////////////////////////////////////
180
+ brush = d3.brushX()
181
+ .extent([
182
+ [0, 0],
183
+ [width, height2]
184
+ ])
185
+ .on("brush end", brushed);
186
+
187
+ zoom = d3.zoom()
188
+ .scaleExtent([1, 1000])
189
+ .translateExtent([
190
+ [0, 0],
191
+ [width, height]
192
+ ])
193
+ .extent([
194
+ [0, 0],
195
+ [width, height]
196
+ ])
197
+ .on("zoom", zoomed);
198
+
199
+ // Initialize Axis Variables //////////////////////////////////////////////////////////////
200
+ xAxis = d3.axisBottom(x);
201
+ xAxis2 = d3.axisBottom(x2);
202
+ yAxis = d3.axisLeft(y);
203
+
204
+ // Initialize Area Variables //////////////////////////////////////////////////////////////
205
+ area = d3.area()
206
+ .curve(d3.curveMonotoneX)
207
+ .x(function(d) {
208
+ return x(d.date);
209
+ })
210
+ .y0(height)
211
+ .y1(function(d) {
212
+ return y(d.count);
213
+ });
214
+
215
+ area2 = d3.area()
216
+ .curve(d3.curveMonotoneX)
217
+ .x(function(d) {
218
+ return x2(d.date);
219
+ })
220
+ .y0(height2)
221
+ .y1(function(d) {
222
+ return y2(d.count);
223
+ });
224
+
225
+ // Make overarching group /////////////////////////////////////////////////////////////////
226
+ gAllSelection = svg.selectAll(".gAll").data([dataInt]);
227
+
228
+ gAllSelection.exit().transition().duration(500)
229
+ .style("opacity", .000001)
230
+ .remove();
231
+ gAllSelection.enter().append("g")
232
+ .attr("class", "gAll")
233
+ .attr("transform", "translate(0,0)");
234
+
235
+ gAll = svg.select(".gAll");
236
+
237
+ // Make focus
238
+ focusSelection = gAll.selectAll(".focus").data([dataInt]);
239
+
240
+ focusSelection.exit().transition().duration(500)
241
+ .style("opacity", .000001)
242
+ .remove();
243
+ focusSelection.enter().append("g")
244
+ .attr("class", "focus")
245
+ .attr("transform", "translate(" + margin.left + "," + margin.top + ")");
246
+
247
+ focus = gAll.select(".focus");
248
+
249
+ // Make context
250
+ contextSelection = gAll.selectAll(".context").data([dataInt]);
251
+
252
+ contextSelection.exit().transition().duration(500)
253
+ .style("opacity", .000001)
254
+ .remove();
255
+ contextSelection.enter().append("g")
256
+ .attr("class", "context")
257
+ .attr("transform", "translate(" + margin2.left + "," + margin2.top + ")");
258
+
259
+ context = gAll.select(".context");
260
+
261
+ // Make clip path
262
+ clipSelection = gAll.selectAll("defs").data([dataInt]);
263
+
264
+ clipSelection.exit().transition().duration(500)
265
+ .style("opacity", .000001)
266
+ .remove();
267
+ clipSelection.enter().append("defs").append("clipPath")
268
+ .attr("id", "clip")
269
+ .append("rect")
270
+ .attr("width", width)
271
+ .attr("height", height);
272
+
273
+ // Make focus x axis
274
+ xAxisSelection = focus.selectAll(".xAxis").data([dataInt]);
275
+
276
+ xAxisSelection.transition().duration(750)
277
+ .call(xAxis);
278
+ xAxisSelection.exit().transition().duration(500)
279
+ .style("opacity", .000001)
280
+ .remove();
281
+ xAxisSelection.enter().append("g")
282
+ .style("opacity", .000001)
283
+ .attr("class", "xAxis")
284
+ .attr("transform", "translate(0," + height + ")")
285
+ .call(xAxis)
286
+ .transition().duration(500)
287
+ .style("opacity", 1);
288
+
289
+ // Make focus y axis
290
+ yAxisSelection = focus.selectAll(".yAxis").data([dataInt]);
291
+
292
+ yAxisSelection.transition().duration(750)
293
+ .call(yAxis);
294
+ yAxisSelection.exit().transition().duration(500)
295
+ .style("opacity", .000001)
296
+ .remove();
297
+ yAxisSelection.enter().append("g")
298
+ .style("opacity", .000001)
299
+ .attr("class", "yAxis")
300
+ .attr("transform", "translate(0,0)")
301
+ .call(yAxis)
302
+ .transition().duration(500)
303
+ .style("opacity", 1);
304
+
305
+ // Make focus path
306
+ focusPathSelection = focus.selectAll(".area").data([dataInt]);
307
+
308
+ focusPathSelection.datum(dataInt).transition().duration(750)
309
+ .attr("d", area);
310
+ focusPathSelection.exit().transition().duration(500)
311
+ .style("opacity", .000001)
312
+ .remove();
313
+ focusPathSelection.enter().append("path")
314
+ .style("opacity", .000001)
315
+ .datum(dataInt)
316
+ .attr("class", "area")
317
+ .transition().duration(500)
318
+ .style("opacity", 1);;
319
+
320
+ // Make context x axis
321
+ xAxis2Selection = context.selectAll(".xAxis").data([dataInt]);
322
+
323
+ xAxis2Selection.transition().duration(500)
324
+ .call(xAxis2);
325
+ xAxis2Selection.exit().transition().duration(500)
326
+ .style("opacity", .000001)
327
+ .remove();
328
+ xAxis2Selection.enter().append("g")
329
+ .style("opacity", .000001)
330
+ .attr("class", "xAxis")
331
+ .attr("transform", "translate(0," + height2 + ")")
332
+ .call(xAxis2)
333
+ .transition().duration(500)
334
+ .style("opacity", 1);
335
+
336
+ // Make context path
337
+ contextPathSelection = context.selectAll(".area").data([dataInt]);
338
+
339
+ contextPathSelection.datum(dataInt).transition().duration(750)
340
+ .attr("d", area2);
341
+ contextPathSelection.exit().transition().duration(500)
342
+ .style("opacity", .000001)
343
+ .remove();
344
+ contextPathSelection.enter().append("path")
345
+ .style("opacity", .000001)
346
+ .datum(dataInt)
347
+ .attr("class", "area")
348
+ .attr("d", area2)
349
+ .transition().duration(500)
350
+ .style("opacity", 1);
351
+
352
+ // Make brush container
353
+ brushSelection = context.selectAll(".brush").data([dataInt]);
354
+
355
+ brushSelection.exit().transition().duration(500)
356
+ .style("opacity", .000001)
357
+ .remove();
358
+ brushSelection.enter().append("g")
359
+ .attr("class", "brush")
360
+ .call(brush)
361
+ .call(brush.move, x.range())
362
+ .merge(brushSelection)
363
+ .style("opacity", 1)
364
+ .call(brush);
365
+
366
+ // Misc ///////////////////////////////////////////////////////////////////////////////////
367
+ // Have to prevent zoom or brush temporarily for transitions to execute
368
+ if (transitioning) {
369
+ setTimeout(function() {
370
+ transitioning = false;
371
+ }, 50);
372
+ } // If not on transition, fade in brush
373
+ else {
374
+ svg.selectAll(".brush")
375
+ .style("opacity", .000001)
376
+ .transition().duration(500)
377
+ .style("opacity", 1);
378
+ }
379
+
380
+ // Before updating domains, move brush to domain it was previously set to
381
+ if (dateUpdated) {
382
+ var lb, ub;
383
+ if (x2(Globals.Domain[0]) < 0) {
384
+ lb = 0;
385
+ } else {
386
+ lb = x2(Globals.Domain[0]);
387
+ }
388
+ if (x2(Globals.Domain[1]) > width) {
389
+ ub = width;
390
+ } else {
391
+ ub = x2(Globals.Domain[1]);
392
+ }
393
+ if(Globals.Domain[0]>x2.domain()[1] || Globals.Domain[1]<x2.domain()[0]) {
394
+ lb = 0;
395
+ ub = width;
396
+ }
397
+ context.select(".brush").call(brush.move, [lb, ub]);
398
+ context.select(".brush").transition().duration(500)
399
+ .style("opacity", 1);
400
+ }
401
+
402
+ // Make zoom container
403
+ zoomSelection = gAll.selectAll(".zoom").data([dataInt]);
404
+
405
+ zoomSelection.exit().transition().duration(500)
406
+ .style("opacity", .000001)
407
+ .remove();
408
+ zoomSelection.enter().append("rect")
409
+ .attr("class", "zoom")
410
+ .attr("width", width)
411
+ .attr("height", height)
412
+ .attr("transform", "translate(" + margin.left + "," + margin.top + ")")
413
+ .merge(zoomSelection)
414
+ .call(zoom);
415
+
416
+
417
+ function brushed() {
418
+ if (!transitioning) {
419
+ if (d3.event.sourceEvent && d3.event.sourceEvent.type === "zoom") return;
420
+ var s = d3.event.selection || x2.range();
421
+ x.domain(s.map(x2.invert, x2));
422
+ Globals.Domain = x.domain();
423
+ focus.select(".area").attr("d", area);
424
+ focus.select(".xAxis").call(xAxis);
425
+ svg.select(".zoom").call(zoom.transform, d3.zoomIdentity
426
+ .scale(width / (s[1] - s[0]))
427
+ .translate(-s[0], 0));
428
+ }
429
+ }
430
+
431
+ function zoomed() {
432
+ if (!transitioning) {
433
+ if (d3.event.sourceEvent && d3.event.sourceEvent.type === "brush") return;
434
+ var t = d3.event.transform;
435
+ x.domain(t.rescaleX(x2).domain());
436
+ Globals.Domain = x.domain();
437
+ focus.select(".area").attr("d", area);
438
+ focus.select(".xAxis").call(xAxis);
439
+ context.select(".brush").call(brush.move, x.range().map(t.invertX, t));
440
+ }
441
+ }
442
+ }
443
+ }
444
+
445
+ function process_filters() {
446
+ var onCampus = document.getElementById("onCampus");
447
+ var offCampus = document.getElementById("offCampus");
448
+ var isMobile = document.getElementById("isMobile");
449
+ var notMobile = document.getElementById("notMobile");
450
+
451
+ if(this==onCampus && offCampus.checked) { offCampus.checked = false; }
452
+ if(this==offCampus && onCampus.checked) { onCampus.checked = false; }
453
+ if(this==isMobile && notMobile.checked) { notMobile.checked = false; }
454
+ if(this==notMobile && isMobile.checked) { isMobile.checked = false; }
455
+
456
+ var from = $("#from").datepicker("getDate");
457
+ var to = new Date($("#to").datepicker("getDate").getTime() + 1000*60*60*24);
458
+ $.ajax({
459
+ type: "GET",
460
+ contentType: "application/json; charset=utf-8",
461
+ url: '<%= url_helper.data_sessions_overview_path %>',
462
+ dataType: "json",
463
+ data: {
464
+ "start_date": from,
465
+ "end_date": to,
466
+ "onCampus": onCampus.checked?1:0,
467
+ "offCampus": offCampus.checked?1:0,
468
+ "isMobile": isMobile.checked?1:0,
469
+ "notMobile": notMobile.checked?1:0
470
+ },
471
+ success: function(sessionsDataSet) {
472
+ var dataMain = _.cloneDeep(sessionsDataSet);
473
+ draw_graph_sessions_overview(dataMain, true, false);
474
+ },
475
+ error: function(result) {
476
+ error();
477
+ }
478
+ });
479
+ }
480
+
481
+ })();