travis-web/app/controllers/repos.js
Piotr Sarnacki 0d9755489f Sort repos in repos controller, not in the component
We rely on the order of repositories when we set current repo on the
main page. That's why we need to do sorting in the controller.
2015-12-08 10:18:08 +01:00

233 lines
6.2 KiB
JavaScript

import Ember from 'ember';
import limit from 'travis/utils/computed-limit';
import Repo from 'travis/models/repo';
var sortCallback = function(repo1, repo2) {
// this function could be made simpler, but I think it's clearer this way
// what're we really trying to achieve
var lastBuild1 = repo1.get('defaultBranch.lastBuild');
var lastBuild2 = repo2.get('defaultBranch.lastBuild');
if(!lastBuild1 && !lastBuild2) {
// if both repos lack builds, put newer repo first
return repo1.get('id') > repo2.get('id') ? -1 : 1;
} else if(lastBuild1 && !lastBuild2) {
// if only repo1 has a build, it goes first
return -1;
} else if(lastBuild2 && !lastBuild1) {
// if only repo2 has a build, it goes first
return 1;
}
var finishedAt1 = lastBuild1.get('finishedAt');
var finishedAt2 = lastBuild2.get('finishedAt');
if(finishedAt1) {
finishedAt1 = new Date(finishedAt1);
}
if(finishedAt2) {
finishedAt2 = new Date(finishedAt2);
}
if(finishedAt1 && finishedAt2) {
// if both builds finished, put newer first
return finishedAt1.getTime() > finishedAt2.getTime() ? -1 : 1;
} else if(finishedAt1 && !finishedAt2) {
// if repo1 finished, but repo2 didn't, put repo2 first
return 1;
} else if(finishedAt2 && !finishedAt1) {
// if repo2 finisher, but repo1 didn't, put repo1 first
return -1;
} else {
// none of the builds finished, put newer build first
return lastBuild1.get('id') > lastBuild2.get('id') ? -1 : 1;
}
throw "should not happen";
};
var Controller = Ember.Controller.extend({
actions: {
activate: function(name) {
return this.activate(name);
},
showRunningJobs: function() {
return this.activate('running');
},
showMyRepositories: function() {
if (this.get('tab') === 'running') {
return this.activate('owned');
} else {
return this.transitionToRoute('main.repositories');
}
}
},
tabOrIsLoadedDidChange: function() {
return this.possiblyRedirectToGettingStartedPage();
}.observes('isLoaded', 'tab', 'repos.length'),
possiblyRedirectToGettingStartedPage() {
return Ember.run.scheduleOnce('routerTransitions', this, function() {
if (this.get('tab') === 'owned' && this.get('isLoaded') && this.get('repos.length') === 0) {
return this.container.lookup('router:main').send('redirectToGettingStarted');
}
});
},
isLoaded: false,
repoController: Ember.inject.controller('repo'),
currentUserBinding: 'auth.currentUser',
selectedRepo: function() {
return this.get('repoController.repo.content') || this.get('repoController.repo');
}.property('repoController.repo', 'repoController.repo.content'),
startedJobsCount: Ember.computed.alias('runningJobs.length'),
allJobsCount: function() {
return this.get('startedJobsCount') + this.get('queuedJobs.length');
}.property('startedJobsCount', 'queuedJobs.length'),
init() {
this._super.apply(this, arguments);
if (!Ember.testing) {
return Visibility.every(this.config.intervals.updateTimes, this.updateTimes.bind(this));
}
},
runningJobs: function() {
var result;
result = this.store.filter('job', {}, function(job) {
return ['queued', 'started', 'received'].indexOf(job.get('state')) !== -1;
});
result.set('isLoaded', false);
result.then(function() {
return result.set('isLoaded', true);
});
return result;
}.property(),
queuedJobs: function() {
var result;
result = this.get('store').filter('job', {}, function(job) {
return ['created'].indexOf(job.get('state')) !== -1;
});
result.set('isLoaded', false);
result.then(function() {
result.set('isLoaded', true);
});
return result;
}.property(),
recentRepos: function() {
return [];
}.property(),
updateTimes() {
var repos;
if (repos = this.get('repos')) {
return repos.forEach(function(r) {
return r.updateTimes();
});
}
},
activate(tab, params) {
this.set('sortProperties', ['sortOrder']);
this.set('tab', tab);
return this[("view_" + tab).camelize()](params);
},
viewOwned() {
var repos, user;
if (repos = this.get('ownedRepos')) {
return this.set('_repos', repos);
} else if (!this.get('fetchingOwnedRepos')) {
this.set('fetchingOwnedRepos', true);
this.set('isLoaded', false);
if (user = this.get('currentUser')) {
user.get('_rawPermissions').then( (data) => {
repos = Repo.accessibleBy(this.store, data.pull).then(
(reposRecordArray) => {
this.set('isLoaded', true);
this.set('_repos', reposRecordArray);
this.set('ownedRepos', reposRecordArray);
this.set('fetchingOwnedRepos', false);
return reposRecordArray;
});
});
}
}
},
viewRunning() {},
viewSearch(phrase) {
this.set('search', phrase);
this.set('isLoaded', false);
Repo.search(this.store, phrase).then( () => {
this.set('isLoaded', true);
this.set('_repos', reposRecordArray);
});
},
searchObserver: function() {
var search;
search = this.get('search');
if (search) {
return this.searchFor(search);
}
}.observes('search'),
searchFor(phrase) {
if (this.searchLater) {
Ember.run.cancel(this.searchLater);
}
this.searchLater = Ember.run.later(this, (function() {
this.transitionTo('main.search', phrase.replace(/\//g, '%2F'));
}), 500);
},
noReposMessage: function() {
var tab;
tab = this.get('tab');
if (tab === 'owned') {
return 'You don\'t have any repos set up on Travis CI';
} else if (tab === 'recent') {
return 'Repositories could not be loaded';
} else {
return 'Could not find any repos';
}
}.property('tab'),
showRunningJobs: function() {
return this.get('tab') === 'running';
}.property('tab'),
repos: function() {
var repos = this.get('_repos');
if(repos && repos.toArray) {
repos = repos.toArray();
}
if(repos && repos.sort) {
return repos.sort(sortCallback);
} else {
return [];
}
}.property('_repos.[]', '_repos.@each.lastBuildFinishedAt',
'_repos.@each.lastBuildId')
});
export default Controller;