X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=view%2Fjs%2Fautocomplete.js;h=7f5f36cfd7b731803b22b7cef12b1491961dbc67;hb=86bdb2d5b9298eb78316e85374ae8a00161b051e;hp=bb3577fb9b2ddd66f8159611fea3a8d0c7a957f9;hpb=1de3960e267a8d298348fbca18cf1be1f6a20f7a;p=friendica.git diff --git a/view/js/autocomplete.js b/view/js/autocomplete.js index bb3577fb9b..7f5f36cfd7 100644 --- a/view/js/autocomplete.js +++ b/view/js/autocomplete.js @@ -1,6 +1,6 @@ // @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&dn=expat.txt Expat /** - * @brief Friendica people autocomplete + * Friendica people autocomplete * * require jQuery, jquery.textcomplete * @@ -197,6 +197,38 @@ function string2bb(element) { * jQuery plugin 'editor_autocomplete' */ (function( $ ) { + /** + * This function should be called immediately after $.textcomplete() to prevent the escape key press to propagate + * after the autocompletion dropdown has closed. + * This avoids the input textarea to lose focus, the modal window to close, etc... when the expected behavior is + * to just close the autocomplete dropdown. + * + * The custom event listener name allows removing this specific event listener, the "real" event this listens to + * is the part before the first dot. + * + * @returns {*} + */ + $.fn.fixTextcompleteEscape = function () { + if (this.data('textcompleteEscapeFixed')) { + return this; + } + + this.data('textcompleteEscapeFixed', true); + + return this.on({ + 'textComplete:show': function (e) { + $(this).on('keydown.friendica.escape', function (e) { + if (e.key === 'Escape') { + e.stopPropagation(); + } + }); + }, + 'textComplete:hide': function (e) { + $(this).off('keydown.friendica.escape'); + }, + }); + } + $.fn.editor_autocomplete = function(backend_url) { // Autocomplete contacts @@ -222,7 +254,7 @@ function string2bb(element) { match: /(^|\s)(\#)([^ \n]{2,})$/, index: 3, search: function(term, callback) { - $.getJSON(baseurl + '/hashtag/' + '?f=&t=' + term) + $.getJSON(baseurl + '/hashtag/' + '?t=' + term) .done(function(data) { callback($.map(data, function(entry) { // .toLowerCase() enables case-insensitive search @@ -245,6 +277,7 @@ function string2bb(element) { this.attr('autocomplete','off'); this.textcomplete([contacts, forums, smilies, tags], {className:'acpopup', zIndex:10000}); + this.fixTextcompleteEscape(); }; })( jQuery ); @@ -275,14 +308,15 @@ function string2bb(element) { tags = { match: /(^|\s)(\#)([^ \n]{2,})$/, index: 3, - search: function(term, callback) { $.getJSON(baseurl + '/hashtag/' + '?f=&t=' + term).done(function(data) { callback($.map(data, function(entry) { return entry.text.indexOf(term) === 0 ? entry : null; })); }); }, + search: function(term, callback) { $.getJSON(baseurl + '/hashtag/' + '?t=' + term).done(function(data) { callback($.map(data, function(entry) { return entry.text.indexOf(term) === 0 ? entry : null; })); }); }, replace: function(item) { return "$1$2" + item.text; }, template: tag_format }; this.attr('autocomplete', 'off'); - var a = this.textcomplete([contacts, community, tags], {className:'acpopup', maxCount:100, zIndex: 10000, appendTo:'nav'}); - a.on('textComplete:select', function(e, value, strategy) { submit_form(this); }); + this.textcomplete([contacts, community, tags], {className:'acpopup', maxCount:100, zIndex: 10000, appendTo:'nav'}); + this.fixTextcompleteEscape(); + this.on('textComplete:select', function(e, value, strategy) { submit_form(this); }); }; })( jQuery ); @@ -301,20 +335,22 @@ function string2bb(element) { }; this.attr('autocomplete','off'); - var a = this.textcomplete([names], {className:'acpopup', zIndex:10000}); + this.textcomplete([names], {className:'acpopup', zIndex:10000}); + this.fixTextcompleteEscape(); - if(autosubmit) - a.on('textComplete:select', function(e,value,strategy) { submit_form(this); }); + if(autosubmit) { + this.on('textComplete:select', function(e,value,strategy) { submit_form(this); }); + } - if(typeof onselect !== 'undefined') - a.on('textComplete:select', function(e, value, strategy) { onselect(value); }); + if(typeof onselect !== 'undefined') { + this.on('textComplete:select', function(e, value, strategy) { onselect(value); }); + } }; })( jQuery ); (function( $ ) { $.fn.bbco_autocomplete = function(type) { - - if(type=='bbcode') { + if (type === 'bbcode') { var open_close_elements = ['bold', 'italic', 'underline', 'overline', 'strike', 'quote', 'code', 'spoiler', 'map', 'img', 'url', 'audio', 'video', 'embed', 'youtube', 'vimeo', 'list', 'ul', 'ol', 'li', 'table', 'tr', 'th', 'td', 'center', 'color', 'font', 'size', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'nobb', 'noparse', 'pre', 'abstract']; var open_elements = ['*', 'hr']; @@ -349,11 +385,12 @@ function string2bb(element) { }; this.attr('autocomplete','off'); - var a = this.textcomplete([bbco], {className:'acpopup', zIndex:10000}); + this.textcomplete([bbco], {className:'acpopup', zIndex:10000}); + this.fixTextcompleteEscape(); - a.on('textComplete:select', function(e, value, strategy) { value; }); + this.on('textComplete:select', function(e, value, strategy) { value; }); - a.keypress(function(e){ + this.keypress(function(e){ if (e.keyCode == 13) { var x = listNewLineAutocomplete(this.id); if(x) { @@ -364,133 +401,4 @@ function string2bb(element) { }); }; })( jQuery ); - -/** - * Friendica people autocomplete legacy code - * - * require jQuery, jquery.textareas - */ -function ACPopup(elm, backend_url){ - this.idsel = -1; - this.element = elm; - this.searchText = ''; - this.ready = true; - this.kp_timer = false; - this.url = backend_url; - - this.conversation_id = null; - var conv_id = this.element.id.match(/\d+$/); - if (conv_id) { - this.conversation_id = conv_id[0]; - } - - var w = $(elm).width(); - var h = $(elm).height(); - - var style = $(elm).offset(); - style.top = style.top + h; - style.width = w; - style.position = 'absolute'; - style.display = 'none'; - - this.cont = $('
'); - this.cont.css(style); - - $('body').append(this.cont); -} - -ACPopup.prototype.close = function(){ - $(this.cont).remove(); - this.ready=false; -} -ACPopup.prototype.search = function(text){ - var that = this; - this.searchText=text; - if (this.kp_timer) clearTimeout(this.kp_timer); - this.kp_timer = setTimeout( function(){that._search();}, 500); -} - -ACPopup.prototype._search = function(){ - console.log("_search"); - var that = this; - var postdata = { - start:0, - count:100, - search:this.searchText, - type:'c', - conversation: this.conversation_id, - } - - $.ajax({ - type:'POST', - url: this.url, - data: postdata, - dataType: 'json', - success:function(data){ - that.cont.html(""); - if (data.tot>0){ - that.cont.show(); - $(data.items).each(function(){ - var html = "