diff --git a/assets/images/ui/bubbles-spinner.svg b/assets/images/ui/bubbles-spinner.svg new file mode 100644 index 00000000..abea1057 --- /dev/null +++ b/assets/images/ui/bubbles-spinner.svg @@ -0,0 +1,29 @@ + diff --git a/assets/images/ui/secure.png b/assets/images/ui/secure.png new file mode 100644 index 00000000..8bb37b0d Binary files /dev/null and b/assets/images/ui/secure.png differ diff --git a/assets/scripts/app/app.coffee b/assets/scripts/app/app.coffee index f866d741..6514083f 100644 --- a/assets/scripts/app/app.coffee +++ b/assets/scripts/app/app.coffee @@ -22,10 +22,13 @@ unless window.TravisApplication annotations: Travis.Annotation request: Travis.Request requests: Travis.Request + env_var: Travis.EnvVar + env_vars: Travis.EnvVar + ssh_key: Travis.SshKey ).property() modelClasses: (-> - [Travis.User, Travis.Build, Travis.Job, Travis.Repo, Travis.Commit, Travis.Worker, Travis.Account, Travis.Broadcast, Travis.Hook, Travis.Annotation, Travis.Request] + [Travis.User, Travis.Build, Travis.Job, Travis.Repo, Travis.Commit, Travis.Worker, Travis.Account, Travis.Broadcast, Travis.Hook, Travis.Annotation, Travis.Request, Travis.EnvVar, Travis.SshKey] ).property() setup: -> @@ -33,6 +36,12 @@ unless window.TravisApplication klass.adapter = Travis.Adapter.create() klass.url = "/#{klass.pluralName()}" + Travis.EnvVar.url = "/settings/env_vars" + Travis.EnvVar.adapter = Travis.EnvVarsAdapter.create() + + Travis.SshKey.url = "/settings/ssh_key" + Travis.SshKey.adapter = Travis.SshKeyAdapter.create() + @slider = new Travis.Slider() @pusher = new Travis.Pusher(Travis.config.pusher_key) if Travis.config.pusher_key @tailing = new Travis.Tailing($(window), '#tail', '#log') diff --git a/assets/scripts/app/controllers.coffee b/assets/scripts/app/controllers.coffee index 718b331b..d44c02a0 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,8 +61,13 @@ 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' require 'controllers/requests' require 'controllers/caches' +require 'controllers/env_var' +require 'controllers/env_vars' +require 'controllers/env_var_new' +require 'controllers/ssh_key' diff --git a/assets/scripts/app/controllers/env_var.coffee b/assets/scripts/app/controllers/env_var.coffee new file mode 100644 index 00000000..c0fe6179 --- /dev/null +++ b/assets/scripts/app/controllers/env_var.coffee @@ -0,0 +1,52 @@ +require 'travis/validations' + +Travis.EnvVarController = Ember.ObjectController.extend Travis.Validations, + isEditing: false + isDeleting: false + + validates: + name: ['presence'] + + actionType: 'Save' + showValueField: Ember.computed.alias('public') + + value: ( (key, value) -> + if arguments.length == 2 + @get('model').set('value', value) + value + else if @get('public') + @get('model.value') + else + '••••••••••••••••' + ).property('model.value', 'public') + + actions: + delete: -> + return if @get('isDeleting') + @set('isDeleting', true) + + deletingDone = => @set('isDeleting', false) + @get('model').deleteRecord().then deletingDone, deletingDone + + edit: -> + @set('isEditing', true) + + cancel: -> + @set('isEditing', false) + @get('model').revert() + + save: -> + return if @get('isSaving') + @set('isSaving', true) + + if @isValid() + env_var = @get('model') + + # TODO: handle errors + env_var.save().then => + @set('isEditing', false) + @set('isSaving', false) + , => + @set('isSaving', false) + else + @set('isSaving', false) diff --git a/assets/scripts/app/controllers/env_var_new.coffee b/assets/scripts/app/controllers/env_var_new.coffee new file mode 100644 index 00000000..2aac40e2 --- /dev/null +++ b/assets/scripts/app/controllers/env_var_new.coffee @@ -0,0 +1,41 @@ +require 'travis/validations' + +Travis.EnvVarsNewController = Travis.Controller.extend Travis.Validations, + needs: ['repo'] + repo: Ember.computed.alias('controllers.repo.repo') + + validates: + name: ['presence'] + + actionType: 'Add' + showValueField: true + + reset: -> + @setProperties(name: null, value: null, public: null) + + actions: + cancel: -> + @reset() + @transitionToRoute('env_vars') + + save: -> + return if @get('isSaving') + @set('isSaving', true) + + if @isValid() + env_var = Travis.EnvVar.create( + name: @get('name') + value: @get('value') + public: @get('public') + repo: @get('repo') + ) + + self = this + env_var.save().then => + @set('isSaving', false) + @reset() + self.transitionToRoute('env_vars') + , => + @set('isSaving', false) + else + @set('isSaving', false) diff --git a/assets/scripts/app/controllers/env_vars.coffee b/assets/scripts/app/controllers/env_vars.coffee new file mode 100644 index 00000000..5c6d4d65 --- /dev/null +++ b/assets/scripts/app/controllers/env_vars.coffee @@ -0,0 +1 @@ +Travis.EnvVarsController = Ember.ArrayController.extend() diff --git a/assets/scripts/app/controllers/repo.coffee b/assets/scripts/app/controllers/repo.coffee index 79733236..4144b681 100644 --- a/assets/scripts/app/controllers/repo.coffee +++ b/assets/scripts/app/controllers/repo.coffee @@ -59,6 +59,9 @@ Travis.RepoController = Travis.Controller.extend viewRequest: -> @connectTab('request') + viewSettings: -> + @connectTab('settings') + lastBuildDidChange: -> Ember.run.scheduleOnce('data', this, @_lastBuildDidChange); diff --git a/assets/scripts/app/controllers/repo_settings.coffee b/assets/scripts/app/controllers/repo_settings.coffee new file mode 100644 index 00000000..3cf63526 --- /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/controllers/ssh_key.coffee b/assets/scripts/app/controllers/ssh_key.coffee new file mode 100644 index 00000000..c177ae7c --- /dev/null +++ b/assets/scripts/app/controllers/ssh_key.coffee @@ -0,0 +1,51 @@ +require 'travis/validations' + +Travis.SshKeyController = Ember.ObjectController.extend Travis.Validations, + isEditing: false + isSaving: false + isDeleting: false + defaultKey: null + + needs: ['repo'] + repo: Ember.computed.alias('controllers.repo.repo') + + validates: + value: ['presence'] + + actions: + add: -> + model = Travis.SshKey.create(id: @get('repo.id')) + @set('model', model) + @set('isEditing', true) + + save: -> + return if @get('isSaving') + @set('isSaving', true) + + if @isValid() + @get('model').save().then => + @set('isEditing', false) + @set('isSaving', false) + , (xhr) => + @set('isSaving', false) + if xhr.status == 422 + @addErrorsFromResponse(JSON.parse(xhr.response)['errors']) + else + @set('isSaving', false) + + delete: -> + return if @get('isDeleting') + @set('isDeleting', true) + + deletingDone = => @set('isDeleting', false) + @get('model').deleteRecord().then(deletingDone, deletingDone).then => + @set('model', null) + + cancel: -> + if model = @get('model') + if model.get('isNew') + @set('model', null) + @set('isEditing', false) + + edit: -> + @set('isEditing', true) diff --git a/assets/scripts/app/helpers/handlebars.coffee b/assets/scripts/app/helpers/handlebars.coffee index 6d183b4a..c08285b2 100644 --- a/assets/scripts/app/helpers/handlebars.coffee +++ b/assets/scripts/app/helpers/handlebars.coffee @@ -8,101 +8,6 @@ Ember.Handlebars.helper('mb', (size) -> (size / 1024 / 1024).toFixed(2) , 'size') -Travis.Tab = Ember.Object.extend - show: -> - @get('tabs').forEach( (t) -> t.hide() ) - @set('visible', true) - - hide: -> - @set('visible', false) - -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( - '
{{hook.description}}
SSH key is set.
+ {{#if description}} +
+ You don't have any custom key set up.
+ The default key's fingerprint is {{defaultKey.fingerprint}}
+