304 lines
9.8 KiB
JavaScript
304 lines
9.8 KiB
JavaScript
/*
|
|
* 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 Testopia System.
|
|
*
|
|
* The Initial Developer of the Original Code is Greg Hendricks.
|
|
* Portions created by Greg Hendricks are Copyright (C) 2006
|
|
* Novell. All Rights Reserved.
|
|
*
|
|
* Contributor(s): Greg Hendricks <ghendricks@novell.com>
|
|
* Ryan Hamilton <rhamilton@novell.com>
|
|
* Daniel Parker <dparker1@novell.com>
|
|
*/
|
|
|
|
Testopia.Build.Store = function(params, auto){
|
|
params.action = 'list';
|
|
Testopia.Build.Store.superclass.constructor.call(this, {
|
|
url: 'tr_builds.cgi',
|
|
root: 'builds',
|
|
listeners: { 'exception': Testopia.Util.loadError },
|
|
baseParams: params,
|
|
id: 'build_id',
|
|
autoLoad: auto,
|
|
fields: [{
|
|
name: "build_id",
|
|
mapping: "build_id"
|
|
}, {
|
|
name: "name",
|
|
mapping: "name"
|
|
}, {
|
|
name: "milestone",
|
|
mapping: "milestone"
|
|
}, {
|
|
name: "description",
|
|
mapping: "description"
|
|
}, {
|
|
name: "product_id",
|
|
mapping: "product_id"
|
|
}, {
|
|
name: "isactive",
|
|
mapping: "isactive"
|
|
}]
|
|
});
|
|
};
|
|
|
|
Ext.extend(Testopia.Build.Store, Ext.data.JsonStore);
|
|
|
|
/*
|
|
* Testopia.Build.Combo
|
|
*/
|
|
Testopia.Build.Combo = function(cfg){
|
|
Testopia.Build.Combo.superclass.constructor.call(this, {
|
|
id: cfg.id || 'build_combo',
|
|
store: cfg.transform ? false : new Testopia.Build.Store(cfg.params, cfg.mode == 'local' ? true : false),
|
|
loadingText: 'Looking up builds...',
|
|
displayField: 'name',
|
|
valueField: 'build_id',
|
|
typeAhead: true,
|
|
triggerAction: 'all',
|
|
minListWidth: 300,
|
|
forceSelection: true,
|
|
transform: cfg.transform,
|
|
emptyText: 'Builds...'
|
|
});
|
|
Ext.apply(this, cfg);
|
|
this.store.on('load', function(){
|
|
if (cfg.value) {
|
|
this.setValue(cfg.value);
|
|
}
|
|
}, this);
|
|
};
|
|
Ext.extend(Testopia.Build.Combo, Ext.form.ComboBox);
|
|
|
|
Testopia.Build.Grid = function(product_id){
|
|
this.product_id = product_id;
|
|
this.store = new Testopia.Build.Store({}, false);
|
|
var mbox = new Testopia.Product.MilestoneCombo({
|
|
hiddenField: 'milestone',
|
|
mode: 'remote',
|
|
params: {
|
|
product_id: product_id
|
|
},
|
|
listeners: {
|
|
'startedit': function(){
|
|
var pid = Ext.getCmp('products_pane').getSelectionModel().getSelectedNode().id;
|
|
if (mbox.store.baseParams.product_id != pid) {
|
|
mbox.store.baseParams.product_id = pid;
|
|
mbox.store.load();
|
|
}
|
|
}
|
|
}
|
|
});
|
|
this.columns = [{
|
|
header: "Name",
|
|
width: 80,
|
|
sortable: true,
|
|
dataIndex: 'name',
|
|
editor: {
|
|
xtype: 'textfield',
|
|
value: 'name',
|
|
allowBlank: false
|
|
}
|
|
}, {
|
|
header: "Description",
|
|
width: 120,
|
|
editor: {
|
|
xtype: 'textfield'
|
|
},
|
|
sortable: true,
|
|
dataIndex: 'description'
|
|
}, {
|
|
header: "Milestone",
|
|
width: 120,
|
|
sortable: true,
|
|
dataIndex: 'milestone',
|
|
editor: mbox
|
|
}, {
|
|
header: 'Active',
|
|
dataIndex: 'isactive',
|
|
trueText: 'Yes',
|
|
falseText: 'No',
|
|
sortable: true,
|
|
xtype: 'booleancolumn',
|
|
editor:{
|
|
xtype: 'checkbox',
|
|
value: 'isactive'
|
|
},
|
|
width: 25
|
|
}];
|
|
|
|
this.form = new Ext.form.BasicForm('testopia_helper_frm');
|
|
|
|
Testopia.Build.Grid.superclass.constructor.call(this, {
|
|
title: 'Builds',
|
|
id: 'build_grid',
|
|
loadMask: {
|
|
msg: 'Loading Builds...'
|
|
},
|
|
autoExpandColumn: "build_name",
|
|
autoScroll: true,
|
|
plugins: [new Ext.ux.grid.RowEditor({
|
|
id:'build_row_editor',
|
|
saveText: 'Update'
|
|
})],
|
|
sm: new Ext.grid.RowSelectionModel({
|
|
singleSelect: true
|
|
}),
|
|
viewConfig: {
|
|
forceFit: true
|
|
},
|
|
tbar: [new Ext.Toolbar.Fill(), {
|
|
xtype: 'button',
|
|
id: 'edit_build_btn',
|
|
icon: 'extensions/testopia/img/edit.png',
|
|
iconCls: 'img_button_16x',
|
|
tooltip: 'Edit Selected Build',
|
|
handler: function(){
|
|
Testopia.Util.editFirstSelection(Ext.getCmp('build_grid'));
|
|
}
|
|
}, {
|
|
xtype: 'button',
|
|
id: 'add_build_btn',
|
|
icon: 'extensions/testopia/img/add.png',
|
|
iconCls: 'img_button_16x',
|
|
tooltip: 'Add a new Build',
|
|
handler: this.newRecord
|
|
}]
|
|
});
|
|
this.on('rowcontextmenu', this.onContextClick, this);
|
|
this.on('activate', this.onActivate, this);
|
|
Ext.getCmp('build_row_editor').on('afteredit', this.onGridEdit, this);
|
|
};
|
|
Ext.extend(Testopia.Build.Grid, Ext.grid.GridPanel, {
|
|
newRecord: function(){
|
|
NewBuild = Ext.data.Record.create([{
|
|
name: 'name',
|
|
type: 'string'
|
|
}, {
|
|
name: 'milestone'
|
|
}, {
|
|
name: 'description',
|
|
type: 'string'
|
|
}, {
|
|
name: 'isactive',
|
|
type: 'bool'
|
|
}]);
|
|
var b = new NewBuild({
|
|
name: '',
|
|
milestone: Ext.getCmp('products_pane').getSelectionModel().getSelectedNode().attributes.attributes.defaultmilestone,
|
|
description: '',
|
|
isactive: true
|
|
});
|
|
var g = Ext.getCmp('build_grid');
|
|
g.store.insert(0, b);
|
|
Ext.getCmp('build_row_editor').startEditing(0);
|
|
},
|
|
onContextClick: function(grid, index, e){
|
|
grid.getSelectionModel().selectRow(index);
|
|
if (!this.menu) { // create context menu on first right click
|
|
this.menu = new Ext.menu.Menu({
|
|
id: 'build-ctx-menu',
|
|
enableScrolling: false,
|
|
items: [{
|
|
text: "Reports",
|
|
enableScrolling: false,
|
|
menu: {
|
|
items: [{
|
|
text: 'New Completion Report',
|
|
handler: function(){
|
|
Ext.getCmp('object_panel').setActiveTab('dashboardpanel');
|
|
|
|
var newPortlet = new Ext.ux.Portlet({
|
|
title: 'Build Completion Report',
|
|
closable: true,
|
|
autoScroll: true,
|
|
tools: PortalTools
|
|
});
|
|
newPortlet.url = 'tr_builds.cgi?action=report&product_id=' + grid.product_id + '&build_ids=' + Testopia.Util.getSelectedObjects(grid, 'id');
|
|
Testopia.Search.dashboard_urls.push(newPortlet.url);
|
|
Ext.getCmp('dashboard_leftcol').add(newPortlet);
|
|
Ext.getCmp('dashboard_leftcol').doLayout();
|
|
newPortlet.load({
|
|
url: newPortlet.url
|
|
});
|
|
}
|
|
}]
|
|
}
|
|
}, {
|
|
text: 'Add a Build',
|
|
icon: 'extensions/testopia/img/add.png',
|
|
iconCls: 'img_button_16x',
|
|
handler: this.newRecord
|
|
}, {
|
|
text: 'Edit This Build',
|
|
icon: 'extensions/testopia/img/edit.png',
|
|
iconCls: 'img_button_16x',
|
|
handler: function(){
|
|
Testopia.Util.editFirstSelection(grid);
|
|
}
|
|
}, {
|
|
text: 'Refresh',
|
|
icon: 'extensions/testopia/img/refresh.png',
|
|
iconCls: 'img_button_16x',
|
|
handler: function(){
|
|
grid.store.reload();
|
|
}
|
|
}]
|
|
});
|
|
}
|
|
e.stopEvent();
|
|
this.menu.showAt(e.getXY());
|
|
},
|
|
onGridEdit: function(e){
|
|
var myparams = e.record.data;
|
|
var ds = this.store;
|
|
myparams.product_id = this.product_id;
|
|
if (myparams.build_id) {
|
|
myparams.action = "edit";
|
|
}
|
|
else {
|
|
myparams.action = "add";
|
|
}
|
|
this.form.submit({
|
|
url: "tr_builds.cgi",
|
|
params: myparams,
|
|
success: function(f, a){
|
|
if (a.result.build_id) {
|
|
e.record.set('build_id', a.result.build_id);
|
|
}
|
|
ds.commitChanges();
|
|
},
|
|
failure: function(f, a){
|
|
Testopia.Util.error(f, a);
|
|
ds.rejectChanges();
|
|
}
|
|
});
|
|
},
|
|
onActivate: function(event){
|
|
if (!this.product_id) {
|
|
Ext.Msg.alert('Error', 'Please select a product.');
|
|
Ext.getCmp('edit_build_btn').disable();
|
|
Ext.getCmp('add_build_btn').disable();
|
|
return;
|
|
}
|
|
else {
|
|
if (!this.store.getCount()) {
|
|
this.store.load({
|
|
params: {
|
|
product_id: this.product_id
|
|
}
|
|
});
|
|
}
|
|
}
|
|
}
|
|
});
|