Changeset - e975e1d41059
[Not reviewed]
Bradley M. Kuhn - 12 years ago 2014-07-03 01:03:29
bkuhn@sfconservancy.org
rhodecode.js: workaround missing unknown autocomplete textboxKeyUpEvent

It was introduced in the YUI update in 5143b8df576c and used for @mention handling.
1 file changed with 5 insertions and 14 deletions:
0 comments (0 inline, 0 general)
rhodecode/public/js/rhodecode.js
Show inline comments
 
@@ -1328,172 +1328,163 @@ var MentionsAutoComplete = function (div
 
                sQuery = this.dataSource.mentionQuery;
 
            }
 

	
 
            var query = sQuery.toLowerCase();
 
            var _gravatar = function(res, em, group){
 
                if (group !== undefined){
 
                    em = '/images/icons/group.png'
 
                }
 
                tmpl = '<div class="ac-container-wrap"><img class="perm-gravatar-ac" src="{0}"/>{1}</div>'
 
                return tmpl.format(em,res)
 
            }
 
            if (oResultData.nname != undefined) {
 
                var fname = oResultData.fname || "";
 
                var lname = oResultData.lname || "";
 
                var nname = oResultData.nname;
 

	
 
                // Guard against null value
 
                var fnameMatchIndex = fname.toLowerCase().indexOf(query),
 
                    lnameMatchIndex = lname.toLowerCase().indexOf(query),
 
                    nnameMatchIndex = nname.toLowerCase().indexOf(query),
 
                    displayfname, displaylname, displaynname;
 

	
 
                if (fnameMatchIndex > -1) {
 
                    displayfname = highlightMatch(fname, query, fnameMatchIndex);
 
                } else {
 
                    displayfname = fname;
 
                }
 

	
 
                if (lnameMatchIndex > -1) {
 
                    displaylname = highlightMatch(lname, query, lnameMatchIndex);
 
                } else {
 
                    displaylname = lname;
 
                }
 

	
 
                if (nnameMatchIndex > -1) {
 
                    displaynname = "(" + highlightMatch(nname, query, nnameMatchIndex) + ")";
 
                } else {
 
                    displaynname = nname ? "(" + nname + ")" : "";
 
                }
 

	
 
                return _gravatar(displayfname + " " + displaylname + " " + displaynname, oResultData.gravatar_lnk);
 
            } else {
 
                return '';
 
            }
 
        };
 

	
 
    if(ownerAC.itemSelectEvent){
 
        ownerAC.itemSelectEvent.subscribe(function (sType, aArgs) {
 

	
 
            var myAC = aArgs[0]; // reference back to the AC instance
 
            var elLI = aArgs[1]; // reference to the selected LI element
 
            var oData = aArgs[2]; // object literal of selected item's result data
 
            //fill the autocomplete with value
 
            if (oData.nname != undefined) {
 
                //users
 
                //Replace the mention name with replaced
 
                var re = new RegExp();
 
                var org = myAC.getInputEl().value;
 
                var chunks = myAC.dataSource.chunks
 
                // replace middle chunk(the search term) with actuall  match
 
                chunks[1] = chunks[1].replace('@'+myAC.dataSource.mentionQuery,
 
                                              '@'+oData.nname+' ');
 
                myAC.getInputEl().value = chunks.join('')
 
                myAC.getInputEl().focus(); // Y U NO WORK !?
 
            } else {
 
                //groups
 
                myAC.getInputEl().value = oData.grname;
 
                $('#perm_new_member_type').val('users_group');
 
            }
 
        });
 
    }
 

	
 
    // in this keybuffer we will gather current value of search !
 
    // since we need to get this just when someone does `@` then we do the
 
    // search
 
    ownerAC.dataSource.chunks = [];
 
    ownerAC.dataSource.mentionQuery = null;
 

	
 
    ownerAC.get_mention = function(msg, max_pos) {
 
        var org = msg;
 
        var re = new RegExp('(?:^@|\s@)([a-zA-Z0-9]{1}[a-zA-Z0-9\-\_\.]+)$')
 
        var chunks  = [];
 

	
 
        // cut first chunk until curret pos
 
        var to_max = msg.substr(0, max_pos);
 
        var at_pos = Math.max(0,to_max.lastIndexOf('@')-1);
 
        var msg2 = to_max.substr(at_pos);
 

	
 
        chunks.push(org.substr(0,at_pos))// prefix chunk
 
        chunks.push(msg2)                // search chunk
 
        chunks.push(org.substr(max_pos)) // postfix chunk
 

	
 
        // clean up msg2 for filtering and regex match
 
        var msg2 = msg2.lstrip(' ').lstrip('\n');
 

	
 
        if(re.test(msg2)){
 
            var unam = re.exec(msg2)[1];
 
            return [unam, chunks];
 
        }
 
        return [null, null];
 
    };
 

	
 
    if (ownerAC.textboxKeyUpEvent){
 
        ownerAC.textboxKeyUpEvent.subscribe(function(type, args){
 

	
 
            var ac_obj = args[0];
 
            var currentMessage = args[1];
 
            var currentCaretPosition = args[0]._elTextbox.selectionStart;
 
    $divid = $('#'+divid);
 
    $divid.keyup(function(e){
 
            var currentMessage = $divid.val();
 
            var currentCaretPosition = $divid[0].selectionStart;
 

	
 
            var unam = ownerAC.get_mention(currentMessage, currentCaretPosition);
 
            var curr_search = null;
 
            if(unam[0]){
 
                curr_search = unam[0];
 
            }
 

	
 
            ownerAC.dataSource.chunks = unam[1];
 
            ownerAC.dataSource.mentionQuery = curr_search;
 

	
 
        })
 
    }
 
    return {
 
        ownerDS: ownerDS,
 
        ownerAC: ownerAC,
 
    };
 
        });
 
}
 

	
 
