diff options
| -rw-r--r-- | plugins/managesieve/Changelog | 3 | ||||
| -rw-r--r-- | plugins/managesieve/managesieve.js | 37 | ||||
| -rw-r--r-- | plugins/managesieve/managesieve.php | 64 | ||||
| -rw-r--r-- | plugins/managesieve/skins/default/managesieve.css | 10 |
4 files changed, 95 insertions, 19 deletions
diff --git a/plugins/managesieve/Changelog b/plugins/managesieve/Changelog index 07ac6a2d9..f92dfe794 100644 --- a/plugins/managesieve/Changelog +++ b/plugins/managesieve/Changelog @@ -1,6 +1,9 @@ +* version 2.10 [2010-10-10] +----------------------------------------------------------- - Fixed import from Avelsieve - Use localized size units (#1486976) - Added support for relational operators and i;ascii-numeric comparator +- Added popups with form errors * version 2.9 [2010-08-02] ----------------------------------------------------------- diff --git a/plugins/managesieve/managesieve.js b/plugins/managesieve/managesieve.js index 74f6db88b..01d2ddc1c 100644 --- a/plugins/managesieve/managesieve.js +++ b/plugins/managesieve/managesieve.js @@ -34,6 +34,12 @@ if (window.rcmail) { 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}); @@ -472,3 +478,34 @@ rcube_webmail.prototype.managesieve_reload = function(set) }, 500); }; +// Register onmouse(leave/enter) events for tips on specified form element +rcube_webmail.prototype.managesieve_tip_register = function(tips) +{ + 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(); + top += offset.top; + left += offset.left; + } + + tip.html(e.data.str) + top -= tip.height(); + + 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(); + }); + } +}; diff --git a/plugins/managesieve/managesieve.php b/plugins/managesieve/managesieve.php index b959c3c93..d0ad268e7 100644 --- a/plugins/managesieve/managesieve.php +++ b/plugins/managesieve/managesieve.php @@ -7,7 +7,7 @@ * It's clickable interface which operates on text scripts and communicates * with server using managesieve protocol. Adds Filters tab in Settings. * - * @version 2.9 + * @version 2.10 * @author Aleksander 'A.L.E.C' Machniak <alec@alec.pl> * * Configuration (see config.inc.php.dist) @@ -23,6 +23,7 @@ class managesieve extends rcube_plugin private $sieve; private $errors; private $form; + private $tips = array(); private $script = array(); private $exts = array(); private $headers = array( @@ -421,8 +422,10 @@ class managesieve extends rcube_plugin $this->form['tests'][$i]['type'] = $sizeop; $this->form['tests'][$i]['arg'] = $sizetarget.$sizeitem; - if (!preg_match('/^[0-9]+(K|M|G)*$/i', $sizetarget)) - $this->errors['tests'][$i]['sizetarget'] = $this->gettext('wrongformat'); + if ($sizetarget == '') + $this->errors['tests'][$i]['sizetarget'] = $this->gettext('cannotbeempty'); + else if (!preg_match('/^[0-9]+(K|M|G)*$/i', $sizetarget)) + $this->errors['tests'][$i]['sizetarget'] = $this->gettext('forbiddenchars'); break; case '...': $cust_header = $headers = $this->strip_value($cust_headers[$idx]); @@ -823,6 +826,8 @@ class managesieve extends rcube_plugin $out .= "</fieldset>\n"; + $this->print_tips(); + if ($scr['disabled']) { $this->rc->output->set_env('rule_disabled', true); } @@ -877,7 +882,8 @@ class managesieve extends rcube_plugin $custom = is_array($rule['arg']) ? implode(', ', $rule['arg']) : $rule['arg']; $out .= '<div id="custom_header' .$id. '" style="display:' .(isset($custom) ? 'inline' : 'none'). '"> - <input type="text" name="_custom_header[]" '. $this->error_class($id, 'test', 'header') + <input type="text" name="_custom_header[]" id="custom_header_i'.$id.'" ' + . $this->error_class($id, 'test', 'header', 'custom_header_i') .' value="' .Q($custom). '" size="20" /> </div>' . "\n"; // matching type select (operator) @@ -926,7 +932,7 @@ class managesieve extends rcube_plugin } $out .= '<input type="text" name="_rule_target[]" id="rule_target' .$id. '" - value="' .Q($target). '" size="20" ' . $this->error_class($id, 'test', 'target') + value="' .Q($target). '" size="20" ' . $this->error_class($id, 'test', 'target', 'rule_target') . ' style="display:' . ($rule['test']!='size' && $rule['test'] != 'exists' ? 'inline' : 'none') . '" />'."\n"; $select_size_op = new html_select(array('name' => "_rule_size_op[]", 'id' => 'rule_size_op'.$id)); @@ -935,8 +941,8 @@ class managesieve extends rcube_plugin $out .= '<div id="rule_size' .$id. '" style="display:' . ($rule['test']=='size' ? 'inline' : 'none') .'">'; $out .= $select_size_op->show($rule['test']=='size' ? $rule['type'] : ''); - $out .= '<input type="text" name="_rule_size_target[]" value="'.$sizetarget.'" size="10" ' - . $this->error_class($id, 'test', 'sizetarget') .' /> + $out .= '<input type="text" name="_rule_size_target[]" id="rule_size_i'.$id.'" value="'.$sizetarget.'" size="10" ' + . $this->error_class($id, 'test', 'sizetarget', 'rule_size_i') .' /> <input type="radio" name="_rule_size_item['.$id.']" value=""' . (!$sizeitem ? ' checked="checked"' : '') .' class="radio" />'.rcube_label('B').' <input type="radio" name="_rule_size_item['.$id.']" value="K"' @@ -1004,9 +1010,9 @@ class managesieve extends rcube_plugin $out .= '<input type="text" name="_action_target[]" id="action_target' .$id. '" ' .'value="' .($action['type']=='redirect' ? Q($action['target'], 'strict', false) : ''). '" size="40" ' .'style="display:' .($action['type']=='redirect' ? 'inline' : 'none') .'" ' - . $this->error_class($id, 'action', 'target') .' />'; + . $this->error_class($id, 'action', 'target', 'action_target') .' />'; $out .= '<textarea name="_action_target_area[]" id="action_target_area' .$id. '" ' - .'rows="3" cols="40" '. $this->error_class($id, 'action', 'targetarea') + .'rows="3" cols="40" '. $this->error_class($id, 'action', 'targetarea', 'action_target_area') .'style="display:' .(in_array($action['type'], array('reject', 'ereject')) ? 'inline' : 'none') .'">' . (in_array($action['type'], array('reject', 'ereject')) ? Q($action['target'], 'strict', false) : '') . "</textarea>\n"; @@ -1015,16 +1021,16 @@ class managesieve extends rcube_plugin $out .= '<div id="action_vacation' .$id.'" style="display:' .($action['type']=='vacation' ? 'inline' : 'none') .'">'; $out .= '<span class="label">'. Q($this->gettext('vacationreason')) .'</span><br />' .'<textarea name="_action_reason[]" id="action_reason' .$id. '" ' - .'rows="3" cols="40" '. $this->error_class($id, 'action', 'reason') . '>' + .'rows="3" cols="40" '. $this->error_class($id, 'action', 'reason', 'action_reason') . '>' . Q($action['reason'], 'strict', false) . "</textarea>\n"; $out .= '<br /><span class="label">' .Q($this->gettext('vacationaddresses')) . '</span><br />' - .'<input type="text" name="_action_addresses[]" ' + .'<input type="text" name="_action_addresses[]" id="action_addr'.$id.'" ' .'value="' . (is_array($action['addresses']) ? Q(implode(', ', $action['addresses']), 'strict', false) : $action['addresses']) . '" size="40" ' - . $this->error_class($id, 'action', 'addresses') .' />'; + . $this->error_class($id, 'action', 'addresses', 'action_addr') .' />'; $out .= '<br /><span class="label">' . Q($this->gettext('vacationdays')) . '</span><br />' - .'<input type="text" name="_action_days[]" ' + .'<input type="text" name="_action_days[]" id="action_days'.$id.'" ' .'value="' .Q($action['days'], 'strict', false) . '" size="2" ' - . $this->error_class($id, 'action', 'days') .' />'; + . $this->error_class($id, 'action', 'days', 'action_days') .' />'; $out .= '</div>'; // mailbox select @@ -1099,13 +1105,15 @@ class managesieve extends rcube_plugin return trim($str); } - private function error_class($id, $type, $target, $name_only=false) + private function error_class($id, $type, $target, $elem_prefix='') { // TODO: tooltips - if ($type == 'test' && isset($this->errors['tests'][$id][$target])) - return ($name_only ? 'error' : ' class="error"'); - else if ($type == 'action' && isset($this->errors['actions'][$id][$target])) - return ($name_only ? 'error' : ' class="error"'); + if (($type == 'test' && ($str = $this->errors['tests'][$id][$target])) || + ($type == 'action' && ($str = $this->errors['actions'][$id][$target])) + ) { + $this->add_tip($elem_prefix.$id, $str, true); + return ' class="error"'; + } return ''; } @@ -1114,4 +1122,22 @@ class managesieve extends rcube_plugin { return rcube_charset_convert($text, 'UTF7-IMAP', $encoding); } + + private function add_tip($id, $str, $error=false) + { + if ($error) + $str = html::span('sieve error', $str); + + $this->tips[] = array($id, $str); + } + + private function print_tips() + { + if (empty($this->tips)) + return; + + $script = JS_OBJECT_NAME.'.managesieve_tip_register('.json_encode($this->tips).');'; + $this->rc->output->add_script($script, 'foot'); + } + } diff --git a/plugins/managesieve/skins/default/managesieve.css b/plugins/managesieve/skins/default/managesieve.css index cd60c7ea3..633d72e3a 100644 --- a/plugins/managesieve/skins/default/managesieve.css +++ b/plugins/managesieve/skins/default/managesieve.css @@ -289,3 +289,13 @@ div .itemlist input { vertical-align: middle; } + +span.sieve.error +{ + color: red; +} + +#managesieve-tip +{ + width: 200px; +} |
