From 92e81cbf22b78bd06bae8006cd5cda57660838c8 Mon Sep 17 00:00:00 2001 From: Aleksander Machniak <alec@alec.pl> Date: Fri, 04 Apr 2014 13:58:24 -0400 Subject: [PATCH] Improve error message on failed http connection --- program/js/app.js | 181 +++++++++++++++++++++++++++++---------------- 1 files changed, 117 insertions(+), 64 deletions(-) diff --git a/program/js/app.js b/program/js/app.js index f83caeb..6d2581a 100644 --- a/program/js/app.js +++ b/program/js/app.js @@ -564,7 +564,7 @@ // execute a specific command on the web client this.command = function(command, props, obj, event) { - var ret, uid, cid, url, flag; + var ret, uid, cid, url, flag, aborted = false; if (obj && obj.blur) obj.blur(); @@ -650,11 +650,16 @@ var form = this.gui_objects.messageform, win = this.open_window(''); - this.save_compose_form_local(); - $("input[name='_action']", form).val('compose'); - form.action = this.url('mail/compose', { _id: this.env.compose_id, _extwin: 1 }); - form.target = win.name; - form.submit(); + if (win) { + this.save_compose_form_local(); + $("input[name='_action']", form).val('compose'); + form.action = this.url('mail/compose', { _id: this.env.compose_id, _extwin: 1 }); + form.target = win.name; + form.submit(); + } + else { + // this.display_message(this.get_label('windowopenerror'), 'error'); + } } else { this.open_window(this.env.permaurl, true); @@ -1049,7 +1054,10 @@ // Reset the auto-save timer clearTimeout(this.save_timer); - this.upload_file(props || this.gui_objects.uploadform, 'upload'); + if (!this.upload_file(props || this.gui_objects.uploadform, 'upload')) { + alert(this.get_label('selectimportfile')); + aborted = true; + } break; case 'insert-sig': @@ -1172,8 +1180,13 @@ case 'import-messages': var form = props || this.gui_objects.importform; - $('input[name="_unlock"]', form).val(this.set_busy(true, 'importwait')); - this.upload_file(form, 'import'); + var importlock = this.set_busy(true, 'importwait'); + $('input[name="_unlock"]', form).val(importlock); + if (!this.upload_file(form, 'import')) { + this.set_busy(false, null, importlock); + alert(this.get_label('selectimportfile')); + aborted = true; + } break; case 'import': @@ -1181,6 +1194,7 @@ var file = document.getElementById('rcmimportfile'); if (file && !file.value) { alert(this.get_label('selectimportfile')); + aborted = true; break; } this.gui_objects.importform.submit(); @@ -1232,9 +1246,9 @@ break; } - if (this.triggerEvent('after'+command, props) === false) + if (!aborted && this.triggerEvent('after'+command, props) === false) ret = false; - this.triggerEvent('actionafter', {props:props, action:command}); + this.triggerEvent('actionafter', { props:props, action:command, aborted:aborted }); return ret === false ? false : obj ? false : true; }; @@ -1434,11 +1448,31 @@ this.drag_end = function(e) { - this.drag_active = false; - this.env.last_folder_target = null; + var list, model; if (this.treelist) this.treelist.drag_end(); + + // execute drag & drop action when mouse was released + if (list = this.message_list) + model = this.env.mailboxes; + else if (list = this.contact_list) + model = this.env.contactfolders; + + if (this.drag_active && model && this.env.last_folder_target) { + var target = model[this.env.last_folder_target]; + list.draglayer.hide(); + + if (this.contact_list) { + if (!this.contacts_drag_menu(e, target)) + this.command('move', target); + } + else if (!this.drag_menu(e, target)) + this.command('move', target); + } + + this.drag_active = false; + this.env.last_folder_target = null; }; this.drag_move = function(e) @@ -1499,37 +1533,15 @@ this.doc_mouse_up = function(e) { - var model, list, id; + var list, id; // ignore event if jquery UI dialog is open if ($(rcube_event.get_target(e)).closest('.ui-dialog, .ui-widget-overlay').length) return; - if (list = this.message_list) - model = this.env.mailboxes; - else if (list = this.contact_list) - model = this.env.contactfolders; - else if (this.ksearch_value) - this.ksearch_blur(); - + list = this.message_list || this.contact_list; if (list && !rcube_mouse_is_over(e, list.list.parentNode)) list.blur(); - - // handle mouse release when dragging - if (this.drag_active && model && this.env.last_folder_target) { - var target = model[this.env.last_folder_target]; - - this.env.last_folder_target = null; - list.draglayer.hide(); - this.drag_end(e); - - if (this.contact_list) { - if (!this.contacts_drag_menu(e, target)) - this.command('move', target); - } - else if (!this.drag_menu(e, target)) - this.command('move', target); - } // reset 'pressed' buttons if (this.buttons_sel) { @@ -1889,12 +1901,12 @@ tree += '<span id="msgicn'+uid+'" class="'+css_class+'"> </span>'; row.className = row_class; - // build subject link - if (!bw.ie && cols.subject) { + // build subject link + if (cols.subject) { var action = flags.mbox == this.env.drafts_mailbox ? 'compose' : 'show'; var uid_param = flags.mbox == this.env.drafts_mailbox ? '_draft_uid' : '_uid'; cols.subject = '<a href="./?_task=mail&_action='+action+'&_mbox='+urlencode(flags.mbox)+'&'+uid_param+'='+uid+'"'+ - ' onclick="return rcube_event.cancel(event)" onmouseover="rcube_webmail.long_subject_title(this,'+(message.depth+1)+')">'+cols.subject+'</a>'; + ' onclick="return rcube_event.cancel(event)" onmouseover="rcube_webmail.long_subject_title(this,'+(message.depth+1)+')"><span>'+cols.subject+'</span></a>'; } // add each submitted col @@ -3096,7 +3108,12 @@ // close compose step in opener if (opener_rc && opener_rc.env.action == 'compose') { - setTimeout(function(){ opener.history.back(); }, 100); + setTimeout(function(){ + if (opener.history.length > 1) + opener.history.back(); + else + opener_rc.redirect(opener_rc.get_task_url('mail')); + }, 100); this.env.opened_extwin = true; } @@ -3139,6 +3156,10 @@ } // skip records from 'other' drafts if (this.env.draft_id && formdata.draft_id && formdata.draft_id != this.env.draft_id) { + continue; + } + // skip records on reply + if (this.env.reply_msgid && formdata.reply_msgid != this.env.reply_msgid) { continue; } // show dialog asking to restore the message @@ -3392,7 +3413,7 @@ if ($("input[name='_is_html']").val() == '1') { var editor = tinyMCE.get(this.env.composebody); editor.getWin().focus(); // correct focus in IE & Chrome - editor.selection.setContent(insert, { format:'text' }); + editor.selection.setContent(this.quote_html(insert).replace(/\r?\n/g, '<br/>'), { format:'text' }); } // replace selection in compose textarea else { @@ -3616,8 +3637,14 @@ this.env.draft_id = id; $("input[name='_draft_saveid']").val(id); - this.remove_compose_data(this.env.compose_id); + // reset history of hidden iframe used for saving draft (#1489643) + if (window.frames['savetarget'] && window.frames['savetarget'].history) { + window.frames['savetarget'].history.back(); + } } + + // always remove local copy upon saving as draft + this.remove_compose_data(this.env.compose_id); }; this.auto_save_start = function() @@ -3680,6 +3707,9 @@ if (this.env.draft_id) { formdata.draft_id = this.env.draft_id; + } + if (this.env.reply_msgid) { + formdata.reply_msgid = this.env.reply_msgid; } $('input, select, textarea', this.gui_objects.messageform).each(function(i, elem) { @@ -3960,7 +3990,7 @@ if (numfiles) { if (this.env.max_filesize && this.env.filesizeerror && size > this.env.max_filesize) { this.display_message(this.env.filesizeerror, 'error'); - return; + return false; } var frame_name = this.async_upload_form(form, action || 'upload', function(e) { @@ -3994,11 +4024,13 @@ if (this.env.upload_progress_time) { this.upload_progress_start('upload', ts); } + + // set reference to the form object + this.gui_objects.attachmentform = form; + return true; } - // set reference to the form object - this.gui_objects.attachmentform = form; - return true; + return false; }; // add file name to attachment list @@ -4040,8 +4072,10 @@ this.remove_from_attachment_list = function(name) { - delete this.env.attachments[name]; - $('#'+name).remove(); + if (this.env.attachments) { + delete this.env.attachments[name]; + $('#'+name).remove(); + } }; this.remove_attachment = function(name) @@ -6092,7 +6126,10 @@ // disable/enable input buttons if (button.type == 'input') { button.status = state; - obj.disabled = !state; + obj.disabled = state == 'pas'; + } + else if (button.type == 'uibutton') { + $(obj).button('option', 'disabled', state == 'pas'); } } }; @@ -6308,7 +6345,7 @@ { // forward call to parent window if (this.is_framed()) { - return parent.rcmail.show_popup_dialog(html, title, buttons); + return parent.rcmail.show_popup_dialog(html, title, buttons, options); } var popup = $('<div class="popup">') @@ -6328,7 +6365,7 @@ popup.dialog('option', { height: Math.min(h - 40, height + 75 + (buttons ? 50 : 0)), - width: Math.min(w - 20, width + 20) + width: Math.min(w - 20, width + 36) }); return popup; @@ -6663,14 +6700,22 @@ this.element_position = function(element, obj) { var obj = $(obj), win = $(window), - width = obj.width(), - height = obj.height(), + width = obj.outerWidth(), + height = obj.outerHeight(), + menu_pos = obj.data('menu-pos'), win_height = win.height(), elem_height = $(element).height(), elem_width = $(element).width(), pos = obj.offset(), top = pos.top, left = pos.left + width; + + if (menu_pos == 'bottom') { + top += height; + left -= width; + } + else + left -= 5; if (top + elem_height > win_height) { top -= elem_height - height; @@ -7018,7 +7063,7 @@ else if (status == 'timeout') this.display_message(this.get_label('requesttimedout'), 'error'); else if (request.status == 0 && status != 'abort') - this.display_message(this.get_label('servererror') + ' (No connection)', 'error'); + this.display_message(this.get_label('connerror'), 'error'); // redirect to url specified in location header if not empty var location_url = request.getResponseHeader("Location"); @@ -7465,20 +7510,28 @@ try { window.navigator.registerProtocolHandler('mailto', this.mailto_handler_uri(), name); } - catch(e) {}; + catch(e) { + this.display_message(String(e), 'error'); + }; }; this.check_protocol_handler = function(name, elem) { var nav = window.navigator; - if (!nav - || (typeof nav.registerProtocolHandler != 'function') - || ((typeof nav.isProtocolHandlerRegistered == 'function') - && nav.isProtocolHandlerRegistered('mailto', this.mailto_handler_uri()) == 'registered') - ) - $(elem).addClass('disabled'); - else - $(elem).click(function() { rcmail.register_protocol_handler(name); return false; }); + if (!nav || (typeof nav.registerProtocolHandler != 'function')) { + $(elem).addClass('disabled').click(function(){ return false; }); + } + else { + var status = null; + if (typeof nav.isProtocolHandlerRegistered == 'function') { + status = nav.isProtocolHandlerRegistered('mailto', this.mailto_handler_uri()); + if (status) + $(elem).parent().find('.mailtoprotohandler-status').html(status); + } + else { + $(elem).click(function() { rcmail.register_protocol_handler(name); return false; }); + } + } }; // Checks browser capabilities eg. PDF support, TIF support -- Gitblit v1.9.1