|
|
<table id="permissions_manage" class="noborder">
|
|
|
<tr>
|
|
|
<td>${_('none')}</td>
|
|
|
<td>${_('read')}</td>
|
|
|
<td>${_('write')}</td>
|
|
|
<td>${_('admin')}</td>
|
|
|
<td>${_('member')}</td>
|
|
|
<td></td>
|
|
|
</tr>
|
|
|
## USERS
|
|
|
%for r2p in c.repo_info.repo_to_perm:
|
|
|
%if r2p.user.username =='default' and c.repo_info.private:
|
|
|
<tr>
|
|
|
<td colspan="4">
|
|
|
<span class="private_repo_msg">
|
|
|
${_('private repository')}
|
|
|
</span>
|
|
|
</td>
|
|
|
<td class="private_repo_msg"><img style="vertical-align:bottom" src="${h.url('/images/icons/user.png')}"/>${r2p.user.username}</td>
|
|
|
</tr>
|
|
|
%else:
|
|
|
<tr id="id${id(r2p.user.username)}">
|
|
|
<td>${h.radio('u_perm_%s' % r2p.user.username,'repository.none')}</td>
|
|
|
<td>${h.radio('u_perm_%s' % r2p.user.username,'repository.read')}</td>
|
|
|
<td>${h.radio('u_perm_%s' % r2p.user.username,'repository.write')}</td>
|
|
|
<td>${h.radio('u_perm_%s' % r2p.user.username,'repository.admin')}</td>
|
|
|
<td style="white-space: nowrap;">
|
|
|
<img style="vertical-align:bottom" src="${h.url('/images/icons/user.png')}"/>${r2p.user.username}
|
|
|
</td>
|
|
|
<td>
|
|
|
%if r2p.user.username !='default':
|
|
|
<span class="delete_icon action_button" onclick="ajaxActionUser(${r2p.user.user_id},'${'id%s'%id(r2p.user.username)}')">
|
|
|
${_('revoke')}
|
|
|
</span>
|
|
|
%endif
|
|
|
</td>
|
|
|
</tr>
|
|
|
%endif
|
|
|
%endfor
|
|
|
|
|
|
## USERS GROUPS
|
|
|
%for g2p in c.repo_info.users_group_to_perm:
|
|
|
<tr id="id${id(g2p.users_group.users_group_name)}">
|
|
|
<td>${h.radio('g_perm_%s' % g2p.users_group.users_group_name,'repository.none')}</td>
|
|
|
<td>${h.radio('g_perm_%s' % g2p.users_group.users_group_name,'repository.read')}</td>
|
|
|
<td>${h.radio('g_perm_%s' % g2p.users_group.users_group_name,'repository.write')}</td>
|
|
|
<td>${h.radio('g_perm_%s' % g2p.users_group.users_group_name,'repository.admin')}</td>
|
|
|
<td style="white-space: nowrap;">
|
|
|
<img style="vertical-align:bottom" src="${h.url('/images/icons/group.png')}"/>${g2p.users_group.users_group_name}
|
|
|
</td>
|
|
|
<td>
|
|
|
<span class="delete_icon action_button" onclick="ajaxActionUsersGroup(${g2p.users_group.users_group_id},'${'id%s'%id(g2p.users_group.users_group_name)}')">
|
|
|
${_('revoke')}
|
|
|
</span>
|
|
|
</td>
|
|
|
</tr>
|
|
|
%endfor
|
|
|
<tr id="add_perm_input">
|
|
|
<td>${h.radio('perm_new_member','repository.none')}</td>
|
|
|
<td>${h.radio('perm_new_member','repository.read')}</td>
|
|
|
<td>${h.radio('perm_new_member','repository.write')}</td>
|
|
|
<td>${h.radio('perm_new_member','repository.admin')}</td>
|
|
|
<td class='ac'>
|
|
|
<div class="perm_ac" id="perm_ac">
|
|
|
${h.text('perm_new_member_name',class_='yui-ac-input')}
|
|
|
${h.hidden('perm_new_member_type')}
|
|
|
<div id="perm_container"></div>
|
|
|
</div>
|
|
|
</td>
|
|
|
<td></td>
|
|
|
</tr>
|
|
|
<tr>
|
|
|
<td colspan="6">
|
|
|
<span id="add_perm" class="add_icon" style="cursor: pointer;">
|
|
|
${_('Add another member')}
|
|
|
</span>
|
|
|
</td>
|
|
|
</tr>
|
|
|
</table>
|
|
|
<script type="text/javascript">
|
|
|
function ajaxActionUser(user_id, field_id) {
|
|
|
var sUrl = "${h.url('delete_repo_user',repo_name=c.repo_name)}";
|
|
|
var callback = {
|
|
|
success: function (o) {
|
|
|
var tr = YUD.get(String(field_id));
|
|
|
tr.parentNode.removeChild(tr);
|
|
|
},
|
|
|
failure: function (o) {
|
|
|
alert("${_('Failed to remove user')}");
|
|
|
},
|
|
|
};
|
|
|
var postData = '_method=delete&user_id=' + user_id;
|
|
|
var request = YAHOO.util.Connect.asyncRequest('POST', sUrl, callback, postData);
|
|
|
};
|
|
|
|
|
|
function ajaxActionUsersGroup(users_group_id,field_id){
|
|
|
var sUrl = "${h.url('delete_repo_users_group',repo_name=c.repo_name)}";
|
|
|
var callback = {
|
|
|
success:function(o){
|
|
|
var tr = YUD.get(String(field_id));
|
|
|
tr.parentNode.removeChild(tr);
|
|
|
},
|
|
|
failure:function(o){
|
|
|
alert("${_('Failed to remove users group')}");
|
|
|
},
|
|
|
};
|
|
|
var postData = '_method=delete&users_group_id='+users_group_id;
|
|
|
var request = YAHOO.util.Connect.asyncRequest('POST', sUrl, callback, postData);
|
|
|
};
|
|
|
|
|
|
YUE.onDOMReady(function () {
|
|
|
if (!YUD.hasClass('perm_new_member_name', 'error')) {
|
|
|
YUD.setStyle('add_perm_input', 'display', 'none');
|
|
|
}
|
|
|
YAHOO.util.Event.addListener('add_perm', 'click', function () {
|
|
|
YUD.setStyle('add_perm_input', 'display', '');
|
|
|
YUD.setStyle('add_perm', 'opacity', '0.6');
|
|
|
YUD.setStyle('add_perm', 'cursor', 'default');
|
|
|
});
|
|
|
});
|
|
|
|
|
|
YAHOO.example.FnMultipleFields = function () {
|
|
|
var myUsers = ${c.users_array|n};
|
|
|
var myGroups = ${c.users_groups_array|n};
|
|
|
|
|
|
// Define a custom search function for the DataSource of users
|
|
|
var matchUsers = function (sQuery) {
|
|
|
// Case insensitive matching
|
|
|
var query = sQuery.toLowerCase();
|
|
|
var i = 0;
|
|
|
var l = myUsers.length;
|
|
|
var matches = [];
|
|
|
|
|
|
// Match against each name of each contact
|
|
|
for (; i < l; i++) {
|
|
|
contact = myUsers[i];
|
|
|
if ((contact.fname.toLowerCase().indexOf(query) > -1) || (contact.lname.toLowerCase().indexOf(query) > -1) || (contact.nname && (contact.nname.toLowerCase().indexOf(query) > -1))) {
|
|
|
matches[matches.length] = contact;
|
|
|
}
|
|
|
}
|
|
|
return matches;
|
|
|
};
|
|
|
|
|
|
// Define a custom search function for the DataSource of usersGroups
|
|
|
var matchGroups = function (sQuery) {
|
|
|
// Case insensitive matching
|
|
|
var query = sQuery.toLowerCase();
|
|
|
var i = 0;
|
|
|
var l = myGroups.length;
|
|
|
var matches = [];
|
|
|
|
|
|
// Match against each name of each contact
|
|
|
for (; i < l; i++) {
|
|
|
matched_group = myGroups[i];
|
|
|
if (matched_group.grname.toLowerCase().indexOf(query) > -1) {
|
|
|
matches[matches.length] = matched_group;
|
|
|
}
|
|
|
}
|
|
|
return matches;
|
|
|
};
|
|
|
|
|
|
//match all
|
|
|
var matchAll = function (sQuery) {
|
|
|
u = matchUsers(sQuery);
|
|
|
g = matchGroups(sQuery);
|
|
|
return u.concat(g);
|
|
|
};
|
|
|
|
|
|
// DataScheme for members
|
|
|
var memberDS = new YAHOO.util.FunctionDataSource(matchAll);
|
|
|
memberDS.responseSchema = {
|
|
|
fields: ["id", "fname", "lname", "nname", "grname", "grmembers"]
|
|
|
};
|
|
|
|
|
|
// DataScheme for owner
|
|
|
var ownerDS = new YAHOO.util.FunctionDataSource(matchUsers);
|
|
|
ownerDS.responseSchema = {
|
|
|
fields: ["id", "fname", "lname", "nname"]
|
|
|
};
|
|
|
|
|
|
// Instantiate AutoComplete for perms
|
|
|
var membersAC = new YAHOO.widget.AutoComplete("perm_new_member_name", "perm_container", memberDS);
|
|
|
membersAC.useShadow = false;
|
|
|
membersAC.resultTypeList = false;
|
|
|
|
|
|
// Instantiate AutoComplete for owner
|
|
|
var ownerAC = new YAHOO.widget.AutoComplete("user", "owner_container", ownerDS);
|
|
|
ownerAC.useShadow = false;
|
|
|
ownerAC.resultTypeList = false;
|
|
|
|
|
|
|
|
|
// Helper highlight function for the formatter
|
|
|
var highlightMatch = function (full, snippet, matchindex) {
|
|
|
return full.substring(0, matchindex) + "<span class='match'>" + full.substr(matchindex, snippet.length) + "</span>" + full.substring(matchindex + snippet.length);
|
|
|
};
|
|
|
|
|
|
// Custom formatter to highlight the matching letters
|
|
|
var custom_formatter = function (oResultData, sQuery, sResultMatch) {
|
|
|
var query = sQuery.toLowerCase();
|
|
|
|
|
|
if (oResultData.grname != undefined) {
|
|
|
var grname = oResultData.grname;
|
|
|
var grmembers = oResultData.grmembers;
|
|
|
var grnameMatchIndex = grname.toLowerCase().indexOf(query);
|
|
|
var grprefix = "${_('Group')}: ";
|
|
|
var grsuffix = " (" + grmembers + " ${_('members')})";
|
|
|
|
|
|
if (grnameMatchIndex > -1) {
|
|
|
return grprefix + highlightMatch(grname, query, grnameMatchIndex) + grsuffix;
|
|
|
}
|
|
|
|
|
|
return grprefix + oResultData.grname + grsuffix;
|
|
|
} else if (oResultData.fname != undefined) {
|
|
|
|
|
|
var fname = oResultData.fname,
|
|
|
lname = oResultData.lname,
|
|
|
nname = oResultData.nname || "",
|
|
|
// Guard against null value
|
|
|
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 displayfname + " " + displaylname + " " + displaynname;
|
|
|
} else {
|
|
|
return '';
|
|
|
}
|
|
|
};
|
|
|
membersAC.formatResult = custom_formatter;
|
|
|
ownerAC.formatResult = custom_formatter;
|
|
|
|
|
|
var myHandler = 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
|
|
|
myAC.getInputEl().value = oData.nname;
|
|
|
YUD.get('perm_new_member_type').value = 'user';
|
|
|
} else {
|
|
|
//groups
|
|
|
myAC.getInputEl().value = oData.grname;
|
|
|
YUD.get('perm_new_member_type').value = 'users_group';
|
|
|
}
|
|
|
|
|
|
};
|
|
|
|
|
|
membersAC.itemSelectEvent.subscribe(myHandler);
|
|
|
if(ownerAC.itemSelectEvent){
|
|
|
ownerAC.itemSelectEvent.subscribe(myHandler);
|
|
|
}
|
|
|
|
|
|
return {
|
|
|
memberDS: memberDS,
|
|
|
ownerDS: ownerDS,
|
|
|
membersAC: membersAC,
|
|
|
ownerAC: ownerAC,
|
|
|
};
|
|
|
}();
|
|
|
|
|
|
</script>
|
|
|
|