Show More
The requested changes are too big and content was truncated. Show full diff
@@ -47,6 +47,7 b' from rhodecode.model.db import Changeset' | |||||
47 | from rhodecode.model.comment import ChangesetCommentsModel |
|
47 | from rhodecode.model.comment import ChangesetCommentsModel | |
48 | from rhodecode.model.meta import Session |
|
48 | from rhodecode.model.meta import Session | |
49 | from rhodecode.lib.diffs import wrapped_diff |
|
49 | from rhodecode.lib.diffs import wrapped_diff | |
|
50 | from rhodecode.model.repo import RepoModel | |||
50 |
|
51 | |||
51 | log = logging.getLogger(__name__) |
|
52 | log = logging.getLogger(__name__) | |
52 |
|
53 | |||
@@ -165,6 +166,9 b' class ChangesetController(BaseRepoContro' | |||||
165 | def __before__(self): |
|
166 | def __before__(self): | |
166 | super(ChangesetController, self).__before__() |
|
167 | super(ChangesetController, self).__before__() | |
167 | c.affected_files_cut_off = 60 |
|
168 | c.affected_files_cut_off = 60 | |
|
169 | repo_model = RepoModel() | |||
|
170 | c.users_array = repo_model.get_users_js() | |||
|
171 | c.users_groups_array = repo_model.get_users_groups_js() | |||
168 |
|
172 | |||
169 | def index(self, revision): |
|
173 | def index(self, revision): | |
170 |
|
174 |
@@ -2820,6 +2820,13 b' table.code-browser .submodule-dir {' | |||||
2820 | box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6); |
|
2820 | box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6); | |
2821 | } |
|
2821 | } | |
2822 |
|
2822 | |||
|
2823 | .mentions-container{ | |||
|
2824 | width: 100% !important; | |||
|
2825 | } | |||
|
2826 | .mentions-container .yui-ac-content{ | |||
|
2827 | width: 90% !important; | |||
|
2828 | } | |||
|
2829 | ||||
2823 | .ac { |
|
2830 | .ac { | |
2824 | vertical-align: top; |
|
2831 | vertical-align: top; | |
2825 | } |
|
2832 | } |
@@ -988,6 +988,189 b' var MembersAutoComplete = function (user' | |||||
988 | } |
|
988 | } | |
989 |
|
989 | |||
990 |
|
990 | |||
|
991 | var MentionsAutoComplete = function (divid, cont, users_list, groups_list, group_lbl, members_lbl) { | |||
|
992 | var myUsers = users_list; | |||
|
993 | var myGroups = groups_list; | |||
|
994 | ||||
|
995 | // Define a custom search function for the DataSource of users | |||
|
996 | var matchUsers = function (sQuery) { | |||
|
997 | var org_sQuery = sQuery; | |||
|
998 | if(this.mentionQuery == null){ | |||
|
999 | return [] | |||
|
1000 | } | |||
|
1001 | sQuery = this.mentionQuery; | |||
|
1002 | // Case insensitive matching | |||
|
1003 | var query = sQuery.toLowerCase(); | |||
|
1004 | var i = 0; | |||
|
1005 | var l = myUsers.length; | |||
|
1006 | var matches = []; | |||
|
1007 | ||||
|
1008 | // Match against each name of each contact | |||
|
1009 | for (; i < l; i++) { | |||
|
1010 | contact = myUsers[i]; | |||
|
1011 | if ((contact.fname.toLowerCase().indexOf(query) > -1) || (contact.lname.toLowerCase().indexOf(query) > -1) || (contact.nname && (contact.nname.toLowerCase().indexOf(query) > -1))) { | |||
|
1012 | matches[matches.length] = contact; | |||
|
1013 | } | |||
|
1014 | } | |||
|
1015 | return matches | |||
|
1016 | }; | |||
|
1017 | ||||
|
1018 | //match all | |||
|
1019 | var matchAll = function (sQuery) { | |||
|
1020 | u = matchUsers(sQuery); | |||
|
1021 | return u | |||
|
1022 | }; | |||
|
1023 | ||||
|
1024 | // DataScheme for owner | |||
|
1025 | var ownerDS = new YAHOO.util.FunctionDataSource(matchUsers); | |||
|
1026 | ownerDS.responseSchema = { | |||
|
1027 | fields: ["id", "fname", "lname", "nname", "gravatar_lnk"] | |||
|
1028 | }; | |||
|
1029 | ||||
|
1030 | // Instantiate AutoComplete for mentions | |||
|
1031 | var ownerAC = new YAHOO.widget.AutoComplete(divid, cont, ownerDS); | |||
|
1032 | ownerAC.useShadow = false; | |||
|
1033 | ownerAC.resultTypeList = false; | |||
|
1034 | ownerAC.suppressInputUpdate = true; | |||
|
1035 | ||||
|
1036 | // Helper highlight function for the formatter | |||
|
1037 | var highlightMatch = function (full, snippet, matchindex) { | |||
|
1038 | return full.substring(0, matchindex) | |||
|
1039 | + "<span class='match'>" | |||
|
1040 | + full.substr(matchindex, snippet.length) | |||
|
1041 | + "</span>" + full.substring(matchindex + snippet.length); | |||
|
1042 | }; | |||
|
1043 | ||||
|
1044 | // Custom formatter to highlight the matching letters | |||
|
1045 | ownerAC.formatResult = function (oResultData, sQuery, sResultMatch) { | |||
|
1046 | var org_sQuery = sQuery; | |||
|
1047 | if(this.dataSource.mentionQuery != null){ | |||
|
1048 | sQuery = this.dataSource.mentionQuery; | |||
|
1049 | } | |||
|
1050 | ||||
|
1051 | var query = sQuery.toLowerCase(); | |||
|
1052 | var _gravatar = function(res, em, group){ | |||
|
1053 | if (group !== undefined){ | |||
|
1054 | em = '/images/icons/group.png' | |||
|
1055 | } | |||
|
1056 | tmpl = '<div class="ac-container-wrap"><img class="perm-gravatar-ac" src="{0}"/>{1}</div>' | |||
|
1057 | return tmpl.format(em,res) | |||
|
1058 | } | |||
|
1059 | if (oResultData.fname != undefined) { | |||
|
1060 | var fname = oResultData.fname, | |||
|
1061 | lname = oResultData.lname, | |||
|
1062 | nname = oResultData.nname || "", | |||
|
1063 | // Guard against null value | |||
|
1064 | fnameMatchIndex = fname.toLowerCase().indexOf(query), | |||
|
1065 | lnameMatchIndex = lname.toLowerCase().indexOf(query), | |||
|
1066 | nnameMatchIndex = nname.toLowerCase().indexOf(query), | |||
|
1067 | displayfname, displaylname, displaynname; | |||
|
1068 | ||||
|
1069 | if (fnameMatchIndex > -1) { | |||
|
1070 | displayfname = highlightMatch(fname, query, fnameMatchIndex); | |||
|
1071 | } else { | |||
|
1072 | displayfname = fname; | |||
|
1073 | } | |||
|
1074 | ||||
|
1075 | if (lnameMatchIndex > -1) { | |||
|
1076 | displaylname = highlightMatch(lname, query, lnameMatchIndex); | |||
|
1077 | } else { | |||
|
1078 | displaylname = lname; | |||
|
1079 | } | |||
|
1080 | ||||
|
1081 | if (nnameMatchIndex > -1) { | |||
|
1082 | displaynname = "(" + highlightMatch(nname, query, nnameMatchIndex) + ")"; | |||
|
1083 | } else { | |||
|
1084 | displaynname = nname ? "(" + nname + ")" : ""; | |||
|
1085 | } | |||
|
1086 | ||||
|
1087 | return _gravatar(displayfname + " " + displaylname + " " + displaynname, oResultData.gravatar_lnk); | |||
|
1088 | } else { | |||
|
1089 | return ''; | |||
|
1090 | } | |||
|
1091 | }; | |||
|
1092 | ||||
|
1093 | if(ownerAC.itemSelectEvent){ | |||
|
1094 | ownerAC.itemSelectEvent.subscribe(function (sType, aArgs) { | |||
|
1095 | ||||
|
1096 | var myAC = aArgs[0]; // reference back to the AC instance | |||
|
1097 | var elLI = aArgs[1]; // reference to the selected LI element | |||
|
1098 | var oData = aArgs[2]; // object literal of selected item's result data | |||
|
1099 | //fill the autocomplete with value | |||
|
1100 | if (oData.nname != undefined) { | |||
|
1101 | //users | |||
|
1102 | //Replace the mention name with replaced | |||
|
1103 | var re = new RegExp(); | |||
|
1104 | var org = myAC.getInputEl().value; | |||
|
1105 | var chunks = myAC.dataSource.chunks | |||
|
1106 | // replace middle chunk(the search term) with actuall match | |||
|
1107 | chunks[1] = chunks[1].replace('@'+myAC.dataSource.mentionQuery, | |||
|
1108 | '@'+oData.nname+' '); | |||
|
1109 | myAC.getInputEl().value = chunks.join('') | |||
|
1110 | YUD.get(myAC.getInputEl()).focus(); // Y U NO WORK !? | |||
|
1111 | } else { | |||
|
1112 | //groups | |||
|
1113 | myAC.getInputEl().value = oData.grname; | |||
|
1114 | YUD.get('perm_new_member_type').value = 'users_group'; | |||
|
1115 | } | |||
|
1116 | }); | |||
|
1117 | } | |||
|
1118 | ||||
|
1119 | // in this keybuffer we will gather current value of search ! | |||
|
1120 | // since we need to get this just when someone does `@` then we do the | |||
|
1121 | // search | |||
|
1122 | ownerAC.dataSource.chunks = []; | |||
|
1123 | ownerAC.dataSource.mentionQuery = null; | |||
|
1124 | ||||
|
1125 | ownerAC.get_mention = function(msg, max_pos) { | |||
|
1126 | var org = msg; | |||
|
1127 | var re = new RegExp('(?:^@|\s@)([a-zA-Z0-9]{1}[a-zA-Z0-9\-\_\.]+)$') | |||
|
1128 | var chunks = []; | |||
|
1129 | ||||
|
1130 | ||||
|
1131 | // cut first chunk until curret pos | |||
|
1132 | var to_max = msg.substr(0, max_pos); | |||
|
1133 | var at_pos = Math.max(0,to_max.lastIndexOf('@')-1); | |||
|
1134 | var msg2 = to_max.substr(at_pos); | |||
|
1135 | ||||
|
1136 | chunks.push(org.substr(0,at_pos))// prefix chunk | |||
|
1137 | chunks.push(msg2) // search chunk | |||
|
1138 | chunks.push(org.substr(max_pos)) // postfix chunk | |||
|
1139 | ||||
|
1140 | // clean up msg2 for filtering and regex match | |||
|
1141 | var msg2 = msg2.replace(' ','').replace('\n',''); | |||
|
1142 | ||||
|
1143 | if(re.test(msg2)){ | |||
|
1144 | var unam = re.exec(msg2)[1]; | |||
|
1145 | return [unam, chunks]; | |||
|
1146 | } | |||
|
1147 | return [null, null]; | |||
|
1148 | }; | |||
|
1149 | ownerAC.textboxKeyUpEvent.subscribe(function(type, args){ | |||
|
1150 | ||||
|
1151 | var ac_obj = args[0]; | |||
|
1152 | var currentMessage = args[1]; | |||
|
1153 | var currentCaretPosition = args[0]._elTextbox.selectionStart; | |||
|
1154 | ||||
|
1155 | var unam = ownerAC.get_mention(currentMessage, currentCaretPosition); | |||
|
1156 | var curr_search = null; | |||
|
1157 | if(unam[0]){ | |||
|
1158 | curr_search = unam[0]; | |||
|
1159 | } | |||
|
1160 | ||||
|
1161 | ownerAC.dataSource.chunks = unam[1]; | |||
|
1162 | ownerAC.dataSource.mentionQuery = curr_search; | |||
|
1163 | ||||
|
1164 | }) | |||
|
1165 | ||||
|
1166 | return { | |||
|
1167 | ownerDS: ownerDS, | |||
|
1168 | ownerAC: ownerAC, | |||
|
1169 | }; | |||
|
1170 | } | |||
|
1171 | ||||
|
1172 | ||||
|
1173 | ||||
991 |
|
1174 | |||
992 | /** |
|
1175 | /** | |
993 | * QUICK REPO MENU |
|
1176 | * QUICK REPO MENU |
1 | NO CONTENT: modified file |
|
NO CONTENT: modified file | ||
The requested commit or file is too big and content was truncated. Show full diff |
1 | NO CONTENT: modified file |
|
NO CONTENT: modified file | ||
The requested commit or file is too big and content was truncated. Show full diff |
General Comments 0
You need to be logged in to leave comments.
Login now