From b4b081713ee88c9a7b2515d18c36bedf966641ce Mon Sep 17 00:00:00 2001 From: svncommit <devs@roundcube.net> Date: Mon, 03 Jul 2006 16:14:26 -0400 Subject: [PATCH] Workaround for drag-drop using whitespace in FF, Junk emptying, misc fixes --- program/js/app.js | 243 ++++++++++++++++++++++++++++++++++++++++------- 1 files changed, 204 insertions(+), 39 deletions(-) diff --git a/program/js/app.js b/program/js/app.js index 98a30d3..c60f62f 100644 --- a/program/js/app.js +++ b/program/js/app.js @@ -123,7 +123,7 @@ } // enable mail commands - this.enable_command('list', 'compose', 'add-contact', 'search', 'reset-search', true); + this.enable_command('list', 'checkmail', 'compose', 'add-contact', 'search', 'reset-search', true); if (this.env.action=='show') { @@ -143,15 +143,17 @@ if (this.env.action=='compose') { - this.enable_command('add-attachment', 'send-attachment', 'send', true); + this.enable_command('add-attachment', 'send-attachment', 'remove-attachment', 'send', true); if (this.env.spellcheck) this.enable_command('spellcheck', true); + if (this.env.drafts_mailbox) + this.enable_command('savedraft', true); } if (this.env.messagecount) this.enable_command('select-all', 'select-none', 'sort', 'expunge', true); - if (this.env.messagecount && this.env.mailbox==this.env.trash_mailbox) + if (this.env.messagecount && (this.env.mailbox==this.env.trash_mailbox || this.env.mailbox==this.env.junk_mailbox)) this.enable_command('purge', true); this.set_page_buttons(); @@ -209,7 +211,7 @@ this.enable_command('save', true); if (this.env.action=='folders') - this.enable_command('subscribe', 'unsubscribe', 'create-folder', 'delete-folder', true); + this.enable_command('subscribe', 'unsubscribe', 'create-folder', 'rename-folder', 'delete-folder', true); var identities_list = this.gui_objects.identitieslist; if (identities_list) @@ -611,11 +613,17 @@ { if (this.env.search_request<0 || (this.env.search_request && props != this.env.mailbox)) this.reset_qsearch(); + + // Reset message list header, unless returning from compose/read/etc + if (this.env.mailbox != props && this.message_rows) + this.clear_message_list_header(); + this.list_mailbox(props); } else if (this.task=='addressbook') this.list_contacts(); break; + case 'sort': // get the type of sorting @@ -676,7 +684,17 @@ { var uid = this.get_single_uid(); if (uid && (!this.env.uid || uid != this.env.uid)) - this.show_message(uid); + { + if (this.env.mailbox==this.env.drafts_mailbox) + { + this.set_busy(true); + location.href = this.env.comm_path+'&_action=compose&_draft_uid='+uid+'&_mbox='+escape(this.env.mailbox); + } + else + { + this.show_message(uid); + } + } } else if (this.task=='addressbook') { @@ -830,12 +848,20 @@ //location.href = this.env.comm_path+'&_action=show&_uid='+this.env.prev_uid+'&_mbox='+this.env.mailbox; break; + case 'checkmail': + this.check_for_recent(); + break; case 'compose': var url = this.env.comm_path+'&_action=compose'; - + + if (this.task=='mail' && this.env.mailbox==this.env.drafts_mailbox) + { + var uid = this.get_single_uid(); + url += '&_draft_uid='+uid+'&_mbox='+escape(this.env.mailbox); + } // modify url if we're in addressbook - if (this.task=='addressbook') + else if (this.task=='addressbook') { url = this.get_task_url('mail', url); var a_cids = new Array(); @@ -867,7 +893,7 @@ } else if (props) - url += '&_to='+props; + url += '&_to='+encodeURIComponent(props); // don't know if this is necessary... url = url.replace(/&_framed=1/, ""); @@ -886,6 +912,19 @@ this.env.spellcheck.spellCheck(this.env.spellcheck.check_link); break; + case 'savedraft': + if (!this.gui_objects.messageform) + break; + + // if saving Drafts is disabled in main.inc.php + if (!this.env.drafts_mailbox) + break; + + this.set_busy(true, 'savingmessage'); + var form = this.gui_objects.messageform; + form.submit(); + break; + case 'send': if (!this.gui_objects.messageform) break; @@ -896,6 +935,7 @@ // all checks passed, send message this.set_busy(true, 'sendingmessage'); var form = this.gui_objects.messageform; + form._draft.value=''; form.submit(); break; @@ -904,6 +944,10 @@ case 'send-attachment': this.upload_file(props) + break; + + case 'remove-attachment': + this.remove_attachment(props); break; case 'reply-all': @@ -1001,6 +1045,10 @@ case 'create-folder': this.create_folder(props); + break; + + case 'rename-folder': + this.rename_folder(props); break; case 'delete-folder': @@ -1171,7 +1219,15 @@ // row was double clicked if (this.task=='mail' && this.list_rows && this.list_rows[id].clicked && this.in_selection(id)) { - this.show_message(id); + if (this.env.mailbox==this.env.drafts_mailbox) + { + this.set_busy(true); + location.href = this.env.comm_path+'&_action=compose&_draft_uid='+id+'&_mbox='+escape(this.env.mailbox); + } + else + { + this.show_message(id); + } return false; } else if (this.task=='addressbook') @@ -1293,8 +1349,16 @@ // enable/disable commands for message if (this.task=='mail') { - this.enable_command('show', 'reply', 'reply-all', 'forward', 'print', selected); - this.enable_command('delete', 'moveto', this.selection.length>0 ? true : false); + if (this.env.mailbox==this.env.drafts_mailbox) + { + this.enable_command('show', selected); + this.enable_command('delete', 'moveto', this.selection.length>0 ? true : false); + } + else + { + this.enable_command('show', 'reply', 'reply-all', 'forward', 'print', selected); + this.enable_command('delete', 'moveto', this.selection.length>0 ? true : false); + } } else if (this.task=='addressbook') { @@ -1388,6 +1452,7 @@ for (var n in this.list_rows) { if (!filter || this.list_rows[n][filter]==true) + this.last_selected = n; this.highlight_row(n, true); } return true; @@ -1505,6 +1570,7 @@ this.clear_message_list = function() { var table = this.gui_objects.messagelist; + var tbody = document.createElement('TBODY'); table.insertBefore(tbody, table.tBodies[0]); table.removeChild(table.tBodies[1]); @@ -1514,6 +1580,18 @@ }; + this.clear_message_list_header = function() + { + var table = this.gui_objects.messagelist; + + var colgroup = document.createElement('COLGROUP'); + table.removeChild(table.colgroup); + table.insertBefore(colgroup, table.thead); + + var thead = document.createElement('THEAD'); + table.removeChild(table.thead); + table.insertBefore(thead, table.tBodies[0]); + }; this.expunge_mailbox = function(mbox) { @@ -1594,7 +1672,6 @@ lock = true; this.set_busy(true, 'movingmessage'); } - // send request to server this.http_request('moveto', '_uid='+a_uids.join(',')+'&_mbox='+escape(this.env.mailbox)+'&_target_mbox='+escape(mbox)+'&_from='+(this.env.action ? this.env.action : ''), lock); }; @@ -1907,12 +1984,15 @@ var message = input_message ? input_message.value : ''; var sig, p; + if (!this.env.identity) + this.env.identity = id + // remove the 'old' signature if (this.env.identity && this.env.signatures && this.env.signatures[this.env.identity]) { sig = this.env.signatures[this.env.identity]; - if (sig.indexOf('-- ')!=0) - sig = '-- \n'+sig; + if (sig.indexOf('--')!=0) + sig = '--\n'+sig; p = message.lastIndexOf(sig); if (p>=0) @@ -1923,8 +2003,8 @@ if (this.env.signatures && this.env.signatures[id]) { sig = this.env.signatures[id]; - if (sig.indexOf('-- ')!=0) - sig = '-- \n'+sig; + if (sig.indexOf('--')!=0) + sig = '--\n'+sig; message += '\n'+sig; } @@ -2017,17 +2097,36 @@ // add file name to attachment list // called from upload page - this.add2attachment_list = function(name) + this.add2attachment_list = function(name,content) { if (!this.gui_objects.attachmentlist) return false; var li = document.createElement('LI'); - li.innerHTML = name; + li.id = name; + li.innerHTML = content; this.gui_objects.attachmentlist.appendChild(li); return true; }; + this.remove_from_attachment_list = function(name) + { + if (!this.gui_objects.attachmentlist) + return false; + + var list = this.gui_objects.attachmentlist.getElementsByTagName("li"); + for (i=0;i<list.length;i++) + if (list[i].id == name) + this.gui_objects.attachmentlist.removeChild(list[i]); + } + + this.remove_attachment = function(name) + { + if (name) + this.http_request('remove-attachment', '_filename='+escape(name)); + + return true; + } // send remote request to add a new contact this.add_contact = function(value) @@ -2532,6 +2631,20 @@ form.elements['_folder_name'].focus(); }; + this.rename_folder = function(props) + { + var form; + if ((form = this.gui_objects.editform) && form.elements['_folder_oldname'] && form.elements['_folder_newname']) + { + oldname = form.elements['_folder_oldname'].value; + newname = form.elements['_folder_newname'].value; + } + + if (oldname && newname) + this.http_request('rename-folder', '_folder_oldname='+escape(oldname)+'&_folder_newname='+escape(newname)); + + }; + this.delete_folder = function(folder) { @@ -2551,6 +2664,21 @@ var row; if (id && (row = document.getElementById(id))) row.style.display = 'none'; + + // remove folder from rename-folder list + var form; + if ((form = this.gui_objects.editform) && form.elements['_folder_oldname']) + { + for (var i=0;i<form.elements['_folder_oldname'].options.length;i++) + { + if (form.elements['_folder_oldname'].options[i].value == folder) + { + form.elements['_folder_oldname'].options[i] = null; + break; + } + } + } + form.elements['_folder_newname'].value=''; }; @@ -2614,16 +2742,25 @@ // add a new folder to the subscription list by cloning a folder row this.add_folder_row = function(name) { + name = name.replace('\\',""); if (!this.gui_objects.subscriptionlist) return false; var tbody = this.gui_objects.subscriptionlist.tBodies[0]; var id = tbody.childNodes.length+1; - - // clone a table row - var row = this.clone_table_row(tbody.rows[0]); - row.id = 'rcmrow'+id; - tbody.appendChild(row); + + if (!tbody.rows[0]) + { + // Refresh to create the first table row + location.href = this.env.comm_path+'&_action=folders'; + } + else + { + // clone a table row if there are existing rows + var row = this.clone_table_row(tbody.rows[0]); + row.id = 'rcmrow'+id; + tbody.appendChild(row); + } // add to folder/row-ID map this.env.subscriptionrows[row.id] = name; @@ -2636,11 +2773,15 @@ row.cells[1].firstChild.checked = true; } if (row.cells[2].firstChild.tagName=='A') - row.cells[2].firstChild.onclick = new Function(this.ref+".command('delete-folder','"+name+"')"); + row.cells[2].firstChild.onclick = new Function(this.ref+".command('delete-folder','"+name.replace('\'','\\\'')+"')"); - var form; - if ((form = this.gui_objects.editform) && form.elements['_folder_name']) - form.elements['_folder_name'].value = ''; + var form; + if ((form = this.gui_objects.editform) && form.elements['_folder_name']) + form.elements['_folder_name'].value = ''; + + // add new folder to rename-folder list + form.elements['_folder_oldname'].options[form.elements['_folder_oldname'].options.length] = new Option(name,name); + }; @@ -2743,6 +2884,26 @@ } }; + // mouse down on button + this.button_sel = function(command, id) + { + var a_buttons = this.buttons[command]; + var button, img; + + if(!a_buttons || !a_buttons.length) + return; + + for(var n=0; n<a_buttons.length; n++) + { + button = a_buttons[n]; + if(button.id==id && button.status=='act') + { + img = document.getElementById(button.id); + if (img && button.sel) + img.src = button.sel; + } + } + }; // mouse out of button this.button_out = function(command, id) @@ -2850,6 +3011,11 @@ this.env.mailbox = mbox; }; + // for reordering column array, Konqueror workaround + this.set_message_coltypes = function(coltypes) + { + this.coltypes = coltypes; + } // create a table row in the message list this.add_message_row = function(uid, cols, flags, attachment, attop) @@ -2882,8 +3048,9 @@ row.appendChild(col); // add each submitted col - for (var c in cols) - { + for (var n = 0; n < this.coltypes.length; n++) + { + var c = this.coltypes[n]; col = document.createElement('TD'); col.className = String(c).toLowerCase(); col.innerHTML = cols[c]; @@ -2927,7 +3094,10 @@ { if (!this.gui_objects.mailboxlist) return false; - + + if (mbox==this.env.mailbox) + set_title = true; + var item, reg, text_obj; mbox = String(mbox).toLowerCase().replace(this.mbox_expression, ''); item = document.getElementById('rcmbx'+mbox); @@ -2944,14 +3114,14 @@ text_obj.innerHTML += ' ('+count+')'; else text_obj.innerHTML = text_obj.innerHTML.replace(reg, ''); - + // set the right classes this.set_classname(item, 'unread', count>0 ? true : false); } // set unread count to window title reg = /^\([0-9]+\)\s+/i; - if (set_title && count && document.title) + if (set_title && document.title) { var doc_title = String(document.title); @@ -2961,11 +3131,6 @@ document.title = '('+count+') '+doc_title; else document.title = doc_title.replace(reg, ''); - } - // remove unread count from window title - else if (document.title) - { - document.title = document.title.replace(reg, ''); } }; @@ -3129,8 +3294,7 @@ ctype = ctype_array[0]; } - if (request_obj.__lock) - this.set_busy(false); + this.set_busy(false); console(request_obj.get_text()); @@ -3184,6 +3348,7 @@ // send periodic request to check for recent messages this.check_for_recent = function() { + this.set_busy(true, 'checkingmail'); var d = new Date(); this.http_request('check-recent', '_t='+d.getTime()); }; -- Gitblit v1.9.1