diff options
| -rw-r--r-- | plugins/managesieve/Changelog | 2 | ||||
| -rw-r--r-- | plugins/managesieve/localization/en_US.inc | 6 | ||||
| -rw-r--r-- | plugins/managesieve/localization/pl_PL.inc | 4 | ||||
| -rw-r--r-- | plugins/managesieve/managesieve.js | 180 | ||||
| -rw-r--r-- | plugins/managesieve/managesieve.php | 150 | ||||
| -rw-r--r-- | plugins/managesieve/skins/default/filter.png | bin | 0 -> 547 bytes | |||
| -rw-r--r-- | plugins/managesieve/skins/default/managesieve.css | 17 | ||||
| -rw-r--r-- | plugins/managesieve/skins/default/managesieve_mail.css | 63 | ||||
| -rw-r--r-- | plugins/managesieve/skins/default/templates/filteredit.html | 7 |
9 files changed, 378 insertions, 51 deletions
diff --git a/plugins/managesieve/Changelog b/plugins/managesieve/Changelog index 4472ccf21..7c056fb76 100644 --- a/plugins/managesieve/Changelog +++ b/plugins/managesieve/Changelog @@ -1,3 +1,5 @@ +- Added possibility to create a filter based on selected message "in-place" + * version 4.3 [2011-07-28] ----------------------------------------------------------- - Fixed handling of error in Net_Sieve::listScripts() diff --git a/plugins/managesieve/localization/en_US.inc b/plugins/managesieve/localization/en_US.inc index f08357ed9..559e9a06c 100644 --- a/plugins/managesieve/localization/en_US.inc +++ b/plugins/managesieve/localization/en_US.inc @@ -77,6 +77,9 @@ $labels['flagdeleted'] = 'Deleted'; $labels['flaganswered'] = 'Answered'; $labels['flagflagged'] = 'Flagged'; $labels['flagdraft'] = 'Draft'; +$labels['filtercreate'] = 'Create filter'; +$labels['usedata'] = 'Use following data in the filter:'; +$labels['nextstep'] = 'Next Step'; $messages = array(); $messages['filterunknownerror'] = 'Unknown server error'; @@ -100,6 +103,7 @@ $messages['setdeleteconfirm'] = 'Are you sure, you want to delete selected filte $messages['setcreateerror'] = 'Unable to create filters set. Server error occured'; $messages['setcreated'] = 'Filters set created successfully'; $messages['emptyname'] = 'Unable to create filters set. Empty set name'; -$messages['nametoolong'] = 'Unable to create filters set. Name too long' +$messages['nametoolong'] = 'Unable to create filters set. Name too long'; +$messages['nodata'] = 'At least one position must be selected!'; ?> diff --git a/plugins/managesieve/localization/pl_PL.inc b/plugins/managesieve/localization/pl_PL.inc index 290dd1a46..4b088f0a6 100644 --- a/plugins/managesieve/localization/pl_PL.inc +++ b/plugins/managesieve/localization/pl_PL.inc @@ -78,6 +78,9 @@ $labels['flagdeleted'] = 'Usunięta'; $labels['flaganswered'] = 'Z odpowiedzią'; $labels['flagflagged'] = 'Oflagowana'; $labels['flagdraft'] = 'Szkic'; +$labels['filtercreate'] = 'Utwóż filtr'; +$labels['usedata'] = 'Użyj następujących danych do utworzenia filtra:'; +$labels['nextstep'] = 'Następny krok'; $messages = array(); $messages['filterunknownerror'] = 'Nieznany błąd serwera'; @@ -102,5 +105,6 @@ $messages['setcreateerror'] = 'Nie można utworzyć zbioru filtrów. Błąd serw $messages['setcreated'] = 'Zbiór filtrów został utworzony pomyślnie'; $messages['emptyname'] = 'Nie można utworzyć zbioru filtrów. Pusta nazwa zbioru'; $messages['nametoolong'] = 'Nie można utworzyć zbioru filtrów. Nazwa zbyt długa' +$messages['nodata'] = 'Należy wybrać co najmniej jedną pozycję!'; ?> diff --git a/plugins/managesieve/managesieve.js b/plugins/managesieve/managesieve.js index ec6247aff..9efbfe6b4 100644 --- a/plugins/managesieve/managesieve.js +++ b/plugins/managesieve/managesieve.js @@ -1,43 +1,59 @@ -/* Sieve Filters (tab) */ +/* (Manage)Sieve Filters */ if (window.rcmail) { rcmail.addEventListener('init', function(evt) { + // add managesieve-create command to message_commands array, + // so it's state will be updated on message selection/unselection + if (rcmail.env.task == 'mail') { + if (rcmail.env.action != 'show') + rcmail.env.message_commands.push('managesieve-create'); + else + rcmail.enable_command('managesieve-create', true); + } + else { + var tab = $('<span>').attr('id', 'settingstabpluginmanagesieve').addClass('tablink'), + button = $('<a>').attr('href', rcmail.env.comm_path+'&_action=plugin.managesieve') + .attr('title', rcmail.gettext('managesieve.managefilters')) + .html(rcmail.gettext('managesieve.filters')) + .appendTo(tab); - var tab = $('<span>').attr('id', 'settingstabpluginmanagesieve').addClass('tablink'); - var button = $('<a>').attr('href', rcmail.env.comm_path+'&_action=plugin.managesieve') - .attr('title', rcmail.gettext('managesieve.managefilters')) - .html(rcmail.gettext('managesieve.filters')) - .appendTo(tab); + // add tab + rcmail.add_element(tab, 'tabs'); + } - // add button and register commands - rcmail.add_element(tab, 'tabs'); - rcmail.register_command('plugin.managesieve-save', function() { rcmail.managesieve_save() }, true); - rcmail.register_command('plugin.managesieve-add', function() { rcmail.managesieve_add() }, true); - rcmail.register_command('plugin.managesieve-del', function() { rcmail.managesieve_del() }, true); - rcmail.register_command('plugin.managesieve-up', function() { rcmail.managesieve_up() }, true); - rcmail.register_command('plugin.managesieve-down', function() { rcmail.managesieve_down() }, true); - rcmail.register_command('plugin.managesieve-set', function() { rcmail.managesieve_set() }, true); - rcmail.register_command('plugin.managesieve-setadd', function() { rcmail.managesieve_setadd() }, true); - rcmail.register_command('plugin.managesieve-setdel', function() { rcmail.managesieve_setdel() }, true); - rcmail.register_command('plugin.managesieve-setact', function() { rcmail.managesieve_setact() }, true); - rcmail.register_command('plugin.managesieve-setget', function() { rcmail.managesieve_setget() }, true); + if (rcmail.env.task == 'mail' || rcmail.env.action.indexOf('plugin.managesieve') != -1) { + // Create layer for form tips + if (!rcmail.env.framed) { + rcmail.env.ms_tip_layer = $('<div id="managesieve-tip" class="popupmenu"></div>'); + rcmail.env.ms_tip_layer.appendTo(document.body); + } + } - if (rcmail.env.action == 'plugin.managesieve') { + // register commands + rcmail.register_command('plugin.managesieve-save', function() { rcmail.managesieve_save() }); + rcmail.register_command('plugin.managesieve-add', function() { rcmail.managesieve_add() }); + rcmail.register_command('plugin.managesieve-del', function() { rcmail.managesieve_del() }); + rcmail.register_command('plugin.managesieve-up', function() { rcmail.managesieve_up() }); + rcmail.register_command('plugin.managesieve-down', function() { rcmail.managesieve_down() }); + rcmail.register_command('plugin.managesieve-set', function() { rcmail.managesieve_set() }); + rcmail.register_command('plugin.managesieve-setadd', function() { rcmail.managesieve_setadd() }); + rcmail.register_command('plugin.managesieve-setdel', function() { rcmail.managesieve_setdel() }); + rcmail.register_command('plugin.managesieve-setact', function() { rcmail.managesieve_setact() }); + rcmail.register_command('plugin.managesieve-setget', function() { rcmail.managesieve_setget() }); + + if (rcmail.env.action == 'plugin.managesieve' || rcmail.env.action == 'plugin.managesieve-save') { if (rcmail.gui_objects.sieveform) { rcmail.enable_command('plugin.managesieve-save', true); + // resize dialog window + if (rcmail.env.action == 'plugin.managesieve' && rcmail.env.task == 'mail') { + parent.rcmail.managesieve_dialog_resize(rcmail.gui_objects.sieveform); + } + $('input[type="text"]:first', rcmail.gui_objects.sieveform).focus(); } else { - rcmail.enable_command('plugin.managesieve-del', 'plugin.managesieve-up', - 'plugin.managesieve-down', false); rcmail.enable_command('plugin.managesieve-add', 'plugin.managesieve-setadd', !rcmail.env.sieveconnerror); } - // Create layer for form tips - if (!rcmail.env.framed) { - rcmail.env.ms_tip_layer = $('<div id="managesieve-tip" class="popupmenu"></div>'); - rcmail.env.ms_tip_layer.appendTo(document.body); - } - if (rcmail.gui_objects.filterslist) { var p = rcmail; rcmail.filters_list = new rcube_list_widget(rcmail.gui_objects.filterslist, {multiselect:false, draggable:false, keyboard:false}); @@ -479,17 +495,19 @@ rcube_webmail.prototype.managesieve_reload = function(set) // Register onmouse(leave/enter) events for tips on specified form element rcube_webmail.prototype.managesieve_tip_register = function(tips) { + var n, framed = parent.rcmail, + tip = framed ? parent.rcmail.env.ms_tip_layer : rcmail.env.ms_tip_layer; + for (var n in tips) { $('#'+tips[n][0]) .bind('mouseenter', {str: tips[n][1]}, function(e) { var offset = $(this).offset(), - tip = rcmail.env.framed ? parent.rcmail.env.ms_tip_layer : rcmail.env.ms_tip_layer, left = offset.left, top = offset.top - 12; - if (rcmail.env.framed) { - offset = $(parent.document.getElementById('filter-box')).offset(); + if (framed) { + offset = $((rcmail.env.task == 'mail' ? '#sievefilterform > iframe' : '#filter-box'), parent.document).offset(); top += offset.top; left += offset.left; } @@ -499,12 +517,7 @@ rcube_webmail.prototype.managesieve_tip_register = function(tips) tip.css({left: left, top: top}).show(); }) - .bind('mouseleave', - function(e) { - var tip = parent.rcmail && parent.rcmail.env.ms_tip_layer ? - parent.rcmail.env.ms_tip_layer : rcmail.env.ms_tip_layer; - tip.hide(); - }); + .bind('mouseleave', function(e) { tip.hide(); }); } }; @@ -579,3 +592,98 @@ function action_type_select(id) elems[x].style.display = !enabled[x] ? 'none' : 'inline'; } }; + +/*********************************************************/ +/********* Mail UI methods *********/ +/*********************************************************/ + +rcube_webmail.prototype.managesieve_create = function() +{ + if (!rcmail.env.sieve_headers || !rcmail.env.sieve_headers.length) + return; + + var i, html, buttons = {}, dialog = $("#sievefilterform"); + + // create dialog window + if (!dialog.length) { + dialog = $('<div id="sievefilterform"></div>'); + $('body').append(dialog); + } + + // build dialog window content + html = '<fieldset><legend>'+this.gettext('managesieve.usedata')+'</legend><ul>'; + for (i in rcmail.env.sieve_headers) + html += '<li><input type="checkbox" name="headers[]" id="sievehdr'+i+'" value="'+i+'" checked="checked" />' + +'<label for="sievehdr'+i+'">'+rcmail.env.sieve_headers[i][0]+':</label> '+rcmail.env.sieve_headers[i][1]+'</li>'; + html += '</ul></fieldset>'; + + dialog.html(html); + + // [Next Step] button action + buttons[this.gettext('managesieve.nextstep')] = function () { + // check if there's at least one checkbox checked + var hdrs = $('input[name="headers[]"]:checked', dialog); + if (!hdrs.length) { + alert(rcmail.gettext('managesieve.nodata')); + return; + } + + // build frame URL + var url = rcmail.get_task_url('mail'); + url = rcmail.add_url(url, '_action', 'plugin.managesieve'); + url = rcmail.add_url(url, '_framed', 1); + + hdrs.map(function() { + var val = rcmail.env.sieve_headers[this.value]; + url = rcmail.add_url(url, 'r['+this.value+']', val[0]+':'+val[1]); + }); + + // load form in the iframe + var frame = $('<iframe>').attr({src: url, frameborder: 0}) + frame.height(dialog.height()); // temp. + dialog.empty().append(frame); + dialog.dialog('dialog').resize(); + + // Change [Next Step] button with [Save] button + buttons = {}; + buttons[rcmail.gettext('save')] = function() { + var win = $('iframe', dialog).get(0).contentWindow; + win.rcmail.managesieve_save(); + }; + dialog.dialog('option', 'buttons', buttons); + }; + + // show dialog window + dialog.dialog({ + modal: false, + resizable: !bw.ie6, + closeOnEscape: (!bw.ie6 && !bw.ie7), // disable for performance reasons + title: this.gettext('managesieve.newfilter'), + close: function() { rcmail.managesieve_dialog_close(); }, + buttons: buttons, + minWidth: 600, + minHeight: 300 + }).show(); + + this.env.managesieve_dialog = dialog; +} + +rcube_webmail.prototype.managesieve_dialog_close = function() +{ + var dialog = this.env.managesieve_dialog; + + // BUG(?): if we don't remove the iframe first, it will be reloaded + dialog.html(''); + dialog.dialog('destroy').hide(); +} + +rcube_webmail.prototype.managesieve_dialog_resize = function(o) +{ + var dialog = this.env.managesieve_dialog, + win = $(window), form = $(o); + width = form.width(), height = form.height(), + w = win.width(), h = win.height(); + + dialog.dialog('option', { height: Math.min(h-20, height+120), width: Math.min(w-20, width+65) }) + .dialog('option', 'position', ['center', 'center']); // only works in a separate call (!?) +} diff --git a/plugins/managesieve/managesieve.php b/plugins/managesieve/managesieve.php index 8ee3b3bde..41a60cf66 100644 --- a/plugins/managesieve/managesieve.php +++ b/plugins/managesieve/managesieve.php @@ -13,6 +13,7 @@ * Configuration (see config.inc.php.dist) * * Copyright (C) 2008-2011, The Roundcube Dev Team + * Copyright (C) 2011, Kolab Systems AG * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 @@ -32,7 +33,7 @@ class managesieve extends rcube_plugin { - public $task = 'settings'; + public $task = 'mail|settings'; private $rc; private $sieve; @@ -50,20 +51,102 @@ class managesieve extends rcube_plugin function init() { - // add Tab label/title - $this->add_texts('localization/', array('filters','managefilters')); + $this->rc = rcmail::get_instance(); // register actions $this->register_action('plugin.managesieve', array($this, 'managesieve_actions')); $this->register_action('plugin.managesieve-save', array($this, 'managesieve_save')); + if ($this->rc->task == 'settings') { + // load localization + $this->add_texts('localization/', array('filters','managefilters')); + + $this->include_script('managesieve.js'); + } + else if ($this->rc->task == 'mail') { + // register message hook + $this->add_hook('message_headers_output', array($this, 'mail_headers')); + + // inject Create Filter popup stuff + if (empty($this->rc->action) || $this->rc->action == 'show') { + $this->mail_task_handler(); + } + } + } + + /** + * Add UI elements to the 'mailbox view' and 'show message' UI. + */ + function mail_task_handler() + { + // load localization + $this->add_texts('localization/'); + + // use jQuery for popup window + $this->require_plugin('jqueryui'); + // include main js script $this->include_script('managesieve.js'); + + // include styles + $skin = $this->rc->config->get('skin'); + if (!file_exists($this->home."/skins/$skin/managesieve_mail.css")) + $skin = 'default'; + $this->include_stylesheet("skins/$skin/managesieve_mail.css"); + + // add 'Create filter' item to message menu + $this->api->add_content(html::tag('li', null, + $this->api->output->button(array( + 'command' => 'managesieve-create', + 'label' => 'managesieve.filtercreate', + 'type' => 'link', + 'classact' => 'filterlink active', + 'class' => 'filterlink', + ))), 'messagemenu'); + + // register some labels/messages + $this->rc->output->add_label('managesieve.newfilter', 'managesieve.usedata', + 'managesieve.nodata', 'managesieve.nextstep', 'save'); } + /** + * Get message headers for popup window + */ + function mail_headers($args) + { + $headers = $args['headers']; + $ret = array(); + + if ($headers->subject) + $ret[] = array('Subject', $headers->subject); + + // @TODO: List-Id, others? + foreach (array('From', 'To') as $h) { + $hl = strtolower($h); + if ($headers->$hl) { + $list = $this->rc->imap->decode_address_list($headers->$hl); + foreach ($list as $item) { + if ($item['mailto']) { + $ret[] = array($h, $item['mailto']); + } + } + } + } + + if ($this->rc->action == 'preview') + $this->rc->output->command('parent.set_env', array('sieve_headers' => $ret)); + else + $this->rc->output->set_env('sieve_headers', $ret); + + + return $args; + } + + /** + * Loads configuration, initializes plugin (including sieve connection) + */ function managesieve_start() { - $this->rc = rcmail::get_instance(); $this->load_config(); // register UI objects @@ -169,6 +252,14 @@ class managesieve extends rcube_plugin function managesieve_actions() { + // load localization + $this->add_texts('localization/', array('filters','managefilters')); + + // include main js script + if ($this->api->output->type == 'html') { + $this->include_script('managesieve.js'); + } + // Init plugin and handle managesieve connection $error = $this->managesieve_start(); @@ -298,12 +389,47 @@ class managesieve extends rcube_plugin $this->rc->output->send(); } + else if ($this->rc->task == 'mail') { + // Initialize the form + $rules = get_input_value('r', RCUBE_INPUT_GET); + if (!empty($rules)) { + $i = 0; + foreach ($rules as $rule) { + list($header, $value) = explode(':', $rule, 2); + $tests[$i] = array( + 'type' => 'contains', + 'test' => 'header', + 'arg1' => $header, + 'arg2' => $value, + ); + $i++; + } + + $this->form = array( + 'join' => count($tests) > 1 ? 'allof' : 'anyof', + 'name' => '', + 'tests' => $tests, + 'actions' => array( + 0 => array('type' => 'fileinto'), + 1 => array('type' => 'stop'), + ), + ); + } + } $this->managesieve_send(); } function managesieve_save() { + // load localization + $this->add_texts('localization/', array('filters','managefilters')); + + // include main js script + if ($this->api->output->type == 'html') { + $this->include_script('managesieve.js'); + } + // Init plugin and handle managesieve connection $error = $this->managesieve_start(); @@ -596,11 +722,17 @@ class managesieve extends rcube_plugin if ($save && $fid !== false) { $this->rc->output->show_message('managesieve.filtersaved', 'confirmation'); - $this->rc->output->add_script( - sprintf("rcmail.managesieve_updatelist('%s', '%s', %d, %d);", - isset($new) ? 'add' : 'update', Q($this->form['name']), - $fid, $this->form['disabled']), - 'foot'); + if ($this->rc->task != 'mail') { + $this->rc->output->add_script( + sprintf("rcmail.managesieve_updatelist('%s', '%s', %d, %d);", + isset($new) ? 'add' : 'update', Q($this->form['name']), + $fid, $this->form['disabled']), + 'foot'); + } + else { + $this->rc->output->command('managesieve_dialog_close'); + $this->rc->output->send('iframe'); + } } else { $this->rc->output->show_message('managesieve.filtersaveerror', 'error'); diff --git a/plugins/managesieve/skins/default/filter.png b/plugins/managesieve/skins/default/filter.png Binary files differnew file mode 100644 index 000000000..a79ba1083 --- /dev/null +++ b/plugins/managesieve/skins/default/filter.png diff --git a/plugins/managesieve/skins/default/managesieve.css b/plugins/managesieve/skins/default/managesieve.css index 675c5d0dc..e416fd17e 100644 --- a/plugins/managesieve/skins/default/managesieve.css +++ b/plugins/managesieve/skins/default/managesieve.css @@ -1,6 +1,3 @@ -/***** Roundcube|Filters styles *****/ - - #filterslist { position: absolute; @@ -168,6 +165,7 @@ body.iframe { min-width: 740px; width: expression(Math.max(740, document.documentElement.clientWidth)+'px'); + background-color: #F2F2F2; } #filter-form @@ -294,3 +292,16 @@ span.sieve.error { width: 200px; } + +/* fixes for popup window */ + +body.iframe.mail +{ + margin: 0; + padding: 0; +} + +body.iframe.mail #filter-form +{ + padding: 10px 5px 5px 5px; +} diff --git a/plugins/managesieve/skins/default/managesieve_mail.css b/plugins/managesieve/skins/default/managesieve_mail.css new file mode 100644 index 000000000..5bb2a2825 --- /dev/null +++ b/plugins/managesieve/skins/default/managesieve_mail.css @@ -0,0 +1,63 @@ +#messagemenu li a.filterlink { + background-image: url(filter.png); + background-position: 7px 0; +} + +#sievefilterform { + top: 0; + bottom: 0; + left: 0; + right: 0; + background-color: #F2F2F2; + border: 1px solid #999999; + padding: 0; + margin: 5px; +} + +#sievefilterform iframe { + top: 0; + bottom: 0; + left: 0; + right: 0; + width: 100%; + min-height: 100%; /* Chrome 14 bug */ + background-color: #F2F2F2; + border: 0; + padding: 0; + margin: 0; +} + +#sievefilterform ul { + list-style: none; + padding: 0; + margin: 0; + margin-top: 5px; +} + +#sievefilterform fieldset { + margin: 5px; +} + +#sievefilterform ul li { + margin-bottom: 5px; + white-space: nowrap; +} + +#sievefilterform ul li input { + margin-right: 5px; +} + +#sievefilterform label { + font-weight: bold; +} + +#managesieve-tip +{ + width: 200px; + z-index: 100000; +} + +span.sieve.error +{ + color: red; +} diff --git a/plugins/managesieve/skins/default/templates/filteredit.html b/plugins/managesieve/skins/default/templates/filteredit.html index 8b1993528..6ecb03cae 100644 --- a/plugins/managesieve/skins/default/templates/filteredit.html +++ b/plugins/managesieve/skins/default/templates/filteredit.html @@ -5,13 +5,16 @@ <roundcube:include file="/includes/links.html" /> <link rel="stylesheet" type="text/css" href="/this/managesieve.css" /> </head> -<body class="iframe"> +<body class="iframe<roundcube:exp expression="env:task != 'mail' ? '' : ' mail'" />"> +<roundcube:if condition="env:task != 'mail'" /> <div id="filter-title" class="boxtitle"><roundcube:label name="managesieve.filterdef" /></div> +<roundcube:endif /> <div id="filter-form" class="boxcontent"> <roundcube:object name="filterform" /> +<roundcube:if condition="env:task != 'mail'" /> <div id="footer"> <div class="footerleft"> <roundcube:button command="plugin.managesieve-save" type="input" class="button mainaction" label="save" /> @@ -21,10 +24,10 @@ <input type="checkbox" id="disabled" name="_disabled" value="1" /> </div> </div> +<roundcube:endif /> </form> </div> - </body> </html> |
