diff --git a/assets/scripts/app/controllers/flash.coffee b/assets/scripts/app/controllers/flash.coffee index 294bd2ab..48b336e3 100644 --- a/assets/scripts/app/controllers/flash.coffee +++ b/assets/scripts/app/controllers/flash.coffee @@ -1,8 +1,38 @@ Travis.FlashController = Ember.ArrayController.extend + broadcastBinding: 'Travis.app.currentUser.broadcasts' + init: -> @_super.apply this, arguments @set('content', Ember.A()) - pushObjects: (objects) -> - Ember.run.later(this, (-> @removeObjects(objects)), 10000) - @_super(objects) + broadcasts: (-> + Travis.Broadcast.find() if Travis.app.get('currentUser') + ).property('Travis.app.currentUser') + + broadcastsObserver: (-> + if broadcasts = @get('broadcasts') + broadcasts.forEach (msg) => @pushObject(msg.toObject()) unless @isSeenBroadcast(msg) + ).observes('broadcasts.length') + + loadFlashes: (msgs) -> + for msg in msgs + type = Ember.keys(msg)[0] + msg = { type: type, message: msg[type] } + @pushObject(msg) + Ember.run.later(this, (-> @removeObject(msg)), 15000) + + close: (msg) -> + @storeSeenBroadcast(msg) if msg.type == 'broadcast' + @removeObject(msg) + + isSeenBroadcast: (msg) -> + msg.get('id') in @seenBroadcasts() + + seenBroadcasts: -> + seen = localStorage.getItem('travis.seen_broadcasts') + if seen then JSON.parse(seen) else [] + + storeSeenBroadcast: (msg) -> + seen = @seenBroadcasts() + seen.push(msg.id) + localStorage.setItem('travis.seen_broadcasts', JSON.stringify(seen)) diff --git a/assets/scripts/app/models.coffee b/assets/scripts/app/models.coffee index 4ff0bdb6..28064194 100644 --- a/assets/scripts/app/models.coffee +++ b/assets/scripts/app/models.coffee @@ -1,6 +1,7 @@ require 'models/extensions' require 'models/account' require 'models/artifact' +require 'models/broadcast' require 'models/branch' require 'models/build' require 'models/commit' diff --git a/assets/scripts/app/models/broadcast.coffee b/assets/scripts/app/models/broadcast.coffee new file mode 100644 index 00000000..e00b659b --- /dev/null +++ b/assets/scripts/app/models/broadcast.coffee @@ -0,0 +1,11 @@ +require 'travis/model' + +@Travis.Broadcast = Travis.Model.extend + message: DS.attr('string') + + toObject: -> + { type: 'broadcast', id: @get('id'), message: @get('message') } + +@Travis.Broadcast.reopenClass + # TODO fix or monkey-patch the adapter's url and key lookup/generation crap + # url: 'users/broadcasts' diff --git a/assets/scripts/app/store/rest_adapter.coffee b/assets/scripts/app/store/rest_adapter.coffee index d28c2393..f3e1df6c 100644 --- a/assets/scripts/app/store/rest_adapter.coffee +++ b/assets/scripts/app/store/rest_adapter.coffee @@ -3,6 +3,7 @@ require 'models' @Travis.RestAdapter = DS.RESTAdapter.extend mappings: + broadcasts: Travis.Broadcast repositories: Travis.Repo repository: Travis.Repo repos: Travis.Repo diff --git a/assets/scripts/app/templates/layouts/flash.hbs b/assets/scripts/app/templates/layouts/flash.hbs index 81b02190..07d9ebdb 100644 --- a/assets/scripts/app/templates/layouts/flash.hbs +++ b/assets/scripts/app/templates/layouts/flash.hbs @@ -1,6 +1,6 @@ {{#each flash in controller}} {{#view Travis.FlashItemView flashBinding="flash"}} -

{{view.message}}

+

{{{flash.message}}}

