From db780e10e4981f15da653d8fc53e0fb80c8cce9a Mon Sep 17 00:00:00 2001 From: Aleksander Machniak <alec@alec.pl> Date: Tue, 13 Jan 2015 04:54:53 -0500 Subject: [PATCH] Fix bug where Drafts list wasn't updated on draft-save action in new window (#1490225) --- program/js/list.js | 110 ++++++++++++++++++++++++++++--------------------------- 1 files changed, 56 insertions(+), 54 deletions(-) diff --git a/program/js/list.js b/program/js/list.js index 6c0fbc2..fd14c63 100644 --- a/program/js/list.js +++ b/program/js/list.js @@ -20,7 +20,7 @@ /** * Roundcube List Widget class - * @contructor + * @constructor */ function rcube_list_widget(list, p) { @@ -32,10 +32,6 @@ this.list = list ? list : null; this.tagname = this.list ? this.list.nodeName.toLowerCase() : 'table'; this.id_regexp = /^rcmrow([a-z0-9\-_=\+\/]+)/i; - this.thead; - this.tbody; - this.fixed_header; - this.frame = null; this.rows = {}; this.selection = []; this.rowcount = 0; @@ -101,6 +97,8 @@ if (this.keyboard) rcube_event.add_listener({event:'keydown', object:this, method:'key_press'}); } + + return this; }, @@ -197,6 +195,12 @@ var me = this; $(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'); + }); } else { $(this.fixed_header).find('thead').replaceWith(clone); @@ -223,6 +227,8 @@ $(this.thead).find('tr td').each(function(index) { $(this).css('width', column_widths[index]); }); + + $(window).scroll(); }, /** @@ -294,11 +300,13 @@ if (row.className) domrow.className = row.className; if (row.style) $.extend(domrow.style, row.style); - for (var domcell, col, i=0; row.cols && i < row.cols.length; i++) { + for (var e, domcell, col, i=0; row.cols && i < row.cols.length; i++) { col = row.cols[i]; domcell = document.createElement(this.col_tagname()); if (col.className) domcell.className = col.className; if (col.innerHTML) domcell.innerHTML = col.innerHTML; + for (e in col.events) + domcell['on' + e] = col.events[e]; domrow.appendChild(domcell); } @@ -359,7 +367,7 @@ // Un-focus already focused elements (#1487123, #1487316, #1488600, #1488620) // It looks that window.focus() does the job for all browsers, but not Firefox (#1489058) - $(':focus:not(body)').blur(); + $('iframe,:focus:not(body)').blur(); window.focus(); if (e || (e = window.event)) @@ -1029,7 +1037,7 @@ /** * Unselect selected row(s) */ -clear_selection: function(id) +clear_selection: function(id, no_event) { var n, num_select = this.selection.length; @@ -1051,7 +1059,7 @@ this.selection = []; } - if (num_select && !this.selection.length) + if (num_select && !this.selection.length && !no_event) this.triggerEvent('select'); }, @@ -1067,7 +1075,7 @@ if (deep !== false && res.length) { for (var uid, uids, i=0, len=res.length; i<len; i++) { uid = res[i]; - if (this.rows[uid].has_children && !this.rows[uid].expanded) { + if (this.rows[uid] && this.rows[uid].has_children && !this.rows[uid].expanded) { uids = this.row_children(uid); for (var j=0, uids_len=uids.length; j<uids_len; j++) { uid = uids[j]; @@ -1104,7 +1112,7 @@ if (!multiple) { if (this.selection.length > 1 || !this.in_selection(id)) { - this.clear_selection(); + this.clear_selection(null, true); this.selection[0] = id; $(this.rows[id].obj).addClass('selected'); } @@ -1152,6 +1160,7 @@ key_press: function(e) { var target = e.target || {}; + if (this.focused != true || target.nodeName == 'INPUT' || target.nodeName == 'TEXTAREA' || target.nodeName == 'SELECT') return true; @@ -1173,11 +1182,9 @@ case 37: // Left arrow key case 39: // Right arrow key - case 107: // Plus sign on a numeric keypad - case 109: // Minus sign on a numeric keypad // Stop propagation rcube_event.cancel(e); - var ret = this.use_plusminus_key(keyCode, mod_key); + var ret = this.use_arrow_key(keyCode, mod_key); this.key_pressed = keyCode; this.modkey = mod_key; this.triggerEvent('keypress'); @@ -1222,13 +1229,44 @@ */ use_arrow_key: function(keyCode, mod_key) { - var new_row; + var new_row, + selected_row = this.rows[this.last_selected]; + // Safari uses the nonstandard keycodes 63232/63233 for up/down, if we're // using the keypress event (but not the keydown or keyup event). if (keyCode == 40 || keyCode == 63233) // down arrow key pressed new_row = this.get_next_row(); else if (keyCode == 38 || keyCode == 63232) // up arrow key pressed new_row = this.get_prev_row(); + else { + if (!selected_row || !selected_row.has_children) + return; + + // expand + if (keyCode == 39) { + if (selected_row.expanded) + return; + + if (mod_key == CONTROL_KEY || this.multiexpand) + this.expand_all(selected_row); + else + this.expand(selected_row); + } + // collapse + else { + if (!selected_row.expanded) + return; + + if (mod_key == CONTROL_KEY || this.multiexpand) + this.collapse_all(selected_row); + else + this.collapse(selected_row); + } + + this.update_expando(selected_row.uid, selected_row.expanded); + + return false; + } if (new_row) { this.select_row(new_row.uid, mod_key, false); @@ -1240,48 +1278,12 @@ /** - * Special handling method for +/- keys - */ -use_plusminus_key: function(keyCode, mod_key) -{ - var selected_row = this.rows[this.last_selected]; - - if (!selected_row || !selected_row.has_children) - return; - - // expand - if (keyCode == 39 || keyCode == 107) { - if (selected_row.expanded) - return; - - if (mod_key == CONTROL_KEY || this.multiexpand) - this.expand_all(selected_row); - else - this.expand(selected_row); - } - // collapse - else { - if (!selected_row.expanded) - return; - - if (mod_key == CONTROL_KEY || this.multiexpand) - this.collapse_all(selected_row); - else - this.collapse(selected_row); - } - - this.update_expando(selected_row.uid, selected_row.expanded); - - return false; -}, - - -/** * Try to scroll the list to make the specified row visible */ 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; @@ -1346,7 +1348,7 @@ var uid = RegExp.$1, row = self.rows[uid]; - if ($.inArray(uid, selection) > -1) + if (!row || $.inArray(uid, selection) > -1) return; selection.push(uid); -- Gitblit v1.9.1