From 05489d4a0a5e4552ea70d5e87bf264d54251f1df Mon Sep 17 00:00:00 2001 From: Piotr Sarnacki Date: Mon, 28 Jul 2014 12:42:21 +0200 Subject: [PATCH] Change tabs to work with routes and outlets instead of helpers When I started working on settings I had a bit different vision on tabs and I've added that code prematurely. It seems that the best way to go is to create separate routes and controllers for each tab - that way we can just rely on Ember.js for customizing, not some custom code in tabs helpers etc. --- assets/scripts/app/controllers.coffee | 22 +----- .../app/controllers/repo_settings.coffee | 30 ++++++++ assets/scripts/app/helpers/handlebars.coffee | 68 +++---------------- assets/scripts/app/routes.coffee | 8 +-- .../scripts/app/templates/repo/settings.hbs | 28 +------- .../app/templates/repo/settings/index.hbs | 25 +++++++ 6 files changed, 70 insertions(+), 111 deletions(-) create mode 100644 assets/scripts/app/controllers/repo_settings.coffee create mode 100644 assets/scripts/app/templates/repo/settings/index.hbs diff --git a/assets/scripts/app/controllers.coffee b/assets/scripts/app/controllers.coffee index 0c74d1e3..46e535a8 100644 --- a/assets/scripts/app/controllers.coffee +++ b/assets/scripts/app/controllers.coffee @@ -50,27 +50,6 @@ Travis.FirstSyncController = Em.Controller.extend Travis.IndexErrorController = Em.Controller.extend() -Travis.RepoSettingsTabController = Em.ObjectController.extend() -Travis.RepoSettingsController = Em.ObjectController.extend - needs: ['repoSettingsTab'] - tab: Ember.computed.alias('controllers.repoSettingsTab.model.tab') - settings: Ember.computed.alias('model.settings') - - settingsChanged: (-> - value = @get('settings.maximum_number_of_builds') - console.log value - if parseInt(value) > 0 || value == '0' || value == 0 - @set('settings.maximum_number_of_builds_valid', '') - @get('model').saveSettings(@get('settings')).then null, -> - Travis.flash(error: 'There was an error while saving settings. Please try again.') - else - @set('settings.maximum_number_of_builds_valid', 'invalid') - ).observes('settings.maximum_number_of_builds') - - save: -> - @get('model').saveSettings(@get('settings')).then null, -> - Travis.flash(error: 'There was an error while saving settings. Please try again.') - require 'controllers/accounts' require 'controllers/auth' require 'controllers/account' @@ -82,6 +61,7 @@ require 'controllers/job' require 'controllers/profile' require 'controllers/repos' require 'controllers/repo' +require 'controllers/repo_settings' require 'controllers/stats' require 'controllers/current_user' require 'controllers/request' diff --git a/assets/scripts/app/controllers/repo_settings.coffee b/assets/scripts/app/controllers/repo_settings.coffee new file mode 100644 index 00000000..4fb7ef25 --- /dev/null +++ b/assets/scripts/app/controllers/repo_settings.coffee @@ -0,0 +1,30 @@ +Travis.RepoSettingsController = Em.ObjectController.extend + tabs: + index: "General Settings" + env_vars: "Environment variables" + ssh_key: "Ssh key" + + init: -> + @_super.apply this, arguments + + tabs = [] + @set('_tabs', tabs) + for own id, name of @get('tabs') + tabs.pushObject Travis.Tab.create(id: id, name: name) + + settings: Ember.computed.alias('model.settings') + + settingsChanged: (-> + value = @get('settings.maximum_number_of_builds') + console.log value + if parseInt(value) > 0 || value == '0' || value == 0 + @set('settings.maximum_number_of_builds_valid', '') + @get('model').saveSettings(@get('settings')).then null, -> + Travis.flash(error: 'There was an error while saving settings. Please try again.') + else + @set('settings.maximum_number_of_builds_valid', 'invalid') + ).observes('settings.maximum_number_of_builds') + + save: -> + @get('model').saveSettings(@get('settings')).then null, -> + Travis.flash(error: 'There was an error while saving settings. Please try again.') diff --git a/assets/scripts/app/helpers/handlebars.coffee b/assets/scripts/app/helpers/handlebars.coffee index cbd630be..a4bd535e 100644 --- a/assets/scripts/app/helpers/handlebars.coffee +++ b/assets/scripts/app/helpers/handlebars.coffee @@ -4,83 +4,33 @@ safe = (string) -> new Handlebars.SafeString(string) Travis.Tab = Ember.Object.extend - show: -> - @get('tabs').forEach( (t) -> t.hide() ) - @set('visible', true) - - hide: -> - @set('visible', false) + url: (-> + id = @get('id') + if id == 'env_vars' + id + else + "repo.settings.#{id}" + ).property('id') Travis.TabsView = Ember.View.extend tabBinding: 'controller.tab' tabsBinding: 'controller.tabs' - tabDidChange: (-> - @activateTab(@get('tab')) - ).observes('tab') - - tabsDidChange: (-> - tab = @get('tab') - if tab - @activateTab(tab) - else if @get('tabs.length') - @activateTab(@get('tabs.firstObject.id')) - ).observes('tabs.length', 'tabs') - - activateTab: (tabId) -> - tab = @get('tabs').findBy('id', tabId) - - return unless tab - - tab.show() unless tab.get('visible') - # TODO: remove hardcoded link layout: Ember.Handlebars.compile( '' + '{{yield}}') -Travis.TabView = Ember.View.extend - attributeBindings: ['style'] - - style: (-> - if !@get('tab.visible') - 'display: none' - ).property('tab.visible') - -Ember.Handlebars.registerHelper('travis-tab', (id, name, options) -> - controller = this - controller.set('tabs', []) unless controller.get('tabs') - - tab = Travis.Tab.create(id: id, name: name, tabs: controller.get('tabs')) - - view = Travis.TabView.create( - controller: this - tab: tab - ) - - controller = this - Ember.run.schedule('afterRender', -> - if controller.get('tabs.length') == 0 - tab.show() - controller.get('tabs').pushObject(tab) - ) - - Ember.Handlebars.helpers.view.call(this, view, options) -) - - Ember.Handlebars.registerHelper('travis-tabs', (options) -> template = options.fn delete options.fn - @set('tabs', []) - view = Travis.TabsView.create( controller: this template: template diff --git a/assets/scripts/app/routes.coffee b/assets/scripts/app/routes.coffee index 79d150a1..c0f35df4 100644 --- a/assets/scripts/app/routes.coffee +++ b/assets/scripts/app/routes.coffee @@ -64,7 +64,7 @@ Travis.Router.map -> # this can't be nested in repo, because we want a set of different # templates rendered for settings (for example no "current", "builds", ... tabs) @resource 'repo.settings', path: '/:owner/:name/settings', -> - @route 'tab', path: ':tab' + @route 'index', path: '/' @route 'first_sync' @route 'insufficient_oauth_permissions' @@ -356,8 +356,8 @@ Travis.RepoSettingsRoute = Travis.Route.extend slug = "#{params.owner}/#{params.name}" Travis.Repo.fetchBySlug(slug) - afterModel: (repo) -> - # I'm using afterModel to fetch settings, because model is not always called. - # If link-to already provides a model, it will be just set as a route context. +Travis.RepoSettingsIndexRoute = Travis.Route.extend + model: -> + repo = @modelFor('repo_settings') repo.fetchSettings().then (settings) -> repo.set('settings', settings) diff --git a/assets/scripts/app/templates/repo/settings.hbs b/assets/scripts/app/templates/repo/settings.hbs index 3143ec48..00a57ea4 100644 --- a/assets/scripts/app/templates/repo/settings.hbs +++ b/assets/scripts/app/templates/repo/settings.hbs @@ -2,32 +2,6 @@

Settings: {{#link-to "repo" this}}{{slug}}{{/link-to}}

{{#travis-tabs}} - {{#travis-tab "general" "General Settings"}} - {{#settings-form}} -

- Build only if .travis.yml is present - {{travis-switch action="save" active=settings.builds_only_with_travis_yml}} -

- -

- Build pushes - {{travis-switch action="save" active=settings.build_pushes}} -

- -

- Build pull requests - {{travis-switch action="save" active=settings.build_pull_requests}} -

- -

-

- {{input value=settings.maximum_number_of_builds size="4" pattern='/^[0-9]+$/'}} -

- -

- {{/settings-form}} - {{/travis-tab}} + {{outlet}} {{/travis-tabs}} diff --git a/assets/scripts/app/templates/repo/settings/index.hbs b/assets/scripts/app/templates/repo/settings/index.hbs new file mode 100644 index 00000000..5dc4a5ca --- /dev/null +++ b/assets/scripts/app/templates/repo/settings/index.hbs @@ -0,0 +1,25 @@ +{{#settings-form}} +

+ Build only if .travis.yml is present + {{travis-switch action="save" active=settings.builds_only_with_travis_yml}} +

+ +

+ Build pushes + {{travis-switch action="save" active=settings.build_pushes}} +

+ +

+ Build pull requests + {{travis-switch action="save" active=settings.build_pull_requests}} +

+ +

+

+ {{input value=settings.maximum_number_of_builds size="4" pattern='/^[0-9]+$/'}} +

+ +

+{{/settings-form}}