Merge pull request #377 from ArthurHoaro/search-tag-autocomplete

Fixes #360 - Auto-complete more than one tag in tag filter field
This commit is contained in:
VirtualTam 2015-11-22 23:22:17 +01:00
commit 98348200e3
3 changed files with 62 additions and 43 deletions

View file

@ -0,0 +1,35 @@
$ = Awesomplete.$;
awesomplete = new Awesomplete($('input[data-multiple]'), {
filter: function(text, input) {
return Awesomplete.FILTER_CONTAINS(text, input.match(/[^ ]*$/)[0]);
},
replace: function(text) {
var before = this.input.value.match(/^.+ \s*|/)[0];
this.input.value = before + text + " ";
},
minChars: 1
});
/**
* Remove already selected items from autocompletion list.
* HTML list is never updated, so removing a tag will add it back to awesomplete.
*
* FIXME: This a workaround waiting for awesomplete to handle this.
* https://github.com/LeaVerou/awesomplete/issues/16749
*/
function awesompleteUniqueTag(selector) {
var input = document.querySelector(selector);
input.addEventListener('input', function()
{
proposedTags = input.getAttribute('data-list').replace(/,/g, '').split(' ');
reg = /(\w+) /g;
while((match = reg.exec(input.value)) !== null) {
id = proposedTags.indexOf(match[1]);
if(id != -1 ) {
proposedTags.splice(id, 1);
}
}
awesomplete.list = proposedTags;
});
}

View file

@ -2,7 +2,6 @@
<html>
<head>{include="includes"}
<link type="text/css" rel="stylesheet" href="../inc/awesomplete.css" />
<script src="inc/awesomplete.min.js#"></script>
</head>
<body
{if="$link.title==''"}onload="document.linkform.lf_title.focus();"
@ -45,40 +44,10 @@
{include="page.footer"}
{/if}
{if="($GLOBALS['config']['OPEN_SHAARLI'] || isLoggedIn())"}
<script src="inc/awesomplete.min.js#"></script>
<script src="inc/awesomplete-multiple-tags.js#"></script>
<script>
$ = Awesomplete.$;
awesomplete = new Awesomplete($('input[data-multiple]'), {
filter: function(text, input) {
return Awesomplete.FILTER_CONTAINS(text, input.match(/[^ ]*$/)[0]);
},
replace: function(text) {
var before = this.input.value.match(/^.+ \s*|/)[0];
this.input.value = before + text + " ";
},
minChars: 1
});
/**
* Remove already selected items from autocompletion list.
* HTML list is never updated, so removing a tag will add it back to awesomplete.
*
* FIXME: This a workaround waiting for awesomplete to handle this.
* https://github.com/LeaVerou/awesomplete/issues/16749
*/
var input = document.querySelector('#lf_tags');
input.addEventListener('input', function()
{
proposedTags = input.getAttribute('data-list').replace(/,/g, '').split(' ');
reg = /(\w+) /g;
while((match = reg.exec(input.value)) !== null) {
id = proposedTags.indexOf(match[1]);
if(id != -1 ) {
proposedTags.splice(id, 1);
}
}
awesomplete.list = proposedTags;
});
awesompleteUniqueTag('#lf_tags');
</script>
{/if}
</body>

View file

@ -9,12 +9,13 @@
{include="page.header"}
<div id="headerform" class="search">
<form method="GET" class="searchform" name="searchform">
<input type="text" tabindex="1" id="searchform_value" name="searchterm" placeholder="Search text" value=""> <input type="submit" value="Search" class="bigbutton"></form>
<input type="text" tabindex="1" id="searchform_value" name="searchterm" placeholder="Search text" value="">
<input type="submit" value="Search" class="bigbutton">
</form>
<form method="GET" class="tagfilter" name="tagfilter">
<input type="text" tabindex="2" name="searchtags" id="tagfilter_value" placeholder="Filter by tag" value="" list="tagsList" autocomplete="off" class="awesomplete" data-minChars="1">
<datalist id="tagsList">
{loop="$tags"}<option>{$key}</option>{/loop}
</datalist>
<input type="text" tabindex="2" name="searchtags" id="tagfilter_value" placeholder="Filter by tag" value=""
autocomplete="off" class="awesomplete" data-multiple data-minChars="1"
data-list="{loop="$tags"}{$key}, {/loop}">
<input type="submit" value="Search" class="bigbutton">
</form>
{loop="$plugins_header.fields_toolbar"}
@ -42,7 +43,9 @@
{if="$search_type=='tags'"}
<div id="searchcriteria">{$result_count} results for tags <i>
{loop="search_crits"}
<span class="linktag" title="Remove tag"><a href="?removetag={$value}">{$value} <span class="remove">x</span></a></span>
<span class="linktag" title="Remove tag">
<a href="?removetag={$value}">{$value} <span class="remove">x</span></a>
</span>
{/loop}</i></div>
{/if}
{/if}
@ -54,9 +57,17 @@
<div class="linkcontainer">
{if="isLoggedIn()"}
<div class="linkeditbuttons">
<form method="GET" class="buttoneditform"><input type="hidden" name="edit_link" value="{$value.linkdate}"><input type="image" alt="Edit" src="images/edit_icon.png#" title="Edit" class="button_edit"></form><br>
<form method="POST" class="buttoneditform"><input type="hidden" name="lf_linkdate" value="{$value.linkdate}">
<input type="hidden" name="token" value="{$token}"><input type="hidden" name="delete_link"><input type="image" alt="Delete" src="images/delete_icon.png#" title="Delete" class="button_delete" onClick="return confirmDeleteLink();"></form>
<form method="GET" class="buttoneditform">
<input type="hidden" name="edit_link" value="{$value.linkdate}">
<input type="image" alt="Edit" src="images/edit_icon.png#" title="Edit" class="button_edit">
</form><br>
<form method="POST" class="buttoneditform">
<input type="hidden" name="lf_linkdate" value="{$value.linkdate}">
<input type="hidden" name="token" value="{$token}">
<input type="hidden" name="delete_link">
<input type="image" alt="Delete" src="images/delete_icon.png#" title="Delete"
class="button_delete" onClick="return confirmDeleteLink();">
</form>
</div>
{/if}
<span class="linktitle"><a href="{$redirector}{$value.url}">{$value.title}</a></span>
@ -98,5 +109,9 @@
{include="page.footer"}
<script src="inc/awesomplete.min.js#"></script>
<script src="inc/awesomplete-multiple-tags.js#"></script>
<script>
awesompleteUniqueTag('#tagfilter_value');
</script>
</body>
</html>