{{/view}} {{/each}} diff --git a/assets/scripts/app/views/application.coffee b/assets/scripts/app/views/application.coffee index 61f8366a..57c2a90e 100644 --- a/assets/scripts/app/views/application.coffee +++ b/assets/scripts/app/views/application.coffee @@ -3,8 +3,9 @@ templateName: 'application' classNames: ['application'] - popup: (event) -> - console.log event + # popup: (event) -> + # console.log event + localeDidChange: (-> if locale = Travis.app.get('auth.user.locale') Travis.setLocale(locale) diff --git a/assets/scripts/app/views/flash.coffee b/assets/scripts/app/views/flash.coffee index 44e05f01..2800abe0 100644 --- a/assets/scripts/app/views/flash.coffee +++ b/assets/scripts/app/views/flash.coffee @@ -6,15 +6,7 @@ FlashItemView: Travis.View.extend tagName: 'li' - classNameBindings: ['type'] - - type: (-> - @get('flash') && Ember.keys(@get('flash'))[0] - ).property('flash') - - message: (-> - @get('flash') && @get('flash')[@get('type')] - ).property('flash') + classNameBindings: ['flash.type'] close: (event) -> - @get('controller').removeObject(@get('flash')) + @get('controller').close(@get('flash')) diff --git a/assets/scripts/lib/travis/ajax.coffee b/assets/scripts/lib/travis/ajax.coffee index 8aca5657..07630660 100644 --- a/assets/scripts/lib/travis/ajax.coffee +++ b/assets/scripts/lib/travis/ajax.coffee @@ -30,7 +30,7 @@ jQuery.support.cors = true success = options.success || (->) options.success = (data) => - Travis.app.router.flashController.pushObjects(data.flash) if Travis.app?.router && data.flash + Travis.app.router.flashController.loadFlashes(data.flash) if Travis.app?.router && data.flash delete data.flash success.call(this, data) diff --git a/assets/styles/_mixins/colors.sass b/assets/styles/_mixins/colors.sass index cc6e9589..2cccaa37 100644 --- a/assets/styles/_mixins/colors.sass +++ b/assets/styles/_mixins/colors.sass @@ -103,6 +103,11 @@ $color-bg-list-info: $yellow-light-2 $color-text-list-info: $slate-yellow-1 $color-shadow-list-info: $slate-yellow-2 +$color-bg-flash-success: #ebfcc2 +$color-bg-flash-notice: lightGoldenrodYellow +$color-bg-flash-error: #f5d7d3 +$color-bg-flash-broadcast: #efefef + #colors .black diff --git a/assets/styles/app/flash.sass b/assets/styles/app/flash.sass index 1dc61eaf..033b8b71 100644 --- a/assets/styles/app/flash.sass +++ b/assets/styles/app/flash.sass @@ -11,14 +11,20 @@ @include box-shadow(transparent 0 0 0 0, $color-border-normal 0 1px 6px 0, transparent 0 0 0 0, transparent 0 0 0 0) border-bottom: 1px solid $color-border-light + a + text-decoration: underline + .success - background-color: #ebfcc2 + background-color: $color-bg-flash-success .notice - background-color: lightGoldenrodYellow + background-color: $color-bg-flash-notice .error - background-color: #f5d7d3 + background-color: $color-bg-flash-error + + .broadcast + background-color: $color-bg-flash-broadcast p margin: 0 diff --git a/lib/travis/web/app.rb b/lib/travis/web/app.rb index 6cf55f68..ff57e257 100644 --- a/lib/travis/web/app.rb +++ b/lib/travis/web/app.rb @@ -94,8 +94,8 @@ class Travis::Web::App end def set_config(string) - string.gsub! %r(]*>) do - %() + string.gsub! %r(]*>) do + %() end string.gsub! %r{(src|href)="(\/?)((styles|scripts)\/[^"]*)"} do @@ -113,4 +113,4 @@ class Travis::Web::App builder.run router builder end -end \ No newline at end of file +end diff --git a/public/scripts/app.js b/public/scripts/app.js index cba2f34b..66e7ad66 100644 --- a/public/scripts/app.js +++ b/public/scripts/app.js @@ -29619,4 +29619,4 @@ var _require=function(){function c(a,c){document.addEventListener?a.addEventList ++g&&setTimeout(c,0)})}}(); (function(){!window.WebSocket&&window.MozWebSocket&&(window.WebSocket=window.MozWebSocket);if(window.WebSocket)Pusher.Transport=window.WebSocket,Pusher.TransportType="native";var c=(document.location.protocol=="http:"?Pusher.cdn_http:Pusher.cdn_https)+Pusher.VERSION,a=[];window.JSON||a.push(c+"/json2"+Pusher.dependency_suffix+".js");if(!window.WebSocket)window.WEB_SOCKET_DISABLE_AUTO_INITIALIZATION=!0,a.push(c+"/flashfallback"+Pusher.dependency_suffix+".js");var b=function(){return window.WebSocket?function(){Pusher.ready()}: function(){window.WebSocket?(Pusher.Transport=window.WebSocket,Pusher.TransportType="flash",window.WEB_SOCKET_SWF_LOCATION=c+"/WebSocketMain.swf",WebSocket.__addTask(function(){Pusher.ready()}),WebSocket.__initialize()):(Pusher.Transport=null,Pusher.TransportType="none",Pusher.ready())}}(),e=function(a){var b=function(){document.body?a():setTimeout(b,0)};b()},g=function(){e(b)};a.length>0?_require(a,g):g()})(); -;minispade.register('app', "(function() {(function() {\nminispade.require('auth');\nminispade.require('controllers');\nminispade.require('helpers');\nminispade.require('models');\nminispade.require('pusher');\nminispade.require('routes');\nminispade.require('slider');\nminispade.require('store');\nminispade.require('tailing');\nminispade.require('templates');\nminispade.require('views');\nminispade.require('config/locales');\nminispade.require('data/sponsors');\n\n Travis.reopen({\n App: Em.Application.extend({\n autoinit: false,\n currentUserBinding: 'auth.user',\n authStateBinding: 'auth.state',\n init: function() {\n this._super.apply(this, arguments);\n this.store = Travis.Store.create();\n this.store.loadMany(Travis.Sponsor, Travis.SPONSORS);\n this.set('auth', Travis.Auth.create({\n app: this,\n endpoint: Travis.config.api_endpoint\n }));\n this.slider = new Travis.Slider();\n this.pusher = new Travis.Pusher(Travis.config.pusher_key);\n return this.tailing = new Travis.Tailing();\n },\n signIn: function() {\n return this.get('auth').signIn();\n },\n autoSignIn: function() {\n return this.get('auth').autoSignIn();\n },\n signOut: function() {\n this.get('auth').signOut();\n return this.get('router').send('afterSignOut');\n },\n receive: function() {\n return this.store.receive.apply(this.store, arguments);\n },\n toggleSidebar: function() {\n var element;\n $('body').toggleClass('maximized');\n element = $('');\n $('#top .profile').append(element);\n Em.run.later((function() {\n return element.remove();\n }), 10);\n element = $('');\n $('#repo').append(element);\n return Em.run.later((function() {\n return element.remove();\n }), 10);\n }\n })\n });\n\n}).call(this);\n\n})();\n//@ sourceURL=app");minispade.register('auth', "(function() {(function() {\n\n this.Travis.Auth = Ember.Object.extend({\n iframe: $('