razum2um/lurker

View on GitHub
lib/lurker/templates/javascripts/lurker.js

Summary

Maintainability
A
45 mins
Test Coverage
(function() {
  var $ = window.jQuery;
  var hljs = window.hljs;

  var Lurker = {
    disableSubmitButton: function() {
      $("#submit-api").attr("disabled", true);
    },

    enableSubmitButton: function() {
      $("#submit-api").attr("disabled", false);
    },

    fillInInfoTab: function($tab, xhr) {
      $tab.find('.status td.value').text(xhr.status + " " + xhr.statusText);
      $tab.find('#headers').text(xhr.getAllResponseHeaders());

      var realTimeTaken = Lurker.lastRequest.endTime - Lurker.lastRequest.startTime;
      $tab.find('.time td.value').text(realTimeTaken + " ms");
    },

    fillInRawTab: function($tab, xhr) {
      var content;
      switch (Lurker.detectContentType(xhr)) {
        case "json":
          var json = JSON.stringify(JSON.parse(xhr.responseText), null, 2);
          content = hljs.highlightAuto(json).value;
          break;
        default:
          content = xhr.responseText;
      }
      $tab.html(content);
    },

    detectContentType: function(response) {
      var contentType = response.getResponseHeader("Content-Type");
      var detectedContentType = null;

      if (contentType.match(/application\/json/)) {
        detectedContentType = 'json';
      }

      return detectedContentType;
    },

    buildActionUrl: function(host, template, values) {
      for (var i = 0; i < values.length; i++) {
        var placeholder = new RegExp(':' + values[i].label);
        template = template.replace(placeholder, encodeURIComponent(values[i].value));
      }
      return host + template;
    },

    serializePayload: function(payload, contentType) {
      if (contentType === 'application/json' || /\+json$/.test(contentType)) {
        return JSON.stringify(payload);
      } else {
        // default to 'application/x-www-form-urlencoded'
        return jQuery.param(payload);
      }
    },

    generateCurlCommand: function(targetUrl, method, payload, contentType) {
      var serializedPayload = Lurker.serializePayload(payload, contentType);
      var results = [];
      results.push('curl');
      results.push('-X ' + method);
      if (serializedPayload.length > 0) {
        if (contentType != 'application/x-www-form-urlencoded') {
          results.push("-H 'Content-Type: " + contentType + "'");
        }
        results.push("-d '" + serializedPayload + "'");
      }
      results.push("'" + targetUrl + "'");
      return results.join(' ');
    },

    performRequest: function(host, method, template, values, payload, contentType) {
      Lurker.disableSubmitButton();

      $.ajax({
        url: Lurker.buildActionUrl(host, template, values),
        data: Lurker.serializePayload(payload, contentType),
        method: method,
        contentType: contentType,
        processData: false
      }).complete(Lurker.onComplete);

      Lurker.lastRequest = {};
      Lurker.lastRequest.startTime = Date.now();

      return false;
    },

    onComplete: function(xhr) {
      Lurker.lastRequest.endTime = Date.now();
      Lurker.enableSubmitButton();

      var $responseDiv = $("#show-api-response-div");
      $responseDiv.find("[ref^='response']").hide();

      Lurker.fillInInfoTab($responseDiv.showNavTab("info"), xhr);
      Lurker.fillInRawTab($responseDiv.showNavTab("raw"), xhr);
    }
  };

  window.Lurker = Lurker;

  $(function($) {
    var activeMenuItem = $('#side-menu').find('a[href="' + window.location.pathname + '"]');
    if (activeMenuItem.length === 1) {
      activeMenuItem.addClass('hovered')
          .parents('.collapse').addClass('in')
          .parents('.endpoint-group').addClass('active');
    }

    window.domain = window.localStorage.lastDomain || '/';
    window.domainName = window.localStorage.lastDomainName || 'Local';
    function currentDomain(domain, domainName) {
      $('.domains').find('.current')
          .text(domainName)
          .data('domain', domain);
    }

    $('.domains .domain').click(function() {
      window.domain = window.localStorage.lastDomain = $(this).data('domain');
      window.domainName = window.localStorage.lastDomainName = $(this).text() + " (" + window.domain + ")";
      currentDomain(window.domain, window.domainName);
    });

    $('.domains .current.btn').click(function() {
      window.location = $(this).data('domain');
    });
    currentDomain(window.domain, window.domainName);
  });

  $.fn.extend({
    showNavTab: function(name) {
      return $(this).find("[ref=response-" + name + "]").show();
    }
  });
})();