From 39930a480955b7ebe5db7de71fddef8f750b8519 Mon Sep 17 00:00:00 2001 From: alec Date: Mon, 17 Oct 2011 10:50:37 +0000 Subject: - 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 --- plugins/managesieve/Changelog | 6 + plugins/managesieve/config.inc.php.dist | 4 + plugins/managesieve/lib/rcube_sieve_script.php | 16 +- plugins/managesieve/localization/en_US.inc | 48 +- plugins/managesieve/localization/pl_PL.inc | 48 +- plugins/managesieve/managesieve.js | 597 +++++++++++---------- plugins/managesieve/managesieve.php | 282 +++++++--- plugins/managesieve/skins/default/managesieve.css | 194 +++---- .../skins/default/templates/managesieve.html | 73 ++- plugins/managesieve/tests/parser_kep14.phpt | 8 +- 10 files changed, 713 insertions(+), 563 deletions(-) (limited to 'plugins') 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 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); + + if (o.name) + $('td', row).html(o.name); + if (o.disabled) + row.addClass('disabled'); + else + row.removeClass('disabled'); + + $('#disabled', $('iframe').contents()).prop('checked', o.disabled); - // we need only to replace filter names... - for (var i=0; i'); + + $('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); - // we need only to replace filter names... - for (var i=0; i'); + + $('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 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()' : '')); + + if ($list) { + foreach ($list as $set) + $select->add($set, $set); + } - $out = $select->show($this->sieve->current); + $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 .= '
'; @@ -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 .= '
'; @@ -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 .= '
error_class($id, 'test', 'header', 'custom_header_i') - .' value="' .Q($custom). '" size="20" /> 
' . "\n"; + .' value="' .Q($custom). '" size="15" /> ' . "\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 .= ''; // shared targets $out .= 'error_class($id, 'action', 'target', 'action_target') .' />'; $out .= '\n"; @@ -1240,15 +1318,15 @@ class managesieve extends rcube_plugin $out .= '
'; $out .= ''. Q($this->gettext('vacationreason')) .'
' .'\n"; $out .= '
' .Q($this->gettext('vacationsubject')) . '
' .'error_class($id, 'action', 'subject', 'action_subject') .' />'; $out .= '
' .Q($this->gettext('vacationaddresses')) . '
' .'error_class($id, 'action', 'addresses', 'action_addr') .' />'; $out .= '
' . Q($this->gettext('vacationdays')) . '
' .'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 @@ - + -
- - - - -
+
-
- - - - +
+
+
+ +
+
+ +
-
-: -
-
- +
+
+
+
+ +
+
+ +
+
+ +
- + +
+ +
+
+
+ +
+
    +
  • +
  • +
  • + +
+
+ +
+
    +
  • +
  • + +
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 -- cgit v1.2.3