forked from GNUsocial/gnu-social
		
	
		
			
				
	
	
		
			138 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			138 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| /** Init for Autocomplete (requires jquery-ui)
 | |
|  *
 | |
|  * @package   Plugin
 | |
|  * @author Mikael Nordfeldth <mmn@hethane.se>
 | |
|  * @copyright 2013 Free Software Foundation, Inc.
 | |
|  * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
 | |
|  * @link      http://status.net/
 | |
|  */
 | |
| 
 | |
| var origInit = SN.Init.NoticeFormSetup;
 | |
| SN.Init.NoticeFormSetup = function(form) {
 | |
|     origInit(form);
 | |
| 
 | |
|     // Only attach to traditional-style forms
 | |
|     var textarea = form.find('.notice_data-text:first');
 | |
|     if (textarea.length === 0) {
 | |
|         return;
 | |
|     }
 | |
| 
 | |
|     function termSplit(val) {
 | |
|         return val.split(/ \s*/);
 | |
|     }
 | |
|     function extractLast( term ) {
 | |
|         return termSplit(term).pop();
 | |
|     }
 | |
|     var apiUrl = $('#autocomplete-api').attr('data-url');
 | |
|     // migrated "multiple" and "multipleSeparator" from
 | |
|     // http://www.learningjquery.com/2010/06/autocomplete-migration-guide
 | |
|     textarea
 | |
|         .bind('keydown', function( event ) {
 | |
|             if ( event.keyCode === $.ui.keyCode.TAB &&
 | |
|                 $( this ).data( "ui-autocomplete" ).menu.active ) {
 | |
|                 event.preventDefault();
 | |
|             }
 | |
|         })
 | |
|         .autocomplete({
 | |
|             minLength: 1,   // 1 is default
 | |
|             source: function (request, response) {
 | |
|                 $.getJSON( apiUrl, {
 | |
|                     term: extractLast(request.term)
 | |
|                 }, response );
 | |
|             },
 | |
|             search: function () {
 | |
|                 // custom minLength, we though we match the 1 below
 | |
|                 var term = extractLast(this.value);
 | |
|                 if (term.length <= 1) {
 | |
|                     return false;
 | |
|                 }
 | |
|             },
 | |
|             focus: function () {
 | |
|                 // prevent value inserted on focus
 | |
|                 return false;
 | |
|             },
 | |
|             select: function (event, ui) {
 | |
|                 var terms = termSplit(this.value);
 | |
|                 terms.pop();    // remove latest term
 | |
|                 terms.push(ui.item.value);  // insert
 | |
|                 terms.push(''); // empty element, for the join()
 | |
|                 this.value = terms.join(' ');
 | |
|                 return false;
 | |
|             },
 | |
|         })
 | |
|         .data('ui-autocomplete')._renderItem = function (ul, item) {
 | |
|             return $('<li></li>')
 | |
|                 .data('ui-autocomplete-item', item)
 | |
|                 .append('<a><img style="display:inline; vertical-align: middle"><span /></a>')
 | |
|                 .find('img').attr('src', item.avatar).end()
 | |
|                 .find('span').text(item.label).end()
 | |
|                 .appendTo(ul);
 | |
|         };
 | |
| };
 | |
| 
 | |
| /**
 | |
|  * Called when a people tag edit box is shown in the interface
 | |
|  *
 | |
|  * - loads the jQuery UI autocomplete plugin
 | |
|  * - sets event handlers for tag completion
 | |
|  *
 | |
|  */
 | |
| SN.Init.PeopletagAutocomplete = function(txtBox) {
 | |
|     var split,
 | |
|         extractLast;
 | |
| 
 | |
|     split = function(val) {
 | |
|         return val.split( /\s+/ );
 | |
|     };
 | |
| 
 | |
|      extractLast = function(term) {
 | |
|         return split(term).pop();
 | |
|     };
 | |
| 
 | |
|     // don't navigate away from the field on tab when selecting an item
 | |
|     txtBox
 | |
|         .on('keydown', function(event) {
 | |
|             if (event.keyCode === $.ui.keyCode.TAB &&
 | |
|                     $(this).data('ui-autocomplete').menu.active) {
 | |
|                 event.preventDefault();
 | |
|             }
 | |
|         })
 | |
|         .autocomplete({
 | |
|             minLength: 0,
 | |
|             source: function(request, response) {
 | |
|                 // delegate back to autocomplete, but extract the last term
 | |
|                 response($.ui.autocomplete.filter(
 | |
|                     SN.C.PtagACData, extractLast(request.term)));
 | |
|             },
 | |
|             focus: function () {
 | |
|                 return false;
 | |
|             },
 | |
|             select: function(event, ui) {
 | |
|                 var terms = split(this.value);
 | |
|                 terms.pop();
 | |
|                 terms.push(ui.item.value);
 | |
|                 terms.push('');
 | |
|                 this.value = terms.join(' ');
 | |
|                 return false;
 | |
|             }
 | |
|         })
 | |
|         .data('ui-autocomplete')
 | |
|         ._renderItem = function (ul, item) {
 | |
|             // FIXME: with jQuery UI you cannot have it highlight the match
 | |
|             var _l = '<a class="ptag-ac-line-tag">' + item.tag +
 | |
|                      ' <em class="privacy_mode">' + item.mode + '</em>' +
 | |
|                      '<span class="freq">' + item.freq + '</span></a>';
 | |
| 
 | |
|             return $('<li/>')
 | |
|                     .addClass('mode-' + item.mode)
 | |
|                     .addClass('ptag-ac-line')
 | |
|                     .data('item.autocomplete', item)
 | |
|                     .append(_l)
 | |
|                     .appendTo(ul);
 | |
|         };
 | |
| };
 | |
| 
 | |
| $(document).on('click', '.peopletags_edit_button', function () {
 | |
|     SN.Init.PeopletagAutocomplete($(this).closest('dd').find('[name="tags"]'));
 | |
| });
 |