diff options
| author | alec <alec@208e9e7b-5314-0410-a742-e7e81cd9613c> | 2011-10-17 10:50:37 +0000 |
|---|---|---|
| committer | alec <alec@208e9e7b-5314-0410-a742-e7e81cd9613c> | 2011-10-17 10:50:37 +0000 |
| commit | 39930a480955b7ebe5db7de71fddef8f750b8519 (patch) | |
| tree | 9baa94d5eb4b358ee2b79944c0c7dfe46e8b3e95 /plugins | |
| parent | bb06657788d03c605837120a77291ad2c621986d (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
Diffstat (limited to 'plugins')
| -rw-r--r-- | plugins/managesieve/Changelog | 6 | ||||
| -rw-r--r-- | plugins/managesieve/config.inc.php.dist | 4 | ||||
| -rw-r--r-- | plugins/managesieve/lib/rcube_sieve_script.php | 16 | ||||
| -rw-r--r-- | plugins/managesieve/localization/en_US.inc | 48 | ||||
| -rw-r--r-- | plugins/managesieve/localization/pl_PL.inc | 48 | ||||
| -rw-r--r-- | plugins/managesieve/managesieve.js | 589 | ||||
| -rw-r--r-- | plugins/managesieve/managesieve.php | 282 | ||||
| -rw-r--r-- | plugins/managesieve/skins/default/managesieve.css | 194 | ||||
| -rw-r--r-- | plugins/managesieve/skins/default/templates/managesieve.html | 73 | ||||
| -rw-r--r-- | plugins/managesieve/tests/parser_kep14.phpt | 8 |
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" /> </div>' . "\n"; + .' value="' .Q($custom). '" size="15" /> </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 |
