Avoid tag duplicates

* Prevent duplicate client side with awesomplete
 * Prevent duplicate server side (save_edit processing)

Fixes #261
This commit is contained in:
ArthurHoaro 2015-07-08 16:28:31 +02:00
parent eee711c0a8
commit 781e8aadea
2 changed files with 28 additions and 5 deletions

View file

@ -1330,6 +1330,7 @@ function renderPage()
{ {
if (!tokenOk($_POST['token'])) die('Wrong token.'); // Go away! if (!tokenOk($_POST['token'])) die('Wrong token.'); // Go away!
$tags = trim(preg_replace('/\s\s+/',' ', $_POST['lf_tags'])); // Remove multiple spaces. $tags = trim(preg_replace('/\s\s+/',' ', $_POST['lf_tags'])); // Remove multiple spaces.
$tags = implode(' ', array_unique(explode(' ', $tags))); // Remove duplicates.
$linkdate=$_POST['lf_linkdate']; $linkdate=$_POST['lf_linkdate'];
$url = trim($_POST['lf_url']); $url = trim($_POST['lf_url']);
if (!startsWith($url,'http:') && !startsWith($url,'https:') && !startsWith($url,'ftp:') && !startsWith($url,'magnet:') && !startsWith($url,'?') && !startsWith($url,'javascript:')) if (!startsWith($url,'http:') && !startsWith($url,'https:') && !startsWith($url,'ftp:') && !startsWith($url,'magnet:') && !startsWith($url,'?') && !startsWith($url,'javascript:'))

View file

@ -42,7 +42,7 @@
{if="($GLOBALS['config']['OPEN_SHAARLI'] || isLoggedIn())"} {if="($GLOBALS['config']['OPEN_SHAARLI'] || isLoggedIn())"}
<script> <script>
$ = Awesomplete.$; $ = Awesomplete.$;
new Awesomplete($('input[data-multiple]'), { awesomplete = new Awesomplete($('input[data-multiple]'), {
filter: function(text, input) { filter: function(text, input) {
return Awesomplete.FILTER_CONTAINS(text, input.match(/[^ ]*$/)[0]); return Awesomplete.FILTER_CONTAINS(text, input.match(/[^ ]*$/)[0]);
}, },
@ -52,6 +52,28 @@
}, },
minChars: 1 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;
});
</script> </script>
{/if} {/if}
</body> </body>