Rally 如何在自定义网格中显示任务修订?
我有一个自定义网格,显示按(Owner=some)筛选的打开的任务-user@company.com)Rally 如何在自定义网格中显示任务修订?,rally,appsdk2,Rally,Appsdk2,我有一个自定义网格,显示按(Owner=some)筛选的打开的任务-user@company.com) 我希望在自定义网格中包含每个任务的最后修订,但“设置”对话框中没有“修订”列。如何从修订历史记录遍历到单个修订?不能使用自定义网格,但可以使用自定义代码。下面是一个应用程序示例,它基于中的选择填充网格,然后在单击事件中显示所选任务的最后一次修订 您可以从以下位置将html文件复制到自定义页面: 以下是js文件: Ext.define('CustomApp', { extend: 'Ra
我希望在自定义网格中包含每个任务的最后修订,但“设置”对话框中没有“修订”列。如何从修订历史记录遍历到单个修订?不能使用自定义网格,但可以使用自定义代码。下面是一个应用程序示例,它基于中的选择填充网格,然后在单击事件中显示所选任务的最后一次修订 您可以从以下位置将html文件复制到自定义页面: 以下是js文件:
Ext.define('CustomApp', {
extend: 'Rally.app.App',
componentCls: 'app',
launch: function() {
var context = this.getContext ();
var currentProject = context.getProject()._ref;
var panel = Ext.create('Ext.panel.Panel', {
layout: 'hbox',
itemId: 'parentPanel',
componentCls: 'panel',
items: [
{
xtype: 'rallyusersearchcombobox',
fieldLabel: 'SELECT USER:',
project: currentProject,
listeners:{
ready: function(combobox){
this._onUserSelected(combobox.getRecord());
},
select: function(combobox){
if (this.down('#c').html !== 'No task is selected') {
Ext.getCmp('c').update('No task is selected');
}
this._onUserSelected(combobox.getRecord());
},
scope: this
}
},
{
xtype: 'panel',
title: 'Tasks',
width: 600,
itemId: 'childPanel1'
},
{
xtype: 'panel',
title: 'Last Revision',
width: 600,
itemId: 'childPanel2'
}
],
});
this.add(panel);
this.down('#childPanel2').add({
id: 'c',
padding: 10,
maxWidth: 600,
maxHeight: 400,
overflowX: 'auto',
overflowY: 'auto',
html: 'No task is selected'
});
},
_onUserSelected:function(record){
var user = record.data['_ref'];
if(user){
var filter = Ext.create('Rally.data.QueryFilter', {
property: 'Owner',
operator: '=',
value: user
});
filter = filter.and({
property: 'State',
operator: '<',
value: 'Completed'
});
filter.toString();
Ext.create('Rally.data.WsapiDataStore', {
model: 'Task',
fetch: [ 'DragAndDropRank','FormattedID','Name','State','RevisionHistory'],
autoLoad: true,
filters : [filter],
sorters:[
{
property: 'DragAndDropRank',
direction: 'ASC'
}
],
listeners: {
load: this._onTaskDataLoaded,
scope: this
}
});
}
},
_onTaskDataLoaded: function(store, data) {
var customRecords = [];
Ext.Array.each(data, function(task, index) {
customRecords.push({
_ref: task.get('_ref'),
FormattedID: task.get('FormattedID'),
Name: task.get('Name'),
RevisionID: Rally.util.Ref.getOidFromRef(task.get('RevisionHistory')),
});
}, this);
this._updateGrid(store,data);
},
_updateGrid: function(store, data){
if (!this.down('#g')) {
this._createGrid(store,data);
}
else{
this.down('#g').reconfigure(store);
}
},
_createGrid: function(store,data){
var that = this;
var g = Ext.create('Rally.ui.grid.Grid', {
id: 'g',
store: store,
enableRanking: true,
columnCfgs: [
{text: 'Formatted ID', dataIndex: 'FormattedID'},
{text: 'Name', dataIndex: 'Name'},
{text: 'State', dataIndex: 'State'},
{text: 'Last Revision',
renderer: function (v, m, r) {
var id = Ext.id();
Ext.defer(function () {
Ext.widget('button', {
renderTo: id,
text: 'see',
width: 50,
handler: function () {
console.log('r', r.data);
that._getRevisionHistory(data, r.data);
}
});
}, 50);
return Ext.String.format('<div id="{0}"></div>', id);
}
}
],
height: 400,
});
this.down('#childPanel1').add(g);
},
_getRevisionHistory: function(taskList, task) {
this._task = task;
this._revisionModel = Rally.data.ModelFactory.getModel({
type: 'RevisionHistory',
scope: this,
success: this._onModelCreated
});
},
_onModelCreated: function(model) {
model.load(Rally.util.Ref.getOidFromRef(this._task.RevisionHistory._ref),{
scope: this,
success: this._onModelLoaded
});
},
_onModelLoaded: function(record, operation) {
record.getCollection('Revisions').load({
fetch: true,
scope: this,
callback: function(revisions, operation, success) {
this._onRevisionsLoaded(revisions, record);
}
});
},
_onRevisionsLoaded: function(revisions, record) {
var lastRev = _.first(revisions).data;
console.log('_onRevisionsLoaded: ',lastRev.Description, lastRev.RevisionNumber, lastRev.CreationDate );
this._displayLastRevision(lastRev.Description,lastRev.RevisionNumber, lastRev.CreationDate );
},
_displayLastRevision:function(desc, num, date){
Ext.getCmp('c').update('<b>' + this._task.FormattedID + '</b><br/><b>Revision CreationDate: </b>' + date +'<br /><b>Description:</b>' + desc + '<br /><b>Revision Number:</b>' + num + '<br />');
}
});
Ext.define('CustomApp'{
扩展:“Rally.app.app”,
组件CLS:“应用程序”,
启动:函数(){
var context=this.getContext();
var currentProject=context.getProject();
var panel=Ext.create('Ext.panel.panel'{
布局:“hbox”,
itemId:“父面板”,
组件CLS:“面板”,
项目:[
{
xtype:“rallyusersearchcombobox”,
fieldLabel:“选择用户:”,
项目:当前项目,
听众:{
就绪:函数(组合框){
此._onUserSelected(combobox.getRecord());
},
选择:函数(组合框){
if(this.down('#c').html!=='未选择任何任务'){
Ext.getCmp('c')。update('No task is selected');
}
此._onUserSelected(combobox.getRecord());
},
范围:本
}
},
{
xtype:'面板',
标题:“任务”,
宽度:600,
itemId:'childPanel1'
},
{
xtype:'面板',
标题:“最新修订版”,
宽度:600,
itemId:'childPanel2'
}
],
});
本条添加(面板);
this.down(“#childPanel2”)。添加({
id:'c',
填充:10,
最大宽度:600,
最大高度:400,
溢出x:'自动',
溢出:“自动”,
html:“未选择任何任务”
});
},
_onUserSelected:功能(记录){
var user=记录.数据[''参考'];
如果(用户){
var filter=Ext.create('Rally.data.QueryFilter'{
财产:'所有者',
运算符:'=',
值:用户
});
filter=filter.and({
财产:'国家',
接线员:'