var addReviewMember = function(id,fname,lname,nname,gravatar_link){
 
    var displayname = "{0} {1} ({2})".format(fname, lname, nname);
 
    var element = (
 
        '     <li id="reviewer_{2}">\n'+
 
        '       <div class="reviewers_member">\n'+
 
        '           <div class="reviewer_status tooltip" title="not_reviewed">\n'+
 
        '             <img src="/images/icons/flag_status_not_reviewed.png"/>\n'+
 
        '           </div>\n'+
 
        '         <div class="reviewer_gravatar gravatar"><img alt="gravatar" src="{0}"/> </div>\n'+
 
        '         <div style="float:left;">{1}</div>\n'+
 
        '         <input type="hidden" value="{2}" name="review_members" />\n'+
 
        '         <div class="reviewer_member_remove action_button" onclick="removeReviewMember({2})">\n'+
 
        '             <i class="icon-remove-sign" style="color: #FF4444;"></i>\n'+
 
        '         </div>\n'+
 
        '       </div>\n'+
 
        '     </li>\n'
 
        ).format(gravatar_link, displayname, id);
 
    // check if we don't have this ID already in
 
    var ids = [];
 
    $('#review_members').find('li').each(function() {
 
            ids.push(this.id);
 
        });
 
    if(ids.indexOf('reviewer_'+id) == -1){
 
        //only add if it's not there
 
        $('#review_members').append(element);
 
    }
 
}
 

	
 
var removeReviewMember = function(reviewer_id, repo_name, pull_request_id){
 
    $('#reviewer_{0}'.format(reviewer_id)).remove();
 
}
 

	
 
/* handle "Save Changes" of addReviewMember and removeReviewMember on PR */
 
var updateReviewers = function(reviewers_ids, repo_name, pull_request_id){
 
    if (reviewers_ids === undefined){
 
        var reviewers_ids = [];
 
        $('#review_members').find('input').each(function(){
 
                reviewers_ids.push(this.value);
 
            });
 
    }
 
    var url = pyroutes.url('pullrequest_update', {"repo_name":repo_name,
 
                                                  "pull_request_id": pull_request_id});
 
    var postData = {'_method':'put',
 
                    'reviewers_ids': reviewers_ids};
 
    var success = function(o){
 
        window.location.reload();
0 comments (0 inline, 0 general)