Split search services
This commit is contained in:
parent
6838f16d60
commit
f2cd58d841
16 changed files with 25 additions and 7198 deletions
|
@ -1,16 +0,0 @@
|
|||
<#-- $This file is distributed under the terms of the license in LICENSE$ -->
|
||||
|
||||
<#-- Template for displaying search error message -->
|
||||
|
||||
<#if title??>
|
||||
<div class="errorPageTitle">
|
||||
<h2>${title?html}</h2>
|
||||
</div>
|
||||
</#if>
|
||||
<div id="nomatchingTitle">
|
||||
<p>
|
||||
${message?html}
|
||||
</p>
|
||||
</div>
|
||||
<#include "searchSelector.ftl">
|
||||
<#include "search-help.ftl" >
|
|
@ -1,49 +0,0 @@
|
|||
<#-- $This file is distributed under the terms of the license in LICENSE$ -->
|
||||
|
||||
<#if origination?has_content && origination == "helpLink">
|
||||
<div id="searchTipsTitleH2">
|
||||
<h2>Search Tips</h2>
|
||||
</div>
|
||||
<span id="searchHelp">
|
||||
<a href="#" onClick="history.back();return false;" title="back to results">Back to results</a>
|
||||
</span>
|
||||
<#else>
|
||||
<div id="searchTipsTitleH3">
|
||||
<h3>Search Tips</h3>
|
||||
</div>
|
||||
</#if>
|
||||
<ul class="searchTips">
|
||||
<li>Keep it simple! Use short, single terms unless your searches are returning too many results.</li>
|
||||
<li>Use quotes to search for an entire phrase -- e.g., "<i>protein folding</i>".</li>
|
||||
<li>Except for boolean operators, searches are <strong>not</strong> case-sensitive, so "Geneva" and "geneva" are equivalent</li>
|
||||
<li>If you are unsure of the correct spelling, put ~ at the end of your search term -- e.g., <i>cabage~</i> finds <i>cabbage</i>, <i>steven~</i> finds <i>Stephen</i> and <i>Stefan</i> (as well as other similar names).</li>
|
||||
</ul>
|
||||
|
||||
<div id="advancedTipsWrapper">
|
||||
<h4><a id="advTipsLink" href="#">Advanced Tips</a></h4>
|
||||
</div>
|
||||
<ul id="advanced" class="searchTips" style="visibility:hidden">
|
||||
<li>When you enter more than one term, search will return results containing all of them unless you add the Boolean "OR" -- e.g., <i>chicken</i> OR <i>egg</i>.</li>
|
||||
<li>NOT" can help limit searches -- e.g., <i>climate</i> NOT <i>change</i>.</li>
|
||||
<li>Phrase searches may be combined with Boolean operators -- e.g. "<i>climate change</i>" OR "<i>global warming</i>".</li>
|
||||
<li>Close word variations will also be found -- e.g., <i>sequence</i> matches <i>sequences</i> and <i>sequencing</i>.</li>
|
||||
<li>Use the wildcard * character to match an even wider variation -- e.g., <i>nano*</i> will match both <i>nanotechnology</i> and <i>nanofabrication</i>.</li>
|
||||
<li>Search uses shortened versions of words -- e.g., a search for <i>cogniti*</i> finds nothing, while <i>cognit*</i> finds both <i>cognitive</i> and <i>cognition</i>.</li>
|
||||
</ul>
|
||||
<a id="closeLink" href="#" style="visibility:hidden;font-size:.825em;padding-left:8px">Close</a>
|
||||
${stylesheets.add('<link rel="stylesheet" href="${urls.base}/css/search.css" />')}
|
||||
<script type="text/javascript">
|
||||
$(document).ready(function(){
|
||||
$('a#advTipsLink').click(function() {
|
||||
$('ul#advanced').css("visibility","visible");
|
||||
$('a#closeLink').css("visibility","visible");
|
||||
$('a#closeLink').click(function() {
|
||||
$('ul#advanced').css("visibility","hidden");
|
||||
$('a#closeLink').css("visibility","hidden");
|
||||
return false;
|
||||
});
|
||||
return false;
|
||||
});
|
||||
});
|
||||
|
||||
</script>
|
|
@ -1,252 +0,0 @@
|
|||
<#-- $This file is distributed under the terms of the license in LICENSE$ -->
|
||||
|
||||
<#-- Template for displaying paged search results -->
|
||||
|
||||
<h2 class="searchResultsHeader">
|
||||
|
||||
<#include "searchSelector.ftl">
|
||||
|
||||
<#escape x as x?html>
|
||||
<div id='searchQueryResults'> ${i18n().search_results_for} '${querytext}'</div>
|
||||
<div id='limitedToClassGroup'> <#if classGroupName?has_content>${i18n().limited_to_type} '${classGroupName}'</#if> </div>
|
||||
<div id='limitedToType'> <#if typeName?has_content>${i18n().limited_to_type} '${typeName}'</#if> </div>
|
||||
</#escape>
|
||||
<script type="text/javascript">
|
||||
var url = window.location.toString();
|
||||
if (url.indexOf("?") == -1){
|
||||
var queryText = 'querytext=${querytext}';
|
||||
} else {
|
||||
var urlArray = url.split("?");
|
||||
var queryText = urlArray[1];
|
||||
}
|
||||
|
||||
var urlsBase = '${urls.base}';
|
||||
</script>
|
||||
|
||||
<img id="downloadIcon" src="images/download-icon.png" alt="${i18n().download_results}" title="${i18n().download_results}" />
|
||||
<#-- <span id="downloadResults" style="float:left"></span> -->
|
||||
</h2>
|
||||
|
||||
<span id="searchHelp"><a href="${urls.base}/searchHelp" title="${i18n().search_help}">${i18n().not_expected_results}</a></span>
|
||||
<div class="contentsBrowseGroup">
|
||||
|
||||
<#-- Refinement links -->
|
||||
<#if classGroupLinks?has_content && classGroupLinks?size gt 1>
|
||||
<div class="searchTOC">
|
||||
<h4>${i18n().display_only}</h4>
|
||||
<ul>
|
||||
<#list classGroupLinks as link>
|
||||
<li><a href="${link.url}" title="${i18n().class_group_link}">${link.text}</a><span>(${link.count})</span></li>
|
||||
</#list>
|
||||
</ul>
|
||||
</div>
|
||||
</#if>
|
||||
|
||||
<#if classLinks?has_content && classLinks?size gt 1 >
|
||||
<div class="searchTOC">
|
||||
<#if classGroupName?has_content>
|
||||
<h4>${i18n().limit} ${classGroupName} ${i18n().to}</h4>
|
||||
<#else>
|
||||
<h4>${i18n().limit_to}</h4>
|
||||
</#if>
|
||||
<ul>
|
||||
<#list classLinks as link>
|
||||
<li><a href="${link.url}" title="${i18n().class_link}">${link.text}</a><span>(${link.count})</span></li>
|
||||
</#list>
|
||||
</ul>
|
||||
</div>
|
||||
</#if>
|
||||
|
||||
|
||||
<div class="virtualArticleSwitch">
|
||||
<label class="switch">${i18n().show_virtual_article}
|
||||
<input id="virtualArticleCheck" type="checkbox" checked="false" onclick="showVirtualArticles();">
|
||||
</label>
|
||||
<#if user.loggedIn>
|
||||
<button onclick="createNewCompilation()">${i18n().create_compilation_button}</button>
|
||||
</#if>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<#-- Search results -->
|
||||
<ul class="searchhits">
|
||||
<#list individuals as individual>
|
||||
<li>
|
||||
<@shortView uri=individual.uri viewContext="search" />
|
||||
</li>
|
||||
</#list>
|
||||
</ul>
|
||||
|
||||
|
||||
<#-- Paging controls -->
|
||||
<#if (pagingLinks?size > 0)>
|
||||
<div class="searchpages">
|
||||
${i18n().pages}:
|
||||
<#if prevPage??><a class="prev" href="${prevPage}" title="${i18n().previous}">${i18n().previous}</a></#if>
|
||||
<#list pagingLinks as link>
|
||||
<#if link.url??>
|
||||
<a href="${link.url}" title="${i18n().page_link}">${link.text}</a>
|
||||
<#else>
|
||||
<span>${link.text}</span> <#-- no link if current page -->
|
||||
</#if>
|
||||
</#list>
|
||||
<#if nextPage??><a class="next" href="${nextPage}" title="${i18n().next_capitalized}">${i18n().next_capitalized}</a></#if>
|
||||
</div>
|
||||
</#if>
|
||||
<br />
|
||||
|
||||
<#-- VIVO OpenSocial Extension by UCSF -->
|
||||
<#if openSocial??>
|
||||
<#if openSocial.visible>
|
||||
<h3>OpenSocial</h3>
|
||||
<script type="text/javascript" language="javascript">
|
||||
// find the 'Search' gadget(s).
|
||||
var searchGadgets = my.findGadgetsAttachingTo("gadgets-search");
|
||||
var keyword = '${querytext}';
|
||||
// add params to these gadgets
|
||||
if (keyword) {
|
||||
for (var i = 0; i < searchGadgets.length; i++) {
|
||||
var searchGadget = searchGadgets[i];
|
||||
searchGadget.additionalParams = searchGadget.additionalParams || {};
|
||||
searchGadget.additionalParams["keyword"] = keyword;
|
||||
}
|
||||
}
|
||||
else { // remove these gadgets
|
||||
my.removeGadgets(searchGadgets);
|
||||
}
|
||||
</script>
|
||||
|
||||
<div id="gadgets-search" class="gadgets-gadget-parent" style="display:inline-block"></div>
|
||||
</#if>
|
||||
</#if>
|
||||
|
||||
</div> <!-- end contentsBrowseGroup -->
|
||||
|
||||
<script>
|
||||
document.addEventListener('DOMContentLoaded', createVirtualCompilation(), false);
|
||||
|
||||
$('input[type=checkbox]').removeAttr('checked');
|
||||
function showVirtualArticles(){
|
||||
var checkBox = document.getElementById("virtualArticleCheck");
|
||||
if (checkBox.checked == true){
|
||||
$('.searchResult').hide();
|
||||
$('.virtualArticlePart').show();
|
||||
} else {
|
||||
$('.searchResult').show();
|
||||
$('.virtualArticlePart').hide();
|
||||
}
|
||||
}
|
||||
|
||||
function createNewCompilation() {
|
||||
var excerpts = $('.compilationDraftExcerpt').toArray();
|
||||
if (excerpts.length == 0){
|
||||
alert("${i18n().create_compilation_no_excerpts}");
|
||||
return;
|
||||
}
|
||||
var compilationName = window.prompt("${i18n().create_compilation_enter_name_notification}");
|
||||
if (!compilationName){
|
||||
alert("${i18n().create_compilation_no_name_entered_error}");
|
||||
return;
|
||||
}
|
||||
var iframe = document.createElement("iframe");
|
||||
var excerptsCounter = $('.compilationDraftExcerpt').length;
|
||||
iframe.setAttribute("src", "${urls.base}/editRequestDispatch?typeOfNew=https%3A%2F%2Flitvinovg.pro%2Ftext_structures%23compilation&editForm=edu.cornell.mannlib.vitro.webapp.edit.n3editing.configuration.generators.CompilationGenerator&excerptsCount=" + excerptsCounter);
|
||||
iframe.style.width = "1px";
|
||||
iframe.style.height = "1px";
|
||||
iframe.id="newCompilationIframe";
|
||||
//iframe.style.display="none";
|
||||
document.body.appendChild(iframe);
|
||||
$('#newCompilationIframe').on('load', function(){
|
||||
fillOutForm(compilationName);
|
||||
});
|
||||
}
|
||||
|
||||
function fillOutForm(compilationName){
|
||||
var iframeDoc = document.getElementById('newCompilationIframe').contentWindow.document;
|
||||
var rules = $('#builder').queryBuilder('getRules', { get_flags: true });
|
||||
var query = format_query_string(rules, "", false);
|
||||
iframeDoc.getElementById('queryBuilderRules').value = JSON.stringify(rules);
|
||||
iframeDoc.getElementById('rawQueryString').value = query;
|
||||
|
||||
|
||||
iframeDoc.getElementById('newCompilationLabel').value = compilationName;
|
||||
var excerpts = $('.compilationDraftExcerpt').toArray();
|
||||
for (i = 0;i < excerpts.length;i++){
|
||||
var excerptUri = excerpts[i].getAttribute('partUri');
|
||||
var excerptName = excerpts[i].getAttribute('partName');
|
||||
var number = i + 1;
|
||||
iframeDoc.getElementById("tocLevel" + number + "Name").value = excerptName + " (" + compilationName + ")";
|
||||
iframeDoc.getElementById("tocItem" + number + "Name").value = excerptName + " (" + compilationName + ")";
|
||||
iframeDoc.getElementById("excerpt" + number).value = excerptUri;
|
||||
}
|
||||
$('#newCompilationIframe').off('load');
|
||||
iframeDoc.getElementById('submit').click();
|
||||
$('#newCompilationIframe').on('load', function(){
|
||||
redirectToNewCompilation();
|
||||
});
|
||||
|
||||
}
|
||||
function redirectToNewCompilation(){
|
||||
var newURL = document.getElementById('newCompilationIframe').contentWindow.location.href;
|
||||
window.open(newURL,"_self");
|
||||
}
|
||||
|
||||
function createVirtualCompilation(){
|
||||
let workSet = new Set();
|
||||
let biblioSet = new Set();
|
||||
var workDivs = $('.virtualArticleWork');
|
||||
var biblioDivs = $('.virtualArticleBibliography');
|
||||
biblioDivs.each(function() {
|
||||
biblioSet.add($(this).html());
|
||||
});
|
||||
workDivs.each(function() {
|
||||
workSet.add($(this).html());
|
||||
});
|
||||
var workArr = Array.from(workSet);
|
||||
workArr.sort();
|
||||
var biblioArr = Array.from(biblioSet);
|
||||
biblioArr.sort();
|
||||
if (workArr.length > 0 ) {
|
||||
$('<div class="virtualWorks virtualArticlePart"><button type="button" style="border:none;width: 100%; text-align:left;" class="collapsible">${i18n().sources_excerpt_button_text}</button><div class="virtualWorks"></div></div>').insertAfter($('.virtualArticlePart').last());
|
||||
for (let value of workArr){
|
||||
$('.virtualWorks').last().append( '<div class="work"><p>' + value + '</p></div>' );
|
||||
}
|
||||
}
|
||||
if (biblioArr.length > 0 ) {
|
||||
$('<div class="virtualBibliography virtualArticlePart"><button type="button" style="border:none;width: 100%; text-align:left;" class="collapsible">${i18n().literature_excerpt_button_text}</button><div class="virtualBibliography"></div></div>').insertAfter($('.virtualArticlePart').last());
|
||||
for (let value of biblioArr){
|
||||
$('.virtualBibliography').last().append( '<div class="bibliography"><p>' + value + '</p></div>' );
|
||||
}
|
||||
}
|
||||
$('.virtualWorks').hide();
|
||||
$('.virtualBibliography').hide();
|
||||
$('.virtualArticlePart').hide();
|
||||
var coll = document.getElementsByClassName("collapsible");
|
||||
var i;
|
||||
for (i = 0; i < coll.length; i++) {
|
||||
coll[i].addEventListener("click", function() {
|
||||
this.classList.toggle("active");
|
||||
var content = this.nextElementSibling;
|
||||
if (content.style.display === "block") {
|
||||
content.style.display = "none";
|
||||
} else {
|
||||
content.style.display = "block";
|
||||
}
|
||||
});
|
||||
}
|
||||
createRemoveButtons();
|
||||
}
|
||||
|
||||
</script>
|
||||
|
||||
${stylesheets.add('<link rel="stylesheet" href="//code.jquery.com/ui/1.10.3/themes/smoothness/jquery-ui.css" />',
|
||||
'<link rel="stylesheet" href="${urls.base}/css/search.css" />',
|
||||
'<link rel="stylesheet" type="text/css" href="${urls.base}/css/jquery_plugins/qtip/jquery.qtip.min.css" />')}
|
||||
|
||||
${headScripts.add('<script src="//code.jquery.com/ui/1.10.3/jquery-ui.js"></script>',
|
||||
'<script type="text/javascript" src="${urls.base}/js/jquery_plugins/qtip/jquery.qtip.min.js"></script>',
|
||||
'<script type="text/javascript" src="${urls.base}/js/tiny_mce/tiny_mce.js"></script>'
|
||||
)}
|
||||
|
||||
${scripts.add('<script type="text/javascript" src="${urls.base}/js/searchDownload.js"></script>')}
|
|
@ -35,10 +35,10 @@ body {
|
|||
max-width: 1920px;
|
||||
width: 100%;
|
||||
height: 200px;
|
||||
display: flex;
|
||||
/*display: flex;
|
||||
flex-direction: column;
|
||||
flex-wrap: nowrap;
|
||||
justify-content: center;
|
||||
justify-content: center;*/
|
||||
}
|
||||
a {
|
||||
color: #000000;
|
||||
|
@ -584,7 +584,11 @@ ul#header-nav a.log-out {
|
|||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
}
|
||||
#switch-to-extended-searchform {
|
||||
#goToExtendedSearchForm {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
#goToExtendedSearch {
|
||||
border:none;
|
||||
background-color:unset;
|
||||
color: #8B4513;
|
||||
|
@ -597,6 +601,7 @@ ul#header-nav a.log-out {
|
|||
font-family: "Roboto";
|
||||
font-style: normal;
|
||||
}
|
||||
|
||||
#custom-search {
|
||||
width: 100%;
|
||||
display: flex;
|
||||
|
@ -1194,7 +1199,6 @@ p.external-auth a.blue:hover {
|
|||
/* HOME SEARCH ------> */
|
||||
#search-home {
|
||||
/*float: left;*/
|
||||
margin-bottom: 30px;
|
||||
margin-top: 10px;
|
||||
width: 100%;
|
||||
display: flex;
|
||||
|
|
|
@ -1,77 +0,0 @@
|
|||
/*!
|
||||
* jQuery QueryBuilder 2.5.2
|
||||
* Locale: Russian (ru)
|
||||
* Licensed under MIT (https://opensource.org/licenses/MIT)
|
||||
*/
|
||||
|
||||
(function(root, factory) {
|
||||
if (typeof define == 'function' && define.amd) {
|
||||
define(['jquery', 'query-builder'], factory);
|
||||
}
|
||||
else {
|
||||
factory(root.jQuery);
|
||||
}
|
||||
}(this, function($) {
|
||||
"use strict";
|
||||
|
||||
var QueryBuilder = $.fn.queryBuilder;
|
||||
|
||||
QueryBuilder.regional['ru'] = {
|
||||
"__locale": "Russian (ru)",
|
||||
"add_rule": "Добавить условие",
|
||||
"add_group": "Добавить группу",
|
||||
"delete_rule": "Удалить",
|
||||
"delete_group": "Удалить",
|
||||
"conditions": {
|
||||
"AND": "И",
|
||||
"OR": "ИЛИ"
|
||||
},
|
||||
"operators": {
|
||||
"equal": "равно",
|
||||
"not_equal": "не равно",
|
||||
"in": "из указанных",
|
||||
"not_in": "не из указанных",
|
||||
"less": "меньше",
|
||||
"less_or_equal": "меньше или равно",
|
||||
"greater": "больше",
|
||||
"greater_or_equal": "больше или равно",
|
||||
"between": "между",
|
||||
"begins_with": "начинается с",
|
||||
"not_begins_with": "не начинается с",
|
||||
"contains": "содержит",
|
||||
"not_contains": "не содержит",
|
||||
"ends_with": "оканчивается на",
|
||||
"not_ends_with": "не оканчивается на",
|
||||
"is_empty": "пустая строка",
|
||||
"is_not_empty": "не пустая строка",
|
||||
"is_null": "пусто",
|
||||
"is_not_null": "не пусто"
|
||||
},
|
||||
"errors": {
|
||||
"no_filter": "Фильтр не выбран",
|
||||
"empty_group": "Группа пуста",
|
||||
"radio_empty": "Не выбранно значение",
|
||||
"checkbox_empty": "Не выбранно значение",
|
||||
"select_empty": "Не выбранно значение",
|
||||
"string_empty": "Не заполненно",
|
||||
"string_exceed_min_length": "Должен содержать больше {0} символов",
|
||||
"string_exceed_max_length": "Должен содержать меньше {0} символов",
|
||||
"string_invalid_format": "Неверный формат ({0})",
|
||||
"number_nan": "Не число",
|
||||
"number_not_integer": "Не число",
|
||||
"number_not_double": "Не число",
|
||||
"number_exceed_min": "Должно быть больше {0}",
|
||||
"number_exceed_max": "Должно быть меньше, чем {0}",
|
||||
"number_wrong_step": "Должно быть кратно {0}",
|
||||
"datetime_empty": "Не заполненно",
|
||||
"datetime_invalid": "Неверный формат даты ({0})",
|
||||
"datetime_exceed_min": "Должно быть, после {0}",
|
||||
"datetime_exceed_max": "Должно быть, до {0}",
|
||||
"boolean_not_valid": "Не логическое",
|
||||
"operator_not_multiple": "Оператор \"{1}\" не поддерживает много значений"
|
||||
},
|
||||
"invert": "Инвертировать"
|
||||
};
|
||||
|
||||
QueryBuilder.defaults({ lang_code: 'ru' });
|
||||
}));
|
File diff suppressed because it is too large
Load diff
File diff suppressed because one or more lines are too long
|
@ -127,7 +127,7 @@ ${scripts.add('<script type="text/javascript" src="${urls.base}/themes/iph/js/to
|
|||
<#assign rawQueryString = statement.value!>
|
||||
</#list>
|
||||
<#if queryBuilderRulesString?? && rawQueryString??>
|
||||
<form action="${urls.base}/customsearch" method="post">
|
||||
<form action="${urls.extendedsearch}" method="post">
|
||||
<input type="hidden" id="queryBuilderRules" name="queryBuilderRules" value='${queryBuilderRulesString}' />
|
||||
<input type="hidden" id="querytext" name="querytext" value='${rawQueryString}' />
|
||||
<input type="submit" id="submit" value="${i18n().metadata_query}"/>
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
<div class="search-form-container">
|
||||
<form id="custom-search" action="${urls.customsearch}" name="custom-search" role="search" method="post" >
|
||||
<form id="custom-search" action="${urls.search}" name="custom-search" role="search">
|
||||
<input type="text" name="querytext" class="custom-search-input" value="${querytext!?html}" autocapitalize="off" />
|
||||
<!-- <#if vClassGroups??>
|
||||
<select form="custom-search" name="classgroup" class="custom-search-select">
|
||||
|
|
|
@ -1,13 +1,11 @@
|
|||
<#-- $This file is distributed under the terms of the license in LICENSE$ -->
|
||||
|
||||
|
||||
|
||||
<#include "developer.ftl">
|
||||
|
||||
<nav role="navigation">
|
||||
<ul id="main-nav" role="list">
|
||||
<#list menu.items as item>
|
||||
<li role="listitem"><a href="${item.url}" title="${item.linkText} ${i18n().menu_item}" <#if item.active> class="selected" </#if>>${item.linkText}</a></li>
|
||||
</#list>
|
||||
</ul>
|
||||
</nav>
|
||||
</nav>
|
||||
|
||||
<#include "developer.ftl">
|
||||
|
|
|
@ -44,7 +44,7 @@
|
|||
<fieldset>
|
||||
<legend>${i18n().search_form}</legend>
|
||||
</fieldset>
|
||||
<#include "searchSelector.ftl">
|
||||
<#include "simpleSearchForm.ftl">
|
||||
</section>
|
||||
|
||||
<div id="wrapperDescription">
|
||||
|
|
|
@ -17,7 +17,7 @@
|
|||
<#include "rightPanel.ftl">
|
||||
</#if>
|
||||
<#include "contentWrapper.ftl">
|
||||
<#if currentServlet != "individual" && currentServlet != "login" && currentServlet != "display" && currentServlet != "customsearch" && currentServlet != "entity">
|
||||
<#if currentServlet != "individual" && currentServlet != "login" && currentServlet != "display" && currentServlet != "extendedsearch" && currentServlet != "entity">
|
||||
<section id="search-home" role="region">
|
||||
<h3><span class="search-filter-selected">filteredSearch</span></h3>
|
||||
|
||||
|
@ -25,7 +25,7 @@
|
|||
<legend>${i18n().search_form}</legend>
|
||||
</fieldset>
|
||||
|
||||
<#include "searchSelector.ftl">
|
||||
<#include "simpleSearchForm.ftl">
|
||||
|
||||
</section>
|
||||
</#if>
|
||||
|
|
|
@ -1,288 +0,0 @@
|
|||
<div id="querybuilder-container" style="display:none;">
|
||||
<div id="CounterSearchWrapper">
|
||||
<div id="builder">
|
||||
<div id="SearchTitle">${i18n().extended_search_label}</div>
|
||||
</div>
|
||||
<div class="btn-group-bottom">
|
||||
<div id="settingsButtons">
|
||||
<div id="OuterWrapperButtons">
|
||||
<div id="wrapperButtons">
|
||||
<button id="btn-set" class="btn btn-success set-json" data-target="basic">${i18n().extended_search_example}</button>
|
||||
<button id="btn-reset-button" class="btn btn-warning reset" data-target="basic">${i18n().extended_search_clean}</button>
|
||||
<!-- <button id="btn-get" class="btn btn-primary parse-json" data-target="basic">Get rules</button> -->
|
||||
<div id="SelectResults">
|
||||
<label style="display:inline;" for="hitsPerPage">${i18n().extended_search_results_on_page}</label>
|
||||
<@selectHitsPerPage/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<button id="btn-search-expand" class="btn btn-warning reset" data-target="basic">${i18n().extended_search_execute_search}</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div id="backgroundForm">
|
||||
<button id="btn-get-standard-searchform" class="btn btn-warning reset" data-target="basic">${i18n().open_standard_search_form}</button>
|
||||
</div>
|
||||
</div>
|
||||
<script src="themes/iph/js/query-builder.standalone.min.js"></script>
|
||||
<script src="themes/iph/js/query-builder.ru.js"></script>
|
||||
<script>
|
||||
var rules_example =
|
||||
<#if searchFields?has_content>
|
||||
{
|
||||
"condition": "AND",
|
||||
"rules": [
|
||||
{
|
||||
"id": "titles",
|
||||
"field": "titles",
|
||||
"type": "string",
|
||||
"input": "text",
|
||||
"operator": "not_contains",
|
||||
"value": "постмодернизм"
|
||||
},
|
||||
{
|
||||
"condition": "OR",
|
||||
"rules": [
|
||||
{
|
||||
"id": "keywords",
|
||||
"field": "keywords",
|
||||
"type": "string",
|
||||
"input": "text",
|
||||
"operator": "contains",
|
||||
"value": "постмодернизм"
|
||||
},
|
||||
{
|
||||
"id": "bibliography",
|
||||
"field": "bibliography",
|
||||
"type": "string",
|
||||
"input": "text",
|
||||
"operator": "contains",
|
||||
"value": "постмодернизм"
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"valid": true
|
||||
};
|
||||
<#else>
|
||||
{
|
||||
"condition": "AND",
|
||||
"rules": [
|
||||
{
|
||||
"id": "ALLTEXT",
|
||||
"field": "everywhere",
|
||||
"type": "string",
|
||||
"input": "text",
|
||||
"operator": "contains",
|
||||
"value": "publication"
|
||||
}
|
||||
],
|
||||
"valid": true
|
||||
};
|
||||
</#if>
|
||||
var rules_start;
|
||||
<#if queryBuilderRules??>
|
||||
rules_start = ${queryBuilderRules};
|
||||
<#else>
|
||||
if (localStorage.getItem('queryBuilderFormSaved') === true || localStorage.getItem('queryBuilderFormSaved') === 'true') {
|
||||
rules_start = JSON.parse(localStorage.getItem('queryBuilderForm'));
|
||||
} else {
|
||||
rules_start = rules_example;
|
||||
}
|
||||
</#if>
|
||||
|
||||
|
||||
$('#builder').queryBuilder({
|
||||
filters: [
|
||||
<#if searchFields?has_content>
|
||||
<#list searchFields as field>
|
||||
<#if field.hasFilters == "true">
|
||||
<@multivalueField field=field />
|
||||
<#else>
|
||||
<@freeField field=field />
|
||||
</#if>
|
||||
</#list>
|
||||
<#else>
|
||||
{
|
||||
id: 'ALLTEXT',
|
||||
label: 'Everywhere',
|
||||
type: 'string',
|
||||
operators: ['contains', 'not_contains']
|
||||
},
|
||||
</#if>
|
||||
|
||||
],
|
||||
lang_code: 'ru',
|
||||
rules: rules_start
|
||||
});
|
||||
|
||||
$('#btn-reset-button').on('click', function() {
|
||||
$('#builder').queryBuilder('reset');
|
||||
});
|
||||
|
||||
$('#btn-set').on('click', function() {
|
||||
$('#builder').queryBuilder('setRules', rules_example);
|
||||
});
|
||||
|
||||
$('#btn-get-standard-searchform').on('click', function() {
|
||||
$('#querybuilder-container').hide();
|
||||
$('#simple-search-container').show();
|
||||
localStorage.setItem('extendedSearchOpen',false);
|
||||
});
|
||||
|
||||
|
||||
$('#btn-search-expand').on('click', function() {
|
||||
var json_result = $('#builder').queryBuilder('getRules', { get_flags: true });
|
||||
var query_string = format_query_string(json_result,"");
|
||||
var hits = $("#hitsPerPageSelect :selected");
|
||||
if (!$.isEmptyObject(query_string)) {
|
||||
localStorage.setItem('queryBuilderForm',JSON.stringify(json_result));
|
||||
localStorage.setItem('queryBuilderFormSaved',true);
|
||||
var queryURL = "${urls.base}/customsearch?querytext=" + query_string;
|
||||
if (hits !== null){
|
||||
queryURL = queryURL.concat("&hitsPerPage=",hits.text());
|
||||
}
|
||||
window.open(queryURL,"_self")
|
||||
}
|
||||
//if (!$.isEmptyObject(json_result)) {
|
||||
// alert(JSON.stringify(json_result, null, 2));
|
||||
// alert(query_string);
|
||||
//}
|
||||
});
|
||||
|
||||
function format_query_string(json_query, string_query, htmlEncode = true){
|
||||
if ('condition' in json_query && 'rules' in json_query ){
|
||||
if (json_query.rules.length > 1 ) {
|
||||
string_query +=" ( ";
|
||||
var i;
|
||||
for (i = 0; i < json_query.rules.length; i++) {
|
||||
string_query = format_query_string(json_query.rules[i], string_query, htmlEncode);
|
||||
if (i + 1 < json_query.rules.length){
|
||||
string_query += " " + json_query.condition + " ";
|
||||
}
|
||||
}
|
||||
string_query +=" ) ";
|
||||
} else {
|
||||
string_query = format_query_string(json_query.rules[0], string_query, htmlEncode);
|
||||
}
|
||||
} else if ( 'field' in json_query && 'value' in json_query ){
|
||||
if ('operator' in json_query && json_query.operator.startsWith("not_")){
|
||||
string_query += "NOT ";
|
||||
}
|
||||
if (json_query.hasOwnProperty('data') && json_query.data.hasOwnProperty('value')){
|
||||
var value = "\"" + json_query.data.value.toString()+ "\"";
|
||||
} else {
|
||||
var value = json_query.value.toString();
|
||||
}
|
||||
if (htmlEncode){
|
||||
string_query += json_query.field + ":" + value.replace(/[']+/g,'').replace(/#/g,'%23') ;
|
||||
} else {
|
||||
string_query += json_query.field + ":" + value.replace(/[']+/g,'');
|
||||
}
|
||||
}
|
||||
return string_query;
|
||||
}
|
||||
|
||||
function excludeDocByURI(name, uri){
|
||||
var allRules = $('#builder').queryBuilder('getRules', { get_flags: true });
|
||||
var excludeRuleString = '{ "id": "URI", "field": "URI", "type": "string", "flags":{}, "input": "text", "operator": "not_contains", "data":{} }';
|
||||
var excludeRule = JSON.parse(excludeRuleString);
|
||||
excludeRule.data.value = uri;
|
||||
excludeRule.flags.value_readonly = true;
|
||||
excludeRule.flags.filter_readonly = true;
|
||||
excludeRule.flags.operator_readonly = true;
|
||||
excludeRule.value = name;
|
||||
if (allRules !== null){
|
||||
if (allRules.condition === "AND"){
|
||||
allRules.rules.push(excludeRule);
|
||||
} else {
|
||||
var outerRulesString = '{ "condition": "AND", "rules": [] }';
|
||||
var outerRules = JSON.parse(outerRulesString);
|
||||
outerRules.rules.push(allRules);
|
||||
outerRules.rules.push(excludeRule);
|
||||
allRules = outerRules;
|
||||
}
|
||||
$('#builder').queryBuilder('setRules', allRules);
|
||||
var elements = document.querySelectorAll('[parturi="' + uri + '"]');
|
||||
var i;
|
||||
for (i = 0; i < elements.length; i++) {
|
||||
elements[i].parentElement.remove();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function createRemoveButtons(){
|
||||
$('.compilationDraftExcerpt').each(function(index){ createRemoveButton(this)});
|
||||
}
|
||||
|
||||
function createRemoveButton(element){
|
||||
var uri = element.getAttribute('parturi');
|
||||
var button = element.querySelector('button');
|
||||
var name = button.textContent;
|
||||
var a = document.createElement('a');
|
||||
a.setAttribute('href',"javascript:excludeDocByURI(\'" + escapeQutes(name) + "\',\'" + escapeQutes(uri) + "\');");
|
||||
a.setAttribute('class',"removeDocFromSearch");
|
||||
|
||||
a.textContent = "${i18n().remove_doc_from_search_results}" ;
|
||||
|
||||
button.appendChild(a);
|
||||
}
|
||||
|
||||
function escapeQutes(input) {
|
||||
return input
|
||||
.replace(/"/g, """)
|
||||
.replace(/'/g, "'")
|
||||
}
|
||||
|
||||
</script>
|
||||
<#macro freeField field >
|
||||
{
|
||||
id: '${field.field}',
|
||||
label: '${field.name}',
|
||||
type: 'string',
|
||||
operators: ['contains', 'not_contains']
|
||||
},
|
||||
</#macro>
|
||||
|
||||
<#macro multivalueField field >
|
||||
{
|
||||
id: '${field.field}',
|
||||
label: '${field.name}',
|
||||
type: 'string',
|
||||
input: 'select',
|
||||
values: {
|
||||
|
||||
<#if searchFields??>
|
||||
<#list searchFilters as filter>
|
||||
<#if filter.field == field.field>
|
||||
'"${filter.id}"':'${filter.name}',
|
||||
</#if>
|
||||
</#list>
|
||||
<#else>
|
||||
{
|
||||
id: 'ALLTEXT',
|
||||
label: 'Everywhere',
|
||||
type: 'string',
|
||||
operators: ['contains', 'not_contains']
|
||||
},
|
||||
</#if>
|
||||
},
|
||||
operators: ['contains', 'not_contains']
|
||||
},
|
||||
</#macro>
|
||||
|
||||
<#macro selectHitsPerPage>
|
||||
<#if !hitsPerPage?? >
|
||||
<#assign hitsPerPage = 20 >
|
||||
</#if>
|
||||
<#assign hitsValues= [20,40,60,80,100]>
|
||||
<select name="hitsPerPage" id="hitsPerPageSelect">
|
||||
<option value="${hitsPerPage}" selected="selected">${hitsPerPage}</option>
|
||||
<#list hitsValues as hppValue>
|
||||
<#if hppValue != hitsPerPage>
|
||||
<option value="${hppValue}">${hppValue}</option>
|
||||
</#if>
|
||||
</#list>
|
||||
|
||||
</select>
|
||||
</#macro>
|
|
@ -1,18 +0,0 @@
|
|||
<div id="simple-search-container">
|
||||
<#include "customSearchForm.ftl">
|
||||
<button id="switch-to-extended-searchform">${i18n().extended_search_label}</button>
|
||||
</div>
|
||||
<#include "queryBuilder.ftl">
|
||||
|
||||
<script>
|
||||
$('#switch-to-extended-searchform').on('click', function() {
|
||||
$('#simple-search-container').hide();
|
||||
$('#querybuilder-container').show();
|
||||
localStorage.setItem('extendedSearchOpen',true);
|
||||
});
|
||||
if (localStorage.getItem('extendedSearchOpen') === true || localStorage.getItem('extendedSearchOpen') === 'true') {
|
||||
$('#simple-search-container').hide();
|
||||
$('#querybuilder-container').show();
|
||||
}
|
||||
</script>
|
||||
|
|
@ -0,0 +1,9 @@
|
|||
<div id="simple-search-container">
|
||||
<#include "customSearchForm.ftl">
|
||||
<form id="goToExtendedSearchForm" action="${urls.extendedsearch}">
|
||||
<button id="goToExtendedSearch">${i18n().extended_search_label}</button>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
|
||||
|
Loading…
Add table
Reference in a new issue