theodi/open-data-certificate

View on GitHub
app/assets/javascripts/campaign.js

Summary

Maintainability
C
1 day
Test Coverage
$(document).ready(function($){

  function isUrlValid(url) {
    return /^(https?|s?ftp):\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i.test(url);
  }

  var subsetTypeahead = {
    tags: undefined,
    organizations: undefined,
    element: $('#subset')
  };

  var handleOrganizations = function(data){
    var orgArray = [];
    if (data && data.success) {
      $.each(data.result, function (i, org) {
        orgArray.push({ value: org.title, name: org.name, type: 'organization' });
      });
      subsetTypeahead.organizations = orgArray;
      $(subsetTypeahead).trigger('checkReady');
    } else {
      return false;
    }
  };

  var handleTags = function(data){
    var tagsArray = [];
    if (data && data.success) {
      $.each(data.result, function (i, tag) {
        tagsArray.push({ value: tag.display_name, name: tag.name, type: 'tags' });
      });
      subsetTypeahead.tags = tagsArray;
      $(subsetTypeahead).trigger('checkReady');
    } else {
      return false;
    }
  };

  window.handleTags = handleTags;
  window.handleOrganizations = handleOrganizations;

  var requestSubsets = function(ckan_url){
    var organizations_url = "";
    var tags_url = "";
    var organizations_path = "3/action/organization_list?all_fields=true";
    var tags_path = "3/action/tag_list?all_fields=true";

    if (isUrlValid(ckan_url)){
      if (ckan_url[ckan_url.length-1] != "/"){ ckan_url = ckan_url + "/"; }
      organizations_url = ckan_url + organizations_path;
      tags_url = ckan_url + tags_path;
    } else {
      return false;
    }

    var orgsOptions = { url: organizations_url, dataType: "jsonp", jsonpCallback: "handleOrganizations", timeout: 5000 };
    var tagsOptions = { url: tags_url, dataType: "jsonp", jsonpCallback: "handleTags", timeout: 5000 };
    
    $.ajax(orgsOptions);
    $.ajax(tagsOptions);
  };

  var bindTypeahead = function(subsetTypeahead){ 
    subsetTypeahead.element.typeahead([{
      hint: false, minLength: 3,
      name:'organisations-'+(new Date-0),
      header: '<h3>Organisations</h3>',
      template: '<p class="">{{ value }}</p>',
      engine: Hogan,
      local: subsetTypeahead.organizations
    }, {
      hint: false, minLength: 3,
      name:'tags-'+(new Date-0),
      header: '<h3>Tags</h3>',
      template: '<p class="">{{ value }}</p>',
      engine: Hogan,
      local: subsetTypeahead.tags
    }]).on('typeahead:selected typeahead:autocompleted', function(e, datum){
      $('div#'+datum.type+'-subset').show();
      $('div#'+datum.type+'-subset').find('input').val(datum.name);
      subsetTypeahead.element.typeahead('setQuery', '');
    });
  };

  $(subsetTypeahead).on('checkReady', function () {
    if (subsetTypeahead.tags && subsetTypeahead.organizations){
      bindTypeahead(subsetTypeahead);
      subsetTypeahead.element.removeAttr('disabled');
      subsetTypeahead.element.css('background-color','white');
      $('#subset-icon').attr('class', 'icon-search');
    } else {
      subsetTypeahead.element.attr('disabled','disabled');
    }
  });

  $('#endpoint_check').off().click(function(){
    var checkOptions = {
      method: 'PUT',
      url: $(this).attr('data-url'),
      data: { campaign_url: $('#certification_campaign_url').val() },
      dataType: 'json',
      beforeSend: function(){ 
        $('#endpoint_check i').attr('class', 'icon-spin icon-refresh'); 
        $('#endpoint_check span').text('Checking...'); 
        $('#subset-icon').attr('class', 'icon-refresh icon-spin');
      },
      success: function(d) {
        if (d.redirect){ $('#certification_campaign_url').val(d.redirect); }
        if (d.success) { 
          $('#endpoint_check i').attr('class', 'icon-ok'); 
          $('#endpoint_check span').text('Valid');
        } else { 
          resetStartButtons(false);
          $('#endpoint_check i').attr('class', 'icon-exclamation-sign'); 
          $('#endpoint_check span').text('Invalid');
        }
      },
      error: function(d){ 
        $('#endpoint_check i').attr('class', 'icon-repeat'); 
        $('#endpoint_check span').text('Please retry'); 
      }
    };
    $.ajax(checkOptions);
  });

  var precheckCampaign = function(event){
    var disabled = $('#campaign_precheck').attr('disabled');
    if (disabled == "disabled"){ console.log("disabled");
      return;
    }
    
    var checkOptions = {
      method: 'PUT',
      url: $(this).attr('data-url'),
      data: { 
        campaign_url: $('#certification_campaign_url').val(),
        jurisdiction: $('#certification_campaign_jurisdiction').val(),
        limit: $('#certification_campaign_limit').val(),
        subset: { 
          organization: $('#organization-subset input').val(), tags: $('#tags-subset input').val() 
        },
        template_dataset_id: $('#certification_campaign_template_dataset_id').val(),
        include_harvested: $('#certification_campaign_include_harvested').is(':checked')
      },
      dataType: 'script',
      beforeSend: function(){ 
        $('#campaign_precheck').attr('disabled','disabled');
        $('#campaign_precheck i').attr('class', 'icon-loading icon-spin icon-refresh'); 
        $('#campaign_precheck span').text('Testing...'); 
      },
      error: function(){ 
        $('#campaign_precheck i').attr('class', 'icon-repeat'); 
        $('#campaign_precheck span').text('Error, retry test');
      },
      complete: function(){
        $('#campaign_precheck').removeAttr('disabled');
      }
    };
    $.ajax(checkOptions);
  };

  var setupFormForUrl = function(){
    subsetTypeahead.element.typeahead('destroy');
    subsetTypeahead.element.off();
    subsetTypeahead.tags = undefined;
    subsetTypeahead.organizations = undefined;
    $('div#tags-subset,div#organization-subset').trigger('click');
    subsetTypeahead.element.attr('disabled','disabled');
    var ckan_url = $("#certification_campaign_url").val();
    if (ckan_url.length > 7){
      requestSubsets(ckan_url);
    }
    resetStartButtons();
    $('#endpoint_check i').attr('class', 'icon-repeat'); 
    $('#endpoint_check span').text('Check URL');
  };

  var resetStartButtons = function(enable){
    $('#campaign_precheck i').attr('class', 'icon-chevron-right'); 
    $('#campaign_precheck span').text('Test campaign');
    var ckan_url = $("#certification_campaign_url").val();
    if ((ckan_url.length <= 7) || (enable === false)) {
      $('#campaign_precheck').attr('disabled','disabled');
      $('#start-campaign').attr('disabled','disabled');
    } else {
      $('#campaign_precheck').removeAttr('disabled').off().click(precheckCampaign);
      $('#start-campaign').removeAttr('disabled');
    }
  };

  var bindTemplateTypeahead = function(element){
    $(element).typeahead('destroy');
    $(element).off();
    $('#certification_campaign_template_typeahead').val('');
    $('#certification_campaign_template_dataset_id').val('');
    
    var jurisdiction = $('#certification_campaign_jurisdiction').val();

    $('#certification_campaign_template_typeahead').typeahead([{
        name:'template-dataset-'+(new Date-0),
        header: '<h3>Datasets</h3>',
        minLength: 2,
        template: '<p class="attained attained-{{attained_index}}">{{value}}</p>',
        engine: Hogan,
        remote: {
          url:'/campaigns/template_typeahead?q=%QUERY&jurisdiction='+jurisdiction
        }
      }
    ]).on('typeahead:selected typeahead:autocompleted', function(e, datum){
      $('#certification_campaign_template_dataset_id').val(datum.id);
    });

    $('#certification_campaign_template_typeahead').change(function(e){
      if ($(this).val().length==0)
        $('#certification_campaign_template_dataset_id').val(''); 
    });
  };

  $("#certification_campaign_url").change(setupFormForUrl);
  subsetTypeahead.element.attr('disabled','disabled');
  resetStartButtons();

  $('div#tags-subset,div#organization-subset').hide();
  $('div#tags-subset,div#organization-subset').off().click(function(e){ 
    $(this).find('input').val(''); $(this).hide();
    resetStartButtons();
  });

  if($("#certification_campaign_url").val()){ setupFormForUrl(); }
  
  bindTemplateTypeahead('#certification_campaign_template_typeahead');
  $('#certification_campaign_jurisdiction').change(function(){
    bindTemplateTypeahead('#certification_campaign_template_typeahead');
  });

});