Arie/serveme

View on GitHub
app/assets/javascripts/reservation.js.erb

Summary

Maintainability
Test Coverage
var free_servers;

function loadReservationPage() {
  function formatServer(server) {
    return "<span class='flags flags-" + server.flag + "'></span>" + server.text;
  };

  function enableDefaultWhitelist() {
    $("#reservation_whitelist_id").val('');
    $(".reservation_whitelist").hide();
    $("#reservation_custom_whitelist_id").val('');
    $(".reservation_custom_whitelist_id").hide();
  };

  function enableLeagueWhitelist() {
    $(".reservation_whitelist").show();
    $("#reservation_custom_whitelist_id").val('', true);
    $(".reservation_custom_whitelist_id").hide();
  };

  function enableCustomWhitelist() {
    $(".reservation_custom_whitelist_id").show();
    $("#reservation_whitelist_id").val('');
    $(".reservation_whitelist").hide();
  };

  if ($("#whitelist_type_default_whitelist").is(':checked'))  { enableDefaultWhitelist(); };
  if ($("#whitelist_type_league_whitelist").is(':checked')) { enableLeagueWhitelist(); };
  if ($("#whitelist_type_custom_whitelist").is(':checked')) { enableCustomWhitelist(); };

  $("#reservation_whitelist_id").select2();

  $("#reservation_first_map").select2({
    allowClear: true
  });

  $("#reservation_server_config_id").select2({
    allowClear: true
  });

  $("#reservation_server_id").select2({
    formatResult: formatServer,
    formatSelection: formatServer,
    formatNoMatches: function() {
      return "No more servers available between " + startsAt().val() + " and " + endsAt().val();
    },
    data: function() { return {results: free_servers}; },
    escapeMarkup: function(m) { return m }
  });
  selectCurrentServer();

  $("#whitelist_type_default_whitelist").change(function() {
    enableDefaultWhitelist();
  });

  $("#whitelist_type_custom_whitelist").change(function() {
    enableCustomWhitelist();
  });

  $("#whitelist_type_league_whitelist").change(function() {
    enableLeagueWhitelist();
  });

  function findFreeServers() {
    enableSpinner("reservation_server_id");
    $.post(find_server_url, $("form.reservation").serialize() ).done(function( data ) {
      free_servers = [];
      $.each(data.servers, function(idx, server) {
        free_servers.push({id: server.id, text: server.name, flag: server.flag, ip_and_port: server.ip_and_port, ip: server.ip});
      });
      if (data.servers.length == 0) {
        $(".buy_premium").slideDown();
      } else {
        $(".buy_premium").slideUp();
      };
      selectCurrentServer();
      disableSpinner("reservation_server_id");
    });
  };

  function pingCurrentServer() {
    currentServerId = serverId();
    $.each(free_servers, function(idx, server) {
      if (server.id == serverId().val()) {
        showSpinner("reservation_ping");
        enableSpinner("reservation_ping");
        new pingServer(server.ip, function(ping, e) {;
          setPing(ping, server.id);
        });
      };
    });
  };

  function clearPing() {
    $("#reservation_ping").val(null);
  };

  function setPing(ping, server_id) {
    if (serverId().val() == server_id) {
      disableSpinner("reservation_ping");
      $("#reservation_ping").val(ping);
    };
  };

  function selectCurrentServer() {
    $("#reservation_server_id").select2("val", $("#reservation_server_id").val());
    pingCurrentServer();
  };

  function showSpinner(field) {
    $("." + field + ' .fa-refresh').css('display', 'inline-block')
  };

  function hideSpinner(field) {
    $("." + field + ' .fa-refresh').css('display', 'none')
  };

  function enableSpinner(field) {
    $("." + field + ' .fa-refresh').addClass('fast-spin');
  };

  function disableSpinner(field) {
    $("." + field + ' .fa-refresh').removeClass('fast-spin');
  };

  $("#reservation_enable_demos_tf").change(function(event) {
    togglePluginsAndDemosTf($(event.currentTarget));
  });

  function togglePluginsAndDemosTf(target) {
    if (target.prop("checked") == true) {
      enablePlugins().prop("disabled", true);
      enablePlugins().prop("checked", true);
    } else {
      if (canEnablePlugins == false) {
        enablePlugins().prop("disabled", false);
        enablePlugins().prop("checked", false);
      } else {
        enablePlugins().prop("disabled", false);
        enablePlugins().prop("checked", true);
      }

    }
  }

  if (enableDemosTf().size > 0) {
    togglePluginsAndDemosTf(enableDemosTf());
  }

  $("#reservation_starts_at").change(function() {

    startDate = getDateFromDatePicker($(this));
    endDate = getDateFromDatePicker($("#reservation_ends_at"));

    if(endDate < startDate){
      newDate = new Date(startDate.getTime() + 7200000);
      $("#reservation_ends_at").datetimepicker("setUTCDate", newDate)
    }
    $("#reservation_ends_at").datetimepicker("setStartDate", $(this).val())

    findFreeServers();
  });

  $("#reservation_ends_at").change(function() {
    findFreeServers();
  });

  $("#reservation_server_id").change(function() {
    clearPing();
    pingCurrentServer();
  });

  $("#refresh-ping").click(function() {
    pingCurrentServer();
  });

  $("#toggle_reservations_list").click(function() {
    $("#toggle_reservations_list").hide();
    $("#server_reservations_table").show();
  });

  $(".gantt").click(function(event) {
    ele = $(event.currentTarget);
    starts = ele.data('next-start');
    ends   = ele.data('next-end');
    server_id  = ele.data('server-id');
    $('html, body').animate({
      scrollTop: startsAt().offset().top
      }, {
        duration: 100,
        complete: function() {
          startsAt().val(starts);
          endsAt().val(ends);
          serverId().val(server_id);
          updateStartsAt();
        }
      })
  });

  $(".server_name").click(function(event) {
    ele = $(event.target);
    server_id  = ele.data('server-id');
    $('html, body').animate({
      scrollTop: startsAt().offset().top
      }, {
        duration: 100,
        complete: function() {
          serverId().val(server_id);
          updateStartsAt();
        }
      })
  });

  function getDateFromDatePicker(element){
    return $.fn.datetimepicker.DPGlobal.parseDate(
      element.val(),
      $.fn.datetimepicker.DPGlobal.parseFormat(datepicker_options.format, 'standard'),
      "en",
      'standard'
    );
  }

  function updateStartsAt() {
    startsAt().change();
  };

  function serverId() {
    return $("#reservation_server_id");
  };

  function startsAt() {
    return $("#reservation_starts_at");
  };

  function endsAt() {
    return $("#reservation_ends_at");
  };

  function enablePlugins() {
    return $("#reservation_enable_plugins");
  };

  function enableDemosTf() {
    return $("#reservation_enable_demos_tf");
  };

  function loadServers() {
    if (startsAt().length > 0) {
      if ($("#reservation_starts_at:enabled").length > 0) {
        findFreeServers();
      } else {
        selectCurrentServer();
      };
    };
  };

  loadServers();

  $('.gantt').tooltip();
};

$(document).on('turbo:load', loadReservationPage);
$(document).on('turbo:render', loadReservationPage);