From 8de314e943d84e722f3f6ce076191472a583a7e1 Mon Sep 17 00:00:00 2001 From: Piotr Sarnacki Date: Tue, 20 Oct 2015 12:28:34 +0200 Subject: [PATCH] Sort repos in repos-list component, not in controller --- app/components/repos-list.coffee | 6 --- app/components/repos-list.js | 66 +++++++++++++++++++++++++ app/controllers/repos.coffee | 25 ++++++---- app/models/repo.coffee | 8 --- app/templates/components/repos-list.hbs | 4 +- 5 files changed, 82 insertions(+), 27 deletions(-) delete mode 100644 app/components/repos-list.coffee create mode 100644 app/components/repos-list.js diff --git a/app/components/repos-list.coffee b/app/components/repos-list.coffee deleted file mode 100644 index 3dcf8f8c..00000000 --- a/app/components/repos-list.coffee +++ /dev/null @@ -1,6 +0,0 @@ -`import Ember from 'ember'` - -ReposListComponent = Ember.Component.extend - tagName: 'ul' - -`export default ReposListComponent` diff --git a/app/components/repos-list.js b/app/components/repos-list.js new file mode 100644 index 00000000..8a3c6caa --- /dev/null +++ b/app/components/repos-list.js @@ -0,0 +1,66 @@ +import Ember from 'ember'; + +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 ReposListComponent = Ember.Component.extend({ + tagName: 'ul', + + sortedRepos: 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') +}); + +export default ReposListComponent; diff --git a/app/controllers/repos.coffee b/app/controllers/repos.coffee index 47acc64c..dd117744 100644 --- a/app/controllers/repos.coffee +++ b/app/controllers/repos.coffee @@ -30,7 +30,7 @@ Controller = Ember.Controller.extend if @get('tab') == 'owned' && @get('isLoaded') && @get('repos.length') == 0 @container.lookup('router:main').send('redirectToGettingStarted') - isLoadedBinding: 'repos.isLoaded' + isLoaded: false repoController: Ember.inject.controller('repo') currentUserBinding: 'auth.currentUser' selectedRepo: (-> @@ -87,20 +87,25 @@ Controller = Ember.Controller.extend this["view_#{tab}".camelize()](params) viewOwned: -> - @set('repos', @get('userRepos')) + @set('isLoaded', false); + if login = @get('currentUser.login') + repos = Repo.accessibleBy(@store, login).then( (reposRecordArray) => + @set('isLoaded', true) + @set('repos', reposRecordArray) + ) + # TODO: handle error + else + @set('repos', []) viewRunning: -> - userRepos: (-> - if login = @get('currentUser.login') - Repo.accessibleBy(@store, login) - else - [] - ).property('currentUser.login') - viewSearch: (phrase) -> @set('search', phrase) - @set('repos', Repo.search(@store, phrase)) + @set('isLoaded', false) + Repo.search(@store, phrase).then( (reposRecordArray) => + @set('isLoaded', true) + @set('repos', reposRecordArray) + ) searchObserver: (-> search = @get('search') diff --git a/app/models/repo.coffee b/app/models/repo.coffee index 31f586d7..97755916 100644 --- a/app/models/repo.coffee +++ b/app/models/repo.coffee @@ -93,14 +93,6 @@ Repo = Model.extend parseInt(@get('defaultBranch.lastBuild.id')) ).property('defaultBranch.lastBuild.id', 'defaultBranch.lastBuild.state') - sortOrder: (-> - # cuz sortAscending seems buggy when set to false - if lastBuildFinishedAt = @get('defaultBranch.lastBuild.finishedAt') - - new Date(lastBuildFinishedAt).getTime() - else - - new Date('9999').getTime() - parseInt(@get('defaultBranch.lastBuild.id')) - ).property('defaultBranch.lastBuild.state', 'defaultBranch.lastBuild.finishedAt') - stats: (-> if @get('slug') @get('_stats') || $.get("https://api.github.com/repos/#{@get('slug')}", (data) => diff --git a/app/templates/components/repos-list.hbs b/app/templates/components/repos-list.hbs index faf4b471..04d069ce 100644 --- a/app/templates/components/repos-list.hbs +++ b/app/templates/components/repos-list.hbs @@ -1,7 +1,5 @@ -{{#each repos as |repo|}} +{{#each sortedRepos as |repo|}} {{repos-list-item repo=repo selectedRepo=selectedRepo}} {{else}}

{{noReposMessage}}

{{/each}} - -