diff --git a/app/routes/home.coffee b/app/routes/home.coffee index da0c5f4c..9a79a480 100644 --- a/app/routes/home.coffee +++ b/app/routes/home.coffee @@ -1,34 +1,56 @@ `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: -> + store = @store repos = Ember.ArrayProxy.extend( isLoadedBinding: 'repos.isLoaded' - repos: Repo.withLastBuild(@store) + repos: @store.filter 'repo', (repo) -> + buildId = repo.get('lastBuildId') + store.hasRecordForId('build', buildId) 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(':') diff --git a/app/styles/app/landing.sass b/app/styles/app/landing.sass index 553d6288..9eb4fb70 100644 --- a/app/styles/app/landing.sass +++ b/app/styles/app/landing.sass @@ -157,6 +157,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 95a5b9b6..2a79ad92 100644 --- a/app/templates/home.hbs +++ b/app/templates/home.hbs @@ -44,12 +44,21 @@
@@ -221,4 +230,4 @@ - \ No newline at end of file +