diff options
| author | mo khan <mo@mokhan.ca> | 2014-10-04 20:43:04 -0600 |
|---|---|---|
| committer | mo khan <mo@mokhan.ca> | 2014-10-04 20:43:04 -0600 |
| commit | 9398cadede4b73f781c049924d5bdfd4bb133b3b (patch) | |
| tree | 23e1a0ce12f65b34fdef55018ae58870a9e8cd22 /app/assets/javascripts | |
| parent | 1b7caffe6ebcd9564cd5f15049324d00b3294b11 (diff) | |
add twitter validation.
Diffstat (limited to 'app/assets/javascripts')
5 files changed, 38 insertions, 12 deletions
diff --git a/app/assets/javascripts/backbone/controllers/profile_controller.js.coffee b/app/assets/javascripts/backbone/controllers/profile_controller.js.coffee index 05443f20..e0306805 100644 --- a/app/assets/javascripts/backbone/controllers/profile_controller.js.coffee +++ b/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)) diff --git a/app/assets/javascripts/backbone/models/profile.js.coffee b/app/assets/javascripts/backbone/models/profile.js.coffee index ae8436af..189d83e4 100644 --- a/app/assets/javascripts/backbone/models/profile.js.coffee +++ b/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' diff --git a/app/assets/javascripts/backbone/routers/profile_router.js.coffee b/app/assets/javascripts/backbone/routers/profile_router.js.coffee index 6451658a..cf83d4ae 100644 --- a/app/assets/javascripts/backbone/routers/profile_router.js.coffee +++ b/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" diff --git a/app/assets/javascripts/backbone/templates/profiles/show.jst.ejs b/app/assets/javascripts/backbone/templates/profiles/show.jst.ejs index 536ffbb9..5a9903f2 100644 --- a/app/assets/javascripts/backbone/templates/profiles/show.jst.ejs +++ b/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> diff --git a/app/assets/javascripts/backbone/views/profiles/show_view.js.coffee b/app/assets/javascripts/backbone/views/profiles/show_view.js.coffee index d534e87b..ef694f4b 100644 --- a/app/assets/javascripts/backbone/views/profiles/show_view.js.coffee +++ b/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()) |
