summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoralec <alec@208e9e7b-5314-0410-a742-e7e81cd9613c>2011-10-17 10:50:37 +0000
committeralec <alec@208e9e7b-5314-0410-a742-e7e81cd9613c>2011-10-17 10:50:37 +0000
commit39930a480955b7ebe5db7de71fddef8f750b8519 (patch)
tree9baa94d5eb4b358ee2b79944c0c7dfe46e8b3e95
parentbb06657788d03c605837120a77291ad2c621986d (diff)
- Filters - UI redesign: added possibility to move filter to any place using drag&drop
(instead of up/down buttons), added filter sets list object, added more 'loading' messages - Added option to hide some scripts (managesieve_filename_exceptions) git-svn-id: https://svn.roundcube.net/trunk@5340 208e9e7b-5314-0410-a742-e7e81cd9613c
-rw-r--r--plugins/managesieve/Changelog6
-rw-r--r--plugins/managesieve/config.inc.php.dist4
-rw-r--r--plugins/managesieve/lib/rcube_sieve_script.php16
-rw-r--r--plugins/managesieve/localization/en_US.inc48
-rw-r--r--plugins/managesieve/localization/pl_PL.inc48
-rw-r--r--plugins/managesieve/managesieve.js589
-rw-r--r--plugins/managesieve/managesieve.php282
-rw-r--r--plugins/managesieve/skins/default/managesieve.css194
-rw-r--r--plugins/managesieve/skins/default/templates/managesieve.html73
-rw-r--r--plugins/managesieve/tests/parser_kep14.phpt8
10 files changed, 709 insertions, 559 deletions
diff --git a/plugins/managesieve/Changelog b/plugins/managesieve/Changelog
index f180f6792..16f60784a 100644
--- a/plugins/managesieve/Changelog
+++ b/plugins/managesieve/Changelog
@@ -1,3 +1,5 @@
+* version 5.0-beta [2011-10-17]
+-----------------------------------------------------------
- Added possibility to create a filter based on selected message "in-place"
- Fixed import from Horde-INGO (#1488064)
- Add managesieve_script_name option for default name of the script (#1487956)
@@ -10,6 +12,10 @@
- Improved script parser, added support for include and variables extensions
- Added Kolab's KEP:14 support (http://wiki.kolab.org/User:Greve/Drafts/KEP:14)
- Use smaller action/rule buttons
+- UI redesign: added possibility to move filter to any place using drag&drop
+ (instead of up/down buttons), added filter sets list object, added more
+ 'loading' messages
+- Added option to hide some scripts (managesieve_filename_exceptions)
* version 4.3 [2011-07-28]
-----------------------------------------------------------
diff --git a/plugins/managesieve/config.inc.php.dist b/plugins/managesieve/config.inc.php.dist
index b721dc7c6..cb9b2a97f 100644
--- a/plugins/managesieve/config.inc.php.dist
+++ b/plugins/managesieve/config.inc.php.dist
@@ -60,4 +60,8 @@ $rcmail_config['managesieve_kolab_master'] = false;
// Cyrus uses '.siv'. Doesn't matter if you have managesieve_kolab_master disabled.
$rcmail_config['managesieve_filename_extension'] = '.sieve';
+// List of reserved script names (without extension).
+// Scripts listed here will be not presented to the user.
+$rcmail_config['managesieve_filename_exceptions'] = array();
+
?>
diff --git a/plugins/managesieve/lib/rcube_sieve_script.php b/plugins/managesieve/lib/rcube_sieve_script.php
index 8fc0e5545..3c6993dcc 100644
--- a/plugins/managesieve/lib/rcube_sieve_script.php
+++ b/plugins/managesieve/lib/rcube_sieve_script.php
@@ -187,11 +187,17 @@ class rcube_sieve_script
array_push($exts, 'variables');
}
foreach ($this->vars as $var) {
- $output .= (empty($has_vars) ? '# ' : '') . 'set ';
- foreach (array_diff(array_keys($var), array('name', 'value')) as $opt) {
- $output .= ":$opt ";
+ if (empty($has_vars)) {
+ // 'variables' extension not supported, put vars in comments
+ $output .= sprintf("# %s %s\n", $var['name'], $var['value']);
+ }
+ else {
+ $output .= 'set ';
+ foreach (array_diff(array_keys($var), array('name', 'value')) as $opt) {
+ $output .= ":$opt ";
+ }
+ $output .= self::escape_string($var['name']) . ' ' . self::escape_string($var['value']) . ";\n";
}
- $output .= self::escape_string($var['name']) . ' ' . self::escape_string($var['value']) . ";\n";
}
}
@@ -423,7 +429,7 @@ class rcube_sieve_script
$rulename = $matches[1];
}
// KEP:14 variables
- else if (preg_match('/^# set "([^"]+)" "([^"]+)";$/', $line, $matches)) {
+ else if (preg_match('/^# (EDITOR|EDITOR_VERSION) (.+)$/', $line, $matches)) {
$this->set_var($matches[1], $matches[2]);
}
// Horde-Ingo format
diff --git a/plugins/managesieve/localization/en_US.inc b/plugins/managesieve/localization/en_US.inc
index 559e9a06c..24cd72a86 100644
--- a/plugins/managesieve/localization/en_US.inc
+++ b/plugins/managesieve/localization/en_US.inc
@@ -43,12 +43,13 @@ $labels['vacationdays'] = 'How often send messages (in days):';
$labels['vacationreason'] = 'Message body (vacation reason):';
$labels['vacationsubject'] = 'Message subject:';
$labels['rulestop'] = 'Stop evaluating rules';
+$labels['enable'] = 'Enable/Disable';
$labels['filterset'] = 'Filters set';
+$labels['filtersets'] = 'Filter sets';
$labels['filtersetadd'] = 'Add filters set';
$labels['filtersetdel'] = 'Delete current filters set';
$labels['filtersetact'] = 'Activate current filters set';
$labels['filtersetdeact'] = 'Deactivate current filters set';
-$labels['filtersetget'] = 'Download filters set in text format';
$labels['filterdef'] = 'Filter definition';
$labels['filtersetname'] = 'Filters set name';
$labels['newfilterset'] = 'New filters set';
@@ -80,30 +81,39 @@ $labels['flagdraft'] = 'Draft';
$labels['filtercreate'] = 'Create filter';
$labels['usedata'] = 'Use following data in the filter:';
$labels['nextstep'] = 'Next Step';
+$labels['...'] = '...';
$messages = array();
-$messages['filterunknownerror'] = 'Unknown server error';
-$messages['filterconnerror'] = 'Unable to connect to managesieve server';
-$messages['filterdeleteerror'] = 'Unable to delete filter. Server error occured';
-$messages['filterdeleted'] = 'Filter deleted successfully';
-$messages['filtersaved'] = 'Filter saved successfully';
-$messages['filtersaveerror'] = 'Unable to save filter. Server error occured';
+$messages['filterunknownerror'] = 'Unknown server error.';
+$messages['filterconnerror'] = 'Unable to connect to server.';
+$messages['filterdeleteerror'] = 'Unable to delete filter. Server error occured.';
+$messages['filterdeleted'] = 'Filter deleted successfully.';
+$messages['filtersaved'] = 'Filter saved successfully.';
+$messages['filtersaveerror'] = 'Unable to save filter. Server error occured.';
$messages['filterdeleteconfirm'] = 'Do you really want to delete selected filter?';
$messages['ruledeleteconfirm'] = 'Are you sure, you want to delete selected rule?';
$messages['actiondeleteconfirm'] = 'Are you sure, you want to delete selected action?';
-$messages['forbiddenchars'] = 'Forbidden characters in field';
-$messages['cannotbeempty'] = 'Field cannot be empty';
-$messages['setactivateerror'] = 'Unable to activate selected filters set. Server error occured';
-$messages['setdeactivateerror'] = 'Unable to deactivate selected filters set. Server error occured';
-$messages['setdeleteerror'] = 'Unable to delete selected filters set. Server error occured';
-$messages['setactivated'] = 'Filters set activated successfully';
-$messages['setdeactivated'] = 'Filters set deactivated successfully';
-$messages['setdeleted'] = 'Filters set deleted successfully';
+$messages['forbiddenchars'] = 'Forbidden characters in field.';
+$messages['cannotbeempty'] = 'Field cannot be empty.';
+$messages['ruleexist'] = 'Filter with specified name already exists.';
+$messages['setactivateerror'] = 'Unable to activate selected filters set. Server error occured.';
+$messages['setdeactivateerror'] = 'Unable to deactivate selected filters set. Server error occured.';
+$messages['setdeleteerror'] = 'Unable to delete selected filters set. Server error occured.';
+$messages['setactivated'] = 'Filters set activated successfully.';
+$messages['setdeactivated'] = 'Filters set deactivated successfully.';
+$messages['setdeleted'] = 'Filters set deleted successfully.';
$messages['setdeleteconfirm'] = 'Are you sure, you want to delete selected filters set?';
-$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['setcreateerror'] = 'Unable to create filters set. Server error occured.';
+$messages['setcreated'] = 'Filters set created successfully.';
+$messages['activateerror'] = 'Unable to enable selected filter(s). Server error occured.';
+$messages['deactivateerror'] = 'Unable to disable selected filter(s). Server error occured.';
+$messages['activated'] = 'Filter(s) disabled successfully.';
+$messages['deactivated'] = 'Filter(s) enabled successfully.';
+$messages['moved'] = 'Filter moved successfully.';
+$messages['moveerror'] = 'Unable to move selected filter. Server error occured.';
+$messages['nametoolong'] = 'Name too long.';
+$messages['namereserved'] = 'Reserved name.';
+$messages['setexist'] = 'Set already exists.';
$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 630600b1f..eaa09e198 100644
--- a/plugins/managesieve/localization/pl_PL.inc
+++ b/plugins/managesieve/localization/pl_PL.inc
@@ -7,8 +7,8 @@ $labels['filtername'] = 'Nazwa filtru';
$labels['newfilter'] = 'Nowy filtr';
$labels['filteradd'] = 'Dodaj filtr';
$labels['filterdel'] = 'Usuń filtr';
-$labels['moveup'] = 'Przenieś wyżej';
-$labels['movedown'] = 'Przenieś niżej';
+$labels['enable'] = 'Włącz/Wyłącz';
+$labels['filtersets'] = 'Zbiory fitrów';
$labels['filterallof'] = 'spełniających wszystkie poniższe kryteria';
$labels['filteranyof'] = 'spełniających dowolne z poniższych kryteriów';
$labels['filterany'] = 'wszystkich';
@@ -49,7 +49,6 @@ $labels['filtersetadd'] = 'Dodaj zbiór filtrów';
$labels['filtersetdel'] = 'Usuń bieżący zbiór filtrów';
$labels['filtersetact'] = 'Aktywuj bieżący zbiór filtrów';
$labels['filtersetdeact'] = 'Deaktywuj bieżący zbiór filtrów';
-$labels['filtersetget'] = 'Pobierz bieżący zbiór filtrów w formacie tekstowym';
$labels['filterdef'] = 'Definicja filtra';
$labels['filtersetname'] = 'Nazwa zbioru';
$labels['newfilterset'] = 'Nowy zbiór filtrów';
@@ -81,30 +80,39 @@ $labels['flagdraft'] = 'Szkic';
$labels['filtercreate'] = 'Utwóż filtr';
$labels['usedata'] = 'Użyj następujących danych do utworzenia filtra:';
$labels['nextstep'] = 'Następny krok';
+$labels['...'] = '...';
$messages = array();
-$messages['filterunknownerror'] = 'Nieznany błąd serwera';
-$messages['filterconnerror'] = 'Nie można nawiązać połączenia z serwerem managesieve';
-$messages['filterdeleteerror'] = 'Nie można usunąć filtra. Wystąpił błąd serwera';
-$messages['filterdeleted'] = 'Filtr został usunięty pomyślnie';
+$messages['filterunknownerror'] = 'Nieznany błąd serwera.';
+$messages['filterconnerror'] = 'Nie można nawiązać połączenia z serwerem.';
+$messages['filterdeleteerror'] = 'Nie można usunąć filtra. Błąd serwera.';
+$messages['filterdeleted'] = 'Filtr został usunięty pomyślnie.';
$messages['filterdeleteconfirm'] = 'Czy na pewno chcesz usunąć wybrany filtr?';
-$messages['filtersaved'] = 'Filtr został zapisany pomyślnie';
+$messages['filtersaved'] = 'Filtr został zapisany pomyślnie.';
$messages['filtersaveerror'] = 'Nie można zapisać filtra. Wystąpił błąd serwera.';
$messages['ruledeleteconfirm'] = 'Czy na pewno chcesz usunąć wybraną regułę?';
$messages['actiondeleteconfirm'] = 'Czy na pewno usunąć wybraną akcję?';
-$messages['forbiddenchars'] = 'Pole zawiera niedozwolone znaki';
-$messages['cannotbeempty'] = 'Pole nie może być puste';
-$messages['setactivateerror'] = 'Nie można aktywować wybranego zbioru filtrów. Błąd serwera';
-$messages['setdeactivateerror'] = 'Nie można deaktywować wybranego zbioru filtrów. Błąd serwera';
-$messages['setdeleteerror'] = 'Nie można usunąć wybranego zbioru filtrów. Błąd serwera';
-$messages['setactivated'] = 'Zbiór filtrów został aktywowany pomyślnie';
-$messages['setdeactivated'] = 'Zbiór filtrów został deaktywowany pomyślnie';
-$messages['setdeleted'] = 'Zbiór filtrów został usunięty pomyślnie';
+$messages['forbiddenchars'] = 'Pole zawiera niedozwolone znaki.';
+$messages['cannotbeempty'] = 'Pole nie może być puste.';
+$messages['setactivateerror'] = 'Nie można aktywować wybranego zbioru filtrów. Błąd serwera.';
+$messages['setdeactivateerror'] = 'Nie można deaktywować wybranego zbioru filtrów. Błąd serwera.';
+$messages['setdeleteerror'] = 'Nie można usunąć wybranego zbioru filtrów. Błąd serwera.';
+$messages['setactivated'] = 'Zbiór filtrów został aktywowany pomyślnie.';
+$messages['setdeactivated'] = 'Zbiór filtrów został deaktywowany pomyślnie.';
+$messages['setdeleted'] = 'Zbiór filtrów został usunięty pomyślnie.';
$messages['setdeleteconfirm'] = 'Czy na pewno chcesz usunąć wybrany zbiór filtrów?';
-$messages['setcreateerror'] = 'Nie można utworzyć zbioru filtrów. Błąd serwera';
-$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['setcreateerror'] = 'Nie można utworzyć zbioru filtrów. Błąd serwera.';
+$messages['setcreated'] = 'Zbiór filtrów został utworzony pomyślnie.';
$messages['nodata'] = 'Należy wybrać co najmniej jedną pozycję!';
+$messages['ruleexist'] = 'Filtr o podanej nazwie już istnieje.';
+$messages['activateerror'] = 'Nie można włączyć wybranych filtrów. Błąd serwera.';
+$messages['deactivateerror'] = 'Nie można wyłączyć wybranych filtrów. Błąd serwera.';
+$messages['activated'] = 'Filtr(y) wyłączono pomyślnie.';
+$messages['deactivated'] = 'Filtr(y) włączono pomyślnie.';
+$messages['moved'] = 'Filter został przeniesiony pomyślnie.';
+$messages['moveerror'] = 'Nie można przenieść wybranego filtra. Błąd serwera.';
+$messages['nametoolong'] = 'Zbyt długa nazwa.';
+$messages['namereserved'] = 'Nazwa zarezerwowana.';
+$messages['setexist'] = 'Zbiór już istnieje.';
?>
diff --git a/plugins/managesieve/managesieve.js b/plugins/managesieve/managesieve.js
index 8f710b4c0..be2d54891 100644
--- a/plugins/managesieve/managesieve.js
+++ b/plugins/managesieve/managesieve.js
@@ -31,11 +31,10 @@ if (window.rcmail) {
// register commands
rcmail.register_command('plugin.managesieve-save', function() { rcmail.managesieve_save() });
+ rcmail.register_command('plugin.managesieve-act', function() { rcmail.managesieve_act() });
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-move', function() { rcmail.managesieve_move() });
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() });
@@ -44,29 +43,55 @@ if (window.rcmail) {
if (rcmail.env.action == 'plugin.managesieve' || rcmail.env.action == 'plugin.managesieve-save') {
if (rcmail.gui_objects.sieveform) {
rcmail.enable_command('plugin.managesieve-save', true);
+
+ // small resize for header element
+ $('select[name="_header[]"]', rcmail.gui_objects.sieveform).each(function() {
+ if (this.value == '...') this.style.width = '40px';
+ });
+
// 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-add', 'plugin.managesieve-setadd', !rcmail.env.sieveconnerror);
}
+ var i, p = rcmail, setcnt, set = rcmail.env.currentset;
+
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});
+ rcmail.filters_list = new rcube_list_widget(rcmail.gui_objects.filterslist,
+ {multiselect:false, draggable:true, keyboard:false});
rcmail.filters_list.addEventListener('select', function(o){ p.managesieve_select(o); });
+ rcmail.filters_list.addEventListener('dragstart', function(o){ p.managesieve_dragstart(o); });
+ rcmail.filters_list.addEventListener('dragend', function(e){ p.managesieve_dragend(e); });
+ rcmail.filters_list.row_init = function (row) {
+ row.obj.onmouseover = function() { p.managesieve_focus_filter(row); };
+ row.obj.onmouseout = function() { p.managesieve_unfocus_filter(row); };
+ };
rcmail.filters_list.init();
rcmail.filters_list.focus();
+ }
- rcmail.enable_command('plugin.managesieve-set', true);
- rcmail.enable_command('plugin.managesieve-setact', 'plugin.managesieve-setget', rcmail.gui_objects.filtersetslist.length);
- rcmail.enable_command('plugin.managesieve-setdel', rcmail.gui_objects.filtersetslist.length > 1);
+ if (rcmail.gui_objects.filtersetslist) {
+ rcmail.filtersets_list = new rcube_list_widget(rcmail.gui_objects.filtersetslist, {multiselect:false, draggable:false, keyboard:false});
+ rcmail.filtersets_list.addEventListener('select', function(o){ p.managesieve_setselect(o); });
+ rcmail.filtersets_list.init();
+ rcmail.filtersets_list.focus();
+
+ if (set != null) {
+ set = rcmail.managesieve_setid(set);
+ rcmail.filtersets_list.shift_start = set;
+ rcmail.filtersets_list.highlight_row(set, false);
+ }
- $('#'+rcmail.buttons['plugin.managesieve-setact'][0].id).attr('title', rcmail.gettext('managesieve.filterset'
- + ($.inArray(rcmail.gui_objects.filtersetslist.value, rcmail.env.active_sets) != -1 ? 'deact' : 'act')));
+ setcnt = rcmail.filtersets_list.rowcount;
+ rcmail.enable_command('plugin.managesieve-set', true);
+ rcmail.enable_command('plugin.managesieve-setact', 'plugin.managesieve-setget', setcnt);
+ rcmail.enable_command('plugin.managesieve-setdel', setcnt > 1);
}
}
if (rcmail.gui_objects.sieveform && rcmail.env.rule_disabled)
@@ -75,7 +100,7 @@ if (window.rcmail) {
};
/*********************************************************/
-/********* Managesieve filters methods *********/
+/********* Managesieve UI methods *********/
/*********************************************************/
rcube_webmail.prototype.managesieve_add = function()
@@ -87,23 +112,41 @@ rcube_webmail.prototype.managesieve_add = function()
rcube_webmail.prototype.managesieve_del = function()
{
var id = this.filters_list.get_single_selection();
- if (confirm(this.get_label('managesieve.filterdeleteconfirm')))
- this.http_request('plugin.managesieve',
- '_act=delete&_fid='+this.filters_list.rows[id].uid, true);
+ if (confirm(this.get_label('managesieve.filterdeleteconfirm'))) {
+ var lock = this.set_busy(true, 'loading');
+ this.http_post('plugin.managesieve',
+ '_act=delete&_fid='+this.filters_list.rows[id].uid, lock);
+ }
};
-rcube_webmail.prototype.managesieve_up = function()
+rcube_webmail.prototype.managesieve_act = function()
{
- var id = this.filters_list.get_single_selection();
- this.http_request('plugin.managesieve',
- '_act=up&_fid='+this.filters_list.rows[id].uid, true);
+ var id = this.filters_list.get_single_selection(),
+ lock = this.set_busy(true, 'loading');
+
+ this.http_post('plugin.managesieve',
+ '_act=act&_fid='+this.filters_list.rows[id].uid, lock);
};
-rcube_webmail.prototype.managesieve_down = function()
+// Filter selection
+rcube_webmail.prototype.managesieve_select = function(list)
{
- var id = this.filters_list.get_single_selection();
- this.http_request('plugin.managesieve',
- '_act=down&_fid='+this.filters_list.rows[id].uid, true);
+ var id = list.get_single_selection();
+ if (id != null)
+ this.load_managesieveframe(list.rows[id].uid);
+};
+
+// Set selection
+rcube_webmail.prototype.managesieve_setselect = function(list)
+{
+ this.show_contentframe(false);
+ this.filters_list.clear(true);
+ this.enable_command('plugin.managesieve-setdel', list.rowcount > 1);
+ this.enable_command( 'plugin.managesieve-setact', 'plugin.managesieve-setget', true);
+
+ var id = list.get_single_selection();
+ if (id != null)
+ this.managesieve_list(this.env.filtersets[id]);
};
rcube_webmail.prototype.managesieve_rowid = function(id)
@@ -115,152 +158,202 @@ rcube_webmail.prototype.managesieve_rowid = function(id)
return i;
};
-rcube_webmail.prototype.managesieve_updatelist = function(action, name, id, disabled)
+// Returns set's identifier
+rcube_webmail.prototype.managesieve_setid = function(name)
+{
+ for (var i in this.env.filtersets)
+ if (this.env.filtersets[i] == name)
+ return i;
+};
+
+// Filters listing request
+rcube_webmail.prototype.managesieve_list = function(script)
+{
+ var lock = this.set_busy(true, 'loading');
+
+ this.http_post('plugin.managesieve', '_act=list&_set='+urlencode(script), lock);
+};
+
+// Script download request
+rcube_webmail.prototype.managesieve_setget = function()
+{
+ var id = this.filtersets_list.get_single_selection(),
+ script = this.env.filtersets[id];
+
+ location.href = this.env.comm_path+'&_action=plugin.managesieve&_act=setget&_set='+urlencode(script);
+};
+
+// Set activate/deactivate request
+rcube_webmail.prototype.managesieve_setact = function()
+{
+ var id = this.filtersets_list.get_single_selection(),
+ lock = this.set_busy(true, 'loading'),
+ script = this.env.filtersets[id],
+ action = $('#rcmrow'+id).hasClass('disabled') ? 'setact' : 'deact';
+
+ this.http_post('plugin.managesieve', '_act='+action+'&_set='+urlencode(script), lock);
+};
+
+// Set delete request
+rcube_webmail.prototype.managesieve_setdel = function()
+{
+ if (!confirm(this.get_label('managesieve.setdeleteconfirm')))
+ return false;
+
+ var id = this.filtersets_list.get_single_selection(),
+ lock = this.set_busy(true, 'loading'),
+ script = this.env.filtersets[id];
+
+ this.http_post('plugin.managesieve', '_act=setdel&_set='+urlencode(script), lock);
+};
+
+// Set add request
+rcube_webmail.prototype.managesieve_setadd = function()
+{
+ this.filters_list.clear_selection();
+ this.enable_command('plugin.managesieve-act', 'plugin.managesieve-del', false);
+
+ if (this.env.contentframe && window.frames && window.frames[this.env.contentframe]) {
+ var lock = this.set_busy(true, 'loading');
+ target = window.frames[this.env.contentframe];
+ target.location.href = this.env.comm_path+'&_action=plugin.managesieve&_framed=1&_newset=1&_unlock='+lock;
+ }
+};
+
+rcube_webmail.prototype.managesieve_updatelist = function(action, o)
{
this.set_busy(true);
switch (action) {
- case 'delete':
- this.filters_list.remove_row(this.managesieve_rowid(id));
- this.filters_list.clear_selection();
- this.enable_command('plugin.managesieve-del', 'plugin.managesieve-up', 'plugin.managesieve-down', false);
+
+ // Delete filter row
+ case 'del':
+ var i, list = this.filters_list, rows = list.rows;
+
+ list.remove_row(this.managesieve_rowid(o.id));
+ list.clear_selection();
this.show_contentframe(false);
+ this.enable_command('plugin.managesieve-del', 'plugin.managesieve-act', false);
// re-numbering filters
- var i, rows = this.filters_list.rows;
for (i=0; i<rows.length; i++) {
- if (rows[i] != null && rows[i].uid > id)
+ if (rows[i] != null && rows[i].uid > o.id)
rows[i].uid = rows[i].uid-1;
}
+
break;
- case 'down':
- var from, fromstatus, status, rows = this.filters_list.rows;
+ // Update filter row
+ case 'update':
+ var i, row = $('#rcmrow'+o.id);
- // we need only to replace filter names...
- for (var i=0; i<rows.length; i++) {
- if (rows[i]==null) { // removed row
- continue;
- }
- else if (rows[i].uid == id) {
- from = rows[i].obj;
- fromstatus = $(from).hasClass('disabled');
- }
- else if (rows[i].uid == id+1) {
- name = rows[i].obj.cells[0].innerHTML;
- status = $(rows[i].obj).hasClass('disabled');
- rows[i].obj.cells[0].innerHTML = from.cells[0].innerHTML;
- from.cells[0].innerHTML = name;
- $(from)[status?'addClass':'removeClass']('disabled');
- $(rows[i].obj)[fromstatus?'addClass':'removeClass']('disabled');
- this.filters_list.highlight_row(i);
- break;
- }
- }
- // ... and disable/enable Down button
- this.filters_listbuttons();
- break;
+ if (o.name)
+ $('td', row).html(o.name);
+ if (o.disabled)
+ row.addClass('disabled');
+ else
+ row.removeClass('disabled');
- case 'up':
- var from, status, fromstatus, rows = this.filters_list.rows;
+ $('#disabled', $('iframe').contents()).prop('checked', o.disabled);
- // we need only to replace filter names...
- for (var i=0; i<rows.length; i++) {
- if (rows[i] == null) { // removed row
- continue;
- }
- else if (rows[i].uid == id-1) {
- from = rows[i].obj;
- fromstatus = $(from).hasClass('disabled');
- this.filters_list.highlight_row(i);
- }
- else if (rows[i].uid == id) {
- name = rows[i].obj.cells[0].innerHTML;
- status = $(rows[i].obj).hasClass('disabled');
- rows[i].obj.cells[0].innerHTML = from.cells[0].innerHTML;
- from.cells[0].innerHTML = name;
- $(from)[status?'addClass':'removeClass']('disabled');
- $(rows[i].obj)[fromstatus?'addClass':'removeClass']('disabled');
- break;
- }
- }
- // ... and disable/enable Up button
- this.filters_listbuttons();
break;
- case 'update':
- var rows = parent.rcmail.filters_list.rows;
- for (var i=0; i<rows.length; i++)
- if (rows[i] && rows[i].uid == id) {
- rows[i].obj.cells[0].innerHTML = name;
- if (disabled)
- $(rows[i].obj).addClass('disabled');
- else
- $(rows[i].obj).removeClass('disabled');
- break;
- }
+ // Add filter row to the list
+ case 'add':
+ var list = this.filters_list,
+ row = $('<tr><td class="name"></td></tr>');
+
+ $('td', row).html(o.name);
+ row.attr('id', 'rcmrow'+o.id);
+ if (o.disabled)
+ row.addClass('disabled');
+
+ list.insert_row(row.get(0));
+ list.highlight_row(o.id);
+
+ this.enable_command('plugin.managesieve-del', 'plugin.managesieve-act', true);
+
break;
- case 'add':
- var row, new_row, td, list = parent.rcmail.filters_list;
+ // Filling rules list
+ case 'list':
+ var i, tr, td, el, list = this.filters_list;
- if (!list)
- break;
+ if (o.clear)
+ list.clear();
- for (var i=0; i<list.rows.length; i++)
- if (list.rows[i] != null && String(list.rows[i].obj.id).match(/^rcmrow/))
- row = list.rows[i].obj;
+ for (i in o.list) {
+ el = o.list[i];
+ tr = document.createElement('TR');
+ td = document.createElement('TD');
- if (row) {
- new_row = parent.document.createElement('tr');
- new_row.id = 'rcmrow'+id;
- td = parent.document.createElement('td');
- new_row.appendChild(td);
- list.insert_row(new_row, false);
- if (disabled)
- $(new_row).addClass('disabled');
- if (row.cells[0].className)
- td.className = row.cells[0].className;
+ td.innerHTML = el.name;
+ td.className = 'name';
+ tr.id = 'rcmrow' + el.id;
+ if (el.class)
+ tr.className = el.class
+ tr.appendChild(td);
- td.innerHTML = name;
- list.highlight_row(id);
+ list.insert_row(tr);
+ }
- parent.rcmail.enable_command('plugin.managesieve-del', 'plugin.managesieve-up', true);
+ if (o.set)
+ list.highlight_row(o.set);
+ else
+ this.enable_command('plugin.managesieve-del', 'plugin.managesieve-act', false);
+
+ break;
+
+ // Sactivate/deactivate set
+ case 'setact':
+ var id = this.managesieve_setid(o.name), row = $('#rcmrow' + id);
+ if (o.active) {
+ if (o.all)
+ $('tr', this.gui_objects.filtersetslist).addClass('disabled');
+ row.removeClass('disabled');
}
- else // refresh whole page
- parent.rcmail.goto_url('plugin.managesieve');
+ else
+ row.addClass('disabled');
+
break;
- }
- this.set_busy(false);
-};
+ // Delete set row
+ case 'setdel':
+ var id = this.managesieve_setid(o.name);
-rcube_webmail.prototype.managesieve_select = function(list)
-{
- var id = list.get_single_selection();
- if (id != null)
- this.load_managesieveframe(list.rows[id].uid);
-};
+ this.filtersets_list.remove_row(id);
+ this.filters_list.clear();
+ this.show_contentframe(false);
+ this.enable_command('plugin.managesieve-setdel', 'plugin.managesieve-setact', 'plugin.managesieve-setget', false);
-rcube_webmail.prototype.managesieve_save = function()
-{
- if (parent.rcmail && parent.rcmail.filters_list && this.gui_objects.sieveform.name != 'filtersetform') {
- var id = parent.rcmail.filters_list.get_single_selection();
- if (id != null)
- this.gui_objects.sieveform.elements['_fid'].value = parent.rcmail.filters_list.rows[id].uid;
+ delete this.env.filtersets[id];
+
+ break;
+
+ // Create set row
+ case 'setadd':
+ var id = 'S' + new Date().getTime(),
+ list = this.filtersets_list,
+ row = $('<tr class="disabled"><td class="name"></td></tr>');
+
+ $('td', row).html(o.name);
+ row.attr('id', 'rcmrow'+id);
+
+ this.env.filtersets[id] = o.name;
+ list.insert_row(row.get(0));
+ list.select(id);
+
+ break;
}
- this.gui_objects.sieveform.submit();
+
+ this.set_busy(false);
};
// load filter frame
rcube_webmail.prototype.load_managesieveframe = function(id)
{
- if (typeof(id) != 'undefined' && id != null) {
- this.enable_command('plugin.managesieve-del', true);
- this.filters_listbuttons();
- }
- else
- this.enable_command('plugin.managesieve-up', 'plugin.managesieve-down', 'plugin.managesieve-del', false);
+ var has_id = typeof(id) != 'undefined' && id != null;
+ this.enable_command('plugin.managesieve-act', 'plugin.managesieve-del', has_id);
if (this.env.contentframe && window.frames && window.frames[this.env.contentframe]) {
target = window.frames[this.env.contentframe];
@@ -270,40 +363,62 @@ rcube_webmail.prototype.load_managesieveframe = function(id)
}
};
-// enable/disable Up/Down buttons
-rcube_webmail.prototype.filters_listbuttons = function()
+// load filter frame
+rcube_webmail.prototype.managesieve_dragstart = function(list)
{
- var id = this.filters_list.get_single_selection(),
- rows = this.filters_list.rows;
+ var id = this.filters_list.get_single_selection();
- for (var i=0; i<rows.length; i++) {
- if (rows[i] == null) { // removed row
- }
- else if (i == id) {
- this.enable_command('plugin.managesieve-up', false);
- break;
- }
- else {
- this.enable_command('plugin.managesieve-up', true);
- break;
+ this.drag_active = true;
+ this.drag_filter = id;
+};
+
+rcube_webmail.prototype.managesieve_dragend = function(e)
+{
+ if (this.drag_active) {
+ if (this.drag_filter_target) {
+ var lock = this.set_busy(true, 'loading');
+
+ this.show_contentframe(false);
+ this.http_post('plugin.managesieve', '_act=move&_fid='+this.drag_filter
+ +'&_to='+this.drag_filter_target, lock);
}
+ this.drag_active = false;
}
+};
- for (var i=rows.length-1; i>0; i--) {
- if (rows[i] == null) { // removed row
- }
- else if (i == id) {
- this.enable_command('plugin.managesieve-down', false);
- break;
- }
- else {
- this.enable_command('plugin.managesieve-down', true);
- break;
- }
- }
+rcube_webmail.prototype.managesieve_focus_filter = function(row)
+{
+ var id = row.id.replace(/^rcmrow/, '');
+ if (this.drag_active && id != this.drag_filter) {
+ this.drag_filter_target = id;
+ $(row.obj).addClass(id < this.drag_filter ? 'filtermoveup' : 'filtermovedown');
+ }
};
-// operations on filters form
+rcube_webmail.prototype.managesieve_unfocus_filter = function(row)
+{
+ if (this.drag_active) {
+ $(row.obj).removeClass('filtermoveup filtermovedown');
+ this.drag_filter_target = null;
+ }
+};
+
+/*********************************************************/
+/********* Filter Form methods *********/
+/*********************************************************/
+
+// Form submition
+rcube_webmail.prototype.managesieve_save = function()
+{
+ if (parent.rcmail && parent.rcmail.filters_list && this.gui_objects.sieveform.name != 'filtersetform') {
+ var id = parent.rcmail.filters_list.get_single_selection();
+ if (id != null)
+ this.gui_objects.sieveform.elements['_fid'].value = parent.rcmail.filters_list.rows[id].uid;
+ }
+ this.gui_objects.sieveform.submit();
+};
+
+// Operations on filters form
rcube_webmail.prototype.managesieve_ruleadd = function(id)
{
this.http_post('plugin.managesieve', '_act=ruleadd&_rid='+id);
@@ -413,125 +528,6 @@ rcube_webmail.prototype.managesieve_formbuttons = function(div)
}
};
-// Set change
-rcube_webmail.prototype.managesieve_set = function()
-{
- var script = $(this.gui_objects.filtersetslist).val();
- location.href = this.env.comm_path+'&_action=plugin.managesieve&_set='+script;
-};
-
-// Script download
-rcube_webmail.prototype.managesieve_setget = function()
-{
- var script = $(this.gui_objects.filtersetslist).val();
- location.href = this.env.comm_path+'&_action=plugin.managesieve&_act=setget&_set='+script;
-};
-
-// Set activate
-rcube_webmail.prototype.managesieve_setact = function()
-{
- if (!this.gui_objects.filtersetslist)
- return false;
-
- var script = this.gui_objects.filtersetslist.value,
- action = ($.inArray(script, rcmail.env.active_sets) != -1 ? 'deact' : 'setact');
-
- this.http_post('plugin.managesieve', '_act='+action+'&_set='+script);
-};
-
-// Set activate flag in sets list after set activation
-rcube_webmail.prototype.managesieve_reset = function()
-{
- if (!this.gui_objects.filtersetslist)
- return false;
-
- var list = this.gui_objects.filtersetslist,
- opts = list.getElementsByTagName('option'),
- label = ' (' + this.get_label('managesieve.active') + ')',
- regx = new RegExp(RegExp.escape(label)+'$');
-
- for (var x=0; x<opts.length; x++) {
- if ($.inArray(opts[x].value, rcmail.env.active_sets)<0) {
- if (opts[x].innerHTML.match(regx))
- opts[x].innerHTML = opts[x].innerHTML.replace(regx, '');
- }
- else if (!opts[x].innerHTML.match(regx))
- opts[x].innerHTML = opts[x].innerHTML + label;
- }
-
- // change title of setact button
- $('#'+rcmail.buttons['plugin.managesieve-setact'][0].id).attr('title', rcmail.gettext('managesieve.filterset'
- + ($.inArray(list.value, rcmail.env.active_sets) != -1 ? 'deact' : 'act')));
-};
-
-// Set delete
-rcube_webmail.prototype.managesieve_setdel = function()
-{
- if (!this.gui_objects.filtersetslist)
- return false;
-
- if (!confirm(this.get_label('managesieve.setdeleteconfirm')))
- return false;
-
- var script = this.gui_objects.filtersetslist.value;
- this.http_post('plugin.managesieve', '_act=setdel&_set='+script);
-};
-
-// Set add
-rcube_webmail.prototype.managesieve_setadd = function()
-{
- this.filters_list.clear_selection();
- this.enable_command('plugin.managesieve-up', 'plugin.managesieve-down', 'plugin.managesieve-del', false);
-
- if (this.env.contentframe && window.frames && window.frames[this.env.contentframe]) {
- target = window.frames[this.env.contentframe];
- var msgid = this.set_busy(true, 'loading');
- target.location.href = this.env.comm_path+'&_action=plugin.managesieve&_framed=1&_newset=1&_unlock='+msgid;
- }
-};
-
-rcube_webmail.prototype.managesieve_reload = function(set)
-{
- this.env.reload_set = set;
- window.setTimeout(function() {
- location.href = rcmail.env.comm_path + '&_action=plugin.managesieve'
- + (rcmail.env.reload_set ? '&_set=' + rcmail.env.reload_set : '')
- }, 500);
-};
-
-// 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(),
- left = offset.left,
- top = offset.top - 12;
-
- if (framed) {
- offset = $((rcmail.env.task == 'mail' ? '#sievefilterform > iframe' : '#filter-box'), parent.document).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) { tip.hide(); });
- }
-};
-
-/*********************************************************/
-/********* Other Managesieve UI methods *********/
-/*********************************************************/
-
function rule_header_select(id)
{
var obj = document.getElementById('header' + id),
@@ -552,6 +548,8 @@ function rule_header_select(id)
op.style.display = 'inline';
rule_op_select(id);
}
+
+ obj.style.width = obj.value == '...' ? '40px' : '';
};
function rule_op_select(id)
@@ -570,7 +568,7 @@ function rule_join_radio(value)
function action_type_select(id)
{
var obj = document.getElementById('action_type' + id),
- enabled = {},
+ enabled = {},
elems = {
mailbox: document.getElementById('action_mailbox' + id),
target: document.getElementById('action_target' + id),
@@ -600,6 +598,35 @@ function action_type_select(id)
}
};
+// 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(),
+ left = offset.left,
+ top = offset.top - 12;
+
+ if (framed) {
+ offset = $((rcmail.env.task == 'mail' ? '#sievefilterform > iframe' : '#filter-box'), parent.document).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) { tip.hide(); });
+ }
+};
+
/*********************************************************/
/********* Mail UI methods *********/
/*********************************************************/
@@ -678,7 +705,7 @@ rcube_webmail.prototype.managesieve_create = function()
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();
diff --git a/plugins/managesieve/managesieve.php b/plugins/managesieve/managesieve.php
index e7977dd85..c778ef57f 100644
--- a/plugins/managesieve/managesieve.php
+++ b/plugins/managesieve/managesieve.php
@@ -216,7 +216,7 @@ class managesieve extends rcube_plugin
$list = $this->list_scripts();
if (!empty($_GET['_set']) || !empty($_POST['_set'])) {
- $script_name = get_input_value('_set', RCUBE_INPUT_GPC);
+ $script_name = get_input_value('_set', RCUBE_INPUT_GPC, true);
}
else if (!empty($_SESSION['managesieve_current'])) {
$script_name = $_SESSION['managesieve_current'];
@@ -244,6 +244,7 @@ class managesieve extends rcube_plugin
// add script and set it active
if ($this->sieve->save_script($script_name, $content)) {
$this->activate_script($script_name);
+ $this->list[] = $script_name;
}
}
}
@@ -278,8 +279,7 @@ class managesieve extends rcube_plugin
else {
$this->exts = $this->sieve->get_extensions();
$this->script = $this->sieve->script->as_array();
- if (empty($_GET['act']))
- $this->rc->output->set_env('active_sets', $this->active);
+ $this->rc->output->set_env('currentset', $this->sieve->current);
$_SESSION['managesieve_current'] = $this->sieve->current;
}
@@ -294,58 +294,93 @@ class managesieve extends rcube_plugin
// Handle user requests
if ($action = get_input_value('_act', RCUBE_INPUT_GPC)) {
- $fid = (int) get_input_value('_fid', RCUBE_INPUT_GET);
+ $fid = (int) get_input_value('_fid', RCUBE_INPUT_POST);
- if ($action == 'up' && !$error) {
- if ($fid && isset($this->script[$fid]) && isset($this->script[$fid-1])) {
- if ($this->sieve->script->update_rule($fid, $this->script[$fid-1]) !== false
- && $this->sieve->script->update_rule($fid-1, $this->script[$fid]) !== false) {
+ if ($action == 'delete' && !$error) {
+ if (isset($this->script[$fid])) {
+ if ($this->sieve->script->delete_rule($fid))
$result = $this->save_script();
- }
- if ($result) {
-// $this->rc->output->show_message('managesieve.filtersaved', 'confirmation');
- $this->rc->output->command('managesieve_updatelist', 'up', '', $fid);
- } else
- $this->rc->output->show_message('managesieve.filtersaveerror', 'error');
+ if ($result === true) {
+ $this->rc->output->show_message('managesieve.filterdeleted', 'confirmation');
+ $this->rc->output->command('managesieve_updatelist', 'del', array('id' => $fid));
+ } else {
+ $this->rc->output->show_message('managesieve.filterdeleteerror', 'error');
+ }
}
}
- else if ($action == 'down' && !$error) {
- if (isset($this->script[$fid]) && isset($this->script[$fid+1])) {
- if ($this->sieve->script->update_rule($fid, $this->script[$fid+1]) !== false
- && $this->sieve->script->update_rule($fid+1, $this->script[$fid]) !== false) {
- $result = $this->save_script();
+ else if ($action == 'move' && !$error) {
+ if (isset($this->script[$fid])) {
+ $to = (int) get_input_value('_to', RCUBE_INPUT_POST);
+ $rule = $this->script[$fid];
+
+ // remove rule
+ unset($this->script[$fid]);
+ $this->script = array_values($this->script);
+
+ // add at target position
+ if ($to >= count($this->script)) {
+ $this->script[] = $rule;
+ }
+ else {
+ $script = array();
+ foreach ($this->script as $idx => $r) {
+ if ($idx == $to)
+ $script[] = $rule;
+ $script[] = $r;
+ }
+ $this->script = $script;
}
+ $this->sieve->script->content = $this->script;
+ $result = $this->save_script();
+
if ($result === true) {
-// $this->rc->output->show_message('managesieve.filtersaved', 'confirmation');
- $this->rc->output->command('managesieve_updatelist', 'down', '', $fid);
+ $result = $this->list_rules();
+
+ $this->rc->output->show_message('managesieve.moved', 'confirmation');
+ $this->rc->output->command('managesieve_updatelist', 'list',
+ array('list' => $result, 'clear' => true, 'set' => $to));
} else {
- $this->rc->output->show_message('managesieve.filtersaveerror', 'error');
+ $this->rc->output->show_message('managesieve.moveerror', 'error');
}
}
}
- else if ($action == 'delete' && !$error) {
+ else if ($action == 'act' && !$error) {
if (isset($this->script[$fid])) {
- if ($this->sieve->script->delete_rule($fid))
+ $rule = $this->script[$fid];
+ $disabled = $rule['disabled'] ? true : false;
+ $rule['disabled'] = !$disabled;
+ $result = $this->sieve->script->update_rule($fid, $rule);
+
+ if ($result !== false)
$result = $this->save_script();
if ($result === true) {
- $this->rc->output->show_message('managesieve.filterdeleted', 'confirmation');
- $this->rc->output->command('managesieve_updatelist', 'delete', '', $fid);
+ if ($rule['disabled'])
+ $this->rc->output->show_message('managesieve.deactivated', 'confirmation');
+ else
+ $this->rc->output->show_message('managesieve.activated', 'confirmation');
+ $this->rc->output->command('managesieve_updatelist', 'update',
+ array('id' => $fid, 'disabled' => $rule['disabled']));
} else {
- $this->rc->output->show_message('managesieve.filterdeleteerror', 'error');
+ if ($rule['disabled'])
+ $this->rc->output->show_message('managesieve.deactivateerror', 'error');
+ else
+ $this->rc->output->show_message('managesieve.activateerror', 'error');
}
}
}
else if ($action == 'setact' && !$error) {
$script_name = get_input_value('_set', RCUBE_INPUT_GPC);
$result = $this->activate_script($script_name);
+ $kep14 = $this->rc->config->get('managesieve_kolab_master');
if ($result === true) {
$this->rc->output->set_env('active_sets', $this->active);
$this->rc->output->show_message('managesieve.setactivated', 'confirmation');
- $this->rc->output->command('managesieve_reset');
+ $this->rc->output->command('managesieve_updatelist', 'setact',
+ array('name' => $script_name, 'active' => true, 'all' => !$kep14));
} else {
$this->rc->output->show_message('managesieve.setactivateerror', 'error');
}
@@ -357,7 +392,8 @@ class managesieve extends rcube_plugin
if ($result === true) {
$this->rc->output->set_env('active_sets', $this->active);
$this->rc->output->show_message('managesieve.setdeactivated', 'confirmation');
- $this->rc->output->command('managesieve_reset');
+ $this->rc->output->command('managesieve_updatelist', 'setact',
+ array('name' => $script_name, 'active' => false));
} else {
$this->rc->output->show_message('managesieve.setdeactivateerror', 'error');
}
@@ -368,7 +404,8 @@ class managesieve extends rcube_plugin
if ($result === true) {
$this->rc->output->show_message('managesieve.setdeleted', 'confirmation');
- $this->rc->output->command('managesieve_reload');
+ $this->rc->output->command('managesieve_updatelist', 'setdel',
+ array('name' => $script_name));
$this->rc->session->remove('managesieve_current');
} else {
$this->rc->output->show_message('managesieve.setdeleteerror', 'error');
@@ -400,14 +437,19 @@ class managesieve extends rcube_plugin
echo $script;
exit;
}
- elseif ($action == 'ruleadd') {
+ else if ($action == 'list') {
+ $result = $this->list_rules();
+
+ $this->rc->output->command('managesieve_updatelist', 'list', array('list' => $result));
+ }
+ else if ($action == 'ruleadd') {
$rid = get_input_value('_rid', RCUBE_INPUT_GPC);
$id = $this->genid();
$content = $this->rule_div($fid, $id, false);
$this->rc->output->command('managesieve_rulefill', $content, $id, $rid);
}
- elseif ($action == 'actionadd') {
+ else if ($action == 'actionadd') {
$aid = get_input_value('_aid', RCUBE_INPUT_GPC);
$id = $this->genid();
$content = $this->action_div($fid, $id, false);
@@ -464,14 +506,28 @@ class managesieve extends rcube_plugin
// filters set add action
if (!empty($_POST['_newset'])) {
- $name = get_input_value('_name', RCUBE_INPUT_POST);
- $copy = get_input_value('_copy', RCUBE_INPUT_POST);
- $from = get_input_value('_from', RCUBE_INPUT_POST);
+ $name = get_input_value('_name', RCUBE_INPUT_POST, true);
+ $copy = get_input_value('_copy', RCUBE_INPUT_POST, true);
+ $from = get_input_value('_from', RCUBE_INPUT_POST);
+ $exceptions = $this->rc->config->get('managesieve_filename_exceptions');
+ $kolab = $this->rc->config->get('managesieve_kolab_master');
+ $name_uc = mb_strtolower($name);
- if (!$name)
- $error = 'managesieve.emptyname';
- else if (mb_strlen($name)>128)
- $error = 'managesieve.nametoolong';
+ if (!$name) {
+ $this->errors['name'] = $this->gettext('emptyname');
+ }
+ else if (mb_strlen($name) > 128) {
+ $this->errors['name'] = $this->gettext('nametoolong');
+ }
+ else if (!empty($exceptions) && in_array($name, (array)$exceptions)) {
+ $this->errors['name'] = $this->gettext('namereserved');
+ }
+ else if (!empty($kolab) && in_array($name_uc, array('MASTER', 'USER', 'MANAGEMENT'))) {
+ $this->errors['name'] = $this->gettext('namereserved');
+ }
+ else if (($list = $this->list_scripts()) && in_array($name, $list)) {
+ $this->errors['name'] = $this->gettext('setexist');
+ }
else if ($from == 'file') {
// from file
if (is_uploaded_file($_FILES['_file']['tmp_name'])) {
@@ -481,12 +537,11 @@ class managesieve extends rcube_plugin
// check syntax before, like this...
$this->sieve->load_script($file);
if (!$this->save_script($name)) {
- $error = 'managesieve.setcreateerror';
+ $this->errors['file'] = $this->gettext('setcreateerror');
}
}
else { // upload failed
$err = $_FILES['_file']['error'];
- $error = true;
if ($err == UPLOAD_ERR_INI_SIZE || $err == UPLOAD_ERR_FORM_SIZE) {
$msg = rcube_label(array('name' => 'filesizeerror',
@@ -494,7 +549,7 @@ class managesieve extends rcube_plugin
show_bytes(parse_bytes(ini_get('upload_max_filesize'))))));
}
else {
- $error = 'fileuploaderror';
+ $this->errors['file'] = $this->gettext('fileuploaderror');
}
}
}
@@ -502,12 +557,13 @@ class managesieve extends rcube_plugin
$error = 'managesieve.setcreateerror';
}
- if (!$error) {
+ if (!$error && empty($this->errors)) {
$this->rc->output->show_message('managesieve.setcreated', 'confirmation');
- $this->rc->output->command('parent.managesieve_reload', $name);
+ $this->rc->output->command('parent.managesieve_updatelist', 'setadd',
+ array('name' => $name));
} else if ($msg) {
$this->rc->output->command('display_message', $msg, 'error');
- } else {
+ } else if ($error) {
$this->rc->output->show_message($error, 'error');
}
}
@@ -752,11 +808,13 @@ class managesieve extends rcube_plugin
if ($save && $fid !== false) {
$this->rc->output->show_message('managesieve.filtersaved', 'confirmation');
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');
+ $this->rc->output->command('parent.managesieve_updatelist',
+ isset($new) ? 'add' : 'update',
+ array(
+ 'name' => Q($this->form['name']),
+ 'id' => $fid,
+ 'disabled' => $this->form['disabled']
+ ));
}
else {
$this->rc->output->command('managesieve_dialog_close');
@@ -797,21 +855,9 @@ class managesieve extends rcube_plugin
$attrib['id'] = 'rcmfilterslist';
// define list of cols to be displayed
- $a_show_cols = array('managesieve.filtername');
+ $a_show_cols = array('name');
- $i = 1;
- foreach ($this->script as $idx => $filter) {
- if ($filter['type'] != 'if') {
- continue;
- }
- $fname = $filter['name'] ? $filter['name'] : "#$i";
- $result[] = array(
- 'managesieve.filtername' => $fname,
- 'id' => $idx,
- 'class' => $filter['disabled'] ? 'disabled' : '',
- );
- $i++;
- }
+ $result = $this->list_rules();
// create XHTML table
$out = rcube_table_output($attrib, $result, $a_show_cols, 'id');
@@ -835,27 +881,47 @@ class managesieve extends rcube_plugin
$list = $this->list_scripts();
- $select = new html_select(array('name' => '_set', 'id' => $attrib['id'],
- 'onchange' => $this->rc->task != 'mail' ? 'rcmail.managesieve_set()' : ''));
+// if ($list) {
+// asort($list, SORT_LOCALE_STRING);
+// }
+
+ if (!empty($attrib['type']) && $attrib['type'] == 'list') {
+ // define list of cols to be displayed
+ $a_show_cols = array('name');
+
+ if ($list) {
+ foreach ($list as $idx => $set) {
+ $scripts['S'.$idx] = $set;
+ $result[] = array(
+ 'name' => Q($set),
+ 'id' => 'S'.$idx,
+ 'class' => !in_array($set, $this->active) ? 'disabled' : '',
+ );
+ }
+ }
- if ($list) {
- asort($list, SORT_LOCALE_STRING);
+ // create XHTML table
+ $out = rcube_table_output($attrib, $result, $a_show_cols, 'id');
- foreach ($list as $set)
- $select->add($set . (in_array($set, $this->active) ? ' ('.$this->gettext('active').')' : ''), $set);
+ $this->rc->output->set_env('filtersets', $scripts);
+ $this->rc->output->include_script('list.js');
}
+ else {
+ $select = new html_select(array('name' => '_set', 'id' => $attrib['id'],
+ 'onchange' => $this->rc->task != 'mail' ? 'rcmail.managesieve_set()' : ''));
- $out = $select->show($this->sieve->current);
+ if ($list) {
+ foreach ($list as $set)
+ $select->add($set, $set);
+ }
+
+ $out = $select->show($this->sieve->current);
+ }
// set client env
if (!$no_env) {
$this->rc->output->add_gui_object('filtersetslist', $attrib['id']);
- $this->rc->output->add_label(
- 'managesieve.setdeleteconfirm',
- 'managesieve.active',
- 'managesieve.filtersetact',
- 'managesieve.filtersetdeact'
- );
+ $this->rc->output->add_label('managesieve.setdeleteconfirm');
}
return $out;
@@ -910,10 +976,14 @@ class managesieve extends rcube_plugin
$select = new html_select(array('name' => '_copy', 'id' => '_copy'));
if (is_array($list)) {
- asort($list, SORT_LOCALE_STRING);
+// asort($list, SORT_LOCALE_STRING);
- foreach ($list as $set)
- $select->add($set . (in_array($set, $this->active) ? ' ('.$this->gettext('active').')' : ''), $set);
+ if (!$copy)
+ $copy = $_SESSION['managesieve_current'];
+
+ foreach ($list as $set) {
+ $select->add($set, $set);
+ }
$out .= '<br /><input type="radio" id="from_set" name="_from" value="set"'
.($selected=='set' ? ' checked="checked"' : '').'></input>';
@@ -923,7 +993,7 @@ class managesieve extends rcube_plugin
// script upload box
$upload = new html_inputfield(array('name' => '_file', 'id' => '_file', 'size' => 30,
- 'type' => 'file', 'class' => ($this->errors['name'] ? 'error' : '')));
+ 'type' => 'file', 'class' => ($this->errors['file'] ? 'error' : '')));
$out .= '<br /><input type="radio" id="from_file" name="_from" value="file"'
.($selected=='file' ? ' checked="checked"' : '').'></input>';
@@ -933,6 +1003,13 @@ class managesieve extends rcube_plugin
$this->rc->output->add_gui_object('sieveform', 'filtersetform');
+ if ($this->errors['name'])
+ $this->add_tip('_name', $this->errors['name'], true);
+ if ($this->errors['file'])
+ $this->add_tip('_file', $this->errors['file'], true);
+
+ $this->print_tips();
+
return $out;
}
@@ -1095,11 +1172,12 @@ class managesieve extends rcube_plugin
$out .= '<div id="custom_header' .$id. '" style="display:' .(isset($custom) ? 'inline' : 'none'). '">
<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";
+ .' value="' .Q($custom). '" size="15" />&nbsp;</div>' . "\n";
// matching type select (operator)
$select_op = new html_select(array('name' => "_rule_op[]", 'id' => 'rule_op'.$id,
'style' => 'display:' .($rule['test']!='size' ? 'inline' : 'none'),
+ 'class' => 'operator_selector',
'onchange' => 'rule_op_select('.$id.')'));
$select_op->add(Q($this->gettext('filtercontains')), 'contains');
$select_op->add(Q($this->gettext('filternotcontains')), 'notcontains');
@@ -1227,11 +1305,11 @@ class managesieve extends rcube_plugin
$out .= '<td class="rowtargets">';
// shared targets
$out .= '<input type="text" name="_action_target['.$id.']" id="action_target' .$id. '" '
- .'value="' .($action['type']=='redirect' ? Q($action['target'], 'strict', false) : ''). '" size="40" '
+ .'value="' .($action['type']=='redirect' ? Q($action['target'], 'strict', false) : ''). '" size="35" '
.'style="display:' .($action['type']=='redirect' ? 'inline' : 'none') .'" '
. $this->error_class($id, 'action', 'target', 'action_target') .' />';
$out .= '<textarea name="_action_target_area['.$id.']" id="action_target_area' .$id. '" '
- .'rows="3" cols="40" '. $this->error_class($id, 'action', 'targetarea', 'action_target_area')
+ .'rows="3" cols="35" '. $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";
@@ -1240,15 +1318,15 @@ 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.']" id="action_reason' .$id. '" '
- .'rows="3" cols="45" '. $this->error_class($id, 'action', 'reason', 'action_reason') . '>'
+ .'rows="3" cols="35" '. $this->error_class($id, 'action', 'reason', 'action_reason') . '>'
. Q($action['reason'], 'strict', false) . "</textarea>\n";
$out .= '<br /><span class="label">' .Q($this->gettext('vacationsubject')) . '</span><br />'
.'<input type="text" name="_action_subject['.$id.']" id="action_subject'.$id.'" '
- .'value="' . (is_array($action['subject']) ? Q(implode(', ', $action['subject']), 'strict', false) : $action['subject']) . '" size="50" '
+ .'value="' . (is_array($action['subject']) ? Q(implode(', ', $action['subject']), 'strict', false) : $action['subject']) . '" size="35" '
. $this->error_class($id, 'action', 'subject', 'action_subject') .' />';
$out .= '<br /><span class="label">' .Q($this->gettext('vacationaddresses')) . '</span><br />'
.'<input type="text" name="_action_addresses['.$id.']" id="action_addr'.$id.'" '
- .'value="' . (is_array($action['addresses']) ? Q(implode(', ', $action['addresses']), 'strict', false) : $action['addresses']) . '" size="50" '
+ .'value="' . (is_array($action['addresses']) ? Q(implode(', ', $action['addresses']), 'strict', false) : $action['addresses']) . '" size="35" '
. $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['.$id.']" id="action_days'.$id.'" '
@@ -1575,10 +1653,36 @@ class managesieve extends rcube_plugin
{
// Kolab's KEP:14
if ($this->rc->config->get('managesieve_kolab_master')) {
- $this->sieve->script->set_var('editor', self::PROGNAME);
- $this->sieve->script->set_var('editor_version', self::VERSION);
+ $this->sieve->script->set_var('EDITOR', self::PROGNAME);
+ $this->sieve->script->set_var('EDITOR_VERSION', self::VERSION);
}
return $this->sieve->save($name);
}
+
+ /**
+ * Returns list of rules from the current script
+ *
+ * @return array List of rules
+ */
+ public function list_rules()
+ {
+ $result = array();
+ $i = 1;
+
+ foreach ($this->script as $idx => $filter) {
+ if ($filter['type'] != 'if') {
+ continue;
+ }
+ $fname = $filter['name'] ? $filter['name'] : "#$i";
+ $result[] = array(
+ 'id' => $idx,
+ 'name' => Q($fname),
+ 'class' => $filter['disabled'] ? 'disabled' : '',
+ );
+ $i++;
+ }
+
+ return $result;
+ }
}
diff --git a/plugins/managesieve/skins/default/managesieve.css b/plugins/managesieve/skins/default/managesieve.css
index 6f4b5609c..cef26d4f3 100644
--- a/plugins/managesieve/skins/default/managesieve.css
+++ b/plugins/managesieve/skins/default/managesieve.css
@@ -1,159 +1,98 @@
-#filterslist
+#filtersetslistbox
{
position: absolute;
- left: 20px;
- top: 120px;
- bottom: 20px;
+ top: 0;
+ bottom: 0;
+ left: 0;
+ width: 195px;
border: 1px solid #999999;
- overflow: auto;
+ background-color: #F9F9F9;
+ overflow: hidden;
/* css hack for IE */
- height: expression((parseInt(document.documentElement.clientHeight)-140)+'px');
+ height: expression(parseInt(this.parentNode.offsetHeight)+'px');
}
-#filters-table
+#filtersscreen
{
- width: 100%;
- table-layout: fixed;
+ position: absolute;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 205px;
/* css hack for IE */
- width: expression(document.getElementById('filterslist').clientWidth);
+ height: expression(parseInt(this.parentNode.offsetHeight)+'px');
}
-#filters-table tbody td
+#filterslistbox
{
- cursor: pointer;
+ position: absolute;
+ left: 0;
+ top: 0;
+ bottom: 0;
+ border: 1px solid #999999;
+ overflow: auto;
+ /* css hack for IE */
+ height: expression(parseInt(this.parentNode.offsetHeight)+'px');
}
-#filters-table tbody tr.disabled td
+#filterslist,
+#filtersetslist
{
- color: #999999;
+ width: 100%;
+ table-layout: fixed;
}
-#filtersbuttons
+#filterslist tbody td,
+#filtersetslist tbody td
{
- position: absolute;
- left: 20px;
- top: 85px;
+ cursor: default;
+ text-overflow: ellipsis;
+ -o-text-overflow: ellipsis;
}
-#filtersetsbuttons
+#filterslist tbody tr.disabled td,
+#filtersetslist tbody tr.disabled td
{
- position: absolute;
- left: 230px;
- top: 85px;
+ color: #999999;
}
-#filtersbuttons a,
-#filtersetsbuttons a
+#filtersetslist tbody td
{
- display: block;
- float: left;
+ font-weight: bold;
}
-
-#filtersbuttons a.button,
-#filtersbuttons a.buttonPas,
-#filtersetsbuttons a.button,
-#filtersetsbuttons a.buttonPas
+/*
+#filtersetslist tr.selected
{
- display: block;
- float: left;
- width: 32px;
- height: 32px;
- padding: 0;
- margin-right: 3px;
- overflow: hidden;
- background: url(images/toolbar.png) 0 0 no-repeat transparent;
- opacity: 0.99; /* this is needed to make buttons appear correctly in Chrome */
+ background-color: #929292;
+ border-bottom: 1px solid #898989;
+ color: #FFF;
+ font-weight: bold;
}
+*/
-#filtersbuttons a.buttonPas,
-#filtersetsbuttons a.buttonPas
+#filterslist tbody tr.filtermoveup td
{
- filter: alpha(opacity=35);
- opacity: 0.35;
-}
-
-#filtersbuttons a.add {
- background-position: 0px 0px;
-}
-
-#filtersbuttons a.addsel {
- background-position: 0 -32px;
-}
-
-#filtersbuttons a.del {
- background-position: -32px 0px;
-}
-
-#filtersbuttons a.delsel {
- background-position: -32px -32px;
+ border-top: 2px dotted #555;
+ padding-top: 0px;
}
-#filtersbuttons a.up {
- background-position: -64px 0px;
-}
-
-#filtersbuttons a.upsel {
- background-position: -64px -32px;
-}
-
-#filtersbuttons a.down {
- background-position: -96px 0px;
-}
-
-#filtersbuttons a.downsel {
- background-position: -96px -32px;
-}
-
-#filtersetsbuttons a.setadd {
- background-position: -128px 0px;
-}
-
-#filtersetsbuttons a.setaddsel {
- background-position: -128px -32px;
-}
-
-#filtersetsbuttons a.setdel {
- background-position: -160px 0px;
-}
-
-#filtersetsbuttons a.setdelsel {
- background-position: -160px -32px;
-}
-
-#filtersetsbuttons a.setset {
- background-position: -192px 0px;
-}
-
-#filtersetsbuttons a.setsetsel {
- background-position: -192px -32px;
-}
-
-#filtersetsbuttons a.setget {
- background-position: -224px 0px;
-}
-
-#filtersetsbuttons a.setgetsel {
- background-position: -224px -32px;
-}
-
-#filtersetselect
+#filterslist tbody tr.filtermovedown td
{
- position: absolute;
- left: 375px;
- top: 90px;
+ border-bottom: 2px dotted #555;
+ padding-bottom: 1px;
}
#filter-box
{
position: absolute;
- top: 120px;
- right: 20px;
- bottom: 20px;
+ top: 0;
+ right: 0;
+ bottom: 0;
border: 1px solid #999999;
overflow: hidden;
/* css hack for IE */
- width: expression((parseInt(document.documentElement.clientWidth)-40-parseInt(document.getElementById('filterslist').offsetWidth))+'px');
- height: expression((parseInt(document.documentElement.clientHeight)-140)+'px');
+ width: expression((parseInt(this.parentNode.offsetWidth)-20-parseInt(document.getElementById('filterslistbox').offsetWidth))+'px');
+ height: expression(parseInt(this.parentNode.offsetHeight)+'px');
}
#filter-frame
@@ -163,14 +102,14 @@
body.iframe
{
- min-width: 740px;
- width: expression(Math.max(740, document.documentElement.clientWidth)+'px');
+ min-width: 620px;
+ width: expression(Math.max(620, document.documentElement.clientWidth)+'px');
background-color: #F2F2F2;
}
#filter-form
{
- min-width: 650px;
+ min-width: 550px;
white-space: nowrap;
padding: 20px 10px 10px 10px;
}
@@ -207,6 +146,7 @@ div.rulerow table, div.actionrow table
{
padding: 0px;
width: 100%;
+ min-width: 620px;
}
td.rowbuttons
@@ -226,7 +166,7 @@ td.rowtargets
{
white-space: nowrap;
width: 98%;
- padding-left: 10px;
+ padding-left: 3px;
}
input.disabled, input.disabled:hover
@@ -245,6 +185,11 @@ input.radio
border: 0;
}
+select.operator_selector
+{
+ width: 200px;
+}
+
span.label
{
color: #666666;
@@ -317,6 +262,13 @@ a.button.disabled
cursor: default;
}
+#filter-form select,
+#filter-form input,
+#filter-form textarea
+{
+ font-size: 11px;
+}
+
/* fixes for popup window */
body.iframe.mail
diff --git a/plugins/managesieve/skins/default/templates/managesieve.html b/plugins/managesieve/skins/default/templates/managesieve.html
index 94cd1f1cc..71eebe105 100644
--- a/plugins/managesieve/skins/default/templates/managesieve.html
+++ b/plugins/managesieve/skins/default/templates/managesieve.html
@@ -8,46 +8,79 @@
<script type="text/javascript" src="/splitter.js"></script>
<style type="text/css">
-#filterslist { width: <roundcube:exp expression="!empty(cookie:sieveviewsplitter) ? cookie:sieveviewsplitter-5 : 210" />px; }
+#filterslistbox { width: <roundcube:exp expression="!empty(cookie:sieveviewsplitter) ? cookie:sieveviewsplitter-5 : 210" />px; }
#filter-box { left: <roundcube:exp expression="!empty(cookie:sieveviewsplitter) ? cookie:sieveviewsplitter+5 : 220" />px;
<roundcube:exp expression="browser:ie ? ('width:expression((parseInt(this.parentNode.offsetWidth)-'.(!empty(cookie:sieveviewsplitter) ? cookie:sieveviewsplitter+5 : 220).')+\\'px\\');') : ''" />
}
+#filtersetslistbox { width: <roundcube:exp expression="!empty(cookie:sieveviewsplitter2) ? cookie:sieveviewsplitter2-5 : 175" />px; }
+#filtersscreen { left: <roundcube:exp expression="!empty(cookie:sieveviewsplitter2) ? cookie:sieveviewsplitter2+5 : 185" />px;
+<roundcube:exp expression="browser:ie ? ('width:expression((parseInt(this.parentNode.offsetWidth)-'.(!empty(cookie:sieveviewsplitter2) ? cookie:sieveviewsplitter2+5 : 185).')+\\'px\\');') : ''" />
+}
</style>
</head>
-<body>
+<body onload="rcube_init_mail_ui()">
<roundcube:include file="/includes/taskbar.html" />
<roundcube:include file="/includes/header.html" />
<roundcube:include file="/includes/settingstabs.html" />
-<div id="filtersbuttons">
-<roundcube:button command="plugin.managesieve-add" type="link" class="buttonPas add" classSel="button addsel" classAct="button add" title="managesieve.filteradd" content=" " />
-<roundcube:button command="plugin.managesieve-del" type="link" class="buttonPas del" classSel="button delsel" classAct="button del" title="managesieve.filterdel" content=" " />
-<roundcube:button command="plugin.managesieve-up" type="link" class="buttonPas up" classSel="button upsel" classAct="button up" title="managesieve.moveup" content=" " />
-<roundcube:button command="plugin.managesieve-down" type="link" class="buttonPas down" classSel="button downsel" classAct="button down" title="managesieve.movedown" content=" " />
-</div>
+<div id="mainscreen">
-<div id="filtersetsbuttons">
-<roundcube:button command="plugin.managesieve-setadd" type="link" class="buttonPas setadd" classSel="button setaddsel" classAct="button setadd" title="managesieve.filtersetadd" content=" " />
-<roundcube:button command="plugin.managesieve-setdel" type="link" class="buttonPas setdel" classSel="button setdelsel" classAct="button setdel" title="managesieve.filtersetdel" content=" " />
-<roundcube:button command="plugin.managesieve-setact" type="link" class="buttonPas setset" classSel="button setsetsel" classAct="button setset" content=" " />
-<roundcube:button command="plugin.managesieve-setget" type="link" class="buttonPas setget" classSel="button setgetsel" classAct="button setget" title="managesieve.filtersetget" content=" " />
+<div id="filtersetslistbox">
+<div id="filtersetslist-title" class="boxtitle"><roundcube:label name="managesieve.filtersets" /></div>
+<div class="boxlistcontent">
+ <roundcube:object name="filtersetslist" id="filtersetslist" class="records-table" cellspacing="0" summary="Filters list" type="list" noheader="true" />
+</div>
+<div class="boxfooter">
+ <roundcube:button command="plugin.managesieve-setadd" type="link" title="managesieve.filtersetadd" class="buttonPas addfilterset" classAct="button addfilterset" content=" " />
+ <roundcube:button name="filtersetmenulink" id="filtersetmenulink" type="link" title="moreactions" class="button groupactions" onclick="rcmail_ui.show_popup('filtersetmenu', undefined, {above:1});return false" content=" " />
</div>
-<div id="filtersetselect">
-<roundcube:label name="managesieve.filterset" />:
-<roundcube:object name="filtersetslist" id="filtersets-select" />
</div>
-<div id="filterslist">
-<roundcube:object name="filterslist" id="filters-table" class="records-table" cellspacing="0" summary="Filters list" />
+<div id="filtersscreen">
+<div id="filterslistbox">
+<div class="boxtitle"><roundcube:label name="managesieve.filters" /></div>
+<div class="boxlistcontent">
+ <roundcube:object name="filterslist" id="filterslist" class="records-table" cellspacing="0" summary="Filters list" noheader="true" />
+</div>
+<div class="boxfooter">
+ <roundcube:button command="plugin.managesieve-add" type="link" title="managesieve.filteradd" class="buttonPas addfilter" classAct="button addfilter" content=" " />
+ <roundcube:button name="filtermenulink" id="filtermenulink" type="link" title="moreactions" class="button groupactions" onclick="rcmail_ui.show_popup('filtermenu', undefined, {above:1});return false" content=" " />
</div>
+</div>
+
<script type="text/javascript">
- var sieveviewsplit = new rcube_splitter({id:'sieveviewsplitter', p1: 'filterslist', p2: 'filter-box', orientation: 'v', relative: true, start: 215});
+ var sieveviewsplit2 = new rcube_splitter({id:'sieveviewsplitter2', p1: 'filtersetslistbox', p2: 'filtersscreen', orientation: 'v', relative: true, start: 200});
+ rcmail.add_onload('sieveviewsplit2.init()');
+
+ var sieveviewsplit = new rcube_splitter({id:'sieveviewsplitter', p1: 'filterslistbox', p2: 'filter-box', orientation: 'v', relative: true, start: 215});
rcmail.add_onload('sieveviewsplit.init()');
</script>
+
<div id="filter-box">
-<roundcube:object name="filterframe" id="filter-frame" width="100%" height="100%" frameborder="0" src="/watermark.html" />
+ <roundcube:object name="filterframe" id="filter-frame" width="100%" height="100%" frameborder="0" src="/watermark.html" />
+</div>
+
+</div>
+</div>
+</div>
+
+<div id="filtersetmenu" class="popupmenu">
+ <ul>
+ <li><roundcube:button command="plugin.managesieve-setact" label="managesieve.enable" classAct="active" /></li>
+ <li><roundcube:button command="plugin.managesieve-setdel" label="delete" classAct="active" /></li>
+ <li class="separator_above"><roundcube:button command="plugin.managesieve-setget" label="download" classAct="active" /></li>
+ <roundcube:container name="filtersetoptions" id="filtersetmenu" />
+ </ul>
+</div>
+
+<div id="filtermenu" class="popupmenu">
+ <ul>
+ <li><roundcube:button command="plugin.managesieve-act" label="managesieve.enable" classAct="active" /></li>
+ <li><roundcube:button command="plugin.managesieve-del" label="delete" classAct="active" /></li>
+ <roundcube:container name="filteroptions" id="filtermenu" />
+ </ul>
</div>
</body>
diff --git a/plugins/managesieve/tests/parser_kep14.phpt b/plugins/managesieve/tests/parser_kep14.phpt
index 9be4eba04..06beaeda1 100644
--- a/plugins/managesieve/tests/parser_kep14.phpt
+++ b/plugins/managesieve/tests/parser_kep14.phpt
@@ -6,8 +6,8 @@ Test of Kolab's KEP:14 implementation
include '../lib/rcube_sieve_script.php';
$txt = '
-# set "editor" "Roundcube";
-# set "editor_version" "123";
+# EDITOR Roundcube
+# EDITOR_VERSION 123
';
$s = new rcube_sieve_script($txt, array());
@@ -15,5 +15,5 @@ echo $s->as_text();
?>
--EXPECT--
-# set "editor" "Roundcube";
-# set "editor_version" "123";
+# EDITOR Roundcube
+# EDITOR_VERSION 123