From 266d0462185aa4fede11cce99a0561bfb43fe4af Mon Sep 17 00:00:00 2001
From: Mateus Rambo Strey <mars11@inf.ufpr.br>
Date: Thu, 15 Oct 2015 11:00:18 -0300
Subject: [PATCH] fix search history back

---
 app/assets/javascripts/application/search.js  | 60 +++++-------
 .../stylesheets/application/search.scss       | 97 +------------------
 app/views/layouts/application.html.erb        |  2 +-
 app/views/search/_fetch.html.erb              |  3 +-
 app/views/search/index.html.erb               | 21 ++--
 5 files changed, 38 insertions(+), 145 deletions(-)

diff --git a/app/assets/javascripts/application/search.js b/app/assets/javascripts/application/search.js
index 967cc5ce5..d13ca48cc 100644
--- a/app/assets/javascripts/application/search.js
+++ b/app/assets/javascripts/application/search.js
@@ -12,7 +12,8 @@ var search = function() {
     }
 
     // change url with new parameters
-    searchState(params);
+    if (!fetch_init) { fetch_init = true}
+    else if (!append) { searchState(params); }
 
     $.ajax({
       url:"/search/fetch",
@@ -23,6 +24,7 @@ var search = function() {
           $('.search-more').remove();
         }
         else {
+          $('.result-info').hide();
           $("#search-fetch").empty();
         }
         $('#search-fetch').append('<div class="search-loading" style="text-align:center;"><br><div class="pong-loader">Carregando...</div></div>');
@@ -34,6 +36,8 @@ var search = function() {
         }
         else {
           $("#search-fetch").empty();
+          $('.result-info-count').html($(data).filter('input:hidden[name="learning-objects-count"]').val());
+          $('.result-info').show();
         }
 
         $("#search-fetch").append(data);
@@ -49,15 +53,12 @@ var search = function() {
     var has_init = false;
 
     function init() {
-      // init when document is ready
-      $(document).ready(function () {
-        // check url and set inputs with params
-        checkUrl();
-
-        watchSearchInput();
-        watchOrder();
-        watchFilters();
-      });
+      // check url and set inputs with params
+      checkUrl();
+
+      watchSearchInput();
+      watchOrder();
+      watchFilters();
     }
 
     // get parameters from url when page is loaded
@@ -107,6 +108,7 @@ var search = function() {
       watchCheckbox('school_year', 'filter-school-year');
     }
 
+    // control ajax requisitions (fetch) of filters
     function filtersFetchInterval() {
       // cancel previous function call
       clearInterval(intervalId);
@@ -114,7 +116,7 @@ var search = function() {
         searchFetch();
         // cancel to not loop (interval)
         clearInterval(intervalId);
-      }, 800 );
+      }, 800);
     }
 
     function watchFilterSubject() {
@@ -174,7 +176,7 @@ var search = function() {
         $('.search-more').on('click', function (event) {
           event.preventDefault();
           params.add('page', params.get('page') + 1);
-          searchFetch(true);
+          searchFetch();
         });
       }
     }
@@ -183,38 +185,24 @@ var search = function() {
   //// INIT
   // initiate params
   var params = searchParameters();
+  var fetch_init = false;
 
-  // init when document is ready
-  $(document).ready(function () {
-    // return previous state when back
-    $(window).on("popstate", function(e) {
-      var original = e.originalEvent.state;
-      history.replaceState(original, original.url, original.url);
-      searchFetch();
-    });
+  // run watchers
+  searchWatchers().init();
 
-    // run watchers
-    searchWatchers().init();
-  });
+  // TODO: find a way to manage all requisitions without page reload
 };
 
 //// SEARCH STATE
 // take care of History API
 var searchState = function(params, replace) {
-  if (replace === undefined) {
-    replace = false;
-  }
-
-  var newState = history.state;
+  if ((replace === undefined) || (replace !== true)) { replace = false; }
+  var newState = JSON.parse(JSON.stringify(history.state));
   newState.url = params.url();
   newState.search_params = params.get();
 
-  if (replace) {
-    history.replaceState(newState, newState.url, newState.url);
-  }
-  else {
-    history.pushState(newState, newState.url, newState.url);
-  }
+  if (replace) { history.replaceState(newState, location.href, location.href); }
+  else { history.pushState(newState, newState.url, newState.url); }
 }
 
 //// SEARCH PARAMETERS
@@ -318,12 +306,14 @@ var searchParameters = function() {
 
 //// DROPDOWN
 var runDropdown = function(element) {
-  if ($(element).next().is(':hidden')) {
+  if (($(element).next().data('dropdown') === 'closed')) {
     $('> .caret', element).addClass('caret-up');
     $(element).next().slideDown();
+    $(element).next().data('dropdown', 'open');
   }
   else {
     $('> .caret', element).removeClass('caret-up');
     $(element).next().slideUp();
+    $(element).next().data('dropdown',  'closed');
   }
 };
diff --git a/app/assets/stylesheets/application/search.scss b/app/assets/stylesheets/application/search.scss
index c955e0154..440e34380 100644
--- a/app/assets/stylesheets/application/search.scss
+++ b/app/assets/stylesheets/application/search.scss
@@ -1,12 +1,12 @@
 
 .search-sidebar {
   margin-top: 40px;
+  display: none;
 
   .dropdown-element {
     width: 95%;
     margin-left: 3%;
   }
-
 }
 
 .nestedAccordion {
@@ -31,98 +31,3 @@
   color: #59585A;
   padding-right: 20px;
 }
-
-// #nestedAccordion{
-//   width:100%;
-// }
-// #nestedAccordion h2, #nestedAccordion h3,
-// #nestedAccordion div, #nestedAccordion ol,
-// #nestedAccordion li{
-//   /* reset styles for accordion */
-//   margin:0;
-//   padding:0;
-//   font-size:1em;
-//   font-weight:normal;
-//   list-style:none;
-// }
-// #nestedAccordion div{
-//   color:#555;/*#555 #003300*/
-//   overflow:hidden;
-//   display:none;
-// }
-//
-// #nestedAccordion h2{
-//   cursor:pointer;
-//   color:#fff;
-//   font-size:1.1em;
-//   moz-border-radius: 5px 5px 0 0;
-//   -webkit-border-radius: 5px 5px 0 0;
-//   border-radius: 5px 5px 0 0;
-//   padding:3px;
-//   margin-top:5px;
-//   background-color: #3F434F;
-//   background-image: -webkit-gradient(linear, left top, left bottom, from(#4B8CFF), to(#447FE8));
-//   background-image: -webkit-linear-gradient(top, #4B8CFF, #447FE8);/*#4B8CFF, #447FE8*/
-//   background-image: -moz-linear-gradient(top, #4B8CFF, #447FE8);
-//   background-image: -ms-linear-gradient(top, #4B8CFF, #447FE8);
-//   background-image: -o-linear-gradient(top, #4B8CFF, #447FE8);
-//   background-image: linear-gradient(to bottom, #4B8CFF, #447FE8);
-//   background-image: url("arrow.ico");
-//     background-repeat: no-repeat;
-//     background-position: right bottom;
-// }
-// #nestedAccordion h3{
-//   cursor:pointer;
-//   padding:4px;
-//   color: #666;
-//   text-shadow: 0 1px 0 rgba(255, 255, 255, .5);
-//   background-color: #f5f5f5;
-//   background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#ededed));
-//   background-image: -webkit-linear-gradient(top, #f5f5f5, #ededed);
-//   background-image: -moz-linear-gradient(top, #f5f5f5, #ededed);
-//   background-image: -ms-linear-gradient(top, #f5f5f5, #ededed);
-//   background-image: -o-linear-gradient(top, #f5f5f5, #ededed);
-//   background-image: linear-gradient(to bottom, #f5f5f5, #ededed);
-//
-// }
-// #nestedAccordion h3:hover{
-//   color:#000;
-// }
-// #nestedAccordion h3 + div{
-//   display:none;
-//   background-color:#F5F5F5;
-//   padding:5px 5px 5px 30px;
-// }
-// #nestedAccordion li:hover{
-//   color:#000;
-//   cursor:pointer;
-// }
-// #nestedAccordion h2 +div.aberto{
-//   display:inherit;
-// }
-// ///Contrast
-// .contraste{
-//   .thumbnail{
-//     background-color: black !important;
-//   }
-//   .navbar{
-//     select{
-//       color: black;
-//     }
-//   }
-//   #nestedAccordion{
-//     div{
-//       background-color: black !important;
-//       color: white !important;
-//     }
-//     h3{
-//       color: white;
-//       background-color: black !important;
-//       background-image: none !important;
-//       border-bottom: 1px solid white;
-//     }
-//     h3:hover{
-//       color: white;
-//     }
-//   }
-// }
diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb
index 0b1b153b9..4bf39a06f 100644
--- a/app/views/layouts/application.html.erb
+++ b/app/views/layouts/application.html.erb
@@ -8,7 +8,7 @@
   <%= csrf_meta_tags %>
   <meta property="creator.productor" content="http://estruturaorganizacional.dados.gov.br/id/unidade-organizacional/1">
 </head>
-<body>
+<body <%= yield(:body_attributes) %>>
 <%= render 'shared/application/header' %>
 
 <% if user_signed_in? %>
diff --git a/app/views/search/_fetch.html.erb b/app/views/search/_fetch.html.erb
index 64b030930..c13adc834 100644
--- a/app/views/search/_fetch.html.erb
+++ b/app/views/search/_fetch.html.erb
@@ -1,2 +1,3 @@
+<input type="hidden" name="learning-objects-count" value="<%= @result.total_count %>"/>
 <%= render @objects, orientation: "horizontal" %>
-<a href="javascript:void(0);" class="btn btn-primary search-more">Ver mais</a>
+<%= link_to "ver mais", "javascript:void(0);", class: "btn btn-primary search-more" unless @objects.blank? %>
diff --git a/app/views/search/index.html.erb b/app/views/search/index.html.erb
index 38ebb7b42..9b24323a1 100644
--- a/app/views/search/index.html.erb
+++ b/app/views/search/index.html.erb
@@ -1,3 +1,4 @@
+<%= content_for(:body_attributes) do %> data-no-turbolink <% end %>
 <div class="row">
   <div class="col-sm-4 search-sidebar" id="menu-left">
     <!-- <h2>Busca Avançada</h2> -->
@@ -265,7 +266,7 @@
           <form method="get">
             <input type="hidden" name="qry" value="<%= params["qry"] %>">
 
-            <select class="order" class="sort-dropdown" name="order">
+            <select class="order sort-dropdown" name="order">
               <option value="">ordenar resultados</option>
               <option value="author">autores</option>
               <option value="publicationasc">mais novos</option>
@@ -283,17 +284,13 @@
   </div>
 </div>
 
-
 <script type="text/javascript">
-  $(document).ready(function () {
-    runDropdown($('.nestedAccordion .dropdown'));
-
-    $(".select-tag-container").select2();
-
-    search();
-
-    $('.nestedAccordion .dropdown').click(function () {
-      runDropdown(this);
-    });
+  $(".select-tag-container").select2();
+  runDropdown($('.nestedAccordion .dropdown'));
+  $('.nestedAccordion .dropdown').click(function () {
+    runDropdown(this);
   });
+  $('.search-sidebar').show();
+
+  search();
 </script>
-- 
GitLab