Aleksander Machniak
2016-05-20 e48f8945b32ab5b67f1cdeb53a37d3d196e31e4d
program/js/list.js
@@ -114,7 +114,8 @@
    var r, len, rows = this.tbody.childNodes;
    for (r=0, len=rows.length; r<len; r++) {
      this.rowcount += this.init_row(rows[r]) ? 1 : 0;
      if (rows[r].nodeType == 1)
        this.rowcount += this.init_row(rows[r]) ? 1 : 0;
    }
    this.init_header();
@@ -131,7 +132,7 @@
  }
  if (this.parent_focus) {
    this.list.parentNode.onclick = function(e) { me.focus(e); };
    this.list.parentNode.onclick = function(e) { me.focus(); };
  }
  return this;
@@ -150,11 +151,17 @@
    var self = this, uid = row.uid;
    this.rows[uid] = {uid:uid, id:row.id, obj:row};
    // set eventhandlers to table row
    row.onmousedown = function(e){ return self.drag_row(e, this.uid); };
    row.onmouseup = function(e){ return self.click_row(e, this.uid); };
    $(row).data('uid', uid)
      // set eventhandlers to table row (only left-button-clicks in mouseup)
      .mousedown(function(e) { return self.drag_row(e, this.uid); })
      .mouseup(function(e) {
        if (e.which == 1 && !self.drag_active)
          return self.click_row(e, this.uid);
        else
          return true;
      });
    if (bw.touch) {
    if (bw.touch && row.addEventListener) {
      row.addEventListener('touchstart', function(e) {
        if (e.touches.length == 1) {
          self.touchmoved = false;
@@ -219,7 +226,7 @@
        if (this.column_fixed == r)
          continue;
        col = this.thead.rows[0].cells[r];
        col.onmousedown = function(e){ return p.drag_column(e, this); };
        col.onmousedown = function(e) { return p.drag_column(e, this); };
        this.colcount++;
      }
    }
@@ -240,12 +247,13 @@
    $(this.list).before(this.fixed_header);
    var me = this;
    $(window).resize(function(){ me.resize() });
    $(window).scroll(function(){
    $(window).resize(function() { me.resize(); });
    $(window).scroll(function() {
      var w = $(window);
      me.fixed_header.css('marginLeft', (-w.scrollLeft()) + 'px');
      if (!bw.webkit)
        me.fixed_header.css('marginTop', (-w.scrollTop()) + 'px');
      me.fixed_header.css({
        marginLeft: -w.scrollLeft() + 'px',
        marginTop: -w.scrollTop() + 'px'
      });
    });
  }
  else {
@@ -270,14 +278,14 @@
    var column_widths = [];
    // get column widths from original thead
    $(this.tbody).parent().find('thead tr td').each(function(index) {
    $(this.tbody).parent().find('thead th,thead td').each(function(index) {
      column_widths[index] = $(this).width();
    });
    // apply fixed widths to fixed table header
    $(this.thead).parent().width($(this.tbody).parent().width());
    $(this.thead).find('tr td').each(function(index) {
      $(this).css('width', column_widths[index]);
    $(this.thead).find('th,td').each(function(index) {
      $(this).width(column_widths[index]);
    });
    $(window).scroll();
@@ -349,10 +357,11 @@
  if (row.nodeName === undefined) {
    // for performance reasons use DOM instead of jQuery here
    var domrow = document.createElement(this.row_tagname());
    if (row.id) domrow.id = row.id;
    if (row.uid) domrow.uid = row.uid;
    if (row.className) domrow.className = row.className;
    if (row.style) $.extend(domrow.style, row.style);
    if (row.uid) $(domrow).data('uid', String(row.uid)); // #1489906
    for (var e, domcell, col, i=0; row.cols && i < row.cols.length; i++) {
      col = row.cols[i];
@@ -388,18 +397,22 @@
  var row = this.rows[id];
  if (!row) return false;
  var domrow = row.obj;
  for (var domcell, col, i=0; cols && i < cols.length; i++) {
  var i, domrow = row.obj;
  for (i = 0; cols && i < cols.length; i++) {
    this.get_cell(domrow, i).html(cols[i]);
  }
  if (newid) {
    delete this.rows[id];
    domrow.uid = newid;
    domrow.id = 'rcmrow' + newid;
    this.init_row(domrow);
    if (select)
      this.selection[0] = newid;
    if (this.last_selected == id)
      this.last_selected = newid;
  }
},
@@ -559,6 +572,10 @@
 */
click_row: function(e, id)
{
  // sanity check
  if (!id || !this.rows[id])
    return false;
  // don't do anything (another action processed before)
  if (!this.is_event_target(e))
    return true;
@@ -816,14 +833,16 @@
get_row_uid: function(row)
{
  if (row && row.uid)
    return row.uid;
  if (!row)
    return;
  var uid;
  if (row && (uid = $(row).data('uid')))
    row.uid = uid;
  else if (row && String(row.id).match(this.id_regexp))
    row.uid = RegExp.$1;
  if (!row.uid) {
    var uid = $(row).data('uid');
    if (uid)
      row.uid = uid;
    else if (String(row.id).match(this.id_regexp))
      row.uid = RegExp.$1;
  }
  return row.uid;
},
@@ -1085,11 +1104,11 @@
/**
 * Check if given id is part of the current selection
 */
in_selection: function(id)
in_selection: function(id, index)
{
  for (var n in this.selection)
    if (this.selection[n] == id)
      return true;
      return index ? parseInt(n) : true;
  return false;
},
@@ -1237,18 +1256,19 @@
    }
  }
  else {
    if (!this.in_selection(id)) { // select row
    var pre, post, p = this.in_selection(id, true);
    if (p === false) { // select row
      this.selection.push(id);
      $(this.rows[id].obj).addClass('selected').attr('aria-selected', 'true');
      if (!norecur && !this.rows[id].expanded)
        this.highlight_children(id, true);
    }
    else { // unselect row
      var p = $.inArray(id, this.selection),
        a_pre = this.selection.slice(0, p),
        a_post = this.selection.slice(p+1, this.selection.length);
      pre = this.selection.slice(0, p);
      post = this.selection.slice(p+1, this.selection.length);
      this.selection = a_pre.concat(a_post);
      this.selection = pre.concat(post);
      $(this.rows[id].obj).removeClass('selected').removeAttr('aria-selected');
      if (!norecur && !this.rows[id].expanded)
        this.highlight_children(id, false);
@@ -1417,7 +1437,8 @@
 */
scrollto: function(id)
{
  var row = this.rows[id].obj;
  var row = this.rows[id] ? this.rows[id].obj : null;
  if (row && this.frame) {
    var scroll_to = Number(row.offsetTop),
      head_offset = 0;
@@ -1506,7 +1527,11 @@
      $('> ' + self.col_tagname(), self.rows[uid].obj).each(function(n, cell) {
        if (self.subject_col < 0 || (self.subject_col >= 0 && self.subject_col == n)) {
          var subject = $(cell).text();
          // remove elements marked with "skip-on-drag" class
          cell = $(cell).clone();
          $(cell).find('.skip-on-drag').remove();
          var subject = cell.text();
          if (subject) {
            // remove leading spaces
@@ -1663,32 +1688,33 @@
    this.col_draglayer = null;
  }
  if (this.col_drag_active)
    this.focus();
  this.col_drag_active = false;
  rcube_event.remove_listener({event:'mousemove', object:this, method:'column_drag_mouse_move'});
  rcube_event.remove_listener({event:'mouseup', object:this, method:'column_drag_mouse_up'});
  // remove temp divs
  this.del_dragfix();
  if (this.selected_column !== null && this.cols && this.cols.length) {
    var i, cpos = 0, pos = rcube_event.get_mouse_pos(e);
  if (this.col_drag_active) {
    this.col_drag_active = false;
    this.focus();
    this.triggerEvent('column_dragend', e);
    // find destination position
    for (i=0; i<this.cols.length; i++) {
      if (pos.x >= this.cols[i]/2 + this.list_pos + cpos)
        cpos += this.cols[i];
      else
        break;
    }
    if (this.selected_column !== null && this.cols && this.cols.length) {
      var i, cpos = 0, pos = rcube_event.get_mouse_pos(e);
    if (i != this.selected_column && i != this.selected_column+1) {
      this.column_replace(this.selected_column, i);
      // find destination position
      for (i=0; i<this.cols.length; i++) {
        if (pos.x >= this.cols[i]/2 + this.list_pos + cpos)
          cpos += this.cols[i];
        else
          break;
      }
      if (i != this.selected_column && i != this.selected_column+1) {
        this.column_replace(this.selected_column, i);
      }
    }
  }
  this.triggerEvent('column_dragend', e);
  return rcube_event.cancel(e);
},