codecombat/app/views/account/settings_view.coffee

158 lines
5.2 KiB
CoffeeScript
Raw Normal View History

2014-01-03 13:32:13 -05:00
View = require 'views/kinds/RootView'
template = require 'templates/account/settings'
{me} = require('lib/auth')
forms = require('lib/forms')
User = require('models/User')
WizardSettingsView = require './wizard_settings_view'
JobProfileView = require './job_profile_view'
2014-01-12 14:54:50 -05:00
2014-01-03 13:32:13 -05:00
module.exports = class SettingsView extends View
id: 'account-settings-view'
2014-01-03 13:32:13 -05:00
template: template
events:
'click #save-button': 'save'
'change #settings-panes input': 'save'
2014-01-03 13:32:13 -05:00
'click #toggle-all-button': 'toggleEmailSubscriptions'
constructor: (options) ->
@save = _.debounce(@save, 200)
super options
return unless me
2014-03-24 02:53:41 -04:00
@listenTo(me, 'invalid', (errors) -> forms.applyErrorsToForm(@$el, me.validationError))
2014-01-03 13:32:13 -05:00
afterRender: ->
super()
$('#settings-tabs a', @$el).click((e) =>
e.preventDefault()
$(e.target).tab('show')
# make sure errors show up in the general pane, but keep the password pane clean
$('#password-pane input').val('')
@save() unless $(e.target).attr('href') is '#password-pane'
forms.clearFormAlerts($('#password-pane', @$el))
)
@chooseTab(location.hash.replace('#',''))
wizardSettingsView = new WizardSettingsView()
@listenTo wizardSettingsView, 'change', @save
@insertSubView wizardSettingsView
@jobProfileView = new JobProfileView()
@listenTo @jobProfileView, 'change', @save
@insertSubView @jobProfileView
@buildPictureTreema()
2014-01-03 13:32:13 -05:00
chooseTab: (category) ->
id = "##{category}-pane"
pane = $(id, @$el)
return @chooseTab('general') unless pane.length or category is 'general'
loc = "a[href=#{id}]"
$(loc, @$el).tab('show')
$('.tab-pane').removeClass('active')
pane.addClass('active')
@currentTab = category
getRenderData: ->
c = super()
return c unless me
c.subs = {}
2014-03-10 16:20:00 -04:00
c.subs[sub] = 1 for sub in c.me.get('emailSubscriptions') or ['announcement', 'notification', 'tester', 'level_creator', 'developer']
c.showsJobProfileTab = me.isAdmin() or me.get('jobProfile') or location.hash.search('job-profile-') isnt -1
2014-01-03 13:32:13 -05:00
c
getSubscriptions: ->
inputs = $('#email-pane input[type="checkbox"]', @$el)
inputs = ($(i) for i in inputs)
subs = (i.attr('name') for i in inputs when i.prop('checked'))
2014-01-03 13:32:13 -05:00
subs = (s.replace('email_', '') for s in subs)
subs
toggleEmailSubscriptions: =>
subs = @getSubscriptions()
$('#email-pane input[type="checkbox"]', @$el).prop('checked', not Boolean(subs.length))
2014-01-03 13:32:13 -05:00
@save()
buildPictureTreema: ->
data = photoURL: me.get('photoURL')
data.photoURL = null if data.photoURL?.search('gravatar') isnt -1 # Old style
2014-04-12 04:35:56 -04:00
schema = _.cloneDeep me.schema()
schema.properties = _.pick me.schema().properties, 'photoURL'
schema.required = ['photoURL']
console.log 'have data', data, 'schema', schema
treemaOptions =
filePath: "db/user/#{me.id}"
schema: schema
data: data
callbacks: {change: @onPictureChanged}
@pictureTreema = @$el.find('#picture-treema').treema treemaOptions
@pictureTreema?.build()
@pictureTreema?.open()
@$el.find('.gravatar-fallback').toggle not me.get 'photoURL'
onPictureChanged: (e) =>
@trigger 'change'
@$el.find('.gravatar-fallback').toggle not me.get 'photoURL'
2014-03-24 12:58:34 -04:00
save: ->
2014-01-03 13:32:13 -05:00
forms.clearFormAlerts(@$el)
@grabData()
res = me.validate()
if res?
forms.applyErrorsToForm(@$el, res)
return
2014-03-10 16:20:00 -04:00
return unless me.hasLocalChanges()
2014-01-03 13:32:13 -05:00
res = me.save()
return unless res
save = $('#save-button', @$el).text($.i18n.t('common.saving', defaultValue: 'Saving...'))
.removeClass('btn-danger').addClass('btn-success').show()
2014-01-03 13:32:13 -05:00
res.error ->
errors = JSON.parse(res.responseText)
forms.applyErrorsToForm(@$el, errors)
save.text($.i18n.t('account_settings.error_saving', defaultValue: 'Error Saving')).removeClass('btn-success').addClass('btn-danger', 500)
2014-01-03 13:32:13 -05:00
res.success (model, response, options) ->
save.text($.i18n.t('account_settings.saved', defaultValue: 'Changes Saved')).removeClass('btn-success', 500)
2014-01-03 13:32:13 -05:00
grabData: ->
@grabPasswordData()
@grabOtherData()
grabPasswordData: ->
password1 = $('#password', @$el).val()
password2 = $('#password2', @$el).val()
bothThere = Boolean(password1) and Boolean(password2)
if bothThere and password1 isnt password2
message = $.i18n.t('account_settings.password_mismatch', defaultValue: 'Password does not match.')
err = [message:message, property:'password2', formatted:true]
forms.applyErrorsToForm(@$el, err)
return
if bothThere
me.set('password', password1)
grabOtherData: ->
me.set 'name', $('#name', @$el).val()
me.set 'email', $('#email', @$el).val()
me.set 'emailSubscriptions', @getSubscriptions()
me.set 'photoURL', @pictureTreema.get('/photoURL')
adminCheckbox = @$el.find('#admin')
if adminCheckbox.length
permissions = []
permissions.push 'admin' if adminCheckbox.prop('checked')
me.set('permissions', permissions)
jobProfile = me.get('jobProfile') ? {}
updated = false
for key, val of @jobProfileView.getData()
updated = updated or jobProfile[key] isnt val
jobProfile[key] = val
if updated
2014-04-07 18:21:05 -04:00
jobProfile.updated = (new Date()).toISOString()
me.set 'jobProfile', jobProfile