Commit 9398cade

mo khan <mo@mokhan.ca>
2014-10-05 02:43:04
add twitter validation.
1 parent 1b7caff
Changed files (8)
app
assets
javascripts
controllers
views
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>
app/views/my/shared/_my_nav.html.erb
@@ -10,7 +10,7 @@
     <li id="tutorial-tab"><%= link_to "Tutorials", my_root_path(anchor: 'tutorials') %></li>
     -->
     <!--<li class="<%= 'active' if controller?('settings') %>"><%= link_to "<i class='fa fa-cog'></i> Settings".html_safe, my_settings_path %></li>-->
-    <li id='profile-tab'><%= link_to "<i class='fa fa-cog'></i> Profile".html_safe, my_root_path(anchor: 'profile') %></li>
+    <li id='profile-tab'><%= link_to "<i class='fa fa-cog'></i> Profile".html_safe, my_root_path(anchor: 'profile/me') %></li>
     <li class="<%= 'active' if controller?('passwords') %>"><%= link_to "<i class='fa fa-eye'></i> Account Settings".html_safe, my_passwords_path %></li>
     <li class="<%= "active" if controller?("favorites") %>"><%= link_to "<i class='fa fa-star'></i> Favorites".html_safe, my_favorites_path %></li>
     <li class="<%= 'active' if controller?('avatars') %>"><%= link_to "<i class='fa fa-picture-o'></i> Picture".html_safe, new_my_avatar_path %></li>