From 52dea338ee256466efdb7aacfa4c2bd11131e65b Mon Sep 17 00:00:00 2001 From: Piotr Sarnacki Date: Tue, 27 May 2014 19:05:56 +0200 Subject: [PATCH] Refactor handling accounts This commit changes a way we load accounts for profile view: * instead of using several views with profile controllers, always use one view to render hooks. This is achieved by redirecting to individual account page from main profile page (for example when going into /profile as a user drogus, the effective address will be /profile/drogus) * instead of using observers to wait for accounts to load I just use promise in ProfileRoute#model which effectively ensures that accounts are loaded at the time we want to select an individual account * profile controller is split into profile and account controller --- assets/scripts/app/controllers.coffee | 1 + assets/scripts/app/controllers/account.coffee | 35 ++++++++++++ .../app/controllers/account_index.coffee | 20 ------- .../scripts/app/controllers/accounts.coffee | 3 - assets/scripts/app/controllers/profile.coffee | 51 +---------------- assets/scripts/app/routes.coffee | 57 +++++++------------ .../{profile/tabs/hooks.hbs => account.hbs} | 0 assets/scripts/app/templates/loading.hbs | 1 + .../app/templates/profile/accounts.hbs | 2 +- assets/scripts/app/templates/profile/tabs.hbs | 6 +- assets/scripts/app/views/accounts.coffee | 2 +- assets/scripts/app/views/profile.coffee | 4 +- 12 files changed, 64 insertions(+), 118 deletions(-) create mode 100644 assets/scripts/app/controllers/account.coffee delete mode 100644 assets/scripts/app/controllers/account_index.coffee rename assets/scripts/app/templates/{profile/tabs/hooks.hbs => account.hbs} (100%) create mode 100644 assets/scripts/app/templates/loading.hbs diff --git a/assets/scripts/app/controllers.coffee b/assets/scripts/app/controllers.coffee index a6adbfc0..45ae67d1 100644 --- a/assets/scripts/app/controllers.coffee +++ b/assets/scripts/app/controllers.coffee @@ -62,6 +62,7 @@ Travis.RepoSettingsController = Em.ObjectController.extend require 'controllers/accounts' require 'controllers/auth' +require 'controllers/account' require 'controllers/build' require 'controllers/builds' require 'controllers/flash' diff --git a/assets/scripts/app/controllers/account.coffee b/assets/scripts/app/controllers/account.coffee new file mode 100644 index 00000000..d8cc6838 --- /dev/null +++ b/assets/scripts/app/controllers/account.coffee @@ -0,0 +1,35 @@ +Travis.AccountController = Ember.ObjectController.extend + allHooks: [] + + init: -> + @_super.apply this, arguments + + self = this + Travis.on("user:synced", (-> + self.reloadHooks() + )) + + toggle: (hook) -> + hook.toggle() + + reloadHooks: -> + if login = @get('login') + @set('allHooks', Travis.Hook.find(all: true, owner_name: login)) + + hooks: (-> + @reloadHooks() unless hooks = @get('allHooks') + @get('allHooks').filter (hook) -> hook.get('admin') + ).property('allHooks.length', 'allHooks') + + hooksWithoutAdmin: (-> + @reloadHooks() unless hooks = @get('allHooks') + @get('allHooks').filter (hook) -> !hook.get('admin') + ).property('allHooks.length', 'allHooks') + + showPrivateReposHint: (-> + Travis.config.show_repos_hint == 'private' + ) .property() + + showPublicReposHint: (-> + Travis.config.show_repos_hint == 'public' + ) .property() diff --git a/assets/scripts/app/controllers/account_index.coffee b/assets/scripts/app/controllers/account_index.coffee deleted file mode 100644 index 754e5b98..00000000 --- a/assets/scripts/app/controllers/account_index.coffee +++ /dev/null @@ -1,20 +0,0 @@ -Travis.AccountIndexController = Em.Controller.extend - needs: ['profile', 'currentUser'] - hooksBinding: 'controllers.profile.hooks' - allHooksBinding: 'controllers.profile.allHooks' - hooksWithoutAdminBinding: 'controllers.profile.hooksWithoutAdmin' - userBinding: 'controllers.currentUser' - - sync: -> - @get('user').sync() - - toggle: (hook) -> - hook.toggle() - - showPrivateReposHint: (-> - Travis.config.show_repos_hint == 'private' - ) .property() - - showPublicReposHint: (-> - Travis.config.show_repos_hint == 'public' - ) .property() diff --git a/assets/scripts/app/controllers/accounts.coffee b/assets/scripts/app/controllers/accounts.coffee index 213d2c85..b96965a1 100644 --- a/assets/scripts/app/controllers/accounts.coffee +++ b/assets/scripts/app/controllers/accounts.coffee @@ -1,5 +1,2 @@ Travis.AccountsController = Ember.ArrayController.extend tab: 'accounts' - - findByLogin: (login) -> - @find (account) -> account.get('login') == login diff --git a/assets/scripts/app/controllers/profile.coffee b/assets/scripts/app/controllers/profile.coffee index 330f6482..65a52dce 100644 --- a/assets/scripts/app/controllers/profile.coffee +++ b/assets/scripts/app/controllers/profile.coffee @@ -1,52 +1,19 @@ Travis.ProfileController = Travis.Controller.extend name: 'profile' - needs: ['currentUser', 'accounts'] + needs: ['currentUser', 'accounts', 'account'] userBinding: 'controllers.currentUser' - accountsBinding: 'controllers.accounts' - - init: -> - @_super.apply this, arguments - - self = this - Travis.on("user:synced", (-> - self.reloadHooks() - )) - - account: (-> - login = @get('params.login') || @get('user.login') - account = @get('accounts').filter((account) -> account if account.get('login') == login)[0] - account.select() if account - account - ).property('accounts.length', 'params.login') + accountBinding: 'controllers.account' sync: -> @get('user').sync() - toggle: (hook) -> - hook.toggle() - activate: (action, params) -> - @setParams(params || @get('params')) this["view#{$.camelize(action)}"]() viewHooks: -> @connectTab('hooks') - @reloadHooks() - - reloadHooks: -> - # TODO: figure out why user is not available sometimes - @set('allHooks', Travis.Hook.find(all: true, owner_name: @get('params.login') || @get('user.login') || Travis.lookup('controller:currentUser').get('login'))) - - hooks: (-> - @reloadHooks() unless hooks = @get('allHooks') - @get('allHooks').filter (hook) -> hook.get('admin') - ).property('allHooks.length', 'allHooks') - - hooksWithoutAdmin: (-> - @reloadHooks() unless hooks = @get('allHooks') - @get('allHooks').filter (hook) -> !hook.get('admin') - ).property('allHooks.length', 'allHooks') + @get('controllers.account').reloadHooks() viewUser: -> @connectTab('user') @@ -54,15 +21,3 @@ Travis.ProfileController = Travis.Controller.extend connectTab: (tab) -> viewClass = Travis["#{$.camelize(tab)}View"] @set('tab', tab) - - setParams: (params) -> - @set('params', {}) - @set("params.#{key}", params[key]) for key, value of params - - showPrivateReposHint: (-> - Travis.config.show_repos_hint == 'private' - ) .property() - - showPublicReposHint: (-> - Travis.config.show_repos_hint == 'public' - ) .property() diff --git a/assets/scripts/app/routes.coffee b/assets/scripts/app/routes.coffee index 9c1b59ce..79d150a1 100644 --- a/assets/scripts/app/routes.coffee +++ b/assets/scripts/app/routes.coffee @@ -72,7 +72,7 @@ Travis.Router.map -> @route 'auth', path: '/auth' @resource 'profile', path: '/profile', -> - @resource 'account', path: '/:login', -> + @resource 'account', path: '/:login' @route 'info', path: '/info' @route 'notFound', path: "/*path" @@ -279,41 +279,36 @@ Travis.NotFoundRoute = Travis.Route.extend Travis.ProfileRoute = Travis.Route.extend needsAuth: true - setupController: -> + setupController: (controller, model) -> @container.lookup('controller:application').connectLayout('profile') - @container.lookup('controller:accounts').set('content', Travis.Account.find(all: true)) + @controllerFor('accounts').set('model', model) + + model: -> + Travis.Account.fetch(all: true) renderTemplate: -> $('body').attr('id', 'profile') - @render 'accounts', outlet: 'left' + @_super.apply(this, arguments) Travis.ProfileIndexRoute = Travis.Route.extend - setupController: -> - @container.lookup('controller:profile').activate 'hooks' - - renderTemplate: -> - @render 'hooks', controller: 'profile' + redirect: -> + # TODO: setting accounts model in ProfileRoute is wrong, but + # at this stage it's better than what we had before + accounts = @modelFor('profile') + login = @controllerFor('currentUser').get('login') + account = accounts.find (account) -> account.get('login') == login + @transitionTo 'account', account Travis.AccountRoute = Travis.Route.extend + setupController: (controller, account) -> + @_super.apply this, arguments + + @controllerFor('profile').activate 'hooks' + model: (params) -> - controller = @container.lookup('controller:accounts') - account = controller.findByLogin(params.login) - - if account - account - else - content = Ember.Object.create(login: params.login) - proxy = Ember.ObjectProxy.create(content: content) - - observer = -> - if account = controller.findByLogin(params.login) - controller.removeObserver 'content.length', observer - proxy.set('content', account) - controller.addObserver 'content.length', observer - - proxy + @modelFor('profile').find (account) -> account.get('login') == params.login serialize: (account) -> if account && account.get @@ -321,18 +316,6 @@ Travis.AccountRoute = Travis.Route.extend else {} -Travis.AccountIndexRoute = Travis.Route.extend - setupController: (controller) -> - profileController = @container.lookup('controller:profile') - profileController.activate 'hooks' - - if account = @modelFor('account') - params = { login: account.get('login') } - profileController.setParams(params) - - renderTemplate: -> - @render 'hooks' - Travis.ProfileInfoRoute = Travis.Route.extend setupController: -> @container.lookup('controller:profile').activate 'user' diff --git a/assets/scripts/app/templates/profile/tabs/hooks.hbs b/assets/scripts/app/templates/account.hbs similarity index 100% rename from assets/scripts/app/templates/profile/tabs/hooks.hbs rename to assets/scripts/app/templates/account.hbs diff --git a/assets/scripts/app/templates/loading.hbs b/assets/scripts/app/templates/loading.hbs new file mode 100644 index 00000000..0277cf2e --- /dev/null +++ b/assets/scripts/app/templates/loading.hbs @@ -0,0 +1 @@ +
Loading
diff --git a/assets/scripts/app/templates/profile/accounts.hbs b/assets/scripts/app/templates/profile/accounts.hbs index 09c3a2df..3a02f44f 100644 --- a/assets/scripts/app/templates/profile/accounts.hbs +++ b/assets/scripts/app/templates/profile/accounts.hbs @@ -9,7 +9,7 @@
{{#collection Travis.AccountsListView contentBinding="controller"}} - {{#link-to "account.index" view.account class="name"}}{{view.name}}{{/link-to}} + {{#link-to "account" view.account class="name"}}{{view.name}}{{/link-to}}

Repositories: {{view.account.reposCount}} diff --git a/assets/scripts/app/templates/profile/tabs.hbs b/assets/scripts/app/templates/profile/tabs.hbs index eb45d004..ac00dfcf 100644 --- a/assets/scripts/app/templates/profile/tabs.hbs +++ b/assets/scripts/app/templates/profile/tabs.hbs @@ -1,11 +1,7 @@