From a5ade45b47afece59f897ec52daab55c3c80ad23 Mon Sep 17 00:00:00 2001 From: Piotr Sarnacki Date: Thu, 2 Apr 2015 13:37:42 +0200 Subject: [PATCH 1/2] Rewrite landing page recent repos to not query API --- app/routes/home.coffee | 58 ++++++++++++++++++++++++++++-------------- app/store.coffee | 26 +++++++++++-------- 2 files changed, 54 insertions(+), 30 deletions(-) diff --git a/app/routes/home.coffee b/app/routes/home.coffee index da0c5f4c..47b89138 100644 --- a/app/routes/home.coffee +++ b/app/routes/home.coffee @@ -1,34 +1,54 @@ `import BasicRoute from 'travis/routes/basic'` `import config from 'travis/config/environment'` -`import Repo from 'travis/models/repo'` `import limit from 'travis/utils/computed-limit'` Route = BasicRoute.extend - activate: -> - if !config.pro && @pusher - @pusher.subscribeAll(['common']) - - @_super.apply(this, arguments) - @store.set('isLandingPageOpened', true) - - @controllerFor('top').set('landingPage', true) - - deactivate: -> - @_super.apply(this, arguments) - @store.set('isLandingPageOpened', false) - - @controllerFor('top').set('landingPage', false) - - setupController: (controller, model) -> + init: -> repos = Ember.ArrayProxy.extend( isLoadedBinding: 'repos.isLoaded' - repos: Repo.withLastBuild(@store) + repos: @store.filter 'repo', (repo) -> + repo.get('lastBuildId') sorted: Ember.computed.sort('repos', 'sortedReposKeys') content: limit('sorted', 'limit') sortedReposKeys: ['sortOrder:asc'] limit: 3 ).create() - controller.set('repos', repos) + @set('repos', repos) + + setInterval => + @set('letMoreReposThrough', true) + , 5000 + + @_super.apply this, arguments + + activate: -> + if !config.pro && @pusher + @pusher.subscribeAll(['common']) + + @store.addPusherEventHandlerGuard('landing-page', (event, data) => + @allowMoreRepos(event, data) + ) + + @_super.apply(this, arguments) + + @controllerFor('top').set('landingPage', true) + + allowMoreRepos: (event, data) -> + if @get('repos.length') < 3 + return true + + if event == 'build:started' && @get('letMoreReposThrough') + @set('letMoreReposThrough', false) + return true + + deactivate: -> + @_super.apply(this, arguments) + + @store.removePusherEventHandlerGuard('landing-page') + @controllerFor('top').set('landingPage', false) + + setupController: (controller, model) -> + controller.set('repos', @get('repos')) `export default Route` diff --git a/app/store.coffee b/app/store.coffee index 0d46166b..a76332c7 100644 --- a/app/store.coffee +++ b/app/store.coffee @@ -7,20 +7,18 @@ Store = DS.Store.extend init: -> @_super.apply(this, arguments) + @set('pusherEventHandlerGuards', {}) - # we will let one start event every 5 seconds to populate some repos for - # landing page - setInterval => - @set('allowMoreLandingPageRepos', true) - , 5000 + addPusherEventHandlerGuard: (name, callback) -> + @get('pusherEventHandlerGuards')[name] = callback + + removePusherEventHandlerGuard: (name) -> + delete @get('pusherEventHandlerGuards')[name] canHandleEvent: (event, data) -> - if @get('isLandingPageOpened') && @get('allowMoreLandingPageRepos') && event == 'build:started' - @set('allowMoreLandingPageRepos', false) - return true - + [name, type] = event.split(':') auth = @container.lookup('auth:main') - if !@get('isRecentTabOpen') && event != 'job:log' && auth.get('signedIn') && + if event != 'job:log' && auth.get('signedIn') && !config.pro && !config.enterprise # if recent repos hasn't been opened yet, we can safely # drop any events that doesn't belong to repos owned by @@ -33,7 +31,13 @@ Store = DS.Store.extend else if name == 'build' id = data.repository.id - return if !@hasRecordForId('repo', id) && !permissions.contains(id) + return @hasRecordForId('repo', id) || permissions.contains(id) + + for name, callback of @get('pusherEventHandlerGuards') + unless callback(event, data) + return false + + return true receivePusherEvent: (event, data) -> [name, type] = event.split(':') From 42cacb31ec88bcf62fe2e623cc61ea4815dc47ae Mon Sep 17 00:00:00 2001 From: Piotr Sarnacki Date: Thu, 2 Apr 2015 16:57:18 +0200 Subject: [PATCH 2/2] Style recent builds on landing page --- app/routes/home.coffee | 4 +- app/styles/app/landing.sass | 96 +++++++++++++++++++++++++++++++++++++ app/templates/home.hbs | 21 +++++--- 3 files changed, 114 insertions(+), 7 deletions(-) diff --git a/app/routes/home.coffee b/app/routes/home.coffee index 47b89138..9a79a480 100644 --- a/app/routes/home.coffee +++ b/app/routes/home.coffee @@ -4,10 +4,12 @@ Route = BasicRoute.extend init: -> + store = @store repos = Ember.ArrayProxy.extend( isLoadedBinding: 'repos.isLoaded' repos: @store.filter 'repo', (repo) -> - repo.get('lastBuildId') + buildId = repo.get('lastBuildId') + store.hasRecordForId('build', buildId) sorted: Ember.computed.sort('repos', 'sortedReposKeys') content: limit('sorted', 'limit') sortedReposKeys: ['sortOrder:asc'] diff --git a/app/styles/app/landing.sass b/app/styles/app/landing.sass index 1167f639..6bf87885 100644 --- a/app/styles/app/landing.sass +++ b/app/styles/app/landing.sass @@ -145,6 +145,102 @@ color: #828282 margin-bottom: 20px list-style-type: none + position: relative + height: 120px + width: 400px + padding: 10px 0 0 60px + text-align: left + + .tile-status + position: absolute + top: 0 + left: 0 + bottom: 0 + + .owner, .name + display: block + + .owner + font-size: 14px + line-height: 1.8em + .name + font-size: 22px + + .state + display: inline-block + margin-left: 4px + + .commit, .number, .branch, .finished-at + position: absolute + display: block + background-repeat: no-repeat + background-position: left center + padding-left: 23px + + .number + left: 60px + top: 65px + background-image: inline-image('svg/build-number-icon.svg') + + .commit + left: 250px + top: 65px + background-image: inline-image('svg/commit-icon.svg') + + .branch + left: 250px + top: 90px + background-image: inline-image('dashboard/branch.svg') + background-size: 19px 19px + + .finished-at + left: 60px + top: 90px + background-image: inline-image('svg/finished-icon.svg') + background-size: 19px 19px + + &.started .tile-status, + &.created .tile-status, + &.received .tile-status, + &.queued .tile-status + background-color: $start-color + &.failed .tile-status + background-color: $fail-color + &.errored .tile-status + background-color: $error-color + &.canceled .tile-status + background-color: $cancel-color + &.passed .tile-status + background-color: $pass-color + &.inactive .tile-status + background-color: $cancel-color + + &.started .owner, + &.started .name, + &.created .owner, + &.created .name, + &.received .owner, + &.received .name, + &.queued .owner, + &.queued .name + color: $start-color + &.failed .owner, + &.failed .name + color: $fail-color + &.errored .owner, + &.errored .name + color: $error-color + &.canceled .owner, + &.canceled .name + color: $cancel-color + &.passed .owner, + &.passed .name + color: $pass-color + &.inactive .owner, + &.inactive .name + color: $cancel-color + + .free-for-oss text-align: center diff --git a/app/templates/home.hbs b/app/templates/home.hbs index 905201ca..c570fa08 100644 --- a/app/templates/home.hbs +++ b/app/templates/home.hbs @@ -50,12 +50,21 @@
    {{#each repo in repos}} -
  • - {{repo.owner}}
    - {{repo.name}}
    - #{{repo.lastBuildNumber}}
    - {{landing-page-last-build-time repo.lastBuildFinishedAt}}
    +
  • + + + + {{repo.owner}} + {{repo.name}} + {{#link-to "build" repo repo.lastBuild.id class="number"}}{{repo.lastBuild.number}} {{repo.lastBuild.state}}{{/link-to}} + {{format-sha repo.lastBuild.commit.sha}} + {{repo.lastBuild.branch}} + + {{landing-page-last-build-time repo.lastBuild.finishedAt}} +
  • + {{else}} + {{/each}}
@@ -227,4 +236,4 @@ - \ No newline at end of file +