584 lines
21 KiB
Cheetah
584 lines
21 KiB
Cheetah
[%# 1.0@bugzilla.org %]
|
|
[%# The contents of this file are subject to the Mozilla Public
|
|
# License Version 1.1 (the "License"); you may not use this file
|
|
# except in compliance with the License. You may obtain a copy of
|
|
# the License at http://www.mozilla.org/MPL/
|
|
#
|
|
# Software distributed under the License is distributed on an "AS
|
|
# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
|
# implied. See the License for the specific language governing
|
|
# rights and limitations under the License.
|
|
#
|
|
# The Original Code is the Bugzilla Test Runner System.
|
|
#
|
|
# The Initial Developer of the Original Code is Maciej Maczynski.
|
|
# Portions created by Maciej Maczynski are Copyright (C) 2001
|
|
# Maciej Maczynski. All Rights Reserved.
|
|
#
|
|
# Contributor(s): Greg Hendricks <ghendricks@novell.com>
|
|
# Scott Sudweeks <ssudweeks@novell.com>
|
|
# Andrew Nelson <anelson@novell.com>
|
|
#%]
|
|
|
|
[%# INTERFACE:
|
|
# ...
|
|
#%]
|
|
|
|
[% PROCESS testopia/style.none.tmpl %]
|
|
[% PROCESS testopia/blocks.html.tmpl %]
|
|
|
|
[% title = "Environment Editor" %]
|
|
|
|
[% PROCESS global/header.html.tmpl %]
|
|
|
|
<style type = "text/css">
|
|
.product .x-tree-node-icon{
|
|
background:url(extensions/testopia/img/product.gif);
|
|
}
|
|
.product .x-tree-node-icon{
|
|
background:url(extensions/testopia/img/product.gif);
|
|
}
|
|
.element .x-tree-node-icon{
|
|
background:url(extensions/testopia/img/element.gif);
|
|
}
|
|
.property .x-tree-node-icon{
|
|
background:url(extensions/testopia/img/property.gif);
|
|
}
|
|
.category .x-tree-node-icon{
|
|
background:url(extensions/testopia/img/category.gif);
|
|
}
|
|
.validexp .x-tree-node-icon{
|
|
background:url(extensions/testopia/img/validexpRed.png);
|
|
}
|
|
.validexpYellow .x-tree-node-icon{
|
|
background:url(extensions/testopia/img/validexpYellow.png);
|
|
}
|
|
</style>
|
|
|
|
<script type="text/javascript">
|
|
Ext.onReady(function(){
|
|
var Tree = Ext.tree;
|
|
var testopia_form = new Ext.form.BasicForm('testopia_helper_frm');
|
|
/*
|
|
* etree - Environment Tree Panel
|
|
* This panel represents the environment
|
|
*/
|
|
var etree = new Tree.TreePanel({
|
|
animate: true,
|
|
autoScroll: true,
|
|
enableDD:true,
|
|
containerScroll: true,
|
|
region: 'center',
|
|
title: 'Editing Environment [% environment.name FILTER js %]',
|
|
split: true,
|
|
id: 'environment_tree',
|
|
root: new Tree.AsyncTreeNode({
|
|
text: '[% environment.name FILTER js %]',
|
|
draggable:false,
|
|
id: '[% environment.id %]',
|
|
type: 'environment'
|
|
}),
|
|
dropConfig :{allowContainerDrop: true},
|
|
loader: new Tree.TreeLoader({
|
|
url: "tr_environments.cgi",
|
|
listeners: {'beforeload':function(l, node) {
|
|
l.baseParams.action = 'getChildren';
|
|
l.baseParams.tree_type = 'env';
|
|
l.baseParams.type = node.attributes.type;
|
|
l.baseParams.env_id = [% environment.id FILTER js %];
|
|
}}
|
|
}),
|
|
listeners:{
|
|
"textchange": function(node, text, oldText){
|
|
var httpRequest = new Ext.data.Connection();
|
|
httpRequest.request({
|
|
url: 'tr_environments.cgi',
|
|
params:{
|
|
action: 'rename',
|
|
name: text,
|
|
env_id: node.id,
|
|
isactive: true
|
|
},
|
|
success:function(object){
|
|
Testopia.Util.notify.msg('Test Environment Updated', 'Environment renamed successfully');
|
|
},
|
|
failure: Testopia.Util.error
|
|
});
|
|
},
|
|
"contextmenu": function(node, event){
|
|
node.getOwnerTree().getSelectionModel().select(node);
|
|
this.menu = new Ext.menu.Menu({
|
|
id: 'etree_menu',
|
|
items: [{
|
|
text: 'Remove Element',
|
|
disabled: true,
|
|
id: 'etree_remove_node',
|
|
handler: function (){
|
|
Ext.Msg.show({
|
|
title: 'Remove Selected Elements',
|
|
msg: 'Are you sure?',
|
|
buttons: Ext.MessageBox.YESNO,
|
|
icon: Ext.MessageBox.QUESTION,
|
|
fn: function(btn, text){
|
|
if (btn == 'yes'){
|
|
var elements = [];
|
|
if(node.attributes.type == 'category'){
|
|
node.eachChild(function(n){
|
|
if (n.attributes.type == 'element')
|
|
elements.push(n.id);
|
|
});
|
|
}
|
|
else {
|
|
elements.push(node.id);
|
|
}
|
|
testopia_form.submit({
|
|
url: 'tr_environments.cgi',
|
|
params:{
|
|
action: 'remove_env_node',
|
|
element_ids: elements.join(','),
|
|
env_id: [% environment.id FILTER js %]
|
|
},
|
|
success:function(f,a){
|
|
if(node != null)
|
|
node.remove();
|
|
},
|
|
failure: Testopia.Util.error
|
|
});
|
|
}
|
|
}
|
|
});
|
|
}
|
|
},{
|
|
text: 'Rename Environment',
|
|
hidden: true,
|
|
id: 'etree_rename_env',
|
|
handler: function(){
|
|
environmentTreeEditor.startEdit(etree.root.ui.textNode);
|
|
}
|
|
},{
|
|
text: 'Mark this value "Selected"',
|
|
hidden: true,
|
|
id: 'etree_value_selector',
|
|
handler: function(){
|
|
testopia_form.submit({
|
|
url: 'tr_environments.cgi',
|
|
params:{
|
|
action: 'set_selected',
|
|
id: node.attributes.property_id,
|
|
type: node.attributes.cls,
|
|
env_id: [% environment.id FILTER js %],
|
|
value: node.attributes.text
|
|
},
|
|
success:function(object){
|
|
var parentNode = node.parentNode;
|
|
var children = parentNode.childNodes;
|
|
for(i=0; i<children.length; i++){
|
|
c = children[i].getUI();
|
|
c.removeClass(["validexpYellow"]);
|
|
c.addClass(["validexp"]);
|
|
}
|
|
c = node.getUI();
|
|
c.removeClass(["validexp"]);
|
|
c.addClass(["validexpYellow"]);
|
|
},
|
|
failure: Testopia.Util.error
|
|
});
|
|
}
|
|
},{
|
|
text: 'Refresh',
|
|
handler: function(){
|
|
node.getOwnerTree().getLoader().load(node);
|
|
}
|
|
}]
|
|
});
|
|
|
|
Ext.getCmp('etree_remove_node').disable();
|
|
Ext.getCmp('etree_value_selector').hide();
|
|
Ext.getCmp('etree_rename_env').hide();
|
|
if (node.attributes.type == 'category' || (node.attributes.type == 'element' && node.getDepth() <= 2)) {
|
|
Ext.getCmp('etree_remove_node').enable();
|
|
}
|
|
else
|
|
if (node.attributes.type == 'value') {
|
|
Ext.getCmp('etree_value_selector').show();
|
|
}
|
|
else
|
|
if (node.attributes.type == 'environment') {
|
|
Ext.getCmp('etree_rename_env').show();
|
|
}
|
|
|
|
this.menu.showAt([event.getPageX(), event.getPageY()]);
|
|
}
|
|
}
|
|
});
|
|
|
|
/*
|
|
* vtree - Variables Tree Panel
|
|
* This panel represents the environment variables
|
|
*/
|
|
var vtree = new Tree.TreePanel({
|
|
animate: true,
|
|
autoScroll: true,
|
|
enableDD:true,
|
|
containerScroll: true,
|
|
region: 'north',
|
|
title: 'Environment Items',
|
|
split: true,
|
|
height: 300,
|
|
collapsible: true,
|
|
rootVisible: false,
|
|
id: 'variable_tree',
|
|
loader: new Tree.TreeLoader({
|
|
url: "tr_environments.cgi",
|
|
listeners: {"beforeload": function(l, node) {
|
|
l.baseParams.action = 'getChildren';
|
|
l.baseParams.tree_type = 'var';
|
|
l.baseParams.type = node.attributes.type;
|
|
l.baseParams.env_id = [% environment.id FILTER js %];
|
|
}}
|
|
}),
|
|
root: new Tree.AsyncTreeNode({
|
|
text: 'root',
|
|
draggable: false,
|
|
id:'0',
|
|
action: 'getChildren',
|
|
type: 'root',
|
|
env_id: '0'
|
|
}),
|
|
listeners: {
|
|
"textchange": editNode,
|
|
"contextmenu": ctxMenu
|
|
}
|
|
});
|
|
var ptree = new Tree.TreePanel({
|
|
animate: true,
|
|
autoScroll: true,
|
|
enableDD:true,
|
|
containerScroll: true,
|
|
region: 'center',
|
|
title: 'Product "[% environment.product.name FILTER js %]" Items',
|
|
split: true,
|
|
width: '300',
|
|
collapsible: true,
|
|
rootVisible: false,
|
|
id: 'prod_variable_tree',
|
|
loader: new Tree.TreeLoader({
|
|
url: "tr_environments.cgi",
|
|
listeners: {"beforeload": function(l, node) {
|
|
l.baseParams.action = 'getChildren';
|
|
l.baseParams.tree_type = 'var';
|
|
l.baseParams.type = node.attributes.type;
|
|
l.baseParams.env_id = [% environment.id FILTER js %];
|
|
}}
|
|
}),
|
|
root: new Tree.AsyncTreeNode({
|
|
text: 'root',
|
|
draggable: false,
|
|
id: [% environment.product_id FILTER none %],
|
|
type: 'root'
|
|
}),
|
|
listeners: {
|
|
"textchange": editNode,
|
|
"contextmenu": ctxMenu
|
|
}
|
|
});
|
|
|
|
/*
|
|
* Tree Editor defs
|
|
*/
|
|
var environmentTreeEditor = new Tree.TreeEditor(etree, {id: 'etree_editor'});
|
|
environmentTreeEditor.cancelOnEscape = true;
|
|
environmentTreeEditor.ignoreNoChange = true;
|
|
environmentTreeEditor.completeOnEnter = true;
|
|
environmentTreeEditor.autosize = true;
|
|
|
|
var itemTreeEditor = new Tree.TreeEditor(vtree, {id: 'vtree_editor'});
|
|
itemTreeEditor.cancelOnEscape = true;
|
|
itemTreeEditor.ignoreNoChange = true;
|
|
itemTreeEditor.completeOnEnter = true;
|
|
itemTreeEditor.autosize = true;
|
|
|
|
var productTreeEditor = new Tree.TreeEditor(ptree, {id: 'vtree_editor'});
|
|
productTreeEditor.cancelOnEscape = true;
|
|
productTreeEditor.ignoreNoChange = true;
|
|
productTreeEditor.completeOnEnter = true;
|
|
productTreeEditor.autosize = true;
|
|
|
|
|
|
/*
|
|
* Functions
|
|
*/
|
|
|
|
function editNode(node, text, oldText){
|
|
var id = node.attributes.id;
|
|
var type = node.attributes.type;
|
|
|
|
testopia_form.submit({
|
|
url: 'tr_environments.cgi',
|
|
params:{
|
|
action: 'edit',
|
|
text: text,
|
|
oldtext: oldText,
|
|
id: node.attributes.property_id || node.attributes.id,
|
|
type: node.attributes.cls
|
|
},
|
|
success:function(f,a){
|
|
Testopia.Util.notify.msg('Environment' + type + 'Updated', type + ' renamed successfully');
|
|
},
|
|
failure: Testopia.Util.error
|
|
});
|
|
}
|
|
|
|
|
|
function expandCallBack(node){
|
|
var children = node.childNodes;
|
|
for(i=0;i<children.length;i++){
|
|
var child = children[i];
|
|
checkAndRemoveNode(child);
|
|
}
|
|
node.remove();
|
|
return;
|
|
}
|
|
|
|
function checkAndRemoveNode(node){
|
|
if(node.attributes.type != 'element')
|
|
return;
|
|
if(node.getDepth() > 2)
|
|
return;
|
|
|
|
var item = {};
|
|
item.id = node.attributes.id;
|
|
item.type = node.attributes.type;
|
|
deleteNode(item);
|
|
}
|
|
|
|
function ctxMenu (node, event){
|
|
ctxmenu = new Ext.menu.Menu({
|
|
id: 'variable_ctx_menu',
|
|
items: [{
|
|
text: 'New Category',
|
|
id: 'add_category_mnu',
|
|
hidden: true,
|
|
nodeId: node.attributes.id,
|
|
type: node.attributes.type,
|
|
handler: addNode.createDelegate(this, [node, 'category'])
|
|
},{
|
|
text: 'New Element',
|
|
id: 'add_element_mnu',
|
|
hidden: true,
|
|
nodeId: node.attributes.id,
|
|
type: node.attributes.type,
|
|
handler: addNode.createDelegate(this, [node, 'element'])
|
|
},{
|
|
text: 'New Property',
|
|
id: 'add_property_mnu',
|
|
hidden: true,
|
|
nodeId: node.attributes.id,
|
|
type: node.attributes.type,
|
|
handler: addNode.createDelegate(this, [node, 'property'])
|
|
},{
|
|
text: 'New Property Value',
|
|
id: 'add_value_mnu',
|
|
hidden: true,
|
|
nodeId: node.attributes.id,
|
|
type: node.attributes.type,
|
|
handler: addNode.createDelegate(this, [node, 'value'])
|
|
},{
|
|
text: 'Delete This Item',
|
|
id: 'delete_node_mnu',
|
|
hidden: true,
|
|
nodeId: node.attributes.id,
|
|
type: node.attributes.type,
|
|
handler: deleteNode.createDelegate(this, [node])
|
|
},{
|
|
text: 'Rename This Item',
|
|
id: 'rename_node_mnu',
|
|
hidden: true,
|
|
nodeId: node.attributes.id,
|
|
type: node.attributes.type,
|
|
handler: renameNode.createDelegate(this, [node])
|
|
}]
|
|
});
|
|
|
|
Ext.getCmp('add_category_mnu').hide();
|
|
Ext.getCmp('add_element_mnu').hide();
|
|
Ext.getCmp('add_property_mnu').hide();
|
|
Ext.getCmp('add_value_mnu').hide();
|
|
Ext.getCmp('delete_node_mnu').hide();
|
|
Ext.getCmp('rename_node_mnu').hide();
|
|
|
|
switch (node.attributes.type){
|
|
case 'product':
|
|
Ext.getCmp('add_category_mnu').show();
|
|
break;
|
|
|
|
case 'category':
|
|
Ext.getCmp('add_element_mnu').show();
|
|
Ext.getCmp('delete_node_mnu').show();
|
|
Ext.getCmp('rename_node_mnu').show();
|
|
break;
|
|
|
|
case 'element':
|
|
Ext.getCmp('add_element_mnu').show();
|
|
Ext.getCmp('add_property_mnu').show();
|
|
Ext.getCmp('delete_node_mnu').show();
|
|
Ext.getCmp('rename_node_mnu').show();
|
|
break;
|
|
|
|
case 'property':
|
|
Ext.getCmp('add_value_mnu').show();
|
|
Ext.getCmp('delete_node_mnu').show();
|
|
Ext.getCmp('rename_node_mnu').show();
|
|
break;
|
|
|
|
case 'value':
|
|
Ext.getCmp('delete_node_mnu').show();
|
|
Ext.getCmp('rename_node_mnu').show();
|
|
break;
|
|
|
|
}
|
|
|
|
ctxmenu.showAt(event.getXY());
|
|
|
|
}
|
|
|
|
function addNode(node, newtype){
|
|
var type = newtype == 'element' && node.attributes.type == 'element' ? 'child' : newtype;
|
|
|
|
testopia_form.submit({
|
|
url: 'tr_environments.cgi',
|
|
params:{
|
|
action: 'create_child',
|
|
id: node.id,
|
|
type: type,
|
|
env_id: [% environment.id FILTER js %]
|
|
},
|
|
success:function(f,a){
|
|
node.leaf = false;
|
|
var newNode = new Ext.tree.TreeNode(a.result.env_object);
|
|
node.appendChild(newNode);
|
|
node.expand(false, true, function(){
|
|
if (node.getOwnerTree().id == 'variable_tree'){
|
|
itemTreeEditor.triggerEdit(newNode);
|
|
}
|
|
else {
|
|
productTreeEditor.triggerEdit(newNode);
|
|
}
|
|
});
|
|
},
|
|
failure: Testopia.Util.error
|
|
});
|
|
}
|
|
|
|
function deleteNode(node){
|
|
testopia_form.submit({
|
|
url: 'tr_environments.cgi',
|
|
params:{
|
|
action: 'delete_element',
|
|
id: node.attributes.property_id || node.id,
|
|
type: node.attributes.type,
|
|
env_id: [% environment.id FILTER js %]
|
|
},
|
|
success:function(object){
|
|
node.remove();
|
|
Testopia.Util.notify.msg('Environment '+ node.attributes.type +' Deleted', '');
|
|
},
|
|
failure: Testopia.Util.error
|
|
});
|
|
}
|
|
|
|
function renameNode(node){
|
|
if (node.getOwnerTree().id == 'variable_tree'){
|
|
itemTreeEditor.triggerEdit(node);
|
|
}
|
|
else {
|
|
productTreeEditor.triggerEdit(node);
|
|
}
|
|
|
|
}
|
|
|
|
|
|
function copyNode(node){
|
|
var copy = new Tree.TreeNode(Ext.apply({}, node.attributes));
|
|
for(var i=0; i < node.childNodes.length; i++){
|
|
n = node.childNodes[i];
|
|
if(n){
|
|
copy.appendChild(copyNode(n));
|
|
}
|
|
}
|
|
return copy;
|
|
};
|
|
|
|
itemTreeEditor.on("beforestartedit", function(editor, element, value){
|
|
if(!editor.editNode)
|
|
return true;
|
|
var type = editor.editNode.attributes.type;
|
|
if(type == 'product' || type == 'classification')
|
|
return false;
|
|
});
|
|
|
|
productTreeEditor.on("beforestartedit", function(editor, element, value){
|
|
if(!editor.editNode)
|
|
return true;
|
|
var type = editor.editNode.attributes.type;
|
|
if(type == 'product' || type == 'classification')
|
|
return false;
|
|
});
|
|
|
|
environmentTreeEditor.on('beforestartedit', function(editor, element, value){
|
|
if(Ext.getCmp('environment_tree').getSelectionModel().getSelectedNode().attributes.type != "environment")
|
|
return false;
|
|
});
|
|
|
|
vtree.on("enddrag", applyElement, this);
|
|
ptree.on("enddrag", applyElement, this);
|
|
|
|
etree.on("beforenodedrop", function(event){
|
|
event.target = event.tree.root;
|
|
event.point = 'append';
|
|
event.dropNode = copyNode(event.dropNode);
|
|
});
|
|
|
|
function applyElement(treePanel, node, dd, e){
|
|
testopia_form.submit({
|
|
url: 'tr_environments.cgi',
|
|
params: {id: node.id, env_id: [% environment.id FILTER js %], type: node.attributes.type, action: 'apply_element'},
|
|
success: function(f,a){
|
|
etree.getLoader().load(etree.root, function(){etree.root.expand()});
|
|
},
|
|
failure: Testopia.Util.error
|
|
});
|
|
}
|
|
|
|
var EnvironmentPanel = new Ext.Panel({
|
|
id: 'environment_panel',
|
|
layout: 'border',
|
|
applyTo: 'environment_div',
|
|
height: 800,
|
|
items: [
|
|
etree,
|
|
{
|
|
layout: 'border',
|
|
region: 'east',
|
|
width: 300,
|
|
split: true,
|
|
items: [vtree, ptree]
|
|
},{
|
|
title: 'Help',
|
|
collapsible: true,
|
|
region: 'south',
|
|
split: true,
|
|
height: 200
|
|
}]
|
|
});
|
|
vtree.dropZone.isTarget = false;
|
|
ptree.dropZone.isTarget = false;
|
|
});
|
|
|
|
|
|
</script>
|
|
|
|
<div id="environment_div"></div>
|
|
|
|
[% PROCESS global/footer.html.tmpl %]
|