diff options
Diffstat (limited to 'app/assets/javascripts')
| -rw-r--r-- | app/assets/javascripts/application.js | 1 | ||||
| -rw-r--r-- | app/assets/javascripts/leap.js | 7 | ||||
| -rw-r--r-- | app/assets/javascripts/platform.js | 93 | ||||
| m--------- | app/assets/javascripts/srp | 0 | ||||
| -rw-r--r-- | app/assets/javascripts/users.js | 132 | 
5 files changed, 232 insertions, 1 deletions
diff --git a/app/assets/javascripts/application.js b/app/assets/javascripts/application.js index 03a40da..ab07e1f 100644 --- a/app/assets/javascripts/application.js +++ b/app/assets/javascripts/application.js @@ -20,4 +20,3 @@  //= require platform  //= require tickets  //= require users -//= require_tree . diff --git a/app/assets/javascripts/leap.js b/app/assets/javascripts/leap.js new file mode 100644 index 0000000..94e602d --- /dev/null +++ b/app/assets/javascripts/leap.js @@ -0,0 +1,7 @@ + +// +// add a bootstrap alert to the page via javascript. +// +function alert_message(msg) { +  $('#messages').append('<div class="alert alert-error"><a class="close" data-dismiss="alert">×</a><span>'+msg+'</span></div>'); +} diff --git a/app/assets/javascripts/platform.js b/app/assets/javascripts/platform.js new file mode 100644 index 0000000..108c162 --- /dev/null +++ b/app/assets/javascripts/platform.js @@ -0,0 +1,93 @@ +/* Inspired by mozillas platform detection: +  https://github.com/mozilla/bedrock/tree/master/media/js/base +*/ + (function () { +   'use strict'; +   function getPlatform() { +     var ua = navigator.userAgent, +         pf = navigator.platform; +     if (/Win(16|9[x58]|NT( [1234]| 5\.0| [^0-9]|[^ -]|$))/.test(ua) || +       /Windows ([MC]E|9[x58]|3\.1|4\.10|NT( [1234]| 5\.0| [^0-9]|[^ ]|$))/.test(ua) || +       /Windows_95/.test(ua)) { +       /** +        * Officially unsupported platforms are Windows 95, 98, ME, NT 4.x, 2000 +        * These regular expressions match: +        *  - Win16 +        *  - Win9x +        *  - Win95 +        *  - Win98 +        *  - WinNT (not followed by version or followed by version <= 5) +        *  - Windows ME +        *  - Windows CE +        *  - Windows 9x +        *  - Windows 95 +        *  - Windows 98 +        *  - Windows 3.1 +        *  - Windows 4.10 +        *  - Windows NT (not followed by version or followed by version <= 5) +        *  - Windows_95 +        */ +       return 'oldwin'; +     } +     if (ua.indexOf("MSIE 6.0") !== -1 && +       ua.indexOf("Windows NT 5.1") !== -1 && +       ua.indexOf("SV1") === -1) { +       // Windows XP SP1 +       return 'oldwin'; +     } +     if (pf.indexOf("Win32") !== -1 || +       pf.indexOf("Win64") !== -1) { +       return 'windows'; +     } +     if (/android/i.test(ua)) { +       return 'android'; +     } +     if (/armv[6-7]l/.test(pf)) { +       return 'android'; +     } +     if (pf.indexOf("Linux") !== -1) { +       return 'linux'; +       //if (pf.indexOf("64") !== -1) { +       //  return 'linux64'; +       //} else { +       //  return 'linux32'; +       //} +     } +     if (pf.indexOf("MacPPC") !== -1) { +       return 'oldmac'; +     } +     if (/Mac OS X 10.[0-5]/.test(ua)) { +       return 'oldmac'; +     } +     if (pf.indexOf('iPhone') !== -1 || +       pf.indexOf('iPad') !== -1 || +       pf.indexOf('iPod') !== -1 ) { +       return 'ios'; +     } +     if (ua.indexOf("Mac OS X") !== -1) { +       return 'osx'; +     } +     if (ua.indexOf("MSIE 5.2") !== -1) { +       return 'oldmac'; +     } +     if (pf.indexOf("Mac") !== -1) { +       return 'oldmac'; +     } +     if (navigator.platform === '' && +       navigator.userAgent.indexOf("Firefox") !== -1 && +       navigator.userAgent.indexOf("Mobile") !== -1) { +       return 'fxos'; +     } + +     return 'other'; +   } +   (function () { +     // Immediately set the platform classname on the html-element +     // to avoid lots of flickering +     var h = document.documentElement; +     window.site = { +       platform : getPlatform() +     }; +     h.className = window.site.platform; +   })(); + })(); diff --git a/app/assets/javascripts/srp b/app/assets/javascripts/srp new file mode 160000 +Subproject 8f33d32d40b1e21ae7fb9a92c78a275422af421 diff --git a/app/assets/javascripts/users.js b/app/assets/javascripts/users.js new file mode 100644 index 0000000..8486756 --- /dev/null +++ b/app/assets/javascripts/users.js @@ -0,0 +1,132 @@ +(function() { +  // +  // LOCAL FUNCTIONS +  // + +  var poll_users,  +      prevent_default,  +      form_failed,  +      form_passed,  +      clear_errors, +      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(); +  }; + +  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('input[type="submit"]').button('reset'); +    }); +  }; + +  markAsSubmitted = function(submitEvent) { +    var form = submitEvent.target; +    $(form).addClass('submitted') +    // bootstrap loading state: +    $(form).find('input[type="submit"]').button('loading'); +  }; + +  resetButtons = function(submitEvent) { +    var form = $('form.submitted') +    // bootstrap loading state: +    $(form).find('input[type="submit"]').button('reset'); +    $(form).removeClass('submitted') +  }; + +  // +  // 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); +    resetButtons(); +  } + +  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 element = $('form input[name$="[' + field + ']"]'); +    if (element) { +      element.trigger('element:validate:fail.ClientSideValidations', error).data('valid', false); +    } +  }; + +  // +  // INIT +  // + +  $(document).ready(function() { +    $('form').submit(markAsSubmitted); +    $('#new_user').submit(prevent_default); +    $('#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);  | 
