Convert repos controller to javascript

This commit is contained in:
Piotr Sarnacki 2015-12-01 14:33:53 +01:00
parent 36d099667e
commit 35c5d619bd
2 changed files with 170 additions and 141 deletions

View File

@ -1,141 +0,0 @@
`import Ember from 'ember'`
`import limit from 'travis/utils/computed-limit'`
`import Repo from 'travis/models/repo'`
Controller = Ember.Controller.extend
actions:
activate: (name) ->
@activate(name)
showRunningJobs: ->
@activate('running')
showMyRepositories: ->
# this is a bit of a hack. I don't want to switch URL for 'running'
# so depending on current state I'm either just switching back or
# redirecting
if @get('tab') == 'running'
@activate('owned')
else
@transitionToRoute('main.repositories')
tabOrIsLoadedDidChange: (->
@possiblyRedirectToGettingStartedPage()
).observes('isLoaded', 'tab', 'repos.length')
possiblyRedirectToGettingStartedPage: ->
Ember.run.scheduleOnce 'routerTransitions', this, ->
if @get('tab') == 'owned' && @get('isLoaded') && @get('repos.length') == 0
@container.lookup('router:main').send('redirectToGettingStarted')
isLoaded: false
repoController: Ember.inject.controller('repo')
currentUserBinding: 'auth.currentUser'
selectedRepo: (->
# we need to observe also repo.content here, because we use
# ObjectProxy in repo controller
# TODO: get rid of ObjectProxy there
@get('repoController.repo.content') || @get('repoController.repo')
).property('repoController.repo', 'repoController.repo.content')
startedJobsCount: Ember.computed.alias('runningJobs.length')
allJobsCount: (->
@get('startedJobsCount') + @get('queuedJobs.length')
).property('startedJobsCount', 'queuedJobs.length')
init: ->
@_super.apply this, arguments
if !Ember.testing
Visibility.every @config.intervals.updateTimes, @updateTimes.bind(this)
runningJobs: (->
result = @store.filter('job', {}, (job) ->
['queued', 'started', 'received'].indexOf(job.get('state')) != -1
)
result.set('isLoaded', false)
result.then =>
result.set('isLoaded', true)
result
).property()
queuedJobs: (->
result = @get('store').filter('job', {}, (job) ->
['created'].indexOf(job.get('state')) != -1
)
result.set('isLoaded', false)
result.then =>
result.set('isLoaded', true)
result
).property()
recentRepos: (->
# I return an empty array here, because we're removing left sidebar, but
# I don't want to refactor too much code (it will be all changed anyway
# when we switch to new dashboard)
[]
).property()
updateTimes: ->
if repos = @get('repos')
repos.forEach (r) -> r.updateTimes()
activate: (tab, params) ->
@set('sortProperties', ['sortOrder'])
@set('tab', tab)
this["view_#{tab}".camelize()](params)
viewOwned: ->
if repos = @get('ownedRepos')
@set('repos', repos)
else if !@get('fetchingOwnedRepos')
@set('fetchingOwnedRepos', true)
@set('isLoaded', false)
if user = @get('currentUser')
user.get('_rawPermissions').then (data) =>
repos = Repo.accessibleBy(@store, data.pull).then( (reposRecordArray) =>
@set('isLoaded', true)
@set('repos', reposRecordArray)
@set('ownedRepos', reposRecordArray)
@set('fetchingOwnedRepos', false)
)
# TODO: handle error
viewRunning: ->
viewSearch: (phrase) ->
@set('search', phrase)
@set('isLoaded', false)
Repo.search(@store, phrase).then( (reposRecordArray) =>
@set('isLoaded', true)
@set('repos', reposRecordArray)
)
searchObserver: (->
search = @get('search')
if search
@searchFor search
).observes('search')
searchFor: (phrase) ->
Ember.run.cancel(@searchLater) if @searchLater
@searchLater = Ember.run.later(this, (->
@transitionTo('main.search', phrase.replace(/\//g, '%2F'))
), 500)
noReposMessage: (->
tab = @get('tab')
if tab == 'owned'
'You don\'t have any repos set up on Travis CI'
else if tab == 'recent'
'Repositories could not be loaded'
else
'Could not find any repos'
).property('tab')
showRunningJobs: (->
@get('tab') == 'running'
).property('tab')
`export default Controller`

170
app/controllers/repos.js Normal file
View File

@ -0,0 +1,170 @@
import Ember from 'ember';
import limit from 'travis/utils/computed-limit';
import Repo from 'travis/models/repo';
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')
});
export default Controller;