#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, "GReleaseDialog", "greleasedialog.selectall"))) #set ($SAVE = $CommonFunctions.encodeJavaScriptString($CommonFunctions.getTermFromResourceBundle($currentUserId, "GReleaseDialog", "greleasedialog.save"))) #set ($CANCEL = $CommonFunctions.encodeJavaScriptString($CommonFunctions.getTermFromResourceBundle($currentUserId, "GReleaseDialog", "greleasedialog.cancel"))) #set ($NAME = $CommonFunctions.encodeJavaScriptString($CommonFunctions.getTermFromResourceBundle($currentUserId, "GReleaseDialog", "greleasedialog.name"))) #set ($TARGET_END_DATE = $CommonFunctions.encodeJavaScriptString($CommonFunctions.getTermFromResourceBundle($currentUserId, "GReleaseDialog", "greleasedialog.targetenddate"))) #set ($BLANK_ENTRY_ERROR = $CommonFunctions.encodeJavaScriptString($CommonFunctions.getTermFromResourceBundle($currentUserId, "GReleaseDialog", "greleasedialog.blankentryerror"))) #set ($XLINK_NAME_COL_TITLE = $CommonFunctions.encodeJavaScriptString($CommonFunctions.getTermFromResourceBundle($currentUserId, "GReleaseDialog", "greleasedialog.xlinknamecoltitle"))) #set ($XLINK_DEF_COL_TITLE = $CommonFunctions.encodeJavaScriptString($CommonFunctions.getTermFromResourceBundle($currentUserId, "GReleaseDialog", "greleasedialog.xlinkdefcoltitle"))) #set ($RELEASE_DLG_TITLE = $CommonFunctions.encodeJavaScriptString($CommonFunctions.getTermFromResourceBundle($currentUserId, "GReleaseDialog", "greleasedialog.releasedlgtitle"))) #set ($ADD_TITLE = $CommonFunctions.encodeJavaScriptString($CommonFunctions.getTermFromResourceBundle($currentUserId, "GReleaseDialog", "greleasedialog.addtitle"))) #set ($EDIT_TITLE = $CommonFunctions.encodeJavaScriptString($CommonFunctions.getTermFromResourceBundle($currentUserId, "GReleaseDialog", "greleasedialog.edittitle"))) #set ($DESCRIPTION = $CommonFunctions.encodeJavaScriptString($CommonFunctions.getTermFromResourceBundle($currentUserId, "GReleaseDialog", "greleasedialog.description"))) #set ($PLANNED_CAPACITY = $CommonFunctions.encodeJavaScriptString($CommonFunctions.getTermFromResourceBundle($currentUserId, "GReleaseDialog", "greleasedialog.plannedcapacity"))) #set ($CAPACITY_UNIT = $CommonFunctions.encodeJavaScriptString($CommonFunctions.getTermFromResourceBundle($currentUserId, "GReleaseDialog", "greleasedialog.capacityunit"))) #set ($LOAD_ERROR = $CommonFunctions.encodeJavaScriptString($CommonFunctions.getTermFromResourceBundle($currentUserId, "GReleaseDialog", "greleasedialog.loaderror"))) #set ($ERROR_TITLE = $CommonFunctions.encodeJavaScriptString($CommonFunctions.getTermFromResourceBundle($currentUserId, "GReleaseDialog", "greleasedialog.errortitle"))) #set ($RELEASE_SAVE_WAIT = $CommonFunctions.encodeJavaScriptString($CommonFunctions.getTermFromResourceBundle($currentUserId, "GReleaseDialog", "greleasedialog.releasesavewait"))) #set ($INVALID_TARGET_DATE = $CommonFunctions.encodeJavaScriptString($CommonFunctions.getTermFromResourceBundle($currentUserId, "GReleaseDialog", "greleasedialog.invalidtargetdate"))) #set ($INVALID_ENTRIES = $CommonFunctions.encodeJavaScriptString($CommonFunctions.getTermFromResourceBundle($currentUserId, "GReleaseDialog", "greleasedialog.invalidentries"))) #set ($TARGET_START_DATE = $CommonFunctions.encodeJavaScriptString($CommonFunctions.getTermFromResourceBundle($currentUserId, "GReleaseDialog", "greleasedialog.startdate"))) #set ($CAPACITY = $CommonFunctions.encodeJavaScriptString($CommonFunctions.getTermFromResourceBundle($currentUserId, "GReleaseDialog", "greleasedialog.capacity"))) #set ($UNIT = $CommonFunctions.encodeJavaScriptString($CommonFunctions.getTermFromResourceBundle($currentUserId, "GReleaseDialog", "greleasedialog.unit"))) #set ($NUMBER_OF_SPRINTS = $CommonFunctions.encodeJavaScriptString($CommonFunctions.getTermFromResourceBundle($currentUserId, "GReleaseDialog", "greleasedialog.numsprints"))) #set ($SPRINT_PREFIX = $CommonFunctions.encodeJavaScriptString($CommonFunctions.getTermFromResourceBundle($currentUserId, "GReleaseDialog", "greleasedialog.sprintprefix"))) #set ($ACTUAL_CAPACITY = $CommonFunctions.encodeJavaScriptString($CommonFunctions.getTermFromResourceBundle($currentUserId, "GReleaseDialog", "greleasedialog.actualcapaciy"))) #set ($CALCULATED = $CommonFunctions.encodeJavaScriptString($CommonFunctions.getTermFromResourceBundle($currentUserId, "GReleaseDialog", "greleasedialog.calculated"))) #set ($RESOURCES = $CommonFunctions.encodeJavaScriptString($CommonFunctions.getTermFromResourceBundle($currentUserId, "GReleaseDialog", "greleasedialog.resources"))) #set ($REPOSITORY_CONNECTION = $CommonFunctions.encodeJavaScriptString($CommonFunctions.getTermFromResourceBundle($currentUserId, "GReleaseDialog", "greleasedialog.repositoryconnection"))) #set ($CHOOSE = $CommonFunctions.encodeJavaScriptString($CommonFunctions.getTermFromResourceBundle($currentUserId, "GReleaseDialog", "greleasedialog.choose"))) #set ($GRID_PERSON = $CommonFunctions.encodeJavaScriptString($CommonFunctions.getTermFromResourceBundle($currentUserId, "GReleaseDialog", "greleasedialog.gridperson"))) #set ($GRID_ALLOCATION = $CommonFunctions.encodeJavaScriptString($CommonFunctions.getTermFromResourceBundle($currentUserId, "GReleaseDialog", "greleasedialog.gridallocation"))) #set ($REMOVE_RESOURCE = $CommonFunctions.encodeJavaScriptString($CommonFunctions.getTermFromResourceBundle($currentUserId, "GReleaseDialog", "greleasedialog.removeresource"))) #set ($SPRINT_DURATION = $CommonFunctions.encodeJavaScriptString($CommonFunctions.getTermFromResourceBundle($currentUserId, "GReleaseDialog", "greleasedialog.sprintduration"))) #set ($ENTER_USER = $CommonFunctions.encodeJavaScriptString($CommonFunctions.getTermFromResourceBundle($currentUserId, "GReleaseDialog", "greleasedialog.enteruser"))) #set ($ENTER_PLANNED = $CommonFunctions.encodeJavaScriptString($CommonFunctions.getTermFromResourceBundle($currentUserId, "GReleaseDialog", "greleasedialog.enterplanned"))) #set ($DAYS = $CommonFunctions.encodeJavaScriptString($CommonFunctions.getTermFromResourceBundle($currentUserId, "GReleaseDialog", "greleasedialog.days"))) #set ($WILL_CREATE = $CommonFunctions.encodeJavaScriptString($CommonFunctions.getTermFromResourceBundle($currentUserId, "GReleaseDialog", "greleasedialog.willcreate"))) #set ($AUTO_NAME_SPRINTS = $CommonFunctions.encodeJavaScriptString($CommonFunctions.getTermFromResourceBundle($currentUserId, "GReleaseDialog", "greleasedialog.autonamesprints"))) #set ($REMAINING_VALUE = $CommonFunctions.encodeJavaScriptString($CommonFunctions.getTermFromResourceBundle($currentUserId, "GReleaseDialog", "greleasedialog.remainingvalue"))) #set ($AUTO_CREATED = $CommonFunctions.encodeJavaScriptString($CommonFunctions.getTermFromResourceBundle($currentUserId, "GReleaseDialog", "greleasedialog.autocreated"))) #set ($NO_RESOURCE_MSG = $CommonFunctions.encodeJavaScriptString($CommonFunctions.getTermFromResourceBundle($currentUserId, "GReleaseDialog", "greleasedialog.noresourcemsg"))) #set ($NO_PLANNED_MSG = $CommonFunctions.encodeJavaScriptString($CommonFunctions.getTermFromResourceBundle($currentUserId, "GReleaseDialog", "greleasedialog.noplannedmsg"))) #set ($AUTO_CREATE_SPRINTS = $CommonFunctions.encodeJavaScriptString($CommonFunctions.getTermFromResourceBundle($currentUserId, "GReleaseDialog", "greleasedialog.autocreatesprints"))) #set ($AUTO_CREATE_SAVE = $CommonFunctions.encodeJavaScriptString($CommonFunctions.getTermFromResourceBundle($currentUserId, "GReleaseDialog", "greleasedialog.autocreatesave"))) #set ($DELIVERED_VALUE = $CommonFunctions.encodeJavaScriptString($CommonFunctions.getTermFromResourceBundle($currentUserId, "GReleaseDialog", "greleasedialog.deliveredcap"))) #set ($BAD_DATE_RANGE = $CommonFunctions.encodeJavaScriptString($CommonFunctions.getTermFromResourceBundle($currentUserId, "GReleaseDialog", "greleasedialog.baddaterange"))) #set ($MAX_AUTOSPRINTS = $CommonFunctions.encodeJavaScriptString($CommonFunctions.getTermFromResourceBundle($currentUserId, "GReleaseDialog", "greleasedialog.warn.maxautosprint"))) // ---------- release Dialog --------- var RDLabels = { SELECT_ALL: '$SELECT_ALL', SAVE: '$SAVE', CANCEL: '$CANCEL', NAME: '$NAME', TARGET_END_DATE: '$TARGET_END_DATE', BLANK_ENTRY_ERROR: '$BLANK_ENTRY_ERROR', XLINK_NAME_COL_TITLE: '$XLINK_NAME_COL_TITLE', XLINK_DEF_COL_TITLE: '$XLINK_DEF_COL_TITLE', RELEASE_DLG_TITLE: '$RELEASE_DLG_TITLE', ADD_TITLE: '$ADD_TITLE', EDIT_TITLE: '$EDIT_TITLE', DESCRIPTION: '$DESCRIPTION', PLANNED_CAPACITY: '$PLANNED_CAPACITY', CAPACITY_UNIT: '$CAPACITY_UNIT', LOAD_ERROR: '$LOAD_ERROR', ERROR_TITLE: '$ERROR_TITLE', RELEASE_SAVE_WAIT: '$RELEASE_SAVE_WAIT', INVALID_TARGET_DATE: '$INVALID_TARGET_DATE', INVALID_ENTRIES: '$INVALID_ENTRIES', TARGET_START_DATE: '$TARGET_START_DATE', CAPACITY: '$CAPACITY', UNIT: '$UNIT', NUMBER_OF_SPRINTS: '$NUMBER_OF_SPRINTS', SPRINT_PREFIX: '$SPRINT_PREFIX', ACTUAL_CAPACITY: '$ACTUAL_CAPACITY', CALCULATED: '$CALCULATED', RESOURCES: '$RESOURCES', REPOSITORY_CONNECTION: '$REPOSITORY_CONNECTION', CHOOSE: '$CHOOSE', GRID_PERSON: '$GRID_PERSON', GRID_ALLOCATION: '$GRID_ALLOCATION', REMOVE_RESOURCE: '$REMOVE_RESOURCE', REMOVE_RESOURCE_TT: '$REMOVE_RESOURCE', SPRINT_DURATION: '$SPRINT_DURATION', ENTER_USER: '<$ENTER_USER>', ENTER_PLANNED: '<$ENTER_PLANNED>', DAYS: '$DAYS', WILL_CREATE: '$WILL_CREATE', AUTO_NAME_SPRINTS: '$AUTO_NAME_SPRINTS', REMAINING_VALUE: '$REMAINING_VALUE', NO_RESOURCE_MSG: '$NO_RESOURCE_MSG', NO_PLANNED_MSG: '$NO_PLANNED_MSG', AUTO_CREATE_SPRINTS: '$AUTO_CREATE_SPRINTS', AUTO_CREATE_SAVE: '$AUTO_CREATE_SAVE', AUTO_CREATED: '$AUTO_CREATED', DELIVERED_VALUE: '$DELIVERED_VALUE', BAD_DATE_RANGE: '$BAD_DATE_RANGE' }; var RDFieldId = { RELEASEID: 'releaseId', NAME: 'name', DESCRIPTION: 'desc', START_DATE: 'startdate', END_DATE: 'targetdate', CAPACITY: 'capacity', UNIT: 'unit', SPRINT_PREFIX: 'sprintprefix', SPRINT_DURATION: 'sprintduration', PLANNED_CAPACITY: 'plancap', CREATE_SPRINT_CB: 'createSprintCB' }; var releaseDialog = { selectedProjectId: null, selectedReleaseId: null, xlinkGrid: null, xlinkDS: null, usersDS: null, userArray: null, totalDaysInt: 0, totalSprintsInt: 0, hasCreatedSprints: false, maxAutoSprints: parseInt('$maxAutoSprints'), totalSprints : 0, init : function() { releaseDialog.releaseIdField = new Ext.form.Hidden({ id: 'releaseDlgId', name: 'releaseId' }); // title releaseDialog.dlgRelTitle = new Ext.form.TextField({ autoCreate: {tag: "input", type: "text", id: "releaseDlgName"}, fieldLabel: RDLabels.NAME, name: 'name', anchor:'96%', allowBlank: false, maxLength: 36, validator : function(v) { if(v!= null && v.trim() == '') { return RDLabels.BLANK_ENTRY_ERROR; } return true; } }); releaseDialog.description = new Ext.form.TextArea({ autoCreate: {tag: "textarea", id: "releaseDlgDesc"}, fieldLabel: RDLabels.DESCRIPTION, name: 'desc', anchor: '96%', height: 92, maxLength : 2000 }); releaseDialog.startDate = new Ext.form.DateField({ autoCreate: {tag: "input", type: "text", id: "releaseDlgStartDate"}, fieldLabel: RDLabels.TARGET_START_DATE, name: 'startdate', anchor:'91%', format: '$LocaleDateFormat', listeners: { change: function(field, newVal, oldVal) { if (newVal != oldVal) { releaseDialog.updateTotalDays(); releaseDialog.updateTotalSprints(); } } } }); releaseDialog.targetDate = new Ext.form.DateField({ autoCreate: {tag: "input", type: "text", id: "releaseDlgDate"}, fieldLabel: RDLabels.TARGET_END_DATE, name: 'targetdate', anchor:'98%', format: '$LocaleDateFormat', listeners: { change: function(field, newVal, oldVal) { if (newVal != oldVal) { releaseDialog.updateTotalDays(); releaseDialog.updateTotalSprints(); } } } }); releaseDialog.unit = new Ext.form.TextField({ autoCreate: {tag: "input", type: "text", id: "releaseDlgCapUnit"}, fieldLabel: RDLabels.UNIT, name: 'unit', anchor:'85%', maxLength : 20 }); releaseDialog.plannedcapacity = new Ext.form.NumberField({ autoCreate: { tag: "input", type: "text", size: "20", maxlength: 4, id: "releaseDlgPlanned" }, fieldLabel: RDLabels.PLANNED_CAPACITY, allowDecimals: false, allowBlank: true, allowNegative: false, name: 'plancap', anchor:'98%', maxValue: 9999 }); releaseDialog.sprintduration = new Ext.form.NumberField({ autoCreate: { tag: "input", type: "text", size: "20", maxlength: 3, id: "releaseDlgSprintDuration" }, fieldLabel: RDLabels.SPRINT_DURATION, allowDecimals: false, allowBlank: true, allowNegative: false, name: 'sprintduration', anchor:'98%', maxValue: 9999, listeners: { change: function(field, newVal, oldVal) { if (newVal != oldVal) { releaseDialog.updateTotalSprints(); } } } }); releaseDialog.sprintprefix = new Ext.form.TextField({ autoCreate: {tag: "input", type: "text", id: "releaseDlgSprintPrefix"}, fieldLabel: RDLabels.SPRINT_PREFIX, name: 'sprintprefix', anchor:'98%', maxLength : 36 }); releaseDialog.totalSprintsComp = new Ext.HTMLComponent({ region:'north', html:'' + RDLabels.DAYS + '' + '' + '' }); releaseDialog.totalDaysComp = new Ext.HTMLComponent({ region:'north', html:'' + '' + releaseDialog.totalDaysInt + '' + ' ' + RDLabels.DAYS + '' }); releaseDialog.createSprintsCB = new Ext.form.Checkbox({ autoCreate: { tag: "input", type: "checkbox", id: "releaseCreateSprintsCB" }, name: 'createSprintCB' }); releaseDialog.createUsersDS(); releaseDialog.createResourceGrid(); releaseDialog.planningFS = new Ext.form.FieldSet({ title: RDLabels.AUTO_CREATE_SPRINTS, id: 'autoCreateSprints', autoHeight:true, defaults: {width: 425}, collapsible: true, items :[ { layout: 'column', height: 55, cls: 'sprintFieldSet', items: [ { columnWidth:.5, layout: 'form', labelWidth: 120, items: [ releaseDialog.sprintduration, releaseDialog.sprintprefix ] }, { columnWidth:.5, layout: 'form', labelWidth: 60, items: [ releaseDialog.totalSprintsComp, new Ext.HTMLComponent({ region:'north', html:'
' + RDLabels.AUTO_NAME_SPRINTS + '' }) ] } ] }, { layout: 'column', height: 135, cls: 'fsGridColumn', items: [ { columnWidth:.26, layout: 'form', labelWidth: 150, items: [ new Ext.HTMLComponent({ region:'north', html:'' + RDLabels.RESOURCES + ':' }) ] }, { columnWidth:.74, layout: 'form', labelWidth: 0, cls: 'gridFormColumn', items: [ releaseDialog.gridpanel, { layout: 'column', height: 25, cls: 'checkboxSet', items: [ releaseDialog.createSprintsCB, new Ext.HTMLComponent({ region:'north', html:'
' }) ] } ] } ] } ] }); releaseDialog.planningFS.on('collapse', function(panel) { releaseDialog.dialog.setHeight(318); }); releaseDialog.planningFS.on('expand', function(panel) { releaseDialog.dialog.setHeight(520); }); // form control releaseDialog.dlgFormCtrl = new Ext.FormPanel({ buttonAlign: 'right', labelAlign: 'right', labelWidth: 100, frame:true, width: 450, cls: 'releaseDialogForm', reader: new Ext.data.JsonReader({}, releaseDialog.dlgFormRec), items: [{ layout: 'form', items: [ releaseDialog.releaseIdField, releaseDialog.dlgRelTitle, releaseDialog.description, { layout: 'column', height: 25, cls: 'dateFieldSet', items: [ { columnWidth:.5, layout: 'form', labelWidth: 100, items: [ releaseDialog.startDate ] }, { columnWidth:.37, layout: 'form', labelWidth: 68, items: [ releaseDialog.targetDate ] }, { columnWidth:.13, layout: 'form', labelWidth: 0, items: [ releaseDialog.totalDaysComp ] } ] }, releaseDialog.planningFS, { layout: 'column', height: 50, cls: 'capacityFieldSet', items: [ { columnWidth:.5, layout: 'form', labelWidth: 125, items: [ releaseDialog.plannedcapacity, { layout: 'column', height: 25, cls: 'deliveredCapSet', items: [ new Ext.HTMLComponent({ region:'north', html:'
' + RDLabels.DELIVERED_VALUE + ':
' }), new Ext.HTMLComponent({ region:'north', html:'
<' + RDLabels.CALCULATED + '>
' }) ] } ] }, { columnWidth:.5, layout: 'form', labelWidth: 93, items: [ releaseDialog.unit, { layout: 'column', height: 25, cls: 'remainingCapSet', items: [ new Ext.HTMLComponent({ region:'north', html:'
' + RDLabels.REMAINING_VALUE + ':
' }), new Ext.HTMLComponent({ region:'north', html:'
<' + RDLabels.CALCULATED + '>
' }) ] } ] } ] } ] }], buttons: [{ id: 'releaseDlgSaveButton', text: RDLabels.SAVE, handler: function(){ releaseDialog.preSaveHandler(); } }, { id: 'releaseDlgCancelButton', text: RDLabels.CANCEL, handler: function() { releaseDialog.totalSprints = 0; releaseDialog.dialog.hide(); } }] }); // form dialog if(!releaseDialog.dialog){ releaseDialog.dialog = new Bxt.BMSWindow({ id: 'reldlg-win', layout:'fit', y:10, width:475, height:420, closeAction:'hide', plain: true, items: releaseDialog.dlgFormCtrl, modal: true, resizable : false, closable: true, renderTo: document.body, saveFunc: releaseDialog.preSaveHandler, formCtrl: releaseDialog.dlgFormCtrl }); }; // Intercept backspace key on dialog var keymap = new Ext.KeyMap('reldlg-win', { key: Ext.EventObject.BACKSPACE, fn: BxtUtil.handleBACKSPACEKey }); releaseDialog.dialog.on('show', function(){ releaseDialog.dlgRelTitle.getEl().dom.focus(); }, null, {delay: 100}); }, // Create release resource grid editor createResourceGrid : function() { // create resource record definition releaseDialog.resourceRec = Ext.data.Record.create( [ {name: 'resourceid'}, {name: 'user'}, {name: 'planned', type: 'float'} ]); // create the data store releaseDialog.resourceDS = new Ext.data.Store({ id : 0, reader: new Ext.data.JsonReader({ totalProperty: 'resourceCount', root: 'resources' }, releaseDialog.resourceRec), sortInfo:{field: 'user', direction: "ASC"} }); // create editors for each column var editors = []; editors[0] = new Ext.form.ComboBox ({ name: 'name', store: releaseDialog.usersDS, displayField: 'name', valueField: 'id', value: '', emptyText: RDLabels.CHOOSE, selectOnFocus: true, forceSelection : true, listClass: 'x-combo-list-small', mode: 'local', allowBlank: true, triggerAction: 'all', typeAhead: true, listeners: { select: releaseDialog.onUserComboSelect, focus: releaseDialog.onUserComboFocus } }); editors[1] = new Ext.form.NumberField({ autoCreate: { tag: "input", type: "text", maxlength: 3 }, selectOnFocus: true, maxLength: 3, maxValue: 100 }); releaseDialog.editors = editors; releaseDialog.gridpanel = new Ext.grid.EditorGridPanel({ store: releaseDialog.resourceDS, columns: [ {id:'user',header: RDLabels.GRID_PERSON, width: 180, sortable: false, resizable: false, dataIndex: 'user' ,editor: editors[0] ,renderer: function(v,p) { var result = RDLabels.ENTER_USER; for (var i = 0;i < releaseDialog.userArray.length;i++) { if (v == releaseDialog.userArray[i].id) { result = releaseDialog.userArray[i].name; break; } } return result; } }, {header: RDLabels.GRID_ALLOCATION, width: 94, sortable: false, resizable: false, dataIndex: 'planned',editor: editors[1], renderer: function(value, p, record, rowindex, colindex, store) { var result = value; if (null == value || '' == value || undefined == value) { p.attr = 'style="text-align:left;vertical-align:middle;"'; result = RDLabels.ENTER_PLANNED; } else { p.attr = 'style="text-align:right;vertical-align:middle;"'; result = value + "%"; } return result; }, summaryType: 'sum' }, {header: '', width: 24, sortable: false, resizable: false, dataIndex: 'removable', renderer: function renderBtn(val, p, record) { if ('' != record.get('user') || '' != record.get('planned')) { var contentId = Ext.id(); createGridButton.defer(1, this, [val, contentId, record]); return ('
'); } return ''; } } ], cls: 'resourceGrid', enableColumnMove: false, clicksToEdit: 1, stripeRows: false, border: true, bodyBorder: true, height:115, width:303, layout: 'fit', maskDisabled: false, sm : new Ext.grid.RowSelectionModel(), listeners: { afteredit: releaseDialog.afterResourceEdit, beforeedit: releaseDialog.beforeResourceEdit } }); function createGridButton(value, contentid, record) { new Ext.Button({iconCls: 'remove', handler: function(btn, e) { if (!releaseDialog.hasCreatedSprints) { if ('' != record.get('user') || '' != record.get('planned')) { releaseDialog.resourceDS.remove(record); releaseDialog.filterUsers(); } } }, tooltip: RDLabels.REMOVE_RESOURCE_TT }).render(document.body, contentid); } }, //******************************* // resource grid event handlers //******************************* onUserComboFocus : function(combo) { var selectedUserId = combo.getValue(); releaseDialog.filterUsers(selectedUserId); combo.setValue(selectedUserId); }, onUserComboSelect : function(combo, record, index) { releaseDialog.gridpanel.stopEditing(); }, filterUsers : function(selectedUserId) { releaseDialog.usersDS.filterBy(function(record, id) { var result = true; var ds = releaseDialog.resourceDS; var userId = record.get('id'); if(userId == selectedUserId) { return true; } for (var i = 0;i < ds.getCount();i++) { var resource = ds.getAt(i); if (userId == resource.get('user')) { result = false; break; } } return result; }); }, afterResourceEdit : function(e) { // check for an existing new resource entry row var ds = e.grid.getStore(); var hasEntryRow = false; for (var i = 0;i < ds.getCount();i++) { var resource = ds.getAt(i); if ('' == resource.get('user') && '' == resource.get('planned')) { hasEntryRow = true; break; } } if (!hasEntryRow) releaseDialog.insertNewResourceRow(); }, beforeResourceEdit : function(e) { return (!releaseDialog.hasCreatedSprints); }, insertNewResourceRow : function() { var resource = new releaseDialog.resourceRec({ resourceid: '', user: '', planned: '' }); releaseDialog.gridpanel.getStore().add(resource); }, //****************************** // end //****************************** createUsersDS : function() { releaseDialog.userRec = Ext.data.Record.create( [ { name:'id' }, { name:'name', sortType:'asUCString' } ]); releaseDialog.usersDS = new Ext.data.Store({ id : 0, reader: new Ext.data.JsonReader({ totalProperty: 'userCount', root: 'users' }, releaseDialog.userRec), sortInfo:{field: 'name', direction: "ASC"} }); releaseDialog.usersDS.on('load', function() { releaseDialog.userArray = new Array(); var ds = releaseDialog.usersDS; for (var i = 0;i < ds.getCount();i++) { var user = ds.getAt(i); releaseDialog.userArray[i] = { 'id' : user.get('id'), 'name' : user.get('name') }; } }); }, dateValidator : function() { var tdate = releaseDialog.targetDate.getValue(); var nowdate = new Date().clearTime(); return !tdate || (tdate.getTime() >= nowdate.getTime()); }, //************************************ // load form functions //************************************ // ---------- Add Release ---------- addNewRelease : function(el) { releaseDialog.dialog.confirmHide = false; releaseDialog.selectedProjectId = sprintplanning.projectCombobox.getValue(); releaseDialog.resourceDS.removeAll(); releaseDialog.totalDaysInt = 365; releaseDialog.totalSprintsInt = 100; releaseDialog.dlgFormCtrl.form.reset(); // load data releaseDialog.dialog.setTitle(RDLabels.ADD_TITLE); BxtLoadUtil.loadWidget( 'pbv/PBVAsyncHandler?action=LOAD-RELEASE', { projectid: releaseDialog.selectedProjectId, releaseid: null, isNew: true }, { el: el, isNew: true }, null, //loadMask is casing scrolling issues, so use progress bar releaseDialog.loadDlgCallback, true //showProgress ); }, editRelease : function(releaseId, el) { releaseDialog.dialog.confirmHide = false; releaseDialog.selectedProjectId = sprintplanning.projectCombobox.getValue(); releaseDialog.selectedReleaseId = releaseId; releaseDialog.resourceDS.removeAll(); releaseDialog.totalDaysInt = 0; releaseDialog.totalSprintsInt = 0; releaseDialog.dlgFormCtrl.form.reset(); // load data releaseDialog.dialog.setTitle(RDLabels.EDIT_TITLE); BxtLoadUtil.loadWidget( 'pbv/PBVAsyncHandler?action=LOAD-RELEASE', { projectid: releaseDialog.selectedProjectId, releaseid: releaseDialog.selectedReleaseId, isNew: false }, { el: el, isNew: false }, null, //loadMask is casing scrolling issues, so use progress bar releaseDialog.loadDlgCallback, true //showProgress ); }, loadDlgCallback : function(formJSON, action) { //********************* // Load Data Stores //********************* // load user combo data releaseDialog.usersDS.loadData(formJSON); // load resource grid data if (formJSON.resourceCount > 0) { releaseDialog.resourceDS.loadData(formJSON); } releaseDialog.insertNewResourceRow(); //********************* // Set Field Values //********************* releaseDialog.loadDlgComponents(formJSON.fields, false); releaseDialog.updateTotalDays(); releaseDialog.updateTotalSprints(); if (action.settings.isNew) { releaseDialog.planningFS.collapse(); } else { releaseDialog.planningFS.expand(); } releaseDialog.dialog.show(action.settings.el); releaseDialog.checkMaxAutoSprints(); }, loadDlgComponents : function(fields,reload) { //********************* // Set Field Values //********************* if (fields) { for (var i = 0; i < fields.length; i++) { // get form component var fieldId = fields[i].fieldId; var cmp = releaseDialog.getComponent(fieldId); if(cmp) { //localize blank text cmp.blankText = '$BLANK_ENTRY_ERROR'; // st field validation if (null != fields[i].required) { cmp.allowBlank = !fields[i].required; } if (null != fields[i].maxLength && -1 != fields[i].maxLength) { cmp.maxLength = fields[i].maxLength; } else { cmp.maxLength = undefined; } // set component value if (!reload) { if(null != fields[i].value) { if (RDFieldId.CREATE_SPRINT_CB == fields[i].fieldId) { var flag = ("true" == fields[i].value) ? true : false; if (flag) { // Disable fields because sprints have been generated releaseDialog.updateCheckboxLabel(true); cmp.setVisible(false); var sprintIcon = document.getElementById('numSprintsIcon'); if (sprintIcon) { sprintIcon.style.display = 'none'; } var sprints = document.getElementById('NumSprintsRel'); if (sprints) { sprints.style.display = 'none'; } releaseDialog.sprintduration.setDisabled(true); releaseDialog.sprintprefix.setDisabled(true); releaseDialog.gridpanel.setDisabled(true); } else { // Enable fields because sprints have not been generated releaseDialog.updateCheckboxLabel(false); cmp.setVisible(true); var sprintIcon = document.getElementById('numSprintsIcon'); if (sprintIcon) { sprintIcon.style.display = 'inline'; } var sprints = document.getElementById('NumSprintsRel'); if (sprints) { sprints.style.display = 'inline'; } releaseDialog.sprintduration.setDisabled(false); releaseDialog.sprintprefix.setDisabled(false); releaseDialog.gridpanel.setDisabled(false); } releaseDialog.hasCreatedSprints = flag; cmp.setValue(flag); } else if (RDFieldId.NAME == fields[i].fieldId || RDFieldId.DESCRIPTION == fields[i].fieldId) { cmp.setValue(g_encoder.unescapeBT(fields[i].value)); } else if (RDFieldId.SPRINT_DURATION == fields[i].fieldId ) { var val = fields[i].value; cmp.setValue( isNaN(val) ? '': val); } else { cmp.setValue(fields[i].value); } } } } } } }, getComponent: function(fieldId) { if(fieldId == RDFieldId.RELEASEID){ return releaseDialog.releaseIdField; } else if(fieldId == RDFieldId.NAME){ return releaseDialog.dlgRelTitle; } else if(fieldId == RDFieldId.DESCRIPTION){ return releaseDialog.description; } else if(fieldId == RDFieldId.START_DATE){ return releaseDialog.startDate; } else if(fieldId == RDFieldId.END_DATE){ return releaseDialog.targetDate; } else if(fieldId == RDFieldId.UNIT){ return releaseDialog.unit; } else if(fieldId == RDFieldId.SPRINT_DURATION){ return releaseDialog.sprintduration; } else if(fieldId == RDFieldId.SPRINT_PREFIX){ return releaseDialog.sprintprefix; } else if(fieldId == RDFieldId.PLANNED_CAPACITY){ return releaseDialog.plannedcapacity; } else if(fieldId == RDFieldId.CREATE_SPRINT_CB){ return releaseDialog.createSprintsCB; } }, //******************************* // end load form functions //******************************* handleLoadFailure : function( form, action) { // TODO: Better error handling in general. Ext.MessageBox.show({ title: RDLabels.ERROR_TITLE, msg: RDLabels.LOAD_ERROR, buttons: Ext.MessageBox.OK, icon: Ext.MessageBox.ERROR }); }, preSaveHandler : function() { if(!releaseDialog.dlgFormCtrl.form.isValid()) { BxtUtil.showErrorMsg(RDLabels.INVALID_ENTRIES); return; } releaseDialog.dialog.confirmHide = true; // build JSON object to hold resources var resources = []; var ds = releaseDialog.resourceDS; ds.commitChanges(); setTimeout("true", 5000); var count = ds.getCount(); for (var i = 0;i < count;i++) { var resource = ds.getAt(i); var usr = resource.get('user'); var planned = resource.get('planned'); if ((usr === null || usr === '') && (planned !== null && planned !== '')) { BxtUtil.showErrorMsg(RDLabels.NO_RESOURCE_MSG); return; } if ((planned === null || planned === '') && (usr !== null && usr !== '')) { BxtUtil.showErrorMsg(RDLabels.NO_PLANNED_MSG); return; } if ((usr !== null && usr !== '') && (planned !== null && planned !== '')) { resources[i] = { 'resourceid': resource.get('resourceid'), 'user': resource.get('user'), 'planned': resource.get('planned') }; } else { ds.remove(resource); } } // validate date range if (!releaseDialog.validateDateRange()) { return; } releaseDialog.saveRelease(resources); }, saveRelease : function(resources) { // escape name and description values var esc_name = g_encoder.escapeBT(releaseDialog.dlgRelTitle.getValue()); var esc_desc = g_encoder.escapeBT(releaseDialog.description.getValue()); releaseDialog.dlgFormCtrl.form.submit({url:'pbv/PBVAsyncHandler', waitMsg : ' ', waitTitle : RDLabels.RELEASE_SAVE_WAIT, params:{ action:'SAVE-RELEASE', projectid: sprintplanning.projectCombobox.getValue(), resources: Ext.util.JSON.encode(resources), isAutoCreated: releaseDialog.createSprintsCB.getValue(), sprintduration: releaseDialog.sprintduration.getValue(), name: esc_name, desc: esc_desc, releaseId: releaseDialog.releaseIdField.getValue() }, settings: {show: true, title: RDLabels.ERROR_TITLE}, success:function(form, action) { releaseDialog.dialog.hide(); releaseDialog.totalSprints = 0; sprintplanningrhs.loadReleaseList(); if(action.result.data[3].reloadsprint == true) { sprintplanningrhs.refreshSprint(); } }, failure:function(form, action) { releaseDialog.dialog.confirmHide = false; ErrorHandlerLib.onFormFailure(form, action); } }); }, updateTotalSprints : function() { if (!releaseDialog.hasCreatedSprints) { var totalSprints = 0; var duration = releaseDialog.sprintduration.getValue(); var totalDays = releaseDialog.totalDaysInt; if ('' !== duration && 0 !== duration) { if (1 === duration) { totalSprints = totalDays; } else if (duration <= totalDays) { // var temp = parseInt(totalDays - duration); // totalSprints = parseInt(temp / (duration-1)) + 1; totalSprints = parseInt(totalDays/duration); } releaseDialog.totalSprints = totalSprints; releaseDialog.checkMaxAutoSprints(); } var str = RDLabels.WILL_CREATE; str = str.replace(/\{0\}/, "" + totalSprints) var sprints = document.getElementById('NumSprintsRel'); if (sprints) { sprints.innerHTML = str; } } }, updateTotalDays : function() { var msPERDAY = 1000 * 60 * 60 * 24; var start = releaseDialog.startDate.getValue(); var target = releaseDialog.targetDate.getValue(); if (start && target && releaseDialog.validateDateRange()) { var diff = start.getElapsed(target); releaseDialog.totalDaysInt = parseInt(diff / msPERDAY) + 1; } else { releaseDialog.totalDaysInt = 0; } var days = document.getElementById('NumDaysRel'); if (days) { days.innerHTML = '' + releaseDialog.totalDaysInt + ''; } }, updateCheckboxLabel : function(enabled) { var str = '
' + RDLabels.AUTO_CREATE_SAVE + '
'; if (enabled) { str = '' + '
' + RDLabels.AUTO_CREATED + '
'; } var cbLabel = document.getElementById('cbLabel'); if (cbLabel) { cbLabel.innerHTML = str; } }, validateDateRange : function() { var startVal = releaseDialog.startDate.getValue(); var endVal = releaseDialog.targetDate.getValue(); if (startVal && endVal) { if (startVal.getTime() > endVal.getTime()) { BxtUtil.showErrorMsg(RDLabels.BAD_DATE_RANGE); return false; } } return true; }, checkMaxAutoSprints : function() { var totalSprints = releaseDialog.totalSprints; var max = releaseDialog.maxAutoSprints; if(totalSprints > max) { var emsg = '$MAX_AUTOSPRINTS'; emsg = String.format(emsg, ''+totalSprints, ''+max); BxtUtil.showWarningMsg(emsg); var sprints = document.getElementById('NumSprintsRel'); sprints.style.color='red'; return true; } var sprints = document.getElementById('NumSprintsRel'); sprints.style.color='blue'; return false; }, //************************ // watir script functions //************************ addAgileReleaseResource : function(person, allocation) { var resource = new releaseDialog.resourceRec({ resourceid: '', user: person, planned: allocation }); releaseDialog.gridpanel.getStore().insert( releaseDialog.gridpanel.getStore().getCount()-1, [resource]); } };