Skip to content

Commit

Permalink
Got cross-release dropdown working, need to cache workspace info to g…
Browse files Browse the repository at this point in the history
…et workspace name
  • Loading branch information
Omar Sulehria committed Jan 31, 2015
1 parent 0c022f7 commit b89190e
Show file tree
Hide file tree
Showing 7 changed files with 173 additions and 126 deletions.
115 changes: 78 additions & 37 deletions App.js
Expand Up @@ -10,75 +10,116 @@ Ext.define('CrossWorkspaceReleaseBurndownApp', {

launch: function() {
Deft.Chain.pipeline([
this.createFilteredReleaseStore,
this.getWorkspaceCollection,
this.getReleasesInWorkspaces,
this.filterLikeReleases,
this.createFilteredCombobox
], this);
},

createFilteredReleaseStore: function() {
var deferred = Ext.create('Deft.Deferred'),
releases = [],
me = this;
getWorkspaceCollection: function() {
var deferred = Ext.create('Deft.Deferred');

Ext.create('Rally.data.wsapi.Store', {
model: 'Release',
model: 'Subscription',
fetch: ['Workspaces'],
autoLoad: true,
context: {
workspace: null,
project: null
},
limit: Infinity,
listeners: {
load: function(store, data) {
_.map(data, function(release) {
var rData = release.data;
var likeRelease = me._isLikeReleaseInList(releases, rData.Name);

if (likeRelease) {
likeRelease.ObjectID.push(rData.ObjectID);
load: function (store, data) {
var subscription = data[0];

if (_.isEqual(likeRelease.Workspace, rData.Workspace)) {
likeRelease.Workspace.push(rData.Workspace);
subscription.getCollection('Workspaces').load({
fetch: ['ObjectID', 'Name', 'State'],
filters: [
{
property: 'State',
operator: '!=',
value: 'Closed'
}
} else {
releases.push({
Name: rData.Name,
ObjectID: [rData.ObjectID],
Workspace: [rData.Workspace],
ReleaseStartDate: rData.ReleaseStartDate,
ReleaseDate: rData.ReleaseDate
});
],
callback: function(records) {
deferred.resolve(records);
}
});
}
}
});

return deferred.promise;
},

getReleasesInWorkspaces: function(workspaces) {
return Deft.Chain.parallel(_.map(workspaces, function(workspace) {
return function() {
var store = Ext.create('Rally.data.wsapi.Store', {
model: 'Release',
fetch: true,
context: {
workspace: Rally.util.Ref.getRelativeUri(workspace),
project: null
}
});

releases = _.sortBy(releases, 'Name');
console.log(releases.length);
deferred.resolve(releases);
return store.load();
};
}));
},

filterLikeReleases: function(aggregateRecords) {
var deferred = Ext.create('Deft.Deferred'),
allReleases = _.pluck(_.flatten(aggregateRecords), 'data'),
releases = [],
me = this;

_.map(allReleases, function(release) {
var likeRelease = me._isLikeReleaseInList(releases, release.Name);

if (likeRelease) {
likeRelease.ObjectID.push(release.ObjectID);

if (!_.isEqual(likeRelease.Workspace, release.Workspace)) {
likeRelease.Workspace.push(release.Workspace);
}
} else {
releases.push({
Name: release.Name,
ObjectID: [release.ObjectID],
Workspace: [release.Workspace],
ReleaseStartDate: release.ReleaseStartDate,
ReleaseDate: release.ReleaseDate
});
}
});

releases = _.sortBy(releases, 'Name');
deferred.resolve(releases);

return deferred.promise;
},

createFilteredCombobox: function(filteredReleases) {
var combobox = Ext.create('Ext.form.field.ComboBox', {
this.add({
xtype: 'combobox',
fieldLabel: 'Choose Release',
store: Ext.create('Ext.data.Store', {
data: filteredReleases,
fields: ['Name', 'ObjectID']
fields: ['Name', 'ObjectID', 'Workspace']
}),
displayField: 'Name',
valueField: 'ObjectId',
width: 600,
width: 300,
listeners: {
select: function(combo, record) {
var data = record[0].getData();
//var data = record[0].getData();
}
},
listConfig: {
itemTpl: new Ext.XTemplate(
'<div class="release-name">{Name} &nbsp; &ndash; &nbsp;</div><div class="workspace-names">(<tpl for="Workspace">{Name}</tpl>)</div>'
),
shadow: 'drop'
}
});

this.add(combobox);
},

_isLikeReleaseInList: function(releases, releaseName) {
Expand Down
19 changes: 0 additions & 19 deletions CrossWorkspaceReleaseBurndownCalculator.js

This file was deleted.

8 changes: 6 additions & 2 deletions app.css
@@ -1,3 +1,7 @@
.app {
/* Add app styles here */
.release-name {
display: inline;
}

.workspace-names {
display: inline;
}
3 changes: 1 addition & 2 deletions config.json
Expand Up @@ -4,8 +4,7 @@
"server": "https://rally1.rallydev.com",
"sdk": "2.0",
"javascript": [
"App.js",
"CrossWorkspaceReleaseBurndownCalculator.js"
"App.js"
],
"css": [
"app.css"
Expand Down
5 changes: 2 additions & 3 deletions deploy/App-external.html
Expand Up @@ -7,8 +7,7 @@

<script type="text/javascript">
Rally.onReady(function () {
Ext.define("CrossWorkspaceReleaseBurndownApp",{extend:"Rally.app.App",componentCls:"app",requires:["Deft.Deferred","Ext.form.field.ComboBox","Rally.data.wsapi.Store"],launch:function(){Deft.Chain.pipeline([this.createFilteredReleaseStore,this.createFilteredCombobox],this)},createFilteredReleaseStore:function(){var deferred=Ext.create("Deft.Deferred"),releases=[],me=this;return Ext.create("Rally.data.wsapi.Store",{model:"Release",autoLoad:!0,context:{workspace:null,project:null},limit:1/0,listeners:{load:function(store,data){_.map(data,function(release){var rData=release.data,likeRelease=me._isLikeReleaseInList(releases,rData.Name);likeRelease?(likeRelease.ObjectID.push(rData.ObjectID),_.isEqual(likeRelease.Workspace,rData.Workspace)&&likeRelease.Workspace.push(rData.Workspace)):releases.push({Name:rData.Name,ObjectID:[rData.ObjectID],Workspace:[rData.Workspace],ReleaseStartDate:rData.ReleaseStartDate,ReleaseDate:rData.ReleaseDate})}),releases=_.sortBy(releases,"Name"),console.log(releases.length),deferred.resolve(releases)}}}),deferred.promise},createFilteredCombobox:function(filteredReleases){var combobox=Ext.create("Ext.form.field.ComboBox",{fieldLabel:"Choose Release",store:Ext.create("Ext.data.Store",{data:filteredReleases,fields:["Name","ObjectID"]}),displayField:"Name",valueField:"ObjectId",width:600,listeners:{select:function(combo,record){var data=record[0].getData()}}});this.add(combobox)},_isLikeReleaseInList:function(releases,releaseName){return _.find(releases,function(release){return release.Name===releaseName})}});
Ext.define("CrossWorkspaceReleaseBurndownCalculator",{extend:"Rally.data.lookback.calculator.TimeSeriesCalculator",constructor:function(config){this.initConfig(config),this.callParent(arguments)},getMetrics:function(){return[{field:"PlanEstimate",as:"Derp Points",display:"line",f:"sum"}]}});
Ext.define("CrossWorkspaceReleaseBurndownApp",{extend:"Rally.app.App",componentCls:"app",requires:["Deft.Deferred","Ext.form.field.ComboBox","Rally.data.wsapi.Store"],launch:function(){Deft.Chain.pipeline([this.getWorkspaceCollection,this.getReleasesInWorkspaces,this.filterLikeReleases,this.createFilteredCombobox],this)},getWorkspaceCollection:function(){var deferred=Ext.create("Deft.Deferred");return Ext.create("Rally.data.wsapi.Store",{model:"Subscription",fetch:["Workspaces"],autoLoad:!0,listeners:{load:function(store,data){var subscription=data[0];subscription.getCollection("Workspaces").load({fetch:["ObjectID","Name","State"],filters:[{property:"State",operator:"!=",value:"Closed"}],callback:function(records){deferred.resolve(records)}})}}}),deferred.promise},getReleasesInWorkspaces:function(workspaces){return Deft.Chain.parallel(_.map(workspaces,function(workspace){return function(){var store=Ext.create("Rally.data.wsapi.Store",{model:"Release",fetch:!0,context:{workspace:Rally.util.Ref.getRelativeUri(workspace),project:null}});return store.load()}}))},filterLikeReleases:function(aggregateRecords){var deferred=Ext.create("Deft.Deferred"),allReleases=_.pluck(_.flatten(aggregateRecords),"data"),releases=[],me=this;return _.map(allReleases,function(release){var likeRelease=me._isLikeReleaseInList(releases,release.Name);likeRelease?(likeRelease.ObjectID.push(release.ObjectID),_.isEqual(likeRelease.Workspace,release.Workspace)||likeRelease.Workspace.push(release.Workspace)):releases.push({Name:release.Name,ObjectID:[release.ObjectID],Workspace:[release.Workspace],ReleaseStartDate:release.ReleaseStartDate,ReleaseDate:release.ReleaseDate})}),releases=_.sortBy(releases,"Name"),deferred.resolve(releases),deferred.promise},createFilteredCombobox:function(filteredReleases){this.add({xtype:"combobox",fieldLabel:"Choose Release",store:Ext.create("Ext.data.Store",{data:filteredReleases,fields:["Name","ObjectID","Workspace"]}),displayField:"Name",valueField:"ObjectId",width:300,listeners:{select:function(combo,record){}},listConfig:{itemTpl:new Ext.XTemplate('<div class="release-name">{Name} &nbsp; &ndash; &nbsp;</div><div class="workspace-names">(<tpl for="Workspace">{Name}</tpl>)</div>'),shadow:"drop"}})},_isLikeReleaseInList:function(releases,releaseName){return _.find(releases,function(release){return release.Name===releaseName})}});

Rally.launchApp('CrossWorkspaceReleaseBurndownApp', {
name:"CrossWorkspaceReleaseBurndown",
Expand All @@ -20,7 +19,7 @@


<style type="text/css">

.release-name{display:inline}.workspace-names{display:inline}
</style>
</head>
<body>
Expand Down

0 comments on commit b89190e

Please sign in to comment.