diff options
Diffstat (limited to 'program/js')
-rw-r--r-- | program/js/app.js | 106 | ||||
-rw-r--r-- | program/js/editor.js | 11 | ||||
-rw-r--r-- | program/js/list.js | 38 |
3 files changed, 84 insertions, 71 deletions
diff --git a/program/js/app.js b/program/js/app.js index 5943ad0fd..ad0015452 100644 --- a/program/js/app.js +++ b/program/js/app.js @@ -499,6 +499,7 @@ function rcube_webmail() // flag object as complete this.loaded = true; + this.env.lastrefresh = new Date(); // show message if (this.pending_message) @@ -1760,7 +1761,7 @@ function rcube_webmail() // set eventhandler to status icon if (row.icon = document.getElementById(status_icon)) { row.icon._row = row.obj; - row.icon.onmousedown = function(e) { self.command('toggle_status', this); rcube_event.cancel(e); }; + row.icon.onclick = function(e) { self.command('toggle_status', this); return rcube_event.cancel(e); }; } // save message icon position too @@ -1772,12 +1773,12 @@ function rcube_webmail() // set eventhandler to flag icon, if icon found if (this.env.flagged_col != null && (row.flagicon = document.getElementById('flagicn'+row.uid))) { row.flagicon._row = row.obj; - row.flagicon.onmousedown = function(e) { self.command('toggle_flag', this); rcube_event.cancel(e); }; + row.flagicon.onclick = function(e) { self.command('toggle_flag', this); return rcube_event.cancel(e); }; } if (!row.depth && row.has_children && (expando = document.getElementById('rcmexpando'+row.uid))) { row.expando = expando; - expando.onmousedown = function(e) { return self.expand_message_row(e, uid); }; + expando.onclick = function(e) { return self.expand_message_row(e, uid); }; if (bw.touch) { expando.addEventListener('touchend', function(e) { if (e.changedTouches.length == 1) { @@ -1831,7 +1832,6 @@ function rcube_webmail() + (!flags.seen ? ' unread' : '') + (flags.deleted ? ' deleted' : '') + (flags.flagged ? ' flagged' : '') - + (flags.unread_children && flags.seen && !this.env.autoexpand_threads ? ' unroot' : '') + (message.selected ? ' selected' : ''), row = { cols:[], style:{}, id:'rcmrow'+uid }; @@ -1881,6 +1881,9 @@ function rcube_webmail() expando = '<div id="rcmexpando' + uid + '" class="' + (message.expanded ? 'expanded' : 'collapsed') + '"> </div>'; row_class += ' thread' + (message.expanded? ' expanded' : ''); } + + if (flags.unread_children && flags.seen && !message.expanded) + row_class += ' unroot'; } tree += '<span id="msgicn'+uid+'" class="'+css_class+'"> </span>'; @@ -1926,7 +1929,7 @@ function rcube_webmail() html = expando; else if (c == 'subject') { if (bw.ie) { - col.onmouseover = function() { rcube_webmail.long_subject_title_ie(this, message.depth+1); }; + col.onmouseover = function() { rcube_webmail.long_subject_title_ex(this, message.depth+1); }; if (bw.ie8) tree = '<span></span>' + tree; // #1487821 } @@ -2877,10 +2880,10 @@ function rcube_webmail() { var len = a_uids.length, i, uid, all_deleted = true, - rows = this.message_list ? this.message_list.rows : []; + rows = this.message_list ? this.message_list.rows : {}; if (len == 1) { - if (!rows.length || (rows[a_uids[0]] && !rows[a_uids[0]].deleted)) + if (!this.message_list || (rows[a_uids[0]] && !rows[a_uids[0]].deleted)) this.flag_as_deleted(a_uids); else this.flag_as_undeleted(a_uids); @@ -2921,7 +2924,7 @@ function rcube_webmail() var r_uids = [], post_data = this.selection_post_data({_uid: this.uids_to_list(a_uids), _flag: 'delete'}), lock = this.display_message(this.get_label('markingmessage'), 'loading'), - rows = this.message_list ? this.message_list.rows : [], + rows = this.message_list ? this.message_list.rows : {}, count = 0; for (var i=0, len=a_uids.length; i<len; i++) { @@ -2941,7 +2944,7 @@ function rcube_webmail() // make sure there are no selected rows if (this.env.skip_deleted && this.message_list) { - if(!this.env.display_next) + if (!this.env.display_next) this.message_list.clear_selection(); if (count < 0) post_data._count = (count*-1); @@ -2965,7 +2968,7 @@ function rcube_webmail() this.flag_deleted_as_read = function(uids) { var icn_src, uid, i, len, - rows = this.message_list ? this.message_list.rows : []; + rows = this.message_list ? this.message_list.rows : {}; uids = String(uids).split(','); @@ -3620,7 +3623,8 @@ function rcube_webmail() message = input_message.val(), is_html = ($("input[name='_is_html']").val() == '1'), sig = this.env.identity, - delim = this.env.recipients_delimiter, + delim = this.env.recipients_separator, + rx_delim = RegExp.escape(delim), headers = ['replyto', 'bcc']; // update reply-to/bcc fields with addresses defined in identities @@ -3637,16 +3641,18 @@ function rcube_webmail() } // cleanup - rx = new RegExp(RegExp.escape(delim) + '\\s*' + RegExp(delim), 'g'); - input_val = input_val.replace(rx, delim) - rx = new RegExp('^\\s*' + RegExp.escape(delim) + '\\s*$'); - input_val = input_val.replace(rx, '') + rx = new RegExp(rx_delim + '\\s*' + rx_delim, 'g'); + input_val = input_val.replace(rx, delim); + rx = new RegExp('^[\\s' + rx_delim + ']+'); + input_val = input_val.replace(rx, ''); // add new address(es) - if (new_val) { - rx = new RegExp(RegExp.escape(delim) + '\\s*$'); - if (input_val && !rx.test(input_val)) - input_val += delim + ' '; + if (new_val && input_val.indexOf(new_val) == -1 && input_val.indexOf(new_val.replace(/"/g, '')) == -1) { + if (input_val) { + rx = new RegExp('[' + rx_delim + '\\s]+$') + input_val = input_val.replace(rx, '') + delim + ' '; + } + input_val += new_val + delim + ' '; } @@ -3749,6 +3755,7 @@ function rcube_webmail() } this.env.identity = id; + this.triggerEvent('change_identity'); return true; }; @@ -3832,7 +3839,12 @@ function rcube_webmail() att.html = '<a title="'+this.get_label('cancel')+'" onclick="return rcmail.cancel_attachment_upload(\''+name+'\', \''+att.frame+'\');" href="#cancelupload" class="cancelupload">' + (this.env.cancelicon ? '<img src="'+this.env.cancelicon+'" alt="" />' : this.get_label('cancel')) + '</a>' + att.html; - var indicator, li = $('<li>').attr('id', name).addClass(att.classname).html(att.html); + var indicator, li = $('<li>'); + + li.attr('id', name) + .addClass(att.classname) + .html(att.html) + .on('mouseover', function() { rcube_webmail.long_subject_title_ex(this, 0); }); // replace indicator's li if (upload_id && (indicator = document.getElementById(upload_id))) { @@ -3978,7 +3990,7 @@ function rcube_webmail() this.env.search_id = null; }; - this.sent_successfully = function(type, msg, target) + this.sent_successfully = function(type, msg, folders) { this.display_message(msg, type); @@ -3987,9 +3999,11 @@ function rcube_webmail() this.lock_form(this.gui_objects.messageform); if (rc) { rc.display_message(msg, type); - // refresh the folder where sent message was saved - if (target && rc.env.task == 'mail' && rc.env.action == '' && rc.env.mailbox == target) - rc.command('checkmail'); + // refresh the folder where sent message was saved or replied message comes from + if (folders && rc.env.task == 'mail' && rc.env.action == '' && $.inArray(rc.env.mailbox, folders) >= 0) { + // @TODO: try with 'checkmail' here when #1485186 is fixed. See also #1489249. + rc.command('list'); + } } setTimeout(function(){ window.close() }, 1000); } @@ -4536,7 +4550,7 @@ function rcube_webmail() boxtitle.append(' » '); } - boxtitle.append($('<span>'+prop.name+'</span>')); + boxtitle.append($('<span>').text(prop.name)); } this.triggerEvent('groupupdate', prop); @@ -6110,24 +6124,23 @@ function rcube_webmail() }; // open a jquery UI dialog with the given content - this.show_popup_dialog = function(html, title, buttons) + this.show_popup_dialog = function(html, title, buttons, options) { // forward call to parent window if (this.is_framed()) { - parent.rcmail.show_popup_dialog(html, title, buttons); - return; + return parent.rcmail.show_popup_dialog(html, title, buttons); } var popup = $('<div class="popup">') .html(html) - .dialog({ + .dialog($.extend({ title: title, buttons: buttons, modal: true, resizable: true, width: 500, close: function(event, ui) { $(this).remove() } - }); + }, options || {})); // resize and center popup var win = $(window), w = win.width(), h = win.height(), @@ -6137,6 +6150,8 @@ function rcube_webmail() height: Math.min(h - 40, height + 75 + (buttons ? 50 : 0)), width: Math.min(w - 20, width + 20) }); + + return popup; }; // enable/disable buttons for page shifting @@ -6509,7 +6524,7 @@ function rcube_webmail() if (result === false) return false; else - query = result; + url = this.url(action, result); } url += '&_remote=1'; @@ -6746,7 +6761,7 @@ function rcube_webmail() // post the given form to a hidden iframe this.async_upload_form = function(form, action, onload) { - var ts = new Date().getTime(), + var frame, ts = new Date().getTime(), frame_name = 'rcmupload'+ts; // upload progress support @@ -6765,21 +6780,19 @@ function rcube_webmail() // have to do it this way for IE // otherwise the form will be posted to a new window if (document.all) { - var html = '<iframe name="'+frame_name+'" src="program/resources/blank.gif" style="width:0;height:0;visibility:hidden;"></iframe>'; - document.body.insertAdjacentHTML('BeforeEnd', html); + document.body.insertAdjacentHTML('BeforeEnd', '<iframe name="'+frame_name+'"' + + ' src="program/resources/blank.gif" style="width:0;height:0;visibility:hidden;"></iframe>'); + frame = $('iframe[name="'+frame_name+'"]'); } - else { // for standards-compilant browsers - var frame = document.createElement('iframe'); - frame.name = frame_name; - frame.style.border = 'none'; - frame.style.width = 0; - frame.style.height = 0; - frame.style.visibility = 'hidden'; - document.body.appendChild(frame); + // for standards-compliant browsers + else { + frame = $('<iframe>').attr('name', frame_name) + .css({border: 'none', width: 0, height: 0, visibility: 'hidden'}) + .appendTo(document.body); } // handle upload errors, parsing iframe content in onload - $(frame_name).bind('load', {ts:ts}, onload); + frame.bind('load', {ts:ts}, onload); $(form).attr({ target: frame_name, @@ -6956,6 +6969,9 @@ function rcube_webmail() if (this.task == 'mail' && this.gui_objects.mailboxlist) params = this.check_recent_params(); + params._last = Math.floor(this.env.lastrefresh.getTime() / 1000); + this.env.lastrefresh = new Date(); + // plugins should bind to 'requestrefresh' event to add own params this.http_request('refresh', params, lock); }; @@ -7265,11 +7281,11 @@ rcube_webmail.long_subject_title = function(elem, indent) if (!elem.title) { var $elem = $(elem); if ($elem.width() + indent * 15 > $elem.parent().width()) - elem.title = $elem.html(); + elem.title = $elem.text(); } }; -rcube_webmail.long_subject_title_ie = function(elem, indent) +rcube_webmail.long_subject_title_ex = function(elem, indent) { if (!elem.title) { var $elem = $(elem), diff --git a/program/js/editor.js b/program/js/editor.js index e403d1f63..6d7b9538a 100644 --- a/program/js/editor.js +++ b/program/js/editor.js @@ -74,11 +74,18 @@ function rcmail_editor_init(config) // react to real individual tinyMCE editor init function rcmail_editor_callback() { - var elem = rcube_find_object('_from'), + var css = {}, + elem = rcube_find_object('_from'), fe = rcmail.env.compose_focus_elem; if (rcmail.env.default_font) - $(tinyMCE.get(rcmail.env.composebody).getBody()).css('font-family', rcmail.env.default_font); + css['font-family'] = rcmail.env.default_font; + + if (rcmail.env.default_font_size) + css['font-size'] = rcmail.env.default_font_size; + + if (css['font-family'] || css['font-size']) + $(tinyMCE.get(rcmail.env.composebody).getBody()).css(css); if (elem && elem.type == 'select-one') { rcmail.change_identity(elem); diff --git a/program/js/list.js b/program/js/list.js index c2ad3f7c3..33f88ab10 100644 --- a/program/js/list.js +++ b/program/js/list.js @@ -35,7 +35,7 @@ function rcube_list_widget(list, p) this.tbody; this.fixed_header; this.frame = null; - this.rows = []; + this.rows = {}; this.selection = []; this.rowcount = 0; this.colcount = 0; @@ -50,7 +50,6 @@ function rcube_list_widget(list, p) this.keyboard = false; this.toggleselect = false; - this.dont_select = false; this.drag_active = false; this.col_drag_active = false; this.column_fixed = null; @@ -86,7 +85,7 @@ init: function() } if (this.tbody) { - this.rows = []; + this.rows = {}; this.rowcount = 0; var r, len, rows = this.tbody.childNodes; @@ -240,7 +239,7 @@ clear: function(sel) $(this.row_tagname() + ':not(.thead)', this.tbody).remove(); } - this.rows = []; + this.rows = {}; this.rowcount = 0; if (sel) @@ -409,7 +408,7 @@ drag_row: function(e, id) var evtarget = rcube_event.get_target(e), tagname = evtarget.tagName.toLowerCase(); - if (this.dont_select || (evtarget && (tagname == 'input' || tagname == 'img'))) + if (evtarget && (tagname == 'input' || tagname == 'img' || (tagname != 'a' && evtarget.onclick))) return true; // accept right-clicks @@ -455,23 +454,16 @@ click_row: function(e, id) if ((evtarget && (tagname == 'input' || tagname == 'img'))) return true; - // don't do anything (another action processed before) - if (this.dont_select) { - this.dont_select = false; - return false; - } - var dblclicked = now - this.rows[id].clicked < this.dblclick_time; - // unselects currently selected row - if (!this.drag_active && this.in_selection_before == id && !dblclicked) - this.select_row(id, mod_key, false); - + // selects/unselects currently selected row + if (!this.drag_active && !dblclicked) + this.select_row(id, mod_key, true); + this.drag_start = false; - this.in_selection_before = false; // row was double clicked - if (this.rows && dblclicked && this.in_selection(id)) { + if (this.rowcount && dblclicked && this.in_selection(id)) { this.triggerEvent('dblclick'); now = 0; } @@ -509,8 +501,6 @@ expand_row: function(e, id) evtarget = rcube_event.get_target(e), mod_key = rcube_event.get_modifier(e); - // Don't select this message - this.dont_select = true; // Don't treat double click on the expando as double click on the message. row.clicked = 0; @@ -703,7 +693,7 @@ update_expando: function(uid, expanded) */ get_next_row: function() { - if (!this.rows) + if (!this.rowcount) return false; var last_selected_row = this.rows[this.last_selected], @@ -717,7 +707,7 @@ get_next_row: function() get_prev_row: function() { - if (!this.rows) + if (!this.rowcount) return false; var last_selected_row = this.rows[this.last_selected], @@ -796,7 +786,7 @@ select_row: function(id, mod_key, with_mouse) break; case CONTROL_KEY: - if (!with_mouse) + if (with_mouse) this.highlight_row(id, true); break; @@ -969,7 +959,7 @@ in_selection: function(id) */ select_all: function(filter) { - if (!this.rows || !this.rows.length) + if (!this.rowcount) return false; // reset but remember selection first @@ -1001,7 +991,7 @@ select_all: function(filter) */ invert_selection: function() { - if (!this.rows || !this.rows.length) + if (!this.rowcount) return false; // remember old selection |