quick_search-core 0.1.1 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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
+ })();