123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138 |
- /** 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"]'));
- });
|