new UI - domains page - draw tree in middle menu.

This commit is contained in:
Jessica Wang 2010-09-28 16:32:06 -07:00
parent b680637366
commit 88abc071a4
2 changed files with 406 additions and 100 deletions

View File

@ -6,104 +6,15 @@
CloudResourceBundle t = CloudResourceBundle.getBundle("resources/resource", browserLocale);
%>
<!-- event detail panel (begin) -->
<div class="main_title" id="right_panel_header">
<div class="main_titleicon">
<img src="images/title_eventsicon.gif" alt="Event" /></div>
<h1>Domain
</h1>
</div>
<div class="contentbox" id="right_panel_content">
<div class="info_detailbox errorbox" id="after_action_info_container" style="display:none">
<p id="after_action_info"></p>
</div>
<div class="tabbox" style="margin-top:15px;">
<div class="content_tabs on">
<%=t.t("Details")%></div>
</div>
<div class="grid_container">
<div class="grid_rows odd">
<div class="grid_row_cell" style="width: 20%;">
<div class="row_celltitles">
<%=t.t("id")%>:</div>
</div>
<div class="grid_row_cell" style="width: 79%;">
<div class="row_celltitles" id="id">
</div>
</div>
<!-- treenode template (begin) -->
<div id="treenode_template" class="tree_levelspanel" style="display:none">
<div class="tree_levelsbox" style="margin-left:20px;">
<div id="domain_title_container" class="tree_levels">
<div id="domain_expand_icon" class="zonetree_closedarrows"></div>
<div id="domain_name" class="tree_links">Domain Name</div>
</div>
<div class="grid_rows odd">
<div class="grid_row_cell" style="width: 20%;">
<div class="row_celltitles">
<%=t.t("Initiated.By")%>:</div>
</div>
<div class="grid_row_cell" style="width: 79%;">
<div class="row_celltitles" id="username">
</div>
</div>
</div>
<div class="grid_rows even">
<div class="grid_row_cell" style="width: 20%;">
<div class="row_celltitles">
<%=t.t("Owner.Account")%>:</div>
</div>
<div class="grid_row_cell" style="width: 79%;">
<div class="row_celltitles" id="account">
</div>
</div>
</div>
<div class="grid_rows odd">
<div class="grid_row_cell" style="width: 20%;">
<div class="row_celltitles">
<%=t.t("Type")%>:</div>
</div>
<div class="grid_row_cell" style="width: 79%;">
<div class="row_celltitles" id="type">
</div>
</div>
</div>
<div class="grid_rows even">
<div class="grid_row_cell" style="width: 20%;">
<div class="row_celltitles">
<%=t.t("Level")%>:</div>
</div>
<div class="grid_row_cell" style="width: 79%;">
<div class="row_celltitles" id="level">
</div>
</div>
</div>
<div class="grid_rows odd">
<div class="grid_row_cell" style="width: 20%;">
<div class="row_celltitles">
<%=t.t("Description")%>:</div>
</div>
<div class="grid_row_cell" style="width: 79%;">
<div class="row_celltitles" id="description">
</div>
</div>
</div>
<div class="grid_rows even">
<div class="grid_row_cell" style="width: 20%;">
<div class="row_celltitles">
<%=t.t("State")%>:</div>
</div>
<div class="grid_row_cell" style="width: 79%;">
<div class="row_celltitles" id="state">
</div>
</div>
</div>
<div class="grid_rows odd">
<div class="grid_row_cell" style="width: 20%;">
<div class="row_celltitles">
<%=t.t("Date")%>:</div>
</div>
<div class="grid_row_cell" style="width: 79%;">
<div class="row_celltitles" id="created">
</div>
</div>
</div>
<div id="domain_children_container" style="display:none">
</div>
</div>
</div>
<!-- event detail panel (end) -->
<!-- treenode template (end) -->

View File

