#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 ""; } }