Javascript 集合:团队状态信息未获取所有需要的信息

Javascript 集合:团队状态信息未获取所有需要的信息,javascript,rally,Javascript,Rally,我一直在尝试获取一些信息,例如用户名、显示名、角色和容量,具体取决于迭代。查询返回指定项目的部分结果,但不是所选迭代的全部结果。我不确定这是什么原因造成的。你可以在下面找到我的作品 function iterationSelected(dropdown, eventArgs) { console.log("Iteration Selected Callback"); if(table != null){ table.destroy(); }

我一直在尝试获取一些信息,例如用户名、显示名、角色和容量,具体取决于迭代。查询返回指定项目的部分结果,但不是所选迭代的全部结果。我不确定这是什么原因造成的。你可以在下面找到我的作品

function iterationSelected(dropdown, eventArgs) {

     console.log("Iteration Selected Callback");
     if(table != null){
        table.destroy();
     }


    var queryByUser = {
        key: "teamDataByUser", type: "User", 
        fetch: 'DisplayName,UserName',
        query: '(ObjectID > 0)'
    };
    rallyDataSource.findAll(queryByUser, queryTeamInformation);


}

function queryTeamInformation(results){
    console.log(results.teamDataByUser.length);
    for(var i=0;i<results.teamDataByUser.length;i++){
        console.log(results.teamDataByUser[i].UserName + " " + results.teamDataByUser[i].DisplayName);
    }


    console.log(iterationDropdown.getSelectedName());
    var queryByUserName = {
        key: "teamData", type: "UserIterationCapacity", 
        project: null,
        fetch: "Capacity,User,Role,EmailAddress,DisplayName,UserName",
        query: '((Iteration.Name = ' + '"' + iterationDropdown.getSelectedName() + '") AND (Project = /project/5564891653))'
    };
    rallyDataSource.findAll(queryByUserName, processResults);
    console.log("GH");

}

function processResults(results){
    rally.forEach(results.teamData, 
    function(teamData) {
        console.log(teamData._ref);

    });
    console.log(results.teamData.length);


        var tableDiv = document.getElementById('table');
        var config = { columns: 
             [{key: 'emailaddress', header: 'Team Member Email', width: 200}, 
             {key: 'displayname', header: 'Display name'},
             {key: 'username', header: 'User name'},
             {key: 'role', header: 'Role'},
             {key: 'cap', header: 'Capacity'}] };

        if(table != null){
            console.log("Got here");
            table.destroy();
        }
        table = new rally.sdk.ui.Table(config);
        for(var i=0;i<results.teamData.length;i++){

            var rowInfo = {'emailaddress': results.teamData[i].User.DisplayName, 'displayname': results.teamData[i].User.UserName, 'username': results.teamData[i].User.EmailAddress, 'role' : results.teamData[i].User.Role, 'cap' : results.teamData[i].Capacity}; 
            table.addRow(rowInfo);
        }



        table.display(tableDiv);


}



//========================================================================================================================
/*
 * Initializes all the page elements
 */
function initPage() {

    rallyDataSource = new rally.sdk.data.RallyDataSource('5410787910', '5948174836', 'false', 'true'); 

    var config = { label : "Select an iteration " };
    iterationDropdown = new rally.sdk.ui.IterationDropdown(config, rallyDataSource);
    iterationDropdown.display("aDiv", iterationSelected);
}
 rally.addOnLoad(initPage);
函数迭代选择(下拉列表,eventArgs){
log(“迭代选择的回调”);
如果(表!=null){
表1.destroy();
}
变量queryByUser={
键:“teamDataByUser”,类型:“用户”,
获取:“显示名称,用户名”,
查询:'(ObjectID>0)'
};
findAll(queryByUser,querytaminformation);
}
函数查询信息(结果){
log(results.teamDataByUser.length);

for(var i=0;iOk-我已经编写了一个示例,我认为该示例说明了获得想要的结果所需的步骤。它通过在queryConfig数组中执行两个查询来实现这一点:一个用于用户,另一个用于用户迭代容量,用于感兴趣的迭代。然后,在processResults函数中,代码构造了三个哈希:

  • teamMembersByTeamName
    :每个项目的团队成员字符串,哈希键:团队/项目名称
  • myTeamList
    :包含用户(第一)查询中的用户数据,为感兴趣的团队选择,hashkey:UserName
  • userIterationCapacityByUser
    :包含来自第二次查询的UserIterationCapacity数据,哈希键:UserName
最后,代码按用户名进行交叉遍历,以重新构建所有团队成员的容量数据,即使他们没有为感兴趣的冲刺定义容量。如果是这种情况,容量显示为“N/a”

您需要自定义
工作空间体
projectOID
myTeamSlashProjectName
变量,以便在您的环境中使用。您可能需要自定义和调整-这只是一个粗略的代码示例。但希望足以说明这个概念

    <!-- Copyright (c) 2012 Rally Software Development Corp. All rights reserved -->
    <html>
    <head>
       <title>Team Capacity Summary Example</title>
       <meta name="Name" content="App Example: Team Capacity Summary" />
       <meta name="Version" content="1.31" />
       <meta name="Vendor" content="Rally Labs" />

       <script type="text/javascript" src="https://rally1.rallydev.com/apps/1.31/sdk.js"></script>
       <script type="text/javascript">

       var rallyDataSource = null;
       var iterationDropdown = null;
       var selectedIteration = "Iteration 1";
       var workspaceOID = "12345678910";
       var projectOID = "12345678911";
       var myTeamSlashProjectName = "My Project";
       var table;

        function iterationSelected(dropdown, eventArgs) {
              var selectedItem = eventArgs.item;
              selectedIteration = eventArgs.value;
              runMainQuery();
        }

        function runMainQuery() {

            var queryConfig = [];

            var capacityQueryString = '((Iteration.Name = ' + '"' + 
                    selectedIteration + 
                    '") AND (Project.ObjectID = "' + 
                    projectOID +
                     '"))';
            console.log(capacityQueryString);

            queryConfig[0] = {
                key: "usercapacities", 
                type: "UserIterationCapacity", 
                fetch: "Capacity,User,Role,EmailAddress,DisplayName,UserName",
                query: capacityQueryString
            };

            queryConfig[1] = {
                type: "users",
                key:  "userdata",
                fetch: "UserName,EmailAddress,DisplayName,UserName,UserPermissions,Project,Role,Name,TeamMemberships,Project,Name"
            };          

            rallyDataSource.findAll(queryConfig, processResults);

        }

        function processResults(results) {      

            // Populate a hash of team members by team name 
            var teamMembersByTeamName= new Array();

            for (i=0;i<results.userdata.length;i++){
                myUser = results.userdata[i];
                myUserName = myUser.UserName;
                myEmailAddress = myUser.EmailAddress;
                myDisplayName = myUser.DisplayName;
                myRole = "N/A";

                if (myUser.TeamMemberships) {

                    myTeamMemberships = myUser.TeamMemberships;

                    for (j=0;j<myTeamMemberships.length;j++) {
                        thisTeam = myTeamMemberships[j];
                        thisTeamName = thisTeam.Name;

                        if (!(thisTeamName in teamMembersByTeamName)) {
                            teamMembersByTeamName[thisTeamName] = [];
                        }

                        var dataToPush = new Array();
                        dataToPush["UserName"] = myUserName;
                        dataToPush["EmailAddress"] = myEmailAddress;
                        dataToPush["DisplayName"] = myDisplayName;
                        dataToPush["Role"] = myRole;
                        dataToPush["Capacity"] = "N/A";

                        teamMembersByTeamName[thisTeamName].push(dataToPush);
                    }
                }
            }

            // Now populate a hash of User Capacities

            var userIterationCapacityByUser = new Array();

            for (i=0;i<results.usercapacities.length;i++) {
                thisCapacityObject = results.usercapacities[i];
                thisUserName = thisCapacityObject.User.UserName;
                if (!(thisUserName in userIterationCapacityByUser)) {

                    thisUser = thisCapacityObject.User;
                    thisCapacity = thisCapacityObject.Capacity;

                    userIterationCapacityByUser[thisUserName] = [];

                    var dataToPush = new Array();
                    dataToPush["UserName"] = thisUser.UserName;
                    dataToPush["EmailAddress"] = thisUser.EmailAddress;
                    dataToPush["DisplayName"] = thisUser.DisplayName;
                    dataToPush["Role"] = thisUser.Role;
                    dataToPush["Capacity"] = thisCapacity;

                    userIterationCapacityByUser[thisUserName].push(dataToPush);             
                }
            }

            // Setup and configure the table
            var tableDiv = document.getElementById('tableDiv');
            var tableConfig = { columns: 
                 [{key: 'emailaddress', header: 'Team Member Email', width: 200}, 
                 {key: 'displayname', header: 'Display name'},
                 {key: 'username', header: 'User name'},
                 {key: 'role', header: 'Role'},
                 {key: 'cap', header: 'Capacity'}] };

            if(table != null){
                table.destroy();
            }

            table = new rally.sdk.ui.Table(tableConfig);        

            // Finally cross-walk team membership by correlating the data from the two hashes
            // Grab team list of interest
            myTeamList = teamMembersByTeamName[myTeamSlashProjectName];

            for(i=0;i<myTeamList.length;i++) {

                myTeamMemberData = myTeamList[i];
                myUserNameFromTeamList = myTeamMemberData["UserName"];

                // User has capacity information - populate data from that result set
                if (myUserNameFromTeamList in userIterationCapacityByUser) {                
                    myUserDataArray = userIterationCapacityByUser[myUserNameFromTeamList];
                    myUserData = myUserDataArray[0];            
                } // User doesn't have capacity information - populate data from user query
                else {
                    myUserData = myTeamMemberData;
                }

                var myUserName = myUserData["UserName"];
                var myEmailAddress = myUserData["EmailAddress"];
                var myDisplayName = myUserData["DisplayName"];
                var myRole = myUserData["Role"];
                var myCapacity = myUserData["Capacity"];

                if (myDisplayName) { 
                    thisDisplayName = myDisplayName;
                } else {
                    thisDisplayName = "N/A";
                }

                var rowInfo = {
                    'emailaddress': myEmailAddress, 
                    'displayname': thisDisplayName, 
                    'username': myUserName,
                    'role' : myRole, 
                    'cap' : myCapacity};
                table.addRow(rowInfo);
            }

            var tableDiv = document.getElementById("tableDiv");     
            table.display(tableDiv);
        }


        function onLoad() {
          rallyDataSource = new rally.sdk.data.RallyDataSource('__WORKSPACE_OID__',
                                                       '__PROJECT_OID__',
                                                       '__PROJECT_SCOPING_UP__',
                                                       '__PROJECT_SCOPING_DOWN__');
          var config = {
                label : "Select an iteration ",
                defaultDisplayValue: selectedIteration
          };
          var iterationDropdown = new rally.sdk.ui.IterationDropdown(config, rallyDataSource);
          iterationDropdown.display("aDiv", iterationSelected);
        }

           rally.addOnLoad(onLoad);

        </script>
    </head>
      <body>
        <div id="aDiv"></div>
        <div id="tableDiv"></div>
    </body>
    </html> 

团队能力摘要示例
var rallyDataSource=null;
var iterationDropdown=null;
var selecteditionation=“迭代1”;
var workspaceOID=“12345678910”;
var projectOID=“12345678911”;
var myTeamSlashProjectName=“我的项目”;
var表;
函数迭代选择(下拉列表,eventArgs){
var selectedItem=eventArgs.item;
选择编辑=事件args.value;
runMainQuery();
}
函数runMainQuery(){
var queryConfig=[];
var capacityQueryString='((Iteration.Name='+''''+
选择编辑+
“”)和(Project.ObjectID=“”+
投影仪+
'"))';
控制台日志(capacityQueryString);
查询配置[0]={
密钥:“用户容量”,
类型:“UserIterationCapacity”,
获取:“容量、用户、角色、电子邮件地址、显示名称、用户名”,
查询:capacityQueryString
};
查询配置[1]={
键入:“用户”,
密钥:“用户数据”,
获取:“用户名、电子邮件地址、显示名称、用户名、用户权限、项目、角色、名称、团队成员资格、项目、名称”
};          
findAll(queryConfig,processResults);
}
函数processResults(results){
//按团队名称填充团队成员的哈希
var teamMembersByTeamName=新数组();

对于(i=0;iOk)-我已经编写了一个示例,我认为该示例演示了获得想要的结果所需的步骤。它通过在queryConfig数组中执行两个查询来实现这一点:一个用于用户,另一个用于用户迭代容量,用于感兴趣的迭代。然后,在processResults函数中,代码构造了三个哈希:

  • teamMembersByTeamName
    :每个项目的团队成员字符串,哈希键:团队/项目名称
  • myTeamList
    :包含用户(第一)查询中的用户数据,为感兴趣的团队选择,hashkey:UserName
  • userIterationCapacityByUser
    :包含来自第二次查询的UserIterationCapacity数据,哈希键:UserName
最后,代码按用户名进行交叉遍历,以重新构建所有团队成员的容量数据,即使他们没有为感兴趣的冲刺定义容量。如果是这种情况,容量显示为“N/a”

您需要自定义
工作空间体
projectOID
myTeamSlashProjectName
变量,以便在您的环境中使用。您可能需要自定义和调整-这只是一个粗略的代码示例。但希望足以说明这个概念

    <!-- Copyright (c) 2012 Rally Software Development Corp. All rights reserved -->
    <html>
    <head>
       <title>Team Capacity Summary Example</title>
       <meta name="Name" content="App Example: Team Capacity Summary" />
       <meta name="Version" content="1.31" />
       <meta name="Vendor" content="Rally Labs" />

       <script type="text/javascript" src="https://rally1.rallydev.com/apps/1.31/sdk.js"></script>
       <script type="text/javascript">

       var rallyDataSource = null;
       var iterationDropdown = null;
       var selectedIteration = "Iteration 1";
       var workspaceOID = "12345678910";
       var projectOID = "12345678911";
       var myTeamSlashProjectName = "My Project";
       var table;

        function iterationSelected(dropdown, eventArgs) {
              var selectedItem = eventArgs.item;
              selectedIteration = eventArgs.value;
              runMainQuery();
        }

        function runMainQuery() {

            var queryConfig = [];

            var capacityQueryString = '((Iteration.Name = ' + '"' + 
                    selectedIteration + 
                    '") AND (Project.ObjectID = "' + 
                    projectOID +
                     '"))';
            console.log(capacityQueryString);

            queryConfig[0] = {
                key: "usercapacities", 
                type: "UserIterationCapacity", 
                fetch: "Capacity,User,Role,EmailAddress,DisplayName,UserName",
                query: capacityQueryString
            };

            queryConfig[1] = {
                type: "users",
                key:  "userdata",
                fetch: "UserName,EmailAddress,DisplayName,UserName,UserPermissions,Project,Role,Name,TeamMemberships,Project,Name"
            };          

            rallyDataSource.findAll(queryConfig, processResults);

        }

        function processResults(results) {      

            // Populate a hash of team members by team name 
            var teamMembersByTeamName= new Array();

            for (i=0;i<results.userdata.length;i++){
                myUser = results.userdata[i];
                myUserName = myUser.UserName;
                myEmailAddress = myUser.EmailAddress;
                myDisplayName = myUser.DisplayName;
                myRole = "N/A";

                if (myUser.TeamMemberships) {

                    myTeamMemberships = myUser.TeamMemberships;

                    for (j=0;j<myTeamMemberships.length;j++) {
                        thisTeam = myTeamMemberships[j];
                        thisTeamName = thisTeam.Name;

                        if (!(thisTeamName in teamMembersByTeamName)) {
                            teamMembersByTeamName[thisTeamName] = [];
                        }

                        var dataToPush = new Array();
                        dataToPush["UserName"] = myUserName;
                        dataToPush["EmailAddress"] = myEmailAddress;
                        dataToPush["DisplayName"] = myDisplayName;
                        dataToPush["Role"] = myRole;
                        dataToPush["Capacity"] = "N/A";

                        teamMembersByTeamName[thisTeamName].push(dataToPush);
                    }
                }
            }

            // Now populate a hash of User Capacities

            var userIterationCapacityByUser = new Array();

            for (i=0;i<results.usercapacities.length;i++) {
                thisCapacityObject = results.usercapacities[i];
                thisUserName = thisCapacityObject.User.UserName;
                if (!(thisUserName in userIterationCapacityByUser)) {

                    thisUser = thisCapacityObject.User;
                    thisCapacity = thisCapacityObject.Capacity;

                    userIterationCapacityByUser[thisUserName] = [];

                    var dataToPush = new Array();
                    dataToPush["UserName"] = thisUser.UserName;
                    dataToPush["EmailAddress"] = thisUser.EmailAddress;
                    dataToPush["DisplayName"] = thisUser.DisplayName;
                    dataToPush["Role"] = thisUser.Role;
                    dataToPush["Capacity"] = thisCapacity;

                    userIterationCapacityByUser[thisUserName].push(dataToPush);             
                }
            }

            // Setup and configure the table
            var tableDiv = document.getElementById('tableDiv');
            var tableConfig = { columns: 
                 [{key: 'emailaddress', header: 'Team Member Email', width: 200}, 
                 {key: 'displayname', header: 'Display name'},
                 {key: 'username', header: 'User name'},
                 {key: 'role', header: 'Role'},
                 {key: 'cap', header: 'Capacity'}] };

            if(table != null){
                table.destroy();
            }

            table = new rally.sdk.ui.Table(tableConfig);        

            // Finally cross-walk team membership by correlating the data from the two hashes
            // Grab team list of interest
            myTeamList = teamMembersByTeamName[myTeamSlashProjectName];

            for(i=0;i<myTeamList.length;i++) {

                myTeamMemberData = myTeamList[i];
                myUserNameFromTeamList = myTeamMemberData["UserName"];

                // User has capacity information - populate data from that result set
                if (myUserNameFromTeamList in userIterationCapacityByUser) {                
                    myUserDataArray = userIterationCapacityByUser[myUserNameFromTeamList];
                    myUserData = myUserDataArray[0];            
                } // User doesn't have capacity information - populate data from user query
                else {
                    myUserData = myTeamMemberData;
                }

                var myUserName = myUserData["UserName"];
                var myEmailAddress = myUserData["EmailAddress"];
                var myDisplayName = myUserData["DisplayName"];
                var myRole = myUserData["Role"];
                var myCapacity = myUserData["Capacity"];

                if (myDisplayName) { 
                    thisDisplayName = myDisplayName;
                } else {
                    thisDisplayName = "N/A";
                }

                var rowInfo = {
                    'emailaddress': myEmailAddress, 
                    'displayname': thisDisplayName, 
                    'username': myUserName,
                    'role' : myRole, 
                    'cap' : myCapacity};
                table.addRow(rowInfo);
            }

            var tableDiv = document.getElementById("tableDiv");     
            table.display(tableDiv);
        }


        function onLoad() {
          rallyDataSource = new rally.sdk.data.RallyDataSource('__WORKSPACE_OID__',
                                                       '__PROJECT_OID__',
                                                       '__PROJECT_SCOPING_UP__',
                                                       '__PROJECT_SCOPING_DOWN__');
          var config = {
                label : "Select an iteration ",
                defaultDisplayValue: selectedIteration
          };
          var iterationDropdown = new rally.sdk.ui.IterationDropdown(config, rallyDataSource);
          iterationDropdown.display("aDiv", iterationSelected);
        }

           rally.addOnLoad(onLoad);

        </script>
    </head>
      <body>
        <div id="aDiv"></div>
        <div id="tableDiv"></div>
    </body>
    </html> 

团队能力摘要示例
var rallyDataSource=null;
var iterationDropdown=null;
var selecteditionation=“迭代1”;
var workspaceOID=“12345678910”;
var projectOID=“12345678911”;
var myTeamSlashProjectName=“我的项目”;
var表;
函数迭代选择(下拉列表,eventArgs){
var selectedItem=eventArgs.item;
选择编辑=事件args.value;
runMainQuery();
}
函数runMainQuery(){
var queryConfig=[];
var capacityQueryString='((Iteration.Name='+''''+
选择编辑+
“”)和(Project.ObjectID=“”+
投影仪+
'"))';
控制台日志(capacityQueryString);
查询配置[0]={
密钥:“用户容量”,
类型:“UserIterationCapacity”,