diff --git a/CHANGELOG b/CHANGELOG index 7b984652b..f7e873917 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,6 +1,7 @@ CHANGELOG RoundCube Webmail =========================== +- Added message Edit feature (#1483891, #1484440) - Fix message Etag generation for counter issues (#1485623) - Fix messages searching on MailEnable IMAP (#1485762) - Fixed many 'skip_deleted' issues (#1485634) diff --git a/program/js/app.js b/program/js/app.js index 2831e3d8d..218351ca3 100644 --- a/program/js/app.js +++ b/program/js/app.js @@ -189,7 +189,7 @@ function rcube_webmail() if (this.env.action=='show' || this.env.action=='preview') { this.enable_command('show', 'reply', 'reply-all', 'forward', 'moveto', 'delete', - 'open', 'mark', 'viewsource', 'download', 'print', 'load-attachment', 'load-headers', true); + 'open', 'mark', 'edit', 'viewsource', 'download', 'print', 'load-attachment', 'load-headers', true); if (this.env.next_uid) { @@ -691,6 +691,10 @@ function rcube_webmail() this.load_contact(cid, 'edit'); else if (this.task=='settings' && props) this.load_identity(props, 'edit-identity'); + else if (this.task=='mail' && (cid = this.get_single_uid())) { + var url = (this.env.mailbox == this.env.drafts_mailbox) ? '_draft_uid=' : '_uid='; + this.goto_url('compose', url+cid+'&_mbox='+urlencode(this.env.mailbox), true); + } break; case 'save-identity': @@ -1393,12 +1397,12 @@ function rcube_webmail() if (this.env.mailbox == this.env.drafts_mailbox) { this.enable_command('reply', 'reply-all', 'forward', false); - this.enable_command('show', 'print', 'open', 'download', 'viewsource', selected); + this.enable_command('show', 'print', 'open', 'edit', 'download', 'viewsource', selected); this.enable_command('delete', 'moveto', 'mark', (list.selection.length > 0 ? true : false)); } else { - this.enable_command('show', 'reply', 'reply-all', 'forward', 'print', 'open', 'download', 'viewsource', selected); + this.enable_command('show', 'reply', 'reply-all', 'forward', 'print', 'edit', 'open', 'download', 'viewsource', selected); this.enable_command('delete', 'moveto', 'mark', (list.selection.length > 0 ? true : false)); } @@ -1803,7 +1807,7 @@ function rcube_webmail() this.show_contentframe(false); // Hide message command buttons until a message is selected - this.enable_command('reply', 'reply-all', 'forward', 'delete', 'mark', 'print', 'open', 'viewsource', 'download', false); + this.enable_command('reply', 'reply-all', 'forward', 'delete', 'mark', 'print', 'open', 'edit', 'viewsource', 'download', false); this._with_selected_messages('moveto', lock, add_url); }; @@ -3940,7 +3944,7 @@ function rcube_webmail() case 'moveto': if (this.env.action == 'show') { // re-enable commands on move/delete error - this.enable_command('reply', 'reply-all', 'forward', 'delete', 'mark', 'print', 'open', 'viewsource', 'download', true); + this.enable_command('reply', 'reply-all', 'forward', 'delete', 'mark', 'print', 'open', 'edit', 'viewsource', 'download', true); } else if (this.message_list) this.message_list.init(); break; @@ -3953,7 +3957,7 @@ function rcube_webmail() this.show_contentframe(false); // disable commands useless when mailbox is empty this.enable_command('show', 'reply', 'reply-all', 'forward', 'moveto', 'delete', - 'mark', 'viewsource', 'open', 'download', 'print', 'load-attachment', + 'mark', 'viewsource', 'open', 'edit', 'download', 'print', 'load-attachment', 'purge', 'expunge', 'select-all', 'select-none', 'sort', false); } break; diff --git a/program/steps/mail/compose.inc b/program/steps/mail/compose.inc index 8d541da1e..b0637d345 100644 --- a/program/steps/mail/compose.inc +++ b/program/steps/mail/compose.inc @@ -23,6 +23,7 @@ define('RCUBE_COMPOSE_REPLY', 0x0106); define('RCUBE_COMPOSE_FORWARD', 0x0107); define('RCUBE_COMPOSE_DRAFT', 0x0108); +define('RCUBE_COMPOSE_EDIT', 0x0109); $MESSAGE_FORM = NULL; $MESSAGE = NULL; @@ -74,6 +75,8 @@ if ($msg_uid = $_SESSION['compose']['param']['_reply_uid']) $compose_mode = RCUBE_COMPOSE_REPLY; else if ($msg_uid = $_SESSION['compose']['param']['_forward_uid']) $compose_mode = RCUBE_COMPOSE_FORWARD; +else if ($msg_uid = $_SESSION['compose']['param']['_uid']) + $compose_mode = RCUBE_COMPOSE_EDIT; else if ($msg_uid = $_SESSION['compose']['param']['_draft_uid']) { $RCMAIL->imap->set_mailbox($CONFIG['drafts_mbox']); $compose_mode = RCUBE_COMPOSE_DRAFT; @@ -168,7 +171,6 @@ function rcmail_compose_headers($attrib) $fvalue = get_input_value($fname, RCUBE_INPUT_POST, TRUE); else if ($fname && !$fvalue && !empty($_SESSION['compose']['param'][$fname])) $fvalue = $_SESSION['compose']['param'][$fname]; - else if ($header && $compose_mode == RCUBE_COMPOSE_REPLY) { // get recipent address(es) out of the message headers @@ -208,7 +210,7 @@ function rcmail_compose_headers($attrib) } } } - else if ($header && $compose_mode == RCUBE_COMPOSE_DRAFT) + else if ($header && in_array($compose_mode, array(RCUBE_COMPOSE_DRAFT, RCUBE_COMPOSE_EDIT))) { // get drafted headers if ($header=='to' && !empty($MESSAGE->headers->to)) @@ -385,7 +387,7 @@ function rcmail_compose_body($attrib) else if ($compose_mode == RCUBE_COMPOSE_FORWARD) $body = rcmail_create_forward_body($body, $isHtml); // load draft message body - else if ($compose_mode == RCUBE_COMPOSE_DRAFT) + else if ($compose_mode == RCUBE_COMPOSE_DRAFT || $compose_mode == RCUBE_COMPOSE_EDIT) $body = rcmail_create_draft_body($body, $isHtml); } else if (!empty($_SESSION['compose']['param']['_body'])) @@ -689,7 +691,7 @@ function rcmail_compose_subject($attrib) $subject = 'Fwd: '.$MESSAGE->subject; } // creeate a draft-subject - else if ($compose_mode == RCUBE_COMPOSE_DRAFT) { + else if ($compose_mode == RCUBE_COMPOSE_DRAFT || $compose_mode == RCUBE_COMPOSE_EDIT) { $subject = $MESSAGE->subject; } else if (!empty($_SESSION['compose']['param']['_subject'])) { @@ -828,8 +830,8 @@ function rcmail_receipt_checkbox($attrib) $checkbox = new html_checkbox($attrib); $out = $form_start ? "$form_start\n" : ''; - $out .= $checkbox->show( - $compose_mode == RCUBE_COMPOSE_DRAFT && $MESSAGE->headers->mdn_to ? 1 : 0); + $out .= $checkbox->show(in_array($compose_mode, array(RCUBE_COMPOSE_DRAFT, RCUBE_COMPOSE_EDIT)) + && $MESSAGE->headers->mdn_to ? 1 : 0); $out .= $form_end ? "\n$form_end" : ''; return $out; diff --git a/skins/default/includes/messagemenu.html b/skins/default/includes/messagemenu.html index 4112bfab4..c5eadb6d1 100644 --- a/skins/default/includes/messagemenu.html +++ b/skins/default/includes/messagemenu.html @@ -2,6 +2,7 @@