本文介绍了拉力赛的实验层次树的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我看到在 Rally 站点 (https://help.rallydev.com/apps/2.0rc3/doc/#!/api/Rally.ui.grid.TreeGrid).我想使用分层树构建一个应用程序,但我对这些功能有一些疑问.是否可以过滤树?我还可以将给定用户故事(估计、待办事项、实际等)的任务总数相加,并将该总数列为用户故事值吗?是否有另一种方法可以获取用户故事列表以及其下方列表中的任务?

I see that Hierarchical trees are labeled as experimental on the Rally site (https://help.rallydev.com/apps/2.0rc3/doc/#!/api/Rally.ui.grid.TreeGrid). I wanted to build an app using the hierarchical tree and I had a few questions about the features. Is it possible to filter the tree or no? Also can i add up the totals of the tasks for a given userstory (estimate, todo, actual, etc) and list that total as the userstory value? Is there another way to get a list of the userstories with the tasks in a list beneath it?

推荐答案

非树形网格示例:此应用程序在当前迭代中按工作产品分组的任务网格中使用组和摘要功能(用户故事),其中总结了单个任务的估计值.完整代码在这个github repo中.>

A not-treegrid example: this app that uses group and summary features in a grid of tasks in current iteration grouped by workproduct (user story), where Estimate values of individual tasks are summed up. Full code is in this github repo.

launch: function() {
        var that = this;
        var today = new Date().toISOString();
        var stories = Ext.create('Rally.data.wsapi.Store', {
            model: 'UserStory',
            fetch: ['Tasks'],
            filters: [
                {
                    property: 'Iteration.StartDate',
                    operator: '<=',
                    value: today
                },
                {
                    property: 'Iteration.EndDate',
                    operator: '>=',
                    value: today
                }
            ]
        });
        stories.load().then({
            success: this.loadTasks,
            scope: this
        }).then({
            success:function(results) {
                that.makeGrid(results);
            },
            failure: function(){
                console.log("oh noes!")
            }
        });
    },

    loadTasks: function(stories){
        console.log("load tasks",stories)
        var promises = [];
        _.each(stories, function(story){
            var tasks = story.get('Tasks');
            if (tasks.Count > 0) {
                tasks.store = story.getCollection('Tasks',{fetch:['Name','FormattedID','Estimate','State','Blocked','WorkProduct']});
                promises.push(tasks.store.load());
            }
        });
        return Deft.Promise.all(promises);
    },


    makeGrid: function(results){
        var tasks = _.flatten(results);
        var data = [];
        _.each(tasks, function(task){
            data.push(task.data);
        })

        _.each(data, function(record){
            record.Story = record.WorkProduct.FormattedID + " " + record.WorkProduct.Name;;
        })


        this.add({
            xtype: 'rallygrid',
            showPagingToolbar: true,
            showRowActionsColumn: true,
            editable: false,
            store: Ext.create('Rally.data.custom.Store', {
                data: data,
                groupField: 'Story',
            }),
            features: [{ftype:'groupingsummary'}],
            columnCfgs: [
                {
                    xtype: 'templatecolumn',text: 'ID',dataIndex: 'FormattedID',width: 100,
                    tpl: Ext.create('Rally.ui.renderer.template.FormattedIDTemplate'),
                    summaryRenderer: function() {
                        return "Estimate Total"; 
                    }
                },
                {
                    text: 'Name',dataIndex: 'Name',
                },
                {
                    text: 'State',dataIndex: 'State',xtype: 'templatecolumn',
                        tpl: Ext.create('Rally.ui.renderer.template.ScheduleStateTemplate',
                            {
                                states: ['Defined', 'In-Progress', 'Completed'],
                                field: {
                                    name: 'State' 
                                }
                        })
                },
                {
                    text: 'Estimate',dataIndex: 'Estimate',
                    summaryType: 'sum',
                },
                {
                    text: 'WorkProduct',dataIndex: 'WorkProduct',
                    renderer: function(val, meta, record) {
                        return '<a href="https://rally1.rallydev.com/#/detail/userstory/' + record.get('WorkProduct').ObjectID + '" target="_blank">' + record.get('WorkProduct').FormattedID + '</a>';
                    }
                },
            ]
        });

    }

更新:如果要过滤任务存储,请在此处添加过滤器:

Update: If you want to filter the task store include a filter here:

tasks.store = story.getCollection('Tasks',{fetch:['Name','FormattedID','Estimate','State','Blocked','WorkProduct'],filters:{property: 'State',operator: '<',value: 'Completed'}});

树形网格示例:您提到的 Rally.ui.grid.TreeGrid 仍在进行中.我还没有看到使用 treegrid 的故事层次结构的工作示例,但这并不意味着这是不可能的.

A treegrid example: Rally.ui.grid.TreeGrid you referred is still a work in progress. I have not seen a working example of a story hierarchy using a treegrid but it does not mean it's impossible.

当我测试故事层次结构时,子故事没有出现在史诗故事下,但是故事/任务层次结构有效.过滤也起作用了.下面是一个例子:

When I tested a story hierarchy, child stories did not appear under epic stories, however a story/task hierarchy worked. The filtering worked too. Here is an example:

Ext.define('CustomApp', {
    extend: 'Rally.app.App',
    componentCls: 'app',
    launch:function(){
        Ext.create('Rally.data.wsapi.TreeStoreBuilder').build({
            models: ['userstory'],
             autoLoad: true,
             filters:[
                {
                    property: 'Name',
                    operator: 'contains',
                    value: 'story'
                }
             ],
             enableHierarchy: true
            }).then({
             success: function(store) {
                var grid = Ext.create('Ext.Container', {
                    items: [{
                        xtype: 'rallytreegrid',
                        columnCfgs: [
                            'Name',
                            'Owner'
                        ],
                        store: store
                    }]
                });
                that.add(grid);

            }
        });
    } 

下面的屏幕截图显示任务按预期嵌套在子故事下,但子故事未嵌套在父故事下.网格按预期按名称过滤:

The screenshot below shows that tasks are nested under a child story as expected,but the child story is not nested under parent. The grid is filtered by Name as expected:

这篇关于拉力赛的实验层次树的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

10-24 06:52