summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoralec <alec@208e9e7b-5314-0410-a742-e7e81cd9613c>2010-10-10 16:01:31 +0000
committeralec <alec@208e9e7b-5314-0410-a742-e7e81cd9613c>2010-10-10 16:01:31 +0000
commita8fdc7ca2c10766c60484325afef4dd040293b81 (patch)
tree0c47958e98b26dae37d09573e24089ebc4022fe2
parentdd87afada9c03859ea1d13817d139250c07f1ac4 (diff)
- Added popups with form errors
- Removed nonexisting 'wrongformat' label usage git-svn-id: https://svn.roundcube.net/trunk@4071 208e9e7b-5314-0410-a742-e7e81cd9613c
-rw-r--r--plugins/managesieve/Changelog3
-rw-r--r--plugins/managesieve/managesieve.js37
-rw-r--r--plugins/managesieve/managesieve.php64
-rw-r--r--plugins/managesieve/skins/default/managesieve.css10
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" />&nbsp;</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;
+}