diff --git a/assets/scripts/app/controllers/sidebar.coffee b/assets/scripts/app/controllers/sidebar.coffee index 83e3dfac..c8a9f644 100644 --- a/assets/scripts/app/controllers/sidebar.coffee +++ b/assets/scripts/app/controllers/sidebar.coffee @@ -15,31 +15,12 @@ Travis.reopen groups = {} for worker in content.toArray() host = worker.get('host') - groups[host] = Em.ArrayProxy.create(content: []) unless groups[host] - groups[host].pushObject(worker) - - prepareForSort = (str) -> - match = str.match /(.*?)-(\d+)/ - name = match[1] - id = match[2].toString() - if id.length < 2 - id = "00#{id}" - else if id.length < 3 - id = "0#{id}" - - "#{name}-#{id}" - - for own host, workers of groups - groups[host] = workers.toArray().sort (a, b) -> - a = prepareForSort a.get('name') - b = prepareForSort b.get('name') - - if a < b - -1 - else if b < a - 1 - else - 0 + unless groups[host] + groups[host] = Em.ArrayProxy.create(Em.SortableMixin, + content: [], + sortProperties: ['nameForSort'] + ) + groups[host].addObject(worker) $.values(groups) ).property('length') diff --git a/assets/scripts/app/models/worker.coffee b/assets/scripts/app/models/worker.coffee index 2beb1e6b..b0039c26 100644 --- a/assets/scripts/app/models/worker.coffee +++ b/assets/scripts/app/models/worker.coffee @@ -29,3 +29,17 @@ require 'travis/model' job: (-> Travis.Job.find @get('job_id') ).property('job_id') + + nameForSort: (-> + if name = @get('name') + match = name.match /(.*?)-(\d+)/ + if match + name = match[1] + id = match[2].toString() + if id.length < 2 + id = "00#{id}" + else if id.length < 3 + id = "0#{id}" + + "#{name}-#{id}" + ).property('name') diff --git a/public/scripts/app.js b/public/scripts/app.js index 27f2494f..369cbb35 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 signOut: function() {\n this.get('auth').signOut();\n return this.get('router').send('showRoot');\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: $('