Commit 9398cade
Changed files (8)
app
assets
javascripts
backbone
controllers
models
routers
templates
profiles
views
profiles
controllers
api
views
layouts
my
shared
app/assets/javascripts/backbone/controllers/profile_controller.js.coffee
@@ -4,11 +4,11 @@ class CakeSide.Controllers.ProfileController extends Marionette.Controller
@content_region = CakeSide.Application.content_region
@comment_view = CakeSide.Application.request('CommentView')
- show: ->
+ show: (id) ->
@selectTab()
@comment_view.hide()
profile = new CakeSide.Models.Profile
- id: 'me'
+ id: id
profile.fetch
success: =>
@content_region.show(new @views.ShowView(model: profile))
app/assets/javascripts/backbone/models/profile.js.coffee
@@ -18,6 +18,7 @@ class CakeSide.Models.Profile extends Backbone.Model
return "Email can't be blank" unless attributes.email && attributes.email.trim()
return "Email is invalid" unless @validateEmail(attributes.email)
return "URL is invalid" if attributes.website && !@validateUrl(attributes.website)
+ return "Twitter handle is invalid" if !@validateTwitter(attributes.twitter)
validateEmail: (email) ->
regex = /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/
@@ -27,6 +28,11 @@ class CakeSide.Models.Profile extends Backbone.Model
regex = new RegExp( "^" + "(?:(?:https?|ftp)://)" + "(?:\\S+(?::\\S*)?@)?" + "(?:" + "(?!(?:10|127)(?:\\.\\d{1,3}){3})" + "(?!(?:169\\.254|192\\.168)(?:\\.\\d{1,3}){2})" + "(?!172\\.(?:1[6-9]|2\\d|3[0-1])(?:\\.\\d{1,3}){2})" + "(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])" + "(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}" + "(?:\\.(?:[1-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))" + "|" + "(?:(?:[a-z\\u00a1-\\uffff0-9]-*)*[a-z\\u00a1-\\uffff0-9]+)" + "(?:\\.(?:[a-z\\u00a1-\\uffff0-9]-*)*[a-z\\u00a1-\\uffff0-9]+)*" + "(?:\\.(?:[a-z\\u00a1-\\uffff]{2,}))" + ")" + "(?::\\d{2,5})?" + "(?:/\\S*)?" + "$", "i")
regex.test(url)
+ validateTwitter: (twitter) ->
+ return true unless twitter
+ regex = /^@?(\w){1,15}$/
+ regex.test(twitter)
+
class CakeSide.Collections.ProfilesCollection extends Backbone.Collection
model: CakeSide.Models.Profile
url: '/api/v1/profiles'
app/assets/javascripts/backbone/routers/profile_router.js.coffee
@@ -1,3 +1,3 @@
class CakeSide.Routers.ProfileRouter extends Marionette.AppRouter
appRoutes:
- "profile": "show"
+ "profile/:id": "show"
app/assets/javascripts/backbone/templates/profiles/show.jst.ejs
@@ -1,6 +1,6 @@
<h1>Public Profile</h1>
<hr />
-<div id="error-message" class="alert alert-error hidden">
+<div id="status-message" class="alert alert-error hidden">
<a class="close" data-dismiss="alert" href="#">×</a>
</div>
<form id="profile-form" class="form-horizontal">
@@ -34,9 +34,12 @@
</div>
</div>
<div class="control-group">
- <label class="control-label" for="user_twitter">Twitter username @</label>
+ <label class="control-label" for="user_twitter">Twitter username</label>
<div class="controls">
- <input class="input-xlarge" id="user_twitter" maxlength="255" name="user[twitter]" placeholder="without the @ sign" size="255" type="text" value="<%= twitter %>">
+ <div class="input-prepend">
+ <span class="add-on">@</span>
+ <input class="input-xlarge" id="user_twitter" maxlength="15" name="user[twitter]" placeholder="without the @ sign" size="255" type="text" value="<%= twitter %>">
+ </div>
<span class="help-inline"></span>
</div>
</div>
app/assets/javascripts/backbone/views/profiles/show_view.js.coffee
@@ -11,25 +11,40 @@ class CakeSide.Views.Profiles.ShowView extends Marionette.ItemView
twitter: '#user_twitter'
save_button: '#save-button'
cancel_button: '#cancel-button'
- error: '#error-message'
+ status: '#status-message'
modelEvents:
'invalid': 'displayError'
+ 'sync': 'syncedUp'
events:
"submit #profile-form": "save"
"keyup input": "refreshStatus"
- "change select": "refreshStatus"
'click #cancel-button': 'cancel'
save: (event) ->
event.preventDefault()
event.stopPropagation()
@disableSaveButton()
- @model.save()
+ @model.save(null,
+ success: @savedSuccessfully
+ error: @couldNotSave
+ )
+
+ syncedUp: (event) ->
+ console.log(arguments)
+ console.log('syncd')
+
+ savedSuccessfully: (profile) =>
+ @disableSaveButton()
+ @ui.status.removeClass('hidden')
+ @ui.status.removeClass('alert-error')
+ @ui.status.html("Saved!")
+
+ couldNotSave: =>
+ console.log('fudge')
enableSaveButton: ->
- @ui.error.addClass('hidden')
@ui.save_button.removeAttr('disabled')
disableSaveButton: ->
@@ -37,10 +52,12 @@ class CakeSide.Views.Profiles.ShowView extends Marionette.ItemView
displayError: ->
@disableSaveButton()
- @ui.error.removeClass('hidden')
- @ui.error.html(@model.validationError)
+ @ui.status.addClass('alert-error')
+ @ui.status.removeClass('hidden')
+ @ui.status.html(@model.validationError)
refreshStatus: ->
+ @ui.status.addClass('hidden')
@enableSaveButton()
@model.set('name', @ui.name.val())
@model.set('email', @ui.email.val())
app/controllers/api/v1/profiles_controller.rb
@@ -7,7 +7,9 @@ module Api
def update
@profile = current_user
- @profile.update(secure_params)
+ unless @profile.update(secure_params)
+ render json: @profile.errors, status: :unprocessable_entity
+ end
end
private
app/views/layouts/_header.html.erb
@@ -52,7 +52,7 @@
<% end %>
</li>
<li>
- <%= link_to my_root_path(anchor: 'profile') do %>
+ <%= link_to my_root_path(anchor: 'profile/me') do %>
<i class="fa fa-cog"></i>
<% end %>
</li>