1

我在 rallygrid 组件中显示快照存储记录,并希望使其 ID 字段可单击并显示该工作项的详细信息页面。由于快照记录包含“_UnformattedID”而不是“FormattedID”,我尝试使用列渲染器来完成此操作,它将文本添加为​​链接:

renderer: function(val, meta, record) {
    return '<a href="https://rally1.rallydev.com/#/detail/userstory/' + record.get('ObjectID') + '" target="_blank">US' + record.get('_UnformattedID') + '</a>';
}

作为非 SSO用户,这对我来说非常有效,但我们工作区中使用 SSO 的用户报告说,该链接只是将他们带到他们的默认起始页面。不是他们期望的详细信息页面。

有没有更好的方法可以实现这一点,让所有用户都可以使用该功能?

4

1 回答 1

2

SSO 实施在组织中有所不同,但这个技巧对我有用。我检测到主机:

this._host = window.location.hostname;

然后我在构建返回值时使用主机,renderer因为在我的环境中的 SSO 和非 SSO 场景中生成的 URL 仅在主机部分不同。

{
   text: 'Formatted ID', dataIndex: 'UnformattedID', 
        renderer: function(val, meta, record) {
            return '<a href="https://' + that._host + '/#/detail/userstory/' + record.get('ObjectID') + '" target="_blank">US' + record.get('UnformattedID') + '</a>';
    }
}

.

Ext.define('CustomApp', {
    extend: 'Rally.app.App',
    componentCls: 'app',
    launch: function() {
    this._host = window.location.hostname;
    console.log('host', this._host);
        var iterationComboBox = Ext.create('Rally.ui.combobox.IterationComboBox',{
                   listeners:{
                           ready: function(combobox){
                                this._iterationOid = combobox.getRecord().get('ObjectID');
                                this._loadStories(this._iterationOid);
                           },
                           select: function(combobox){
                                this._iterationOid = combobox.getRecord().get('ObjectID'); 
                                this._loadStories(this._iterationOid);
                           },
                           scope: this  
                   }
           });
        this.add(iterationComboBox);
    },


     _loadStories:function(iterationOid){
        console.log('loading stories for ', iterationOid);
        var myStore = Ext.create('Rally.data.lookback.SnapshotStore', {
                autoLoad:true,
                fetch    : ['Name','_UnformattedID','ScheduleState','_TypeHierarchy'],

                filters  : [{
                    property : '__At',
                    value    : 'current'
                },
                {
                    property : '_TypeHierarchy',
                    value    : 'HierarchicalRequirement'
                },
                {
                    property : 'Iteration',
                    value    : iterationOid
                }
                ],
        hydrate: ['_TypeHierarchy'],
                listeners: {
                           load: function(store,records,success){
                                   console.log("loaded %i records", records.length);
                                this._onDataLoaded(myStore, records);
                           },
                           scope:this
                   }
        });         
    },

     _onDataLoaded: function(store,data){
                console.log('count',store.getCount());
        var that = this;
        var records = [];
                    Ext.Array.each(data, function(record) {
                        records.push({
                            Name: record.get('Name'),
                            ObjectID: record.get('ObjectID'),
                UnformattedID: record.get('_UnformattedID')
                        });
                    });
            var myStore = Ext.create('Rally.data.custom.Store', {
                data: records
            });
                    if (!this.down('#grid')) {
            this.add({
                xtype: 'rallygrid',
                id: 'grid',
                store: myStore,
                columnCfgs: [
                {
                    text: 'Name', dataIndex: 'Name', flex: 1
                },
                {
                    text: 'Formatted ID', dataIndex: 'UnformattedID', 
                    renderer: function(val, meta, record) {
                        return '<a href="https://' + that._host + '/#/detail/userstory/' + record.get('ObjectID') + '" target="_blank">US' + record.get('UnformattedID') + '</a>';
                    }
                }
                ]
            });
            }
            else{
            console.log(store);
            this.down('#grid').reconfigure(myStore);
             }
     }
});
于 2014-02-12T17:53:26.487 回答