Rally SDK 2手动筛选或指定显示的rallycardboard列
我正在尝试创建一个简单的rallycardboard应用程序,它以列的形式显示项目,以卡片的形式显示项目待办事项。然后允许拖放卡片来设置项目。代码见附件 如果我指定'Project'作为属性,则该板包含工作区中所有项目的列。我希望将显示的列限制为Rally SDK 2手动筛选或指定显示的rallycardboard列,rally,appsdk2,Rally,Appsdk2,我正在尝试创建一个简单的rallycardboard应用程序,它以列的形式显示项目,以卡片的形式显示项目待办事项。然后允许拖放卡片来设置项目。代码见附件 如果我指定'Project'作为属性,则该板包含工作区中所有项目的列。我希望将显示的列限制为 作用域父项和子项,或 为项目列列表编写代码。我尝试了操纵列、columnConfig、上下文设置,但没有任何结果 <!DOCTYPE html> <html> <head> <title>Card
<!DOCTYPE html>
<html>
<head>
<title>CardBoard Example</title>
<script type="text/javascript" src="/apps/2.0rc2/sdk.js"></script>
<script type="text/javascript">
Rally.onReady(function() {
Ext.define('ProjBoard', {
extend: 'Rally.app.App',
launch: function() {
if (cardBoardConfig) {
cardBoardConfig.destroy();
}
var cardBoardConfig = {
xtype: 'rallycardboard',
types: ['User Story'],
attribute: 'Project',
fieldToDisplay: 'Project',
cardConfig: {
fields: ['Project', 'Parent','Iteration']
},
storeConfig: {
filters: [
{ property: 'ScheduleState', operator: '<', value: 'In-Progress' },
{ property: 'Iteration', operator: '=', value: '' }
],
sorters: [
{ property: 'Rank', direction: 'DESC' }
],
//Specify current project and scoping
context: this.getContext().getDataContext()
}
};
this.add(cardBoardConfig);
}
});
Rally.launchApp('ProjBoard', {
name: 'Backlog Project Board'
});
});
</script>
<style type="text/css">
</style>
</head>
<body></body>
</html>
纸板示例
onReady(函数(){
Ext.define('ProjBoard'{
扩展:“Rally.app.app”,
启动:函数(){
if(cardBoardConfig){
cardBoardConfig.destroy();
}
var cardBoardConfig={
xtype:“拉力纸板”,
类型:[“用户故事”],
属性:“项目”,
fieldToDisplay:“项目”,
cardConfig:{
字段:[“项目”、“父项”、“迭代”]
},
storeConfig:{
过滤器:[
{property:'ScheduleState',operator:'下面的代码允许我将十几个项目列缩减为三个。首先,我获取当前项目并查询其子项目的集合,以构建我希望在板上包含的项目数组(您可以为希望在板上包含的项目选择不同的标准),然后我扩展了Rally.ui.carboard.carboard
以覆盖其\u buildColumnsFromModel
方法,其中仅过滤满足此条件的列:
retrievedColumns = _.select(retrievedColumns, function(project){
return that.arrayOfProjectRefs.indexOf(project.value) != -1
});
这是完整的js文件。除了这些更改,这是您的代码
Ext.define('CustomApp', { extend: 'Rally.app.App', componentCls: 'app',
launch: function() {
var that = this;
that.arrayOfProjectRefs = [];
var p = this.getContext().getProject();
Ext.create('Rally.data.wsapi.Store', {
model: 'Project',
fetch: ['Children'],
filters:[
{
Property: '_ref',
value: p
}
],
pageSize: 1,
autoLoad: true,
listeners: {
load: function(store, records) {
var project = records[0];
var childProjects = project.get('Children');
var childProjectsCount = project.get('Children').Count;
console.log('childProjectsCount', childProjectsCount);
that.arrayOfProjectRefs.push(project.get('_ref'));
project.getCollection('Children').load({
fetch: ['_ref', 'Name', 'State'],
callback: function(records, operation, success) {
Ext.Array.each(records, function(child) {
console.log(child.get('_ref') + ' - ' + child.get('Name') + child.get('State'));
if (child.get('State') === 'Open') {
that.arrayOfProjectRefs.push(child.get('_ref'));
--childProjectsCount;
if (childProjectsCount === 0) {
that._buildBoard();
}
}
});
}
});
}
}
});
},
_buildBoard:function(){
var that = this;
console.log('app._arrayOfProjectRefs', this.arrayOfProjectRefs);
Ext.define('ProjectCardboard', {extend: 'Rally.ui.cardboard.CardBoard',
xtype: 'projectCardboard',
_buildColumnsFromModel: function() {
var model = this.models[0];
if (model) {
var attribute = model.getField('Project');
if (attribute) {
attribute.getAllowedValueStore().load({
callback: function(records, operation, success) {
var retrievedColumns = _.map(records, function(allowedValue) {
var displayValue, value = allowedValue.get('StringValue');
if (!value && attribute.attributeDefinition.AttributeType.toLowerCase() === 'rating') {
value = "None";
} else if (attribute.attributeDefinition.AttributeType.toLowerCase() === 'object') {
displayValue = value;
value = allowedValue.get('_ref');
if (value === 'null') {
value = null;
}
}
return {
value: value,
columnHeaderConfig: {
headerTpl: displayValue || value || 'None'
}
};
});
this.fireEvent('columnsretrieved', this, retrievedColumns);
retrievedColumns = _.select(retrievedColumns, function(project){
return that.arrayOfProjectRefs.indexOf(project.value) != -1
});
console.log('retrievedColumns after filter', retrievedColumns)
this.columnDefinitions = [];
_.each(retrievedColumns, this.addColumn, this);
this.renderColumns();
},
scope: this
});
}
}
}
});
var addNewConfig = {
xtype: 'rallyaddnew',
recordTypes: ['User Story'],
ignoredRequiredFields: ['Name', 'Iteration'],
showAddWithDetails: false,
};
this.addNew = this.add(addNewConfig);
var myCardConfig = {
xtype: 'rallycard',
fields: ['ScheduleState','Name'],
maxHeight: 100
}
var cardBoardConfig = {
xtype: 'projectCardboard',
types: ['User Story'],
attribute: 'Project',
cardConfig: myCardConfig
};
this.cardBoard = this.add(cardBoardConfig);
}
});
您应该能够通过配置指定列:
你在问什么?只是将列限制为这两种情况中的一种?是的,如果我现在在测试环境中运行此操作,我会为层次结构中的每个项目获得一列。我希望限制通过所描述的任一方法显示的列。第一种方法是手动指定它们(即“产品a、团队1、团队2、团队3”)。我使用rally app builder将其放入Cloud9。创建了应用程序,但板不会显示。Chrome控制台有:childProjectsCount 0,无论我在何处查看。工作非常出色!我真的很难解开这些列:语法…谢谢!我同意你的看法-我很久没有尝试过用这种方式制作板了。很难理解!
columns: [
{
value: '/project/12345',
columnHeaderConfig: {
headerTpl: '{project}',
headerData: {project: 'Project 1'}
}
},
//more columns...
]