#set ($ADD_STORY = $CommonFunctions.encodeJavaScriptString($CommonFunctions.getTermFromResourceBundle($currentUserId, "gSprintplanningrhs", "sprintplanningrhs.addstory")))
#set ($REFRESH_STORY_TABLE = $CommonFunctions.encodeJavaScriptString($CommonFunctions.getTermFromResourceBundle($currentUserId, "gSprintplanningrhs", "sprintplanningrhs.refreshstorytable")))
#if ($canManageStories)
#set ($EDIT_STORY = $CommonFunctions.encodeJavaScriptString($CommonFunctions.getTermFromResourceBundle($currentUserId, "gSprintplanningrhs", "sprintplanningrhs.editstory")))
#else
#set ($EDIT_STORY = $CommonFunctions.encodeJavaScriptString($CommonFunctions.getTermFromResourceBundle($currentUserId, "gSprintplanningrhs", "sprintplanningrhs.viewstory")))
#end
#set ($COPY_STORY = $CommonFunctions.encodeJavaScriptString($CommonFunctions.getTermFromResourceBundle($currentUserId, "gSprintplanningrhs", "sprintplanningrhs.copystory")))
#set ($SIZE_HEADER = $CommonFunctions.encodeJavaScriptString($CommonFunctions.getTermFromResourceBundle($currentUserId, "gSprintplanningrhs", "sprintplanningrhs.colsize")))
#set ($NAME_HEADER = $CommonFunctions.encodeJavaScriptString($CommonFunctions.getTermFromResourceBundle($currentUserId, "GSprintDialog", "gsprintdialog.name")))
var SPLabels = {
PROJECT_COMBO : '$PROJECT',
BACKLOG_COMBO : '$BACKLOG'
}
// ---------- SPV table ----------
var sprintplanning = {
viewPanel: null, // split view
projectComboDS: null,
projectCombobox: null,
projectComboRec: null,
projectComboboxLoaded: null,
gridDS: null,
gridCtrl: null,
isLoaded: false,
ddTarget: null,
reader: null,
blCombods: null,
blCombobox: null,
selBacklog: null,
comboboxLoaded: false,
toolbar: null,
contextMenu: null,
contextMenuReqId: null,
comboRec: null,
projComboRec: null,
loadMask:null,
init : function() {
Ext.QuickTips.init();
sprintplanningrhs.init();
sprintplanning.createGrid();
sprintplanning.createToolbar();
sprintplanning.loadProjectList();
sprintplanning.createViewPanel();
// fix for displaying 'Choose...'
sprintplanning.projectCombobox.setValue();
sprintplanning.blCombobox.setValue();
sprintplanning.loadMask = new Ext.LoadMask(sprintplanning.viewPanel.getEl(), {});
},
setLoadMask : function (loadMask) {
sprintplanning.loadMask = loadMask;
},
createViewPanel: function() {
var projectPanel = new Ext.Panel({
region: 'north',
layout: 'fit',
border: false,
bodyStyle: 'display: none',
tbar: [ new Ext.Toolbar.TextItem('' + SPLabels.PROJECT_COMBO + ':'),
new Ext.Toolbar.Spacer(),
new Ext.Toolbar.Spacer(),
sprintplanning.projectCombobox,
'->',
sprintplanning.refreshButton]
});
var backlogPanel = new Ext.Panel({
region: 'west',
layout: 'fit',
split: true,
width : 350,
items: [sprintplanning.gridCtrl]
});
var sprintPanel = new Ext.Panel({
region: 'center',
layout: 'fit',
width : 450,
items: [sprintplanningrhs.gridCtrl]
});
sprintplanning.viewPanel = new Ext.Panel ({
layout: 'border',
items: [projectPanel,backlogPanel,sprintPanel]
});
var viewPort = new Ext.Viewport({
layout:'fit',
items:[sprintplanning.viewPanel],
renderTo: document.body
});
},
createProjectToolbarCombo : function() {
var refreshButton = new Ext.Toolbar.Button({
text:'$REFRESH',
tooltip:'$REFRESH_TITLE',
iconCls:'refresh',
handler : function() {
sprintplanning.loadSPxBacklogTable(sprintplanning.onLoadStories, 'NONULLRANKS');
sprintplanningrhs.loadSPxReleaseTable(sprintplanningrhs.onLoadSprints);
}
});
refreshButton.setDisabled(true);
sprintplanning.refreshButton = refreshButton;
sprintplanning.projectComboRec = Ext.data.Record.create( [
{ name:'id' },
{ name:'name', sortType:'asUCString' }
]);
// project toolbar combo ds
sprintplanning.projectComboDS = new Ext.data.Store({
id : 0,
proxy: new Ext.data.HttpProxy({url:'pbv/PBVAsyncHandler?action=PROJECTLIST'}),
reader: new Ext.data.JsonReader({id:'id'}, sprintplanning.projectComboRec),
sortInfo:{field: 'name', direction: "ASC"}
});
// backlog toolbar combo box
sprintplanning.projectCombobox = new Ext.form.ComboBox({
id: 'sprintPlanningProjectCombo',
tpl: '{name}
',
store : sprintplanning.projectComboDS,
displayField :'name',
valueField :'id',
//typeAhead : true,
forceSelection : true,
mode : 'local',
emptyText :'$CHOOSE',
selectOnFocus :true,
width : 220,
editable : false,
triggerAction : 'all',
listWidth: 220,
listClass :'x-combo-list-small' ,
listeners : { select : onProjectSelect, loadexception: BxtUtil.lexHandler }
});
function onProjectSelect(combo, rec, index) {
document.location.href = '../common/application/itimpact/loadpagespx.html?projectId=' + rec.get('id');
}
},
createGrid : function() {
// create Story table with specified columns
var g = new Bxt.StoryTable( {
id: 'sprintplanninglhsGrid',
columns: [
{header: "ID", width: 40, sortable: false, dataIndex: 'id' , renderer:TBLRender.Id},
{id:'name',header: "$NAME_HEADER", width: 80, sortable: false, dataIndex: 'name', renderer:sprintplanning.renderName },
{header: "Rank", width: 60, fixed: true, hidden: true, sortable: false, dataIndex: 'rank', renderer:TBLRender.Number},
{header: "$SIZE_HEADER", width: 60, sortable: false, dataIndex: 'size', renderer:TBLRender.Number}
],
frame : false,
header : false,
border : false,
bbar : null
});
// context menus
//set panel context menu first
var panelMenuItems = [
{ id: 'addNewReq', text: '$ADD_STORY', #if (!$canManageStories) disabled: true, #end handler: sprintplanning.contextMenuHandler },
{ id: 'refresh', text: '$REFRESH_STORY_TABLE', handler: sprintplanning.contextMenuHandler } ] ;
g.setPanelContextMenu(panelMenuItems);
// set row context menu second.
var rowMenuItems = [ { id: 'editReq', text: '$EDIT_STORY', handler: sprintplanning.contextMenuHandler },
{ id: 'copyReq', text: '$COPY_STORY', #if (!$canManageStories) disabled: true, #end handler: sprintplanning.contextMenuHandler },
'-',
{ id: 'addNewReq', text: '$ADD_STORY', #if (!$canManageStories) disabled: true, #end handler: sprintplanning.contextMenuHandler },
{ id: 'refresh', text: '$REFRESH_STORY_TABLE', handler: sprintplanning.contextMenuHandler } ]
g.setContextMenu( rowMenuItems );
#if ($canManageBacklogs)
// Dragdrop
//sprintplanning.chgDDState
g.setDragDropHandler( null, null, sprintplanning.updateRankPosition );
#end
// gridCtrl property and grid store property
sprintplanning.gridCtrl = g;
sprintplanning.gridDS = g.getStore();
},
renderName : function(value, p, record, rowindex, colindex, store) {
//p.attr = 'ext:qtip="' + value + '"';
var reqId = sprintplanning.gridDS.getAt(rowindex).get('id');
return "" + value + "";
},
createBacklogToolbarCombo : function() {
sprintplanning.comboRec = Ext.data.Record.create( [
{ name:'id' },
{ name:'name', sortType:'asUCString' },
{ name:'xlinkid' }
]);
// backlog toolbar combo ds
sprintplanning.blCombods = new Ext.data.Store({
id : 0,
proxy: new Ext.data.HttpProxy({url:'ajax2/Gemini?action=focus.web.ajax.SaveSPXProjectSettingAction'}),
reader: new Ext.data.JsonReader({id:'id', master:'master'}, sprintplanning.comboRec),
sortInfo:{field: 'name', direction: "ASC"}
});
// backlog toolbar combo box
sprintplanning.blCombobox = new Ext.form.ComboBox({
id: 'spx_backlogCombobox',
tpl: '{name}
',
store : sprintplanning.blCombods,
displayField :'name',
valueField :'id',
typeAhead : true,
forceSelection : true,
mode : 'local',
emptyText :'$CHOOSE',
selectOnFocus :true,
//autoWidth : true,
width: 220,
editable : false,
triggerAction : 'all',
listClass :'x-combo-list-small',
listeners : { select : onBacklogSelect }
});
function onBacklogSelect(combo, rec, index) {
sprintplanning.selBacklog = rec.data.id;
sprintplanning.loadSPxBacklogTable(sprintplanning.onLoadStories,
'NONULLRANKS');
}
},
createToolbar : function() {
sprintplanning.createProjectToolbarCombo();
sprintplanning.toolbar = sprintplanning.gridCtrl.getTopToolbar();
// create backlog combo box
sprintplanning.createBacklogToolbarCombo();
sprintplanning.toolbar.add(new Ext.Toolbar.TextItem('' + SPLabels.BACKLOG_COMBO + ':'));
sprintplanning.toolbar.addSpacer();
sprintplanning.toolbar.addSpacer();
sprintplanning.toolbar.addSpacer();
sprintplanning.toolbar.add(sprintplanning.blCombobox);
},
contextMenuHandler : function (item, e) {
switch (item.id) {
case 'addNewReq':
sprintplanning.addNewRequirement(item.getEl());
break;
case 'copyReq' :
var contextMenuReqId = sprintplanning.gridCtrl.selectedContextMenuItem.get('id');
sprintplanning.showRequirementDetails(contextMenuReqId, true, item.getEl());
break;
case 'editReq' :
var contextMenuReqId = sprintplanning.gridCtrl.selectedContextMenuItem.get('id');
sprintplanning.showRequirementDetails(contextMenuReqId, false, item.getEl());
break;
case 'refresh' :
sprintplanning.loadSPxBacklogTable(sprintplanning.onLoadStories,
'NONULLRANKS');
break;
}
},
#if (false)
refreshSPx : function() {
sprintplanning.blCombobox.setValue();
sprintplanning.projectCombobox.setValue();
sprintplanning.loadProjectList();
/*if(sprintplanning.selBacklog){
sprintplanning.gridDS.load({waitMsg:'$LOADING',params:{start:0, limit:30,
backlogid: sprintplanning.selBacklog, subaction: 'NONULLRANKS'},
callback: sprintplanning.onLoadStories});
}*/
var releaseId = sprintplanningrhs.releaseCombobox.getValue();
if(releaseId) {
sprintplanningrhs.loadSprintRequirements();
}
},
#end
// ----- project combo loading with user settings -----
loadProjectList : function() {
sprintplanning.projectComboDS.load({ waitinMsg:'$LOADING',
params:{ start:0,
limit: 30},
callback:sprintplanning.projectLoaded });
},
projectLoaded : function(rec, options, success) {
if(!success) {
BxtUtil.showErrorMsg('$PROJECT_LIST_LOAD_ERROR');
return;
}
sprintplanning.refreshButton.setDisabled(false);
if(rec.length == 1) {
sprintplanning.setProjectValue(rec[0].get('id'));
} else {
sprintplanning.loadUserSettingsProject();
}
},
loadUserSettingsProject:function() {
BxtUserSettings.load('$_FOCUS_SPRINT_PLANNING_VIEW',
'$_FOCUS_PROJECT_SELECTION',
sprintplanning.setProjectSettingValue,
null);
},
setProjectSettingValue : function(response, options) {
var r = Ext.decode(response.responseText);
sprintplanning.setProjectValue(r.selection);
},
setProjectValue : function(selection) {
var ret = BxtUserSettings.setComboboxValue(sprintplanning.projectCombobox, selection);
if( ret == BxtUserSettings.cbNEW) {
sprintplanning.blCombobox.clearValue();
sprintplanning.gridDS.removeAll();
sprintplanning.loadBacklogList();
sprintplanningrhs.loadReleaseList();
} else if( ret == BxtUserSettings.cbSET) {
sprintplanning.loadUserSettingsBacklog();
sprintplanningrhs.loadUserSettingsRelease();
}
},
loadSPxBacklogTable : function(cbFunction,saction) {
sprintplanning.gridDS.proxy = new Ext.data.HttpProxy({url:'ajax2/Gemini?action=focus.web.ajax.LoadSPxBacklogTableAction&userid=$currentUserId'})
if (!cbFunction) cbFunction = null;
if (!saction) saction = null;
var projectCtrlId = sprintplanning.projectCombobox.getValue();
var backlogCtrlId = sprintplanning.blCombobox.getValue();
sprintplanning.gridDS.load({ waitMsg:'$LOADING',
params:{ start:0,
limit:50,
group:'NO',
subaction: saction,
userid:'$currentUserId',
backlogid: backlogCtrlId,
spxprojectid: projectCtrlId,
spxbacklogid: backlogCtrlId },
callback: cbFunction
});
},
// ----- backlog combo loading with user settings -----
loadBacklogList : function() {
var pId = sprintplanning.projectCombobox.getValue();
if ( pId != '') {
sprintplanning.blCombods.load({ waitMsg:'$LOADING',
params:{start:0,
limit:25,
projectid: sprintplanning.projectCombobox.getValue(),
userId:'$currentUserId',
viewId:'$_FOCUS_SPRINT_PLANNING_VIEW',
keyId:'$_FOCUS_BACKLOG_SELECTION',
selection: pId },
callback: sprintplanning.updaterdlgBklogCombods });
}
},
updaterdlgBklogCombods : function(rec, options, success) {
if(success) {
//storyDialog.updaterdlgBklogCombods(rec);
if (rec.length == 1) {
var backlogId = rec[0].get('id');
sprintplanning.setBacklogValue(backlogId);
sprintplanning.selBacklog = backlogId;
} else {
sprintplanning.loadUserSettingsBacklog();
}
} else {
BxtUtil.showErrorMsg('$BACKLOG_LIST_LOAD_ERROR');
}
},
loadUserSettingsBacklog:function() {
if (sprintplanning.blCombods.getCount() == 1) {
var backlogId = sprintplanning.blCombods.getAt(0).get('id');
sprintplanning.setBacklogValue(backlogId);
sprintplanning.selBacklog = backlogId;
}
else {
BxtUserSettings.load('$_FOCUS_SPRINT_PLANNING_VIEW',
'$_FOCUS_BACKLOG_SELECTION',
sprintplanning.setBacklogSettingValue,
null);
}
},
setBacklogSettingValue : function(response, options) {
var r = Ext.decode(response.responseText);
sprintplanning.setBacklogValue(r.selection);
},
setBacklogValue : function(selection) {
var cb = sprintplanning.blCombobox;
var ret = BxtUserSettings.setComboboxValue(cb, selection);
if( ret == BxtUserSettings.cbNEW) {
sprintplanning.selBacklog = selection;
} else if( ret == BxtUserSettings.cbNONE){
sprintplanning.selBacklog = null;
sprintplanning.gridDS.removeAll();
cb.setValue();
} else {
cb.setValue(selection);
}
if ((ret == BxtUserSettings.cbNEW)) {
sprintplanning.loadSPxBacklogTable(sprintplanning.onLoadStories,
'NONULLRANKS');
}
},
onLoadStories : function(rec, options, success) {
if(!success){
BxtUtil.showErrorMsg('$STORYLOAD_ERROR');
sprintplanning.gridDS.removeAll();
}
},
updateRankPosition : function(indexArray, rankArray, destIndex, paramString, destRecord) {
//sprintplanning.loadMask.show();
Ext.Ajax.request({
url: 'pbv/PBVAsyncHandler?action=SAVE-RANKS',
success: sprintplanning.reqReinsertHandler,
failure: function(response, options){
//sprintplanning.loadMask.hide();
ErrorHandlerLib.onAjaxFailure(response, options);
},
settings: {show: true, msg:'$UPDATERANK_ERROR'},
localvars: {indexArray: indexArray, rankArray: rankArray, destindex: destIndex, destRecord: destRecord},
params: {start:0, limit:25, paramString: paramString, reqbacklogid: sprintplanning.selBacklog}
});
},
// handler to remove and re-insert a requirement
reqReinsertHandler : function(response, options) {
//sprintplanning.loadMask.hide();
if (response.responseText != undefined) {
if(BxtUtil.checkErrorInResponse(response)) {
return;
}
var indexArray = options.localvars.indexArray;
var rankArray = options.localvars.rankArray;
var destIndex = options.localvars.destindex;
var destRecord = options.localvars.destRecord;
if (indexArray.length == rankArray.length) {
var ds = sprintplanning.gridDS;
var reqArray = new Array(indexArray.length);
for (i = 0; i < reqArray.length; i++) {
var req = sprintplanning.gridDS.getAt(indexArray[i]);
req.set("rank", rankArray[i]);
reqArray[i] = req;
}
for (i = 0; i < reqArray.length; i++) {
ds.remove(reqArray[i]);
ds.insert(ds.indexOf(destRecord), reqArray[i]);
}
ds.commitChanges();
// auto renumber
for (i = 0; i < rankArray.length; i++) {
if(BxtUtil.getDecimalDigits(rankArray[i]) > 7){
sprintplanning.reNumberRankedRequirments();
break;
}
}
} else {
BxtUtil.showErrorMsg('$UPDATEBLOG_ERROR');
}
}
},
reNumberRankedRequirments : function() {
var ds = sprintplanning.gridDS;
var count = ds.getCount();
var index = 1;
var paramString = "";
for (i = 0; i < count; i++) {
var rec = ds.getAt(i);
var reqId = rec.get('id');
if (paramString != "") {
paramString += "|" ;
}
paramString += reqId + "," + index;
rec.set('rank',index);
index ++;
}
if (paramString.length > 0) {
ds.commitChanges();
//sprintplanning.loadMask.show();
Ext.Ajax.request({
url: 'pbv/PBVAsyncHandler?action=SAVE-RANKS',
success: sprintplanning.reNumberSuccess,
failure: function(response, options){
//sprintplanning.loadMask.hide();
ErrorHandlerLib.onAjaxFailure(response, options);
},
settings: {show: true, msg:'$UPDATERANK_ERROR'},
params: {
start: 0,
limit: 25,
paramString: paramString,
reqbacklogid: sprintplanning.selBacklog
}
});
}
},
reNumberSuccess : function(response, options) {
//sprintplanning.loadMask.hide();
},
setupStoryDialog : function() {
storyDialog.resetDialog();
storyDialog.projectId = sprintplanning.projectCombobox.getValue();
storyDialog.productBacklog = sprintplanning.blCombobox.getValue();
storyDialog.saveSuccessHandlerFn = sprintplanning.reloadReqsHighlightFirstRow;
storyDialog.tabx = 'spx';
},
reloadRequirements : function() {
sprintplanning.gridDS.load({waitMsg:'Loading',params:{start:0, limit:25, backlogid: sprintplanning.blCombobox.getValue(), subaction: 'NONULLRANKS'},
callback: sprintplanning.onLoadStories});
},
reloadReqsHighlightFirstRow : function() {
sprintplanning.gridDS.load({waitMsg:'Loading',params:{start:0, limit:25, backlogid: sprintplanning.blCombobox.getValue(), subaction: 'NONULLRANKS'},
callback: sprintplanning.highlightFirstRequirement});
},
highlightFirstRequirement : function(rec, options, success) {
sprintplanning.onLoadStories(rec, options, success);
sprintplanning.gridCtrl.getSelectionModel().selectFirstRow();
},
showRequirementDetails : function(reqId, copy, el) {
sprintplanning.setupStoryDialog();
storyDialog.showRequirementDetails(reqId, copy, el, sprintplanning.loadMask);
},
// ---------- Add Requirement ----------
addNewRequirement : function(el) {
sprintplanning.setupStoryDialog();
storyDialog.addNewRequirement(el, sprintplanning.loadMask);
},
chgDDState : function ( grid, columnIndex, evt) {
var ddt = sprintplanning.gridCtrl.ddTarget;
if(columnIndex == 2) { // rank
var state = sprintplanning.gridCtrl.getStore().getSortState();
var sdir = (state.direction == 'ASC');
if (sdir) {
ddt.unlock();
}
else{
ddt.lock(); // disable drop target
}
} else {
ddt.lock(); // disable drop target
}
},
//WATIR support
getStoryIdByName: function(storyname) {
var ds = sprintplanning.gridDS;
var count = ds.getCount();
for (i = 0; i < count; i++) {
var rec = ds.getAt(i);
var reqId = rec.get('id');
var reqname = rec.get('name');
if(reqname == storyname)
{
return reqId;
}
}
return "";
}
}