diff --git a/app/assets/javascripts/application/accessibility.js b/app/assets/javascripts/application/accessibility.js index 8796b4669f5a7805389646c4e435e8b9b65ee897..9383da590ec29253b1a029b825306704bae5f021 100644 --- a/app/assets/javascripts/application/accessibility.js +++ b/app/assets/javascripts/application/accessibility.js @@ -12,40 +12,31 @@ var fontSize = function() { }); // init - size_c = readCookie('fontSize'); - if (size_c != null) { - $(document).ready(function() { - reloadFontSize(size_c); - }); - } - else { - createCookie('fontSize', 0, 365); - } + $(document).ready(function() { + size_c = readCookie('fontSize'); + if (size_c != null) reloadFontSize(size_c); + else createCookie('fontSize', 0, 365); + }); function reloadFontSize(size) { var i = 0; size = (parseFloat(size) / 10) + 1; + // change body zoom + $('body').css('zoom', size, 'important'); + $('body').css('-moz-transform', "scale("+size+")", 'important'); + $('body').css('-moz-transform-origin', '0 0', 'important'); - // change body font size - $('body').css('fontSize', (size * 100) + '%', 'important'); - - // change custom elements - for (i; i < elements_length; i++) { - $(elements[i]).css('fontSize', (parseFloat(elements_size[elements[i]]) * size) + "px", 'important'); - } } return { resizeText: function(increment) { var size = parseFloat(readCookie('fontSize')); increment = parseFloat(increment); - if (increment === 0) size = 0; else if (((size > -6) && (increment < 0)) || ((size < 7) && (increment > 0))) { size = size + increment; }; reloadFontSize(size); - createCookie('fontSize', size, 365); } }; diff --git a/app/assets/javascripts/application/search.js b/app/assets/javascripts/application/search.js index 967cc5ce573b9ad8022a7ddeea645e07f9be845a..a6425bb889ce8022071e30e20a5f94eb82417074 100644 --- a/app/assets/javascripts/application/search.js +++ b/app/assets/javascripts/application/search.js @@ -12,17 +12,19 @@ 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", type: 'get', - data: params.get(), + data: params.get_fetch(), beforeSend: function() { if (append) { $('.search-more').remove(); } else { + $('.result-bar').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-bar').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() { @@ -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 @@ -279,6 +267,13 @@ var searchParameters = function() { } return params[type]; }, + get_fetch: function() { + var params_to_send = JSON.parse(JSON.stringify(params)); + params_to_send.subject = params_to_send.subject.join(', '); + params_to_send.type = params_to_send.type.join(', '); + params_to_send.school_year = params_to_send.school_year.join(', '); + return params_to_send; + }, url: function() { var url = history.state.url.split('?', 1) + "?", keys = Object.keys(params), @@ -318,12 +313,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 c955e015436411c53f9acb0d5c034d1c41159564..0c741c551992ee34c1e76a6252a1798d8fb10e0a 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 { @@ -20,109 +20,18 @@ width: 100% !important; } -.result-info{ - font-weight: 500; - color: #88888D; -} +.result-bar { + display: none; -.sort-dropdown{ - border: 0; - border-radius: 3px; - color: #59585A; - padding-right: 20px; -} + .result-info { + font-weight: 500; + color: #88888D; + } -// #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; -// } -// } -// } + .sort-dropdown { + border: 0; + border-radius: 3px; + color: #59585A; + padding-right: 20px; + } +} diff --git a/app/controllers/search_controller.rb b/app/controllers/search_controller.rb index 06c3c5104b2cc3332c3e191e06fbf11a889c7c4e..7ba640079c6e661adddb6fc044de222bf98efb89 100644 --- a/app/controllers/search_controller.rb +++ b/app/controllers/search_controller.rb @@ -7,6 +7,9 @@ class SearchController < ApplicationController def fetch objectsFound = [] + params[:subject]= params[:subject].split(', ') + params[:type] = params[:type].split(', ') + params[:school_year] = params[:school_year].split(', ') page=1 if (params[:page]) page = params[:page].to_i @@ -15,9 +18,7 @@ class SearchController < ApplicationController @pagination_limit=10 unless params[:query].blank? - params[:order] = "" if params[:order].blank? - - objectsFound = search params[:query], params[:order] + objectsFound = search params @numFound = objectsFound.length # case params[:order] diff --git a/app/repositories/orient_db/learning_object_repository.rb b/app/repositories/orient_db/learning_object_repository.rb index 15e357f6fb6253e6d1fb87b7b524d669cc4ab6e8..d126c700966b8887d53a317d798a4e3e0908e19c 100644 --- a/app/repositories/orient_db/learning_object_repository.rb +++ b/app/repositories/orient_db/learning_object_repository.rb @@ -129,32 +129,34 @@ module OrientDb # ON LearningObject (name, description) # FULLTEXT ENGINE LUCENE # METADATA {"analyzer":"org.apache.lucene.analysis.br.BrazilianAnalyzer"} - def search(qry, order = nil) + def search(params) # TODO: fix search metadata from dspace + order = params[:order] + qry = params[:query] unless order.nil? order = case order - when "author" - "metadata.key['dc.contributor.author']" - when "publicationasc" - "metadata.key['dc.date.submitted']" - when "publicationdesc" - "metadata.key['dc.date.submitted'] DESC" - when "title" - "name ASC" - else - nil - end + when "author" + "author" + when "publicationasc" + "created_at" + when "publicationdesc" + "created_at DESC" + when "title" + "name ASC" + else + nil + end end query = "SELECT EXPAND(rid) FROM index:learningobject_search WHERE key LUCENE '#{qry}'" + query = "SELECT * FROM (" + query + ") WHERE " + fetch_types(params[:type]) unless params[:type].blank? query = "SELECT * FROM (" + query + ") ORDER BY #{order}" unless order.nil? query = "SELECT @rid.asString(), last_modified FROM (" + query + ")" - learning_objects_hash = connection.query query, limit: 10000 # return only rids with their modification time learning_objects_hash.map do |e| - {'@rid' => e['rid'], 'last_modified' => e['last_modified']} + {'@rid': e['rid'], 'last_modified': e['last_modified']} end end @@ -172,6 +174,15 @@ module OrientDb hash end + def fetch_types(types) + qry = '' + types.each do |type| + qry = qry + "type = '#{type}' " if type == types.first + qry = qry + "OR type = '#{type}' " if type != types.first + end + qry + end + private def accepted_properties diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index 0b1b153b9e11ee8efcd45d3be60f0f92e8840b4f..4bf39a06f9548f4d10659b171fad5fcab46d5964 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 64b030930660086189807e91d6c1a8e53d69b59a..c13adc834784567d0faaa437ec29352b8b0cef1b 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 38ebb7b422b153ea393802bded2f0f334f724e5b..dc085d56cc8ee17e0fb0926b5abfe5c57fa9dd44 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> --> @@ -21,7 +22,7 @@ <select class="select-tag-container filter-subject" multiple="multiple"> <option value="Conjunto">Conjuntos</option> <option value="Soma">Soma</option> - <option value="Ãlgebra">Ãlgebra</option> + <option value="Algebra">Ãlgebra</option> </select> </div> <h4 class="dropdown">Biologia<span class="caret caret-align-right"/></h4> @@ -255,7 +256,7 @@ <!-- search results --> <div class="col-sm-8"> - <div> + <div class="result-bar"> <form method="get"> <input type="hidden" name="qry" value="<%= params["qry"] %>"> <div class="col-sm-6"> @@ -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> diff --git a/lib/search_engine/orientdb_lucene.rb b/lib/search_engine/orientdb_lucene.rb index db31ac7ca01d1672a271ba7d090be6e96d357243..b260e81c3dccb944681136db64c4fb1ca0513e0d 100644 --- a/lib/search_engine/orientdb_lucene.rb +++ b/lib/search_engine/orientdb_lucene.rb @@ -1,8 +1,8 @@ module SearchEngine module OrientdbLucene - def search(qry, order = nil) - learning_object_repository.search(qry, order) + def search(params) + learning_object_repository.search(params) end end