summaryrefslogtreecommitdiff
path: root/app/assets/javascripts/users.js
diff options
context:
space:
mode:
Diffstat (limited to 'app/assets/javascripts/users.js')
-rw-r--r--app/assets/javascripts/users.js181
1 files changed, 181 insertions, 0 deletions
diff --git a/app/assets/javascripts/users.js b/app/assets/javascripts/users.js
new file mode 100644
index 0000000..e6c2fcc
--- /dev/null
+++ b/app/assets/javascripts/users.js
@@ -0,0 +1,181 @@
+(function() {
+
+
+ var settings = {
+ "error_class":"help-inline",
+ "error_tag":"span",
+ "wrapper_error_class":"error",
+ "wrapper_tag":"div",
+ "wrapper_class":"control-group"
+ }
+
+ //
+ // LOCAL FUNCTIONS
+ //
+
+ var poll_users,
+ prevent_default,
+ clear_errors,
+ clear_field_errors,
+ validate_password_confirmation,
+ validate_password_length,
+ update_user;
+
+ prevent_default = function(event) {
+ return event.preventDefault();
+ };
+
+ poll_users = function(query, process) {
+ return $.get("/1/users.json", {
+ query: query
+ }).done(process);
+ };
+
+ clear_errors = function() {
+ return $('#messages').empty();
+ };
+
+ clear_field_errors = function() {
+ return $(settings.error_tag + '.' + settings.error_class).remove();
+ };
+
+ update_user = function(submitEvent) {
+ var form = submitEvent.target;
+ var token = form.dataset.token;
+ var url = form.action;
+ var req = $.ajax({
+ url: url,
+ type: 'PUT',
+ headers: { Authorization: 'Token token="' + token + '"' },
+ data: $(form).serialize()
+ });
+ req.done( function() {
+ $(form).find('.btn[type="submit"]').button('reset');
+ });
+ };
+
+ validate_password_confirmation = function(submitEvent) {
+ var form = submitEvent.target;
+ var password = $(form).find('input#srp_password').val();
+ var confirmation = $(form).find('input#srp_password_confirmation').val();
+ if (password === confirmation) {
+ return true;
+ }
+ else {
+ displayFieldError("password_confirmation", "does not match.");
+ submitEvent.stopImmediatePropagation()
+ return false;
+ }
+ };
+
+ validate_password_length = function(submitEvent) {
+ var form = submitEvent.target;
+ var password = $(form).find('input#srp_password').val();
+ if (password.length > 7) {
+ return true;
+ }
+ else {
+ displayFieldError("password", "needs to be at least 8 characters long.");
+ submitEvent.stopImmediatePropagation()
+ return false;
+ }
+ };
+
+ //
+ // PUBLIC FUNCTIONS
+ //
+
+ srp.session = new srp.Session();
+
+ srp.signedUp = function() {
+ return srp.login();
+ };
+
+ srp.loggedIn = function() {
+ return window.location = '/';
+ };
+
+ srp.updated = function() {
+ return window.location = '/users/' + srp.session.id();
+ };
+
+ //
+ // if a json request returns an error, this function gets called and
+ // decorates the appropriate fields with the error messages.
+ //
+ srp.error = function(message) {
+ clear_errors();
+ var errors = extractErrors(message);
+ displayErrors(errors);
+ $('.btn[type="submit"]').button('reset');
+ }
+
+ function extractErrors(message) {
+ if ($.isPlainObject(message) && message.errors) {
+ return message.errors;
+ } else {
+ return {
+ base: (message.error || JSON.stringify(message))
+ };
+ }
+ }
+
+ function displayErrors(errors) {
+ for (var field in errors) {
+ var error = errors[field];
+ if (field === 'base') {
+ alert_message(error);
+ } else {
+ displayFieldError(field, error);
+ }
+ }
+ }
+
+ function displayFieldError(field, error) {
+ var message = $.isArray(error) ? error[0] : error;
+ var element = $('form input[name$="[' + field + ']"]');
+ if (element) {
+ addError(element, settings, message);
+ }
+ };
+
+ function addError(element, settings, message) {
+ var errorElement, wrapper;
+
+ errorElement = element.parent().find("" + settings.error_tag + "." + settings.error_class);
+ wrapper = element.closest(settings.wrapper_tag + '.' + settings.wrapper_class);
+ if (errorElement[0] == null) {
+ errorElement = $("<" + settings.error_tag + "/>", {
+ "class": settings.error_class,
+ text: message
+ });
+ element.after(errorElement);
+ }
+ wrapper.addClass(settings.wrapper_error_class);
+ return errorElement.text(message);
+ }
+
+//
+// INIT
+//
+
+ $(document).ready(function() {
+ $('.hidden.js-show').removeClass('hidden');
+ $('.js-show').show();
+ $('#new_user').submit(prevent_default);
+ $('#new_user').submit(clear_field_errors);
+ $('#new_user').submit(validate_password_length);
+ $('#new_user').submit(validate_password_confirmation);
+ $('#new_user').submit(srp.signup);
+ $('#new_session').submit(prevent_default);
+ $('#new_session').submit(srp.login);
+ $('#update_login_and_password').submit(prevent_default);
+ $('#update_login_and_password').submit(srp.update);
+ $('#update_pgp_key').submit(prevent_default);
+ $('#update_pgp_key').submit(update_user);
+ return $('#user-typeahead').typeahead({
+ source: poll_users
+ });
+ });
+
+}).call(this);