ari/jobsworth

View on GitHub
app/assets/javascripts/tasks/timer.js

Summary

Maintainability
C
7 hrs
Test Coverage
var jobsworth = jobsworth || {};
jobsworth.tasks = jobsworth.tasks || {};

jobsworth.tasks.TaskTimer = (function () {

  function bind() {
    var $ = jQuery;
    var self = this;

    // buttons
    var $pause_button = $('#pause-btn'),
        $play_button = $('#play-btn'),
        $save_button = $('#save-btn'),
        $li_elapsed = $('#worklog-elapsed'),
        $li_none = $('#worklog-none'),
        $dialog = $('#worktime-dialog'),
        $form = $('#taskform');

    // initialize modal
    $dialog.draggable({handle: '.modal-header'});

    // bind dropdown
    $('.dropdown-toggle').dropdown();

    // bindings
    $pause_button.bind('click', function () {
      self.total_milliseconds += (new Date() - self.last_start_point);

      clearInterval(self.timer);
      $(this).hide();
      $play_button.show();

      return false;
    });

    $('#worklog-property').find('ul li').bind('click', function () {
      var id = $(this).attr("data-id");
      $("#worklog-property input#choice-id").val(id);
      $('#selected-worklog-property').html($(this).text() + "<b class=\"caret\"></b>");
      $('#worklog-property').removeClass('open');
      return false;
    });

    // it restarts the timer and then hides itself to show the pause button
    $play_button.bind('click', function () {
      self.last_start_point = new Date();

      self.timer = setInterval(function () {
        pulse.call(self)
      }, self.INTERVAL);
      $(this).hide();
      $pause_button.show();

      return false;
    });

    // drop-down elements behaviour
    $li_elapsed.click(function () {
      var minutes = Math.floor(self.total_milliseconds / 60000) % 60;
      var hours = Math.floor(self.total_milliseconds / 3600000);

      $('#taskform input[name="work_log[duration]"]').val(hours + 'h' + minutes + 'm');
      $form.submit();
    });

    $li_none.click(function () {
      $('#taskform input[name="work_log[duration]"]').remove();
      $form.submit();
    });

    // show dropdown
    $save_button.click(function () {
      var minutes = Math.floor(self.total_milliseconds / 60000) % 60;
      var hours = Math.floor(self.total_milliseconds / 3600000);

      var hour_unit = hours > 1 ? "hours" : "hour";
      var minute_unit = minutes > 1 ? "minutes" : "minute";

      // show elapsed in drop-down list
      if (hours > 0) {
        $('#worklog-elapsed > a').text(hours + " " + hour_unit + " " + minutes + " " + minute_unit);
      } else {
        $('#worklog-elapsed > a').text(minutes + " " + minute_unit);
      }

      return false;
    });


    $("button.save", $dialog).click(function (e) {
      $('input[name^="work_log"]', $form).remove();
      $dialog.modal('hide');
      $dialog.addClass("none").appendTo($form);
      $form.submit();
      return false;
    })
  }

  function pulse() {
    var new_start_point = new Date();
    this.total_milliseconds += (new_start_point - this.last_start_point);
    this.last_start_point = new_start_point;

    var minutes = Math.floor(this.total_milliseconds / 60000) % 60;
    var hours = Math.floor(this.total_milliseconds / 3600000);
    var hour_unit = hours > 1 ? "hours" : "hours";
    var minute_unit = minutes > 1 ? "minutes" : "minute";

    $('#hours .unit').text(hour_unit);
    $('#minutes .unit').text(minute_unit);
    this.$minutes.text(minutes);
    this.$hours.text(hours);

    if (hours > 0) {
      $('#hours').show();
    } else {
      $('#hours').hide();
    }
  }

  function destroy() {
    clearInterval(this.timer);
  }

  function init() {
    this.INTERVAL = 60000; // runs every minute
    this.timer = null;
    this.total_milliseconds = 0;
    this.last_start_point = new Date();

    this.$minutes = jQuery('#minutes > .timer-val');
    this.$hours = jQuery('#hours > .timer-val');
    jQuery('#hours').hide();

    // initial timer values
    this.$minutes.text('0');
    this.$hours.text('0');

  }

  function TaskTimer() {
    init.call(this);
    bind.call(this);

    //public methods
    this.destroy = destroy;

    // init timer
    var self = this;
    this.timer = setInterval(function () {
      pulse.apply(self)
    }, this.INTERVAL);
  }

  return TaskTimer;
})();