From acb70dcac7114e82ec64f64b16df848deafe49a9 Mon Sep 17 00:00:00 2001 From: Piotr Sarnacki Date: Tue, 24 Feb 2015 16:16:11 +0100 Subject: [PATCH] First stab at changing favicon based on build or job state --- app/controllers/build.coffee | 4 ++++ app/controllers/job.coffee | 4 ++++ app/mixins/build-favicon.coffee | 36 +++++++++++++++++++++++++++++ app/routes/abstract-builds.coffee | 2 ++ app/routes/application.coffee | 3 ++- app/routes/build.coffee | 1 + app/routes/main-tab.coffee | 2 ++ app/routes/pull-requests.coffee | 1 + app/routes/repo/index.coffee | 2 ++ app/utils/favicon-manager.coffee | 38 +++++++++++++++++++++++++++++++ 10 files changed, 92 insertions(+), 1 deletion(-) create mode 100644 app/mixins/build-favicon.coffee create mode 100644 app/utils/favicon-manager.coffee diff --git a/app/controllers/build.coffee b/app/controllers/build.coffee index 91c14983..6ce36f33 100644 --- a/app/controllers/build.coffee +++ b/app/controllers/build.coffee @@ -23,4 +23,8 @@ Controller = Ember.Controller.extend GithubUrlPropertievs, gravatarImage(@get('commit.authorEmail'), 40) ).property('commit.authorEmail') + buildStateDidChange: (-> + @send('faviconStateDidChange', @get('build.state')) + ).observes('build.state') + `export default Controller` diff --git a/app/controllers/job.coffee b/app/controllers/job.coffee index f05e44ad..f262a0e4 100644 --- a/app/controllers/job.coffee +++ b/app/controllers/job.coffee @@ -16,4 +16,8 @@ Controller = Ember.Controller.extend githubCommit(@get('repo.slug'), @get('commit.sha')) ).property('repo.slug', 'commit.sha') + jobStateDidChange: (-> + @send('faviconStateDidChange', @get('job.state')) + ).observes('job.state') + `export default Controller` diff --git a/app/mixins/build-favicon.coffee b/app/mixins/build-favicon.coffee new file mode 100644 index 00000000..47e5701a --- /dev/null +++ b/app/mixins/build-favicon.coffee @@ -0,0 +1,36 @@ +`import Ember from 'ember'` +`import { colorForState } from 'travis/utils/helpers'` +`import FaviconManager from 'travis/utils/favicon-manager'` + +Mixin = Ember.Mixin.create + actions: + faviconStateDidChange: (state) -> + if state + @setFaviconForState(state) + else + @setDefault() + + init: -> + @faviconManager = new FaviconManager() + + @_super.apply this, arguments + + setFaviconForState: (state) -> + color = colorForState(state) + + images = { + red: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP4z8DwHwAFAAH/VscvDQAAAABJRU5ErkJggg==', + yellow: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP4/5ThPwAHrwLktvrIVgAAAABJRU5ErkJggg==', + green: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mOwv276HwAE7wJLzZ3V0gAAAABJRU5ErkJggg==', + gray: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mMoqyj7DwAFMAJkMSbkxgAAAABJRU5ErkJggg==' + } + + @setFavicon(images[color]) + + setDefault: -> + @setFavicon('data:image/png;base64,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') + + setFavicon: (href) -> + @faviconManager.setFavicon(href) + +`export default Mixin` diff --git a/app/routes/abstract-builds.coffee b/app/routes/abstract-builds.coffee index 1fc355ba..1a79b7ec 100644 --- a/app/routes/abstract-builds.coffee +++ b/app/routes/abstract-builds.coffee @@ -15,6 +15,8 @@ Route = TravisRoute.extend deactivate: -> @controllerFor('repo').removeObserver(@get('path'), this, 'contentDidChange') + @_super.apply(this, arguments) + contentDidChange: -> path = @get('path') @controllerFor('builds').set('model', @controllerFor('repo').get(path)) diff --git a/app/routes/application.coffee b/app/routes/application.coffee index 2e17f470..c46573fe 100644 --- a/app/routes/application.coffee +++ b/app/routes/application.coffee @@ -1,7 +1,8 @@ `import TravisRoute from 'travis/routes/basic'` `import config from 'travis/config/environment'` +`import BuildFaviconMixin from 'travis/mixins/build-favicon'` -Route = TravisRoute.extend +Route = TravisRoute.extend BuildFaviconMixin, needsAuth: false renderTemplate: -> diff --git a/app/routes/build.coffee b/app/routes/build.coffee index a1227588..2703be70 100644 --- a/app/routes/build.coffee +++ b/app/routes/build.coffee @@ -22,6 +22,7 @@ Route = TravisRoute.extend @store.find('build', params.build_id) deactivate: -> + @_super.apply(this, arguments) @controllerFor('job').set('job', null) @controllerFor('build').set('build', null) diff --git a/app/routes/main-tab.coffee b/app/routes/main-tab.coffee index d35a328a..bbc1d4da 100644 --- a/app/routes/main-tab.coffee +++ b/app/routes/main-tab.coffee @@ -17,6 +17,8 @@ Route = TravisRoute.extend deactivate: -> @controllerFor('repos').removeObserver('firstObject', this, 'currentRepoDidChange') + @_super.apply(this, arguments) + currentRepoDidChange: -> if repo = @controllerFor('repos').get('firstObject') @controllerFor('repo').set('repo', repo) diff --git a/app/routes/pull-requests.coffee b/app/routes/pull-requests.coffee index 121aa633..4253f7c0 100644 --- a/app/routes/pull-requests.coffee +++ b/app/routes/pull-requests.coffee @@ -10,6 +10,7 @@ Route = AbstractBuildsRoute.extend( this.controllerFor('builds').set('isPullRequestsList', true) deactivate: -> + @_super.apply(this, arguments) this.controllerFor('builds').set('isPullRequestsList', false) ) diff --git a/app/routes/repo/index.coffee b/app/routes/repo/index.coffee index 348425cf..0715b315 100644 --- a/app/routes/repo/index.coffee +++ b/app/routes/repo/index.coffee @@ -16,4 +16,6 @@ Route = TravisRoute.extend @controllerFor('build').set('build', null) @controllerFor('job').set('job', null) + @_super.apply(this, arguments) + `export default Route` diff --git a/app/utils/favicon-manager.coffee b/app/utils/favicon-manager.coffee new file mode 100644 index 00000000..47b90619 --- /dev/null +++ b/app/utils/favicon-manager.coffee @@ -0,0 +1,38 @@ +`import Ember from 'ember'` + +manager = (headTag) -> + @headTag = headTag if headTag + + return this + +manager.prototype.getHeadTag = -> + @headTag || document.getElementsByTagName('head')[0] + +manager.prototype.setFavicon = (href) -> + link = @getLinkTag() + + if !link + oldLink = link + link = @createLinkTag() + head = @getHeadTag() + head.appendChild(link) + + link.setAttribute('href', href) + + if oldLink + head.removeChild(oldLink) + +manager.prototype.getLinkTag = -> + links = document.getElementsByTagName('head')[0].getElementsByTagName('link') + if links.length + for link in links + if link.getAttribute('rel').trim() == 'icon' + return link + +manager.prototype.createLinkTag = -> + link = document.createElement('link') + link.setAttribute('rel', 'icon') + link.setAttribute('type', 'image/png') + document.getElementsByTagName('head')[0].appendChild(link) + +`export default manager`