blob: 7517d15f831b8f2999c3d47a34e76972fb7e5165 [file] [log] [blame]
[define category_css]css/ph_list.css[end]
[include "../framework/header.ezt" "showusertabs" "t1"]
[include "../framework/js-placeholders.ezt"]
<div id="colcontrol">
<h2>
[if-any viewing_self][else]
[if-any user_stars_enabled]
[if-any logged_in_user]
[if-any read_only][else]
[if-any user_stars_enabled]
[if-any logged_in_user]
[if-any read_only][else]
<a id="user_star"
style="color:[if-any is_user_starred]cornflowerblue[else]gray[end]"
title="[if-any is_user_starred]Un-s[else]S[end]tar this user">
[if-any is_user_starred]&#9733;[else]&#9734;[end]
</a>
[end]
[end]
[end]
[end]
[end]
[end]
[end]
[viewed_user_display_name]
</h2>
<p>
<b>Last visit:</b>
[last_visit_str]
</p>
[if-any last_bounce_str]
<p>
<b>Email to this user bounced:</b>
[last_bounce_str]
[define offer_clear_bouncing]No[end]
[if-any viewing_self][define offer_clear_bouncing]Yes[end][end]
[if-any perms._EditOtherUsers][define offer_clear_bouncing]Yes[end][end]
[is offer_clear_bouncing "Yes"]
<a href="[viewed_user.profile_url]clearBouncing" style="margin-left:2em">Clear</a>
[end]
</p>
[end]
[if-any vacation_message]
<p>
<b>Vacation message:</b>
[vacation_message]
</p>
[end]
[if-any linked_parent]
<p>
<b>Linked parent account:</b>
[include "../framework/user-link.ezt" linked_parent]
[if-any offer_unlink perms._EditOtherUsers]
<input type="button" class="unlink_account secondary"
data-parent="[linked_parent.email]"
data-child="[viewed_user.email]"
value="Unlink">
[end]
</p>
[end]
[if-any linked_children]
<p>
<b>Linked child accounts:</b>
[for linked_children]
[include "../framework/user-link.ezt" linked_children]
[if-any offer_unlink perms._EditOtherUsers]
<input type="button" class="unlink_account secondary"
data-parent="[viewed_user.email]"
data-child="[linked_children.email]"
value="Unlink">
[end]
[end]
</p>
[end]
[if-any incoming_invite_users]
<b>Accept linked sub-account:</b>
[for incoming_invite_users]
<div>
[include "../framework/user-link.ezt" incoming_invite_users]
[if-any can_edit_invites][# TODO(jrobbins): allow site admin to accept invites for other users.]
<input type="button" class="incoming_invite" data-email="[incoming_invite_users.email]" value="Accept">
[# TODO(jrobbins): Button to decline invite.]
[end]
</div>
[end]
[else][if-any outgoing_invite_users]
<b>Waiting for acceptance by parent-account:</b>
[for outgoing_invite_users]
<div>
[include "../framework/user-link.ezt" outgoing_invite_users]
</div>
[end]
[else][if-any possible_parent_accounts]
<b>Link this account to:</b>
<select id="parent_to_invite">
<option value="" selected="selected">----</option>
[for possible_parent_accounts]
<option value="[possible_parent_accounts]">[possible_parent_accounts]</option>
[end]
</select>
[if-any can_edit_invites][# TODO(jrobbins): allow site admin to create invites for other users.]
<button id="create_linked_account_invite" disabled="disabled">Link</button>
[end]
[end][end][end]
[if-any user_stars_enabled]
<p>
<b>Starred developers:</b>
[if-any starred_users]
[for starred_users]
[include "../framework/user-link.ezt" starred_users][if-index starred_users last][else], [end]
[end]
[else]<i>None</i>[end]
</p>
[end]
<br>
<div class="list">
<table style="width: 100%;" cellspacing="0" cellpadding="0">
<tbody><tr>
<th style="text-align: left;">Projects
</th>
</tr></tbody>
</table>
</div>
<table cellspacing="0" cellpadding="2" border="0" class="results striped" id="projecttable" width="100%">
<tbody>
<tr id="headingrow">
[if-any logged_in_user]
<th style="white-space:nowrap; width:3%;"></th>
[end]
<th style="white-space:nowrap; width:15%;">Role</th>
<th style="white-space:nowrap; width:25%;">Project</th>
<th style="white-space:nowrap; width:57%;">Summary</th>
</tr>
[if-any owner_of_projects committer_of_projects contributor_to_projects]
[if-any owner_of_projects]
[for owner_of_projects]
<tr data-url="[owner_of_projects.relative_home_url]" data-project-name="[owner_of_projects.project_name]">
[if-any logged_in_user]
<td class="rowwidgets">
<a class="star"
style="color:[if-any owner_of_projects.starred]cornflowerblue[else]gray[end]"
title="[if-any owner_of_projects.starred]Un-s[else]S[end]tar this project"
data-project-name="[owner_of_projects.project_name]">
[if-any owner_of_projects.starred]&#9733;[else]&#9734;[end]
</a>
</td>
[end]
<td>Owner</td>
<td class="id" name="owner">
<a href="[owner_of_projects.relative_home_url]/">[owner_of_projects.project_name]</a>
[is owner_of_projects.state_name "HIDDEN"]<span style="color:red"> - hidden</span>[end]
</td>
<td>[owner_of_projects.summary]</td>
</tr>
[end]
[end]
[if-any committer_of_projects]
[for committer_of_projects]
<tr data-url="[committer_of_projects.relative_home_url]" data-project-name="[committer_of_projects.project_name]">
[if-any logged_in_user]
<td class="rowwidgets">
<a class="star"
style="color:[if-any committer_of_projects.starred]cornflowerblue[else]gray[end]"
title="[if-any committer_of_projects.starred]Un-s[else]S[end]tar this project"
data-project-name="[committer_of_projects.project_name]">
[if-any committer_of_projects.starred]&#9733;[else]&#9734;[end]
</a>
</td>
[end]
<td>Committer</td>
<td class="id" name="committer">
<a href="[committer_of_projects.relative_home_url]/">[committer_of_projects.project_name]
</a>
</td>
<td>
[committer_of_projects.summary]
</td>
</tr>
[end]
[end]
[if-any contributor_to_projects]
[for contributor_to_projects]
<tr data-url="[contributor_to_projects.relative_home_url]" data-project-name="[contributor_to_projects.project_name]">
[if-any logged_in_user]
<td class="rowwidgets">
<a class="star"
style="color:[if-any contributor_to_projects.starred]cornflowerblue[else]gray[end]"
title="[if-any contributor_to_projects.starred]Un-s[else]S[end]tar this project"
data-project-name="[contributor_to_projects.project_name]">
[if-any contributor_to_projects.starred]&#9733;[else]&#9734;[end]
</a>
</td>
[end]
<td>Contributor</td>
<td class="id" name="contributor">
<a href="[contributor_to_projects.relative_home_url]/">[contributor_to_projects.project_name]
</a>
[is contributor_to_projects.state_name "HIDDEN"]<span style="color:red"> - hidden</span>[end]</td>
<td>
[contributor_to_projects.summary]
</td>
</tr>
[end]
[end]
[else]
<tr>
<td colspan="4"><i>No projects.</i></td>
<tr>
[end]
</tbody>
</table>
[if-any starred_projects]
<br>
<div class="list">
<table style="width: 100%;" cellspacing="0" cellpadding="0">
<tbody><tr>
<th style="text-align: left;">
Starred by [if-any viewing_self]me[else]
[viewed_user_display_name]
[end]
</th>
</tr></tbody>
</table>
</div>
<table cellspacing="0" cellpadding="2" border="0" class="results striped" id="starredtable" width="100%">
<tbody>
<tr id="headingrow">
[if-any logged_in_user]
<th style="white-space:nowrap; width:3%;"></th>
[end]
<th style="white-space:nowrap; width:25%;">Name</th>
<th style="white-space:nowrap; width:57%;">Summary</th>
</tr>
[for starred_projects]
<tr data-url="[starred_projects.relative_home_url]" data-project-name="[starred_projects.project_name]">
[if-any logged_in_user]
<td class="rowwidgets">
<a class="star"
style="color:[if-any starred_projects.starred]cornflowerblue[else]gray[end]"
title="[if-any starred_projects.starred]Un-s[else]S[end]tar this project"
data-project-name="[starred_projects.project_name]">
[if-any starred_projects.starred]&#9733;[else]&#9734;[end]
</a>
</td>
[end]
<td class="id" name="starred_project">
<a href="[starred_projects.relative_home_url]/">[starred_projects.project_name]</a>
[is starred_projects.state_name "HIDDEN"]<span style="color:red"> - hidden</span>[end]
</td>
<td>
[starred_projects.summary]
</td>
</tr>
[end]
</table>
[end]
[if-any owner_of_archived_projects]
<br>
<div class="list">
<table style="width: 100%;" cellspacing="0" cellpadding="0">
<tbody><tr>
<th style="text-align: left;">Archived projects
</th>
</tr></tbody>
</table>
</div>
<table cellspacing="0" cellpadding="2" border="0" class="results striped" id="archivedtable" width="100%">
<tbody>
<tr id="headingrow">
<th style="white-space:nowrap; width:25%;">Name</th>
<th style="white-space:nowrap; width:60%;">Summary</th>
</tr>
[for owner_of_archived_projects]
<tr data-url="[owner_of_archived_projects.relative_home_url]/adminAdvanced">
<td class="id" name="deleted_project">[owner_of_archived_projects.project_name] -
<a href="[owner_of_archived_projects.relative_home_url]/adminAdvanced">Unarchive or delete</a>
</td>
<td>
[owner_of_archived_projects.summary]
</td>
</tr>
[end]
</table>
[end]
[if-any user_groups]
<br>
<div class="list">
<table style="width: 100%;" cellspacing="0" cellpadding="0">
<tbody><tr>
<th style="text-align: left;">User groups
</th>
</tr></tbody>
</table>
</div>
<table cellspacing="0" cellpadding="2" border="0" class="results striped" id="usergrouptable" width="100%">
<tbody>
<tr id="headingrow">
<th style="white-space:nowrap; width:25%;">Name</th>
</tr>
[for user_groups]
<tr data-url="[user_groups.profile_url]">
<td class="id">
<a href="[user_groups.profile_url]">[user_groups.email]</a>
</td>
</tr>
[end]
</tbody>
</table>
[end]
[if-any can_ban]
<form action="ban.do" method="POST">
<input type="hidden" name="token" value="[ban_token]">
<h4>Banned for abuse</h4>
<div style="margin:0 0 2em 2em">
<input type="checkbox" name="banned" id="banned" value="1"
[if-any settings_user_is_banned]checked="checked"[end] >
<label for="banned">This user is banned because:</label>
<input type="text" size="50" name="banned_reason" id="banned_reason" value="[settings_user_pb.banned]">
</div>
<div style="margin:0 0 2em 2em">
<input id="submit_btn" type="submit" name="btn"
value="Update banned status">
</div>
</form>
[if-any viewed_user_is_spammer]
<form action="banSpammer.do" method="POST">
<input type="hidden" name="token" value="[ban_spammer_token]">
<input type="hidden" size="50" name="banned_reason" id="banned_reason" value="">
<input type="submit" name="undoBanSpammerButton" id="undo_ban_spammer_btn" value="Un-ban this user as a spammer">
</form>
[end]
[if-any viewed_user_may_be_spammer]
<form action="banSpammer.do" method="POST">
<input type="hidden" name="token" value="[ban_spammer_token]">
<input type="hidden" name="banned" value="True">
<input type="hidden" size="50" name="banned_reason" id="banned_reason" value="Spam">
<input type="submit" name="banSpammerButton" id="ban_spammer_btn" value="Ban this user as a spammer">
</form>
[end]
[end]
[if-any perms._EditOtherUsers]
<h3 style="clear:both">Edit user</h3>
<form action="edit.do" method="POST">
<input type="hidden" name="token" value="[form_token]">
<h4>Site administration</h4>
<div style="margin:0 0 2em 2em">
<input type="checkbox" name="site_admin" id="site_admin" value="1" [if-any viewed_user_pb.is_site_admin_bool]checked="checked"[end] >
<label for="site_admin">This user is a site administrator (a super user)</label>
</div>
[include "unified-settings.ezt"]
<div style="margin:0 0 2em 2em">
<input id="submit_btn" type="submit" name="btn"
value="Save changes">
</div>
</form>
[end]
[if-any can_delete_user]
<h3 style="clear:both">Delete user account</h3>
<p>Deleting a user account deletes the user and most user owned items from the site.
The user's email will be removed from any issues that the user participated in.
Hotlists owned by the user will either be transferred to another editor or get deleted.
Any Project Rules that the user is involved in will get deleted.
</p>
<div style="margin:0 0 2em 2em">
<input id="delete_btn" type="submit" name="btn" value="Delete user account">
<div id="delete_error" class="fielderror"></div>
</div>
[end]
</div>
</div>
<script type="text/javascript" nonce="[nonce]">
runOnLoad(function() {
if ($("user_star")) {
[# The user viewing this page wants to star the user *on* this page]
$("user_star").addEventListener("click", function () {
_TKR_toggleStar($("user_star"), null, null, "[viewed_user_id]", null, null);
});
}
var stars = document.getElementsByClassName("star");
for (var i = 0; i < stars.length; ++i) {
var star = stars[[]i];
star.addEventListener("click", function (event) {
var projectName = event.target.getAttribute("data-project-name");
_TKR_toggleStar(event.target, projectName);
});
}
function _handleProjectClick(event) {
var target = event.target;
if (target.tagName == "A")
return;
if (target.classList.contains("rowwidgets") || target.parentNode.classList.contains("rowwidgets"))
return;
if (target.tagName != "TR") target = target.parentNode;
_go(target.attributes[[]"data-url"].value,
(event.metaKey || event.ctrlKey || event.button == 1));
};
$("projecttable").addEventListener("click", _handleProjectClick);
if ($("starredtable")) {
$("starredtable").addEventListener("click", _handleProjectClick);
}
if ($("archivedtable")) {
$("archivedtable").addEventListener("click", _handleProjectClick);
}
if ($("banned_reason")) {
$("banned_reason").addEventListener("keyup", function() {
$("banned").checked = $("banned_reason").value != "";
});
}
if ($("ban_spammer_btn")) {
$("ban_spammer_btn").addEventListener("click", function(evt) {
var ok = window.confirm("This will remove all issues and comments " +
"created by this user. Continue?");
if (!ok) {
evt.preventDefault();
}
});
}
if ($("delete_btn")) {
$("delete_btn").addEventListener("click", async function(event) {
const expungeCall = window.prpcClient.call(
'monorail.Users', 'ExpungeUser', {email: "[viewed_user_display_name]"});
expungeCall.then((resp) => {
location.replace(location.origin);
}).catch((reason) => {
$("delete_error").textContent = reason;
});
});
}
});
</script>
<script type="module" defer src="[version_base]/static/js/sitewide/linked-accounts.js" nonce="[nonce]"></script>
[include "../framework/footer.ezt"]