@ -1,3 +1,398 @@
function afterLoadDomainJSP() {
}
var defaultRootDomainId = g_domainid;
var defaultRootLevel = 0;
var index = 1;
//var treeContentBox = $("#tree_contentbox"); //???
var treeContentBox = $("#midmenu_container");
var treenodeTemplate = $("#treenode_template");
var grid = $("#right_panel_grid");
var gridRowTemplate = $("#grid_row_template");
var gridContent = grid.find("#grid_content");
var gridHeader = grid.find("#grid_header");
var rightPanelDetailContent = $("#right_panel_detail_content");
var rightPanelSearchResult = $("#right_panel_search_result");
var rightPanelGrid = rightPanelDetailContent.find("#right_panel_grid");
var domainDetail = rightPanelDetailContent.find("#domain_detail");
var submenuContent = $("#submenu_content_domains");
var searchButton = submenuContent.find("#search_button");
var searchInput = submenuContent.find("#search_input");
var searchResultsContainer = submenuContent.find("#search_results_container");
var searchResultTemplate = $("#search_result_template");
//var breadcrumbBox = submenuContent.find("#breadcrumb_box");
//var breadcrumbPieceTemplate = $("#breadcrumb_piece_template");
var childParentMap = {}; //map childDomainId to parentDomainId
var domainIdNameMap = {}; //map domainId to domainName
/*
activateDialog($("#dialog_resource_limits").dialog({
autoOpen: false,
modal: true,
zIndex: 2000
}));
*/
function drawNode(json, level, container) {
if("parentdomainid" in json)
childParentMap[json.id] = json.parentdomainid; //map childDomainId to parentDomainId
domainIdNameMap[json.id] = json.name; //map domainId to domainName
var template = treenodeTemplate.clone(true);
template.attr("id", "domain_"+json.id);
template.data("domainId", json.id).data("domainName", fromdb(json.name)).data("domainLevel", level);
template.find("#domain_title_container").attr("id", "domain_title_container_"+json.id);
template.find("#domain_expand_icon").attr("id", "domain_expand_icon_"+json.id);
template.find("#domain_name").attr("id", "domain_name_"+json.id).text(json.name);
template.find("#domain_children_container").attr("id", "domain_children_container_"+json.id);
container.append(template.show());
return template;
}
function drawTree(id, level, container) {
$.ajax({
data: createURL("command=listDomainChildren&id="+id+"&response=json&pageSize=-1"),
dataType: "json",
async: false,
success: function(json) {
var domains = json.listdomainchildrenresponse.domain;
if (domains != null && domains.length > 0) {
for (var i = 0; i < domains.length; i++) {
drawNode(domains[i], level, container);
if(domains[i].haschild=="true")
drawTree(domains[i].id, (level+1), $("#domain_children_container_"+domains[i].id));
}
}
}
});
}
function clickExpandIcon(domainId) {
var template = $("#domain_"+domainId);
var expandIcon = template.find("#domain_expand_icon_"+domainId);
if (expandIcon.hasClass("zonetree_closedarrows")) {
template.find("#domain_children_container_"+domainId).show();
expandIcon.removeClass().addClass("zonetree_openarrows");
} else {
template.find("#domain_children_container_"+domainId).hide();
expandIcon.removeClass().addClass("zonetree_closedarrows");
}
}
/*
function accountJSONToTemplate(json, template) {
if (index++ % 2 == 0) {
template.addClass("smallrow_odd");
} else {
template.addClass("smallrow_even");
}
template.find("#grid_row_cell1").text(json.domain);
template.find("#grid_row_cell2").text(json.name);
}
*/
function updateResourceLimit(domainId, type, max) {
$.ajax({
data: createURL("command=updateResourceLimit&domainid="+domainId+"&resourceType="+type+"&max="+max),
dataType: "json",
success: function(json) {
}
});
}
function listAdminAccounts(domainId) {
gridContent.empty();
index = 0;
rightPanelDetailContent.find("#loading_gridtable").show();
var accountType = (domainId==1)? 1: 2;
$.ajax({
cache: false,
data: createURL("command=listAccounts&domainid="+domainId+"&accounttype="+accountType+"&response=json"+maxPageSize),
dataType: "json",
success: function(json) {
var accounts = json.listaccountsresponse.account;
if (accounts != null && accounts.length > 0) {
for (var i = 0; i < accounts.length; i++) {
var template = gridRowTemplate.clone(true).attr("id","account"+accounts[i].id);
accountJSONToTemplate(accounts[i], template);
gridContent.append(template.show());
}
}
rightPanelDetailContent.find("#loading_gridtable").hide();
},
error: function(XMLHttpResponse) {
handleError(XMLHttpResponse);
rightPanelDetailContent.find("#loading_gridtable").hide();
}
});
}
treenodeTemplate.bind("click", function(event) {
var template = $(this);
var target = $(event.target);
var action = target.attr("id");
var id = template.attr("id");
var domainId = template.data("domainId");
var domainName = template.data("domainName");
if (action.indexOf("domain_expand_icon")!=-1) {
clickExpandIcon(domainId);
}
else if(action.indexOf("domain_name")!=-1) {
domainDetail.find("#domain_name").text(domainName);
domainDetail.find("#domain_id").text(domainId);
$.ajax({
cache: false,
data: createURL("command=listAccounts&domainid="+domainId+maxPageSize),
dataType: "json",
success: function(json) {
var accounts = json.listaccountsresponse.account;
if (accounts != null) {
domainDetail.find("#redirect_to_account_page").text(accounts.length);
domainDetail.find("#redirect_to_account_page").bind("click", function() {
$("#menutab_role_root #menutab_accounts").data("domainId", domainId).click();
});
}
else {
domainDetail.find("#redirect_to_account_page").text("");
domainDetail.find("#redirect_to_account_page").unbind("click");
}
}
});
$.ajax({
cache: false,
data: createURL("command=listVirtualMachines&domainid="+domainId+"&response=json"),
dataType: "json",
success: function(json) {
var instances = json.listvirtualmachinesresponse.virtualmachine;
if (instances != null) {
domainDetail.find("#redirect_to_instance_page").text(instances.length);
domainDetail.find("#redirect_to_instance_page").bind("click", function() {
$("#menutab_role_root #menutab_vm").data("domainId", domainId).click();
});
}
else {
domainDetail.find("#redirect_to_instance_page").text("");
domainDetail.find("#redirect_to_instance_page").unbind("click");
}
}
});
$.ajax({
cache: false,
data: createURL("command=listVolumes&domainid="+domainId+"&response=json"),
dataType: "json",
success: function(json) {
var volumes = json.listvolumesresponse.volume;
if (volumes != null) {
domainDetail.find("#redirect_to_volume_page").text(volumes.length);
domainDetail.find("#redirect_to_volume_page").bind("click", function() {
$("#menutab_role_root #menutab_storage").data("domainId", domainId).data("targetTab", "submenu_volume").click();
});
}
else {
domainDetail.find("#redirect_to_volume_page").text("");
domainDetail.find("#redirect_to_volume_page").unbind("click");
}
}
});
if (isAdmin() || (isDomainAdmin() && (g_domainid != domainId))) {
$("#limits_container").show();
/*
$("#account_resource_limits").data("domainId", domainId).unbind("click").bind("click", function() {
var domainId = $(this).data("domainId");
$.ajax({
cache: false,
data: createURL("command=listResourceLimits&domainid="+domainId+"&response=json"),
dataType: "json",
success: function(json) {
var limits = json.listresourcelimitsresponse.resourcelimit;
var preInstanceLimit, preIpLimit, preDiskLimit, preSnapshotLimit, preTemplateLimit = -1;
if (limits != null) {
for (var i = 0; i < limits.length; i++) {
var limit = limits[i];
switch (limit.resourcetype) {
case "0":
preInstanceLimit = limit.max;
$("#dialog_resource_limits #limits_vm").val(limit.max);
break;
case "1":
preIpLimit = limit.max;
$("#dialog_resource_limits #limits_ip").val(limit.max);
break;
case "2":
preDiskLimit = limit.max;
$("#dialog_resource_limits #limits_volume").val(limit.max);
break;
case "3":
preSnapshotLimit = limit.max;
$("#dialog_resource_limits #limits_snapshot").val(limit.max);
break;
case "4":
preTemplateLimit = limit.max;
$("#dialog_resource_limits #limits_template").val(limit.max);
break;
}
}
}
$("#dialog_resource_limits")
.dialog('option', 'buttons', {
"Save": function() {
// validate values
var isValid = true;
isValid &= validateNumber("Instance Limit", $("#dialog_resource_limits #limits_vm"), $("#dialog_resource_limits #limits_vm_errormsg"), -1, 32000, false);
isValid &= validateNumber("Public IP Limit", $("#dialog_resource_limits #limits_ip"), $("#dialog_resource_limits #limits_ip_errormsg"), -1, 32000, false);
isValid &= validateNumber("Disk Volume Limit", $("#dialog_resource_limits #limits_volume"), $("#dialog_resource_limits #limits_volume_errormsg"), -1, 32000, false);
isValid &= validateNumber("Snapshot Limit", $("#dialog_resource_limits #limits_snapshot"), $("#dialog_resource_limits #limits_snapshot_errormsg"), -1, 32000, false);
isValid &= validateNumber("Template Limit", $("#dialog_resource_limits #limits_template"), $("#dialog_resource_limits #limits_template_errormsg"), -1, 32000, false);
if (!isValid) return;
var instanceLimit = trim($("#dialog_resource_limits #limits_vm").val());
var ipLimit = trim($("#dialog_resource_limits #limits_ip").val());
var diskLimit = trim($("#dialog_resource_limits #limits_volume").val());
var snapshotLimit = trim($("#dialog_resource_limits #limits_snapshot").val());
var templateLimit = trim($("#dialog_resource_limits #limits_template").val());
$(this).dialog("close");
if (instanceLimit != preInstanceLimit) {
updateResourceLimit(domainId, 0, instanceLimit);
}
if (ipLimit != preIpLimit) {
updateResourceLimit(domainId, 1, ipLimit);
}
if (diskLimit != preDiskLimit) {
updateResourceLimit(domainId, 2, diskLimit);
}
if (snapshotLimit != preSnapshotLimit) {
updateResourceLimit(domainId, 3, snapshotLimit);
}
if (templateLimit != preTemplateLimit) {
updateResourceLimit(domainId, 4, templateLimit);
}
},
"Cancel": function() {
$(this).dialog("close");
}
}).dialog("open");
}
});
return false;
});
*/
} else {
$("#limits_container").hide();
}
rightPanelDetailContent.show();
rightPanelSearchResult.hide();
listAdminAccounts(domainId);
rightPanelGrid.show();
}
return false;
});
/*
searchResultTemplate.bind("click", function(event) {
var template = $(this);
var target = $(event.target);
var action = target.attr("id");
var id = template.attr("id");
var domainId = template.data("domainId");
if(action=="domain_name")
refreshWholeTree(domainId, defaultRootLevel);
});
*/
/*
searchButton.bind("click", function(event) {
searchResultsContainer.empty();
rightPanelDetailContent.hide();
rightPanelSearchResult.show();
var keyword = searchInput.val();
$.ajax({
data: createURL("command=listDomains&keyword="+keyword+"&response=json&pageSize=-1"), //pageSize=-1 will return all items (no limitation)
dataType: "json",
async: false,
success: function(json) {
var domains = json.listdomainsresponse.domain;
if (domains != null && domains.length > 0) {
for(var i=0; i<domains.length; i++) {
var template = searchResultTemplate.clone(true).attr("id", "searchresult"+domains[i].id).data("domainId", domains[i].id);
template.find("#domain_name").text(domains[i].name);
searchResultsContainer.append(template.show());
}
}
}
});
return false;
});
*/
/*
searchInput.bind("keypress", function(event) {
if(event.keyCode == keycode_Enter) {
searchButton.click();
return false;
}
});
*/
//draw root node
function drawRootNode(rootDomainId) {
treeContentBox.empty();
$.ajax({
data: createURL("command=listDomains&id="+rootDomainId+"&response=json&pageSize=-1"), //pageSize=-1 will return all items (no limitation)
dataType: "json",
async: false,
success: function(json) {
var domains = json.listdomainsresponse.domain;
if (domains != null && domains.length > 0) {
var node = drawNode(domains[0], defaultRootLevel, treeContentBox);
var treeLevelsbox = node.find(".tree_levelsbox"); //root node shouldn't have margin-left:20px
if(treeLevelsbox!=null && treeLevelsbox.length >0)
treeLevelsbox[0].style.marginLeft="0px"; //set root node's margin-left to 0px.
}
}
});
}
/*
breadcrumbPieceTemplate.bind("click", function(event) {
var domainId = $(this).data("domainId");
refreshWholeTree(domainId);
});
*/
//draw breadcrumb all the way up
/*
function drawBreadcrumb(domainId) {
var domainName = domainIdNameMap[domainId];
if(domainName == null)
return;
var onePiece = breadcrumbPieceTemplate.clone(true).attr("id", "breadcrumb_"+domainId).data("domainId", domainId).text(" > "+domainName);
breadcrumbBox.prepend(onePiece.show());
var parentDomainId = childParentMap[domainId];
if(parentDomainId!=null)
drawBreadcrumb(parentDomainId);
}
*/
function refreshWholeTree(rootDomainId, rootLevel) {
drawRootNode(rootDomainId);
drawTree(rootDomainId, (rootLevel+1), $("#domain_children_container_"+rootDomainId)); //draw the whole tree (under root node)
$("#domain_"+rootDomainId).show(); //show root node
clickExpandIcon(rootDomainId); //expand root node
//breadcrumbBox.empty();
//drawBreadcrumb(rootDomainId);
}
refreshWholeTree(defaultRootDomainId, defaultRootLevel);
}