#parse("/focus/strings_stx.vm") var STLabels = { TAB_TITLE4 : '$ST_TAB_TITLE', PROJECT_COMBO : '$ST_PROJECT' } // ---------- STx table ---------- var storyTree = { viewPanel: null, // split view initialized : false, // tab initialization selProject : null, loadMask : null, bFoundChild: false, init: function() { Ext.QuickTips.init(); storyTree.createToolbar(); storyTree.createTreePanel(); storyTree.createContextMenu(); storyTree.viewPanel = new Ext.Panel({ layout:'border', items: [ storyTree.mainPanel ] }); storyTree.viewPort = new Ext.Viewport({ layout:'fit', items:[storyTree.viewPanel], renderTo: document.body }); storyTree.loadMask = new Ext.LoadMask(storyTree.mainPanel.getEl(), { msg:'$ST_SYNCING'}); storyTree.loadSettings(); }, // ---------- widget setup createToolbar : function() { var refreshButton = new Ext.Button({ text:'$ST_REFRESH', tooltip:'$ST_REFRESH_TITLE', iconCls:'refresh', handler : function() { storyTree.refreshTree(); } }); refreshButton.setDisabled(true); storyTree.refreshButton = refreshButton; var syncButton = new Ext.Button({ text:'$ST_SYNC', tooltip:'$ST_SYNC_TITLE', iconCls:'refresh', handler : function() { storyTree.syncTree(); } }); syncButton.setDisabled(true); storyTree.syncButton = syncButton; storyTree.projectComboRec = Ext.data.Record.create( [ { name:'id' }, { name:'name', sortType:'asUCString' } ]); // project toolbar combo ds storyTree.projectComboDS = new Ext.data.Store({ id : 0, proxy: new Ext.data.HttpProxy({url:'pbv/PBVAsyncHandler?action=PROJECTLIST'}), reader: new Ext.data.JsonReader({id:'id'}, storyTree.projectComboRec), sortInfo:{field: 'name', direction: "ASC"} }); storyTree.projectCombobox = new Ext.form.ComboBox({ id: 'storyTreeProjectCombo', tpl: '
{name}
', store : storyTree.projectComboDS, displayField :'name', valueField :'id', forceSelection : true, mode : 'local', emptyText :'$ST_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) { var projectId = combo.getValue(); document.location.href="../common/application/itimpact/loadpagestx.html?projectId=" + projectId; /*if(projectId != storyTree.selProject) { storyTree.loadTree(projectId); }*/ } var mainPanel = new Ext.Panel({ region: 'center', margins: '0 0 0 0', border: false, header: false, hideMode : 'offsets', frame : false, height: 1, autoScroll: true, tbar: [ new Ext.Toolbar.TextItem('' + STLabels.PROJECT_COMBO + ':') , new Ext.Toolbar.Spacer(), new Ext.Toolbar.Spacer(), storyTree.projectCombobox, '->', syncButton, refreshButton ] }); storyTree.mainPanel = mainPanel; }, createTreePanel : function() { var mainPanel = storyTree.mainPanel; var Tree = Ext.tree; var tree = new Tree.TreePanel({ renderTo: mainPanel.getEl(), autoScroll:true, animate:true, enableDD:false, containerScroll: true, bodyBorder: false, rootVisible:false, loader: new Tree.TreeLoader({dataUrl:'pbv/PBVAsyncHandler?action=LOAD-STORYTREE', listeners : { 'load' : function(loader,node,response) { var resp = eval("(" + response.responseText + ")"); var stat = resp.success; if((stat != undefined) && (stat == false)) { var msg = resp.data[0].msg; Ext.Msg.show({ title:'$SYNC_MSG_TITLE', msg: '' + msg +'', buttons: Ext.Msg.OK, fn: storyTree.refreshTree, icon: Ext.MessageBox.WARNING }); } } } }), listeners: {click : storyTree.nodeSelected} }); var sorter = new Ext.tree.TreeSorter(tree, { folderSort: true, dir: "asc", sortType: function(node) { // sort by a custom, typed attribute: return node.text; } }); // set the root node var root = new Tree.AsyncTreeNode({ text: 'Project', draggable:false, iconCls: 'reqroot-node', id:'source' }); root.on('load', function() {storyTree.loadMask.hide()}); tree.setRootNode(root); storyTree.tree = tree; mainPanel.add(tree); }, createContextMenu : function() { var contextMenu = new Ext.menu.Menu(); storyTree.contextMenu = contextMenu; // handler for context menu items function contextMenuHandler(item, e) { var node = storyTree.selectedNode; var el = null; switch (item.id) { case 'addChild': var parentId = node.id; storyTree.addChildStory(parentId, el); break; case 'editStory': var reqId = node.id; var parentId = node.parentNode.id; storyTree.editStory(reqId, parentId, false, el); break; case 'copyStory': var reqId = node.id; var parentId = node.parentNode.id; storyTree.editStory(reqId, parentId, true, el); break; } } storyTree.editStoryMenu = new Ext.menu.Item({ id: 'editStory', text: '$ST_EDIT_STORY', handler: contextMenuHandler }); storyTree.copyStoryMenu = new Ext.menu.Item({ id: 'copyStory', text: '$ST_COPY_STORY', handler: contextMenuHandler }); storyTree.addChildMenu = new Ext.menu.Item({ id: 'addChild', text: '$ST_ADD_CHILD', handler: contextMenuHandler }); contextMenu.add(storyTree.editStoryMenu); contextMenu.add('-'); contextMenu.add(storyTree.copyStoryMenu); contextMenu.add(storyTree.addChildMenu); storyTree.tree.addListener('contextmenu', storyTree.showContextMenu); }, showContextMenu : function(node, e) { node.select(); var coords = e.getXY(); var na = node.attributes; var disAddChild = (na.commit) || (na.tcount > 0); var disEdit = (node.id == 'source'); #if (!$canManageStories) //storyTree.editStoryMenu.setDisabled(true); storyTree.copyStoryMenu.setDisabled(true); storyTree.addChildMenu.setDisabled(true); #else storyTree.copyStoryMenu.setDisabled(false); storyTree.addChildMenu.setDisabled(false); #end storyTree.selectedNode = node; if(disAddChild) { storyTree.addChildMenu.hide(); } else { storyTree.addChildMenu.show(); } storyTree.editStoryMenu.setDisabled(disEdit); storyTree.contextMenu.showAt([coords[0], coords[1]]); }, // -------- Handle settings and selections loadSettings : function() { if(!storyTree.initialized) { storyTree.loadProjectList(); storyTree.initialized = true; } else { storyTree.loadUserSettingsProject(); } }, loadUserSettingsProject : function() { BxtUserSettings.load('$_FOCUS_STX_VIEW', '$_FOCUS_PROJECT_SELECTION', storyTree.setProjectSettingValue, null); }, loadProjectList : function() { storyTree.projectComboDS.load({waitinMsg:'$ST_LOADING', params:{start:0, limit: 30}, callback:storyTree.projectLoaded }); }, projectLoaded : function(projectId) { // Reload Story Tree // On switching, remember the story tree as before and expand the tree ? storyTree.loadUserSettingsProject(); }, setProjectSettingValue : function(response, options) { var r = Ext.decode(response.responseText); storyTree.setProjectValue(r.selection); }, setProjectValue : function(selection) { var ret = BxtUserSettings.setComboboxValue(storyTree.projectCombobox, selection); if( ret === BxtUserSettings.cbNEW) { storyTree.loadTree(selection); } storyTree.selProject = selection; storyTree.refreshButton.setDisabled(selection==null); #if (!$canManageStories) storyTree.syncButton.setDisabled(true); #else storyTree.syncButton.setDisabled(selection==null); #end }, nodeSelected : function(node, e) { }, // ---------- loading tree nodes refreshTree : function() { var projectId = storyTree.projectCombobox.getValue(); if(projectId != null) { storyTree.loadTree(projectId); } }, syncTree : function() { var projectId = storyTree.projectCombobox.getValue(); if(projectId != null) { var msg2 = '$ST_SYNC_WARN'; Ext.Msg.show({ title:'$ST_SYNC_WARN_TITLE', msg: '' + msg2 +'', buttons: Ext.Msg.OKCANCEL, fn: storyTree.onSyncBacklog, icon: Ext.MessageBox.QUESTION }); } }, onSyncBacklog : function(val) { if(val == 'ok'){ var tree = storyTree.tree; var projectId = storyTree.projectCombobox.getValue(); var id = projectId; var rec = storyTree.projectComboDS.getById(id); tree.getRootNode().setText(rec.get('name')); storyTree.selProject = projectId; storyTree.loadRoot(projectId,true); } }, loadTree : function(projectId) { var tree = storyTree.tree; var id = projectId; //storyTree.projectCombobox.getValue(); var rec = storyTree.projectComboDS.getById(id); tree.getRootNode().setText(rec.get('name')); storyTree.selProject = projectId; storyTree.refreshButton.setDisabled(projectId==null); storyTree.loadRoot(projectId,false); }, loadRoot : function(projectId,sync) { var tree = storyTree.tree; if(!sync) { tree.loader.dataUrl = 'ajax2/Gemini?action=focus.web.ajax.LoadSTxTreeAction&userid=$currentUserId&projectid='+projectId; storyTree.loadMask.msg = '$ST_LOADING'; } else { tree.loader.dataUrl = 'ajax2/Gemini?action=focus.web.ajax.LoadSTxTreeAction&sync=true&userid=$currentUserId&projectid='+projectId; storyTree.loadMask.msg = '$ST_SYNCING'; } storyTree.loadMask.show(); tree.root.reload(); }, refreshTreeNodes : function(form, action) { var newNodeTxt = action.response.responseText; var newNodeObj = Ext.util.JSON.decode(newNodeTxt); var newNode = newNodeObj.data[0]; var parentId = newNode.parentid; if(parentId == null) { parentId = 'source'; } var parentNode = storyTree.tree.getNodeById(parentId); if(parentNode != undefined) { if( parentNode.isExpanded()) { if(parentId == 'source') { storyTree.tree.root.reload(); } else { parentNode.reload(); } } else { parentNode.expand(); } } }, // ---------- child creation and edit addChildStory : function(parentStoryId, el) { storyTree.setupStoryDialog(parentStoryId); storyDialog.addNewRequirement(el, null); // loadmask set to null }, editStory : function(reqId, parentId, copy, el) { storyTree.setupStoryDialog(parentId); //alert(reqId + ',' + copy + ',' + storyDialog.projectId + ',' + storyDialog.parentStoryId + ',' + storyDialog.tabx); storyDialog.showRequirementDetails(reqId, copy, el, null); }, setupStoryDialog : function(parentStoryId) { storyDialog.resetDialog(); storyDialog.projectId = storyTree.projectCombobox.getValue(); storyDialog.parentStoryId = parentStoryId; storyDialog.tabx = 'stx'; storyDialog.saveSuccessHandlerFn = storyTree.refreshTreeNodes; }, // //WATIR support // /** * Finds the first child that has the attribute with the specified value. * Looks recursively down the tree to find the child. */ findChild : function(node, value) { var cs = node.childNodes; for(var i = 0, len = cs.length; i < len; i++) { if(cs[i].text == value){ return cs[i]; } var result = storyTree.findChild( cs[i],value); if(result !=null){ return result; } } return null; } , expandChildren : function(node) { var cs = node.childNodes; for(var i = 0, len = cs.length; i < len; i++) { cs[i].expand(true, false, function(thisNode) { storyTree.expandChildren(thisNode); }); } } , getChildStoryId: function(storyName) { var root = storyTree.tree.getRootNode(); var node = storyTree.findChild(root, storyName); if(node != null) { return node.id; } return ""; } }