#set ($SYSTEM_ASSIGNED = "System assigned") #set ($NA = $CommonFunctions.encodeJavaScriptString($CommonFunctions.getTermFromResourceBundle($currentUserId, "BacklogTable", "backlogtable.na"))) #set ($TEMPLATE_TEXT = $CommonFunctions.encodeJavaScriptString($CommonFunctions.getTermFromResourceBundle($currentUserId, "BacklogTable", "backlogtable.templatetext"))) #set ($SELECT_ALL = $CommonFunctions.encodeJavaScriptString($CommonFunctions.getTermFromResourceBundle($currentUserId, "gobstacledialog", "gobstacledialog.selectall"))) #set ($SAVE = $CommonFunctions.encodeJavaScriptString($CommonFunctions.getTermFromResourceBundle($currentUserId, "gobstacledialog", "gobstacledialog.save"))) #set ($CANCEL = $CommonFunctions.encodeJavaScriptString($CommonFunctions.getTermFromResourceBundle($currentUserId, "gobstacledialog", "gobstacledialog.cancel"))) #set ($NAME = $CommonFunctions.encodeJavaScriptString($CommonFunctions.getTermFromResourceBundle($currentUserId, "gobstacledialog", "gobstacledialog.name"))) #set ($BLANK_ENTRY_ERROR = $CommonFunctions.encodeJavaScriptString($CommonFunctions.getTermFromResourceBundle($currentUserId, "gobstacledialog", "gobstacledialog.blankentryerror"))) #set ($OBSTACLE_DLG_TITLE = $CommonFunctions.encodeJavaScriptString($CommonFunctions.getTermFromResourceBundle($currentUserId, "gobstacledialog", "gobstacledialog.obstacledlgtitle"))) #set ($ADD_TITLE = $CommonFunctions.encodeJavaScriptString($CommonFunctions.getTermFromResourceBundle($currentUserId, "gobstacledialog", "gobstacledialog.addtitle"))) #set ($EDIT_TITLE = $CommonFunctions.encodeJavaScriptString($CommonFunctions.getTermFromResourceBundle($currentUserId, "gobstacledialog", "gobstacledialog.edittitle"))) #set ($DESCRIPTION = $CommonFunctions.encodeJavaScriptString($CommonFunctions.getTermFromResourceBundle($currentUserId, "gobstacledialog", "gobstacledialog.description"))) #set ($RESOLUTION = $CommonFunctions.encodeJavaScriptString($CommonFunctions.getTermFromResourceBundle($currentUserId, "gobstacledialog", "gobstacledialog.resolution"))) #set ($ASSIGNED_TO = $CommonFunctions.encodeJavaScriptString($CommonFunctions.getTermFromResourceBundle($currentUserId, "gobstacledialog", "gobstacledialog.assignedto"))) #set ($SPRINT_BLOCKER = $CommonFunctions.encodeJavaScriptString($CommonFunctions.getTermFromResourceBundle($currentUserId, "gobstacledialog", "gobstacledialog.sprintblocker"))) #set ($STATUS = $CommonFunctions.encodeJavaScriptString($CommonFunctions.getTermFromResourceBundle($currentUserId, "gobstacledialog", "gobstacledialog.status"))) #set ($LOAD_ERROR = $CommonFunctions.encodeJavaScriptString($CommonFunctions.getTermFromResourceBundle($currentUserId, "gobstacledialog", "gobstacledialog.loaderror"))) #set ($ERROR_TITLE = $CommonFunctions.encodeJavaScriptString($CommonFunctions.getTermFromResourceBundle($currentUserId, "gobstacledialog", "gobstacledialog.errortitle"))) #set ($OBSTACLE_SAVE_WAIT = $CommonFunctions.encodeJavaScriptString($CommonFunctions.getTermFromResourceBundle($currentUserId, "gobstacledialog", "gobstacledialog.obstaclesavewait"))) #set ($INVALID_ENTRIES = $CommonFunctions.encodeJavaScriptString($CommonFunctions.getTermFromResourceBundle($currentUserId, "gobstacledialog", "gobstacledialog.invalidentries"))) #set ($TASK_NAME_COL_TITLE = $CommonFunctions.encodeJavaScriptString($CommonFunctions.getTermFromResourceBundle($currentUserId, "gobstacledialog", "gobstacledialog.tasknameheader"))) #set ($TASK_ID_COL_TITLE = $CommonFunctions.encodeJavaScriptString($CommonFunctions.getTermFromResourceBundle($currentUserId, "gobstacledialog", "gobstacledialog.taskidheader"))) #set ($OBSTACLE_SAVE_ERROR = $CommonFunctions.encodeJavaScriptString($CommonFunctions.getTermFromResourceBundle($currentUserId, "gobstacledialog", "gobstacledialog.obstacleerror"))) // ---------- obstacle Dialog --------- var OBLabels = { SELECT_ALL: '$SELECT_ALL', SAVE: '$SAVE', CANCEL: '$CANCEL', NAME: '$NAME', BLANK_ENTRY_ERROR: '$BLANK_ENTRY_ERROR', OBSTACLE_DLG_TITLE: '$OBSTACLE_DLG_TITLE', ADD_TITLE: '$ADD_TITLE', EDIT_TITLE: '$EDIT_TITLE', DESCRIPTION: '$DESCRIPTION', RESOLUTION:'$RESOLUTION', SPRINT_BLOCKER: '$SPRINT_BLOCKER', STATUS:'$STATUS', ASSIGNED_TO: '$ASSIGNED_TO', LOAD_ERROR: '$LOAD_ERROR', ERROR_TITLE: '$ERROR_TITLE', OBSTACLE_SAVE_WAIT: '$OBSTACLE_SAVE_WAIT', INVALID_ENTRIES: '$INVALID_ENTRIES', TASK_NAME_COL_TITLE: '$TASK_NAME_COL_TITLE', TASK_ID_COL_TITLE: '$TASK_ID_COL_TITLE' }; OBStatuses = { ACTIVE: '000000000001', RESOLVED: '000000000002' }; var obstacleDialog = { selectedSprintId: null, selectedObstacleId: null, selectedTaskId:null, saveSuccessHandlerFn:null, taskGrid: null, taskObstacleDS: null, rdlgSelXTasks: null, rdlgSelXTaskCount: null, usersDS : null, userRec : null, userArray : null, statusDS:null, statusCombo:null, dlgEditMode:false, init : function() { // form record obstacleDialog.dlgFormRec = Ext.data.Record.create( [ { name:'obstacleId' }, { name:'name' }, { name:'desc' }, { name:'status' }, { name:'assignedto' }, { name:'sprintblocker' }, { name:'resolution' } ]); // title obstacleDialog.dlgObsTitle = new Ext.form.TextField({ autoCreate: {tag: "input", type: "text", id: "obstacleDlgName"}, fieldLabel: OBLabels.NAME, name: 'name', anchor:'98%', allowBlank: false, maxLength: 200, validator : function(v) { if(v!= null && v.trim() == '') { return OBLabels.BLANK_ENTRY_ERROR; } return true; } }); //description obstacleDialog.ObstacleDesc = new Ext.form.TextArea({ autoCreate: {tag: "textarea", id: "obstacleDlgDesc"}, xtype: 'textarea', fieldLabel: OBLabels.DESCRIPTION, name: 'desc', anchor: '98%', height: 92, maxLength : 2000 }); //Status obstacleDialog.createStatusComboBox(); //users obstacleDialog.createUserComboBox(); //sprintblocker obstacleDialog.ObstacleSprintBlocker=new Ext.form.Checkbox({ fieldLabel: OBLabels.SPRINT_BLOCKER, name: 'sprintblocker', id: 'sprintblocker', width: 100, boxLabel: " ", value: 'off' }); //assigned to obstacleDialog.createTaskGrid(); //resolution obstacleDialog.ObstacleResol = new Ext.form.TextArea({ autoCreate: {tag: "textarea", id: "obstacleDlgResol"}, xtype: 'textarea', fieldLabel: OBLabels.RESOLUTION, name: 'resolution', anchor: '98%', height: 92, maxLength : 2000, hidden : false, hideLabel : false }); // form control obstacleDialog.dlgFormCtrl = new Ext.FormPanel({ buttonAlign: 'right', labelAlign: 'right', labelWidth: 100, frame:true, width: 450, height: 400, reader: new Ext.data.JsonReader({}, obstacleDialog.dlgFormRec), items: [{ layout: 'form', items: [{ autoCreate: {tag: "input", type: "text", id: "obstacleDlgId"}, xtype: 'textfield', name: 'obstacleId', hidden : true, hideLabel : true, height : 0 }, obstacleDialog.dlgObsTitle, //title obstacleDialog.ObstacleDesc, //description /** { layout: 'column', height: 22, items: [ { columnWidth:.35, layout: 'form', labelWidth: 70, items: [ obstacleDialog.statusCombo ] }, { columnWidth:.63, layout: 'form', labelWidth: 60, items: [ obstacleDialog.usersCombo ] }] },**/ obstacleDialog.statusCombo ,//status combo obstacleDialog.usersCombo,//Assigned To obstacleDialog.ObstacleSprintBlocker,//sprintBlocker obstacleDialog.taskGrid,//Taskgrid obstacleDialog.ObstacleResol //resolution ] }], buttons: [{ id: 'obstacleDlgSaveButton', text: OBLabels.SAVE, handler: function(){ obstacleDialog.saveObstacle(); } }, { id: 'obstacleDlgCancelButton', text: OBLabels.CANCEL, handler: function() { obstacleDialog.dialog.hide(); } }] }); }, createDialog:function() { // form dialog if(!obstacleDialog.dialog){ obstacleDialog.dialog = new Bxt.BMSWindow({ layout:'fit', width:450, height:460, closeAction:'hide', plain: true, items: obstacleDialog.dlgFormCtrl, modal: true, resizable : false, closable: true, renderTo: document.body, saveFunc: obstacleDialog.saveObstacle, formCtrl: obstacleDialog.dlgFormCtrl }); }; obstacleDialog.dialog.on('show', function(){ obstacleDialog.dlgObsTitle.getEl().dom.focus(); }, null, {delay: 100}); }, createStatusComboBox : function() { // status obstacleDialog.statusRec = Ext.data.Record.create( [ { name:'id' }, { name:'value'} ]); obstacleDialog.statusDS = new Ext.data.Store({ id : 0, proxy: new Ext.data.HttpProxy({url:'pbv/PBVAsyncHandler?action=GET-OBSTACLE-STATUSES'}), reader: new Ext.data.JsonReader({ id: 'id' }, obstacleDialog.statusRec), sortInfo:{field: 'value', direction: "ASC"} }); obstacleDialog.statusCombo = new Ext.form.ComboBox({ fieldLabel: OBLabels.STATUS, name: 'status', store: obstacleDialog.statusDS, displayField: 'value', valueField: 'id', selectOnFocus: true, forceSelection : true, listClass: 'x-combo-list-small', mode: 'local', allowBlank: false, triggerAction: 'all', editable: false, autoWidth: false, anchor: '60%' }); //for new obstacle set the status to active and hide the control obstacleDialog.statusDS.on('load', function() { if (!obstacleDialog.selectedObstacleId) { obstacleDialog.statusCombo.setValue(OBStatuses.ACTIVE); } }); obstacleDialog.statusCombo.on('select', function(combo, rec, index){ var value= combo.getValue(); if (OBStatuses.ACTIVE == id) { //Active //do something obstacleDialog.dialog.setHeight(440); obstacleDialog.hideField( obstacleDialog.ObstacleResol); } else if (OBStatuses.RESOLVED == value) { //Resolved obstacleDialog.dialog.setHeight(550); obstacleDialog.showField( obstacleDialog.ObstacleResol); } }); }, createUserComboBox : function() { obstacleDialog.userRec = Ext.data.Record.create( [ { name:'id' }, { name:'name', sortType:'asUCString' } ]); obstacleDialog.usersDS = new Ext.data.Store({ id : 0, proxy: new Ext.data.HttpProxy({url:'pbv/PBVAsyncHandler?action=USERLIST'}), reader: new Ext.data.JsonReader({}, obstacleDialog.userRec), sortInfo:{field: 'name', direction: "ASC"} }); obstacleDialog.usersDS.on('load', function() { obstacleDialog.userArray = new Array(); var ds = obstacleDialog.usersDS; for (var i = 0;i < ds.getCount();i++) { var user = ds.getAt(i); obstacleDialog.userArray[i] = { 'id' : user.get('id'), 'name' : user.get('name') }; } }); obstacleDialog.usersCombo = new Ext.form.ComboBox ({ fieldLabel: OBLabels.ASSIGNED_TO, name: 'assignedto', store: obstacleDialog.usersDS, displayField: 'name', valueField: 'id', value: '', emptyText: OBLabels.CHOOSE, selectOnFocus: true, forceSelection : true, listClass: 'x-combo-list-small', mode: 'local', allowBlank: true, triggerAction: 'all', editable: false , autoWidth: false, anchor: '98%' }); }, // ---------- selection handlers ---------- onTaskSelect : function(el, taskid) { var checked = el.checked; var ds = obstacleDialog.taskObstacleDS; if(taskid == 'header') { var len = ds.getCount(); for(var i = 0; i < len; i++) { var rec = ds.getAt(i); rec.set('sel', checked); } } else { var rec = ds.getById(taskid); rec.set('sel', checked); } ds.commitChanges(); }, getSelectedTasks : function() { //This is called before submitting save to check if //task selection has changed. var selectedTasks = []; var selcount =0; var ds = obstacleDialog.taskObstacleDS; var len = ds.getCount(); for(var i = 0; i < len; i++) { var rec = ds.getAt(i); if(rec.get('sel')) { selectedTasks[selcount++] = rec; } } return selectedTasks; }, getSelectedTaskCount : function() { var selcount =0; var ds = obstacleDialog.taskObstacleDS; var len = ds.getCount(); for(var i = 0; i < len; i++) { var rec = ds.getAt(i); if(rec.get('sel')) { selcount++; } } return selcount; }, createTaskGrid : function() { // create Task record definition var taskRec = Ext.data.Record.create( [ { name: 'taskId' }, { name: 'name' }, { name: 'sel', type: 'bool' } ] ); // create the data store obstacleDialog.taskObstacleDS = new Ext.data.Store({ id : 0, proxy: new Ext.data.HttpProxy({url:'pbv/PBVAsyncHandler?action=OBSTACLETASKLIST'}), reader: new Ext.data.JsonReader({id:'taskId'}, taskRec), sortInfo:{field: 'sel', direction: "DESC"} }); obstacleDialog.taskGrid = new Ext.grid.EditorGridPanel({ fieldLabel: OBLabels.TASKS, store: obstacleDialog.taskObstacleDS, columns: [ {header: 'taskId', hidden: true, dataIndex: 'taskId'}, {header: '', width: 33, dataIndex: 'sel', sortable: true,renderer: obstacleDialog.renderCheckbox }, {id:'id',header: OBLabels.TASK_ID_COL_TITLE, width: 50, sortable: true, resizable: false, dataIndex: 'taskId', renderer: TBLRender.Id } , {id:'name',header: OBLabels.TASK_NAME_COL_TITLE, width: 230, sortable: true, resizable: false, dataIndex: 'name' } ], sm : new Ext.grid.RowSelectionModel(), header: false, autoScroll: true, autoExpandColumn: 'name', layout: 'fit', viewConfig: { autoFill: true, forceFit:true }, width:420, height:150, frame:false, iconCls:'icon-grid', el: 'rel-link-div' }); obstacleDialog.usersDS.on('load', function() { }); }, // ---------- table renderers ---------- hideField: function(field,allowblank) { if (field != null) { field.hide(); field.getEl().up('.x-form-item').setDisplayed(false); if((typeof(allowblank) != 'undefined') && (allowblank != null)) { field.allowBlank = allowblank; } } else { alert("Field could not be found"); } return field; }, showField : function(field,allowBlank) { if (field != null) { field.show(); field.getEl().up('.x-form-item').setDisplayed(true); if((typeof(allowblank) != 'undefined') && (allowblank != null)) { field.allowBlank = allowblank; } } else { alert("Field could not be found"); } return field; }, renderCheckbox : function (value, p, record, rowindex, colindex, store) { var taskId = record.get('taskId'); var chk = (value) ? ' checked ': '' ; return '
'; }, renderID : function(value, p, record, rowindex, colindex, store) { var taskId = record.get('taskId'); var iTaskId = BxtUtil.formatId(taskId);; return iTaskId; }, // ---------- Add Obstacle ---------- addNewObstacle: function(projectId,sprintId, taskId, el, loadMask) { obstacleDialog.dlgEditMode = false; obstacleDialog.createDialog(); obstacleDialog.dialog.confirmHide = false; // load user combo data obstacleDialog.usersDS.load({ params:{ taskid: taskId, projectid: projectId, sprintid: sprintId } }); obstacleDialog.statusDS.load({ params:{ taskid: taskId, projectid: projectId, sprintid: sprintId } }); obstacleDialog.selectedProjectId = projectId; obstacleDialog.selectedSprintId = sprintId; obstacleDialog.selectedTaskId = taskId; obstacleDialog.selectedObstacleId = null; obstacleDialog.dlgFormCtrl.form.reset(); obstacleDialog.dialog.setTitle(OBLabels.ADD_TITLE); obstacleDialog.taskGrid.render(); obstacleDialog.rdlgSelTasks = []; obstacleDialog.rdlgSelTaskCount = 1; obstacleDialog.hideField( obstacleDialog.ObstacleResol); obstacleDialog.hideField( obstacleDialog.statusCombo); obstacleDialog.taskObstacleDS.load({ params: { taskid: taskId, projectid: projectId, sprintid: sprintId } }); var cb = document.getElementById('obs-task-all-cb'); if (null != cb) { cb.checked = false; cb.disabled = false; } obstacleDialog.dialog.setHeight(460); obstacleDialog.dialog.show(el); }, editObstacle : function(projectId,sprintId, obstacleId, taskId,el, loadMask) { obstacleDialog.dlgEditMode = true; obstacleDialog.createDialog(); obstacleDialog.dialog.confirmHide = false; // load user combo data obstacleDialog.usersDS.load({ params:{ taskid: taskId, projectid: projectId, sprintid: sprintId } }); obstacleDialog.statusDS.load({ params:{ taskid: taskId, projectid: projectId, sprintid: sprintId } }); obstacleDialog.selectedProjectId = projectId; obstacleDialog.selectedSprintId = sprintId; obstacleDialog.selectedTaskId = taskId; obstacleDialog.selectedObstacleId = obstacleId; obstacleDialog.dlgFormCtrl.form.reset(); obstacleDialog.dialog.setTitle(OBLabels.EDIT_TITLE); obstacleDialog.taskGrid.render(); obstacleDialog.showField( obstacleDialog.statusCombo); obstacleDialog.dlgFormCtrl.form.reset(); var relUrl = 'pbv/PBVAsyncHandler?action=LOAD-OBSTACLE&obstacleid=' + obstacleId ; obstacleDialog.dlgFormCtrl.form.load({ url: relUrl, loadMask: {msg:'Loading Data...'}, success : obstacleDialog.loadTasksForEdit, failure : obstacleDialog.handleLoadFailure }); obstacleDialog.showField( obstacleDialog.ObstacleResol); var cb = document.getElementById('rel-task-all-cb'); if (null != cb) { cb.checked = false; cb.disabled = true; } obstacleDialog.dialog.setHeight(550); obstacleDialog.dialog.show(el); }, loadTasksForEdit : function( form, action) { // successfully loaded form information, so load and select tasks obstacleDialog.taskObstacleDS.reload({ params: { projectid: obstacleDialog.selectedProjectId, sprintid: obstacleDialog.selectedSprintId, obstacleid: obstacleDialog.selectedObstacleId } }); }, setTaskSelectionForEdit : function(ds, records, option) { // This is called as a listener after taskObstacleDS has been loaded. // It sets up rdlgSelTasks to remember the original tasks. obstacleDialog.rdlgSelTasks = []; var selcnt = 0; for(var i =0; i < records.length; i++) { var r = records[i]; var taskid = r.get('taskId'); var sel = r.get('sel'); if(sel) { obstacleDialog.rdlgSelTasks[taskid] = true; selcnt++; } } obstacleDialog.rdlgSelTaskCount = selcnt; // activate the 'select all' checkbox if (records.length > 0) { var cb = document.getElementById('rel-task-all-cb'); if (null != cb) { cb.disabled = false; } } }, handleLoadFailure : function( form, action) { // TODO: Better error handling in general. Ext.MessageBox.show({ title: OBLabels.ERROR_TITLE, msg: OBLabels.LOAD_ERROR, buttons: Ext.MessageBox.OK, icon: Ext.MessageBox.ERROR }); }, saveObstacle : function() { if(!obstacleDialog.dlgFormCtrl.form.isValid()) { ErrorHandlerLib.showErrorMsg(OBLabels.INVALID_ENTRIES); return; } if(!obstacleDialog.ObstacleSprintBlocker.getValue() && obstacleDialog.getSelectedTaskCount() <=0) { ErrorHandlerLib.showErrorMsg('$OBSTACLE_SAVE_ERROR'); return; } obstacleDialog.dialog.confirmHide = true; var selTasks = obstacleDialog.getSelectedTasks(); var selectedTasks = ''; var cnt = 0; for(var i = 0; i < selTasks.length; i++) { var taskid = selTasks[i].get('taskId'); // remove local from selected list. if(cnt > 0 ) selectedTasks += ','; selectedTasks = selectedTasks + selTasks[i].get('taskId'); cnt++; } obstacleDialog.dlgFormCtrl.form.submit({url:'pbv/PBVAsyncHandler', waitMsg : ' ', waitTitle : OBLabels.OBSTACLE_SAVE_WAIT, params:{action:'SAVE-OBSTACLE', tasks: selectedTasks, projectId: obstacleDialog.selectedProjectId , sprintId:obstacleDialog.selectedSprintId, status: obstacleDialog.statusCombo.getValue(), assignedto: obstacleDialog.usersCombo.getValue()}, settings: {show: true, title: OBLabels.ERROR_TITLE}, success:function(form, action) { obstacleDialog.dialog.hide(); teamboard.loadBoard(); if(obstacleDialog.saveSuccessHandlerFn) obstacleDialog.saveSuccessHandlerFn(); }, failure:function(form, action) { obstacleDialog.dialog.confirmHide = false; ErrorHandlerLib.onFormFailure(form, action); } }); } };