diff options
Diffstat (limited to 'plugins')
-rw-r--r-- | plugins/acl/acl.js | 52 | ||||
-rw-r--r-- | plugins/acl/acl.php | 4 | ||||
-rw-r--r-- | plugins/acl/localization/en_US.inc | 5 | ||||
-rw-r--r-- | plugins/acl/skins/larry/acl.css | 17 | ||||
-rw-r--r-- | plugins/acl/skins/larry/templates/table.html | 21 | ||||
-rw-r--r-- | plugins/emoticons/emoticons.php | 4 | ||||
-rw-r--r-- | plugins/legacy_browser/skins/larry/ie7hacks.css | 1 | ||||
-rw-r--r-- | plugins/managesieve/Changelog | 1 | ||||
-rw-r--r-- | plugins/managesieve/lib/Roundcube/rcube_sieve_vacation.php | 20 | ||||
-rw-r--r-- | plugins/managesieve/localization/en_US.inc | 5 | ||||
-rw-r--r-- | plugins/managesieve/managesieve.js | 49 | ||||
-rw-r--r-- | plugins/managesieve/skins/classic/templates/vacation.html | 2 | ||||
-rw-r--r-- | plugins/managesieve/skins/larry/managesieve.css | 9 | ||||
-rw-r--r-- | plugins/managesieve/skins/larry/templates/managesieve.html | 45 | ||||
-rw-r--r-- | plugins/managesieve/skins/larry/templates/vacation.html | 6 | ||||
-rw-r--r-- | plugins/newmail_notifier/newmail_notifier.php | 4 | ||||
-rw-r--r-- | plugins/zipdownload/zipdownload.js | 25 | ||||
-rw-r--r-- | plugins/zipdownload/zipdownload.php | 8 |
18 files changed, 156 insertions, 122 deletions
diff --git a/plugins/acl/acl.js b/plugins/acl/acl.js index acea60a4c..d82725c8b 100644 --- a/plugins/acl/acl.js +++ b/plugins/acl/acl.js @@ -140,15 +140,16 @@ rcube_webmail.prototype.acl_mode_switch = function(elem) rcube_webmail.prototype.acl_list_init = function() { var method = this.env.acl_advanced ? 'addClass' : 'removeClass'; + $('#acl-switch')[method]('selected'); $(this.gui_objects.acltable)[method]('advanced'); this.acl_list = new rcube_list_widget(this.gui_objects.acltable, - {multiselect:true, draggable:false, keyboard:true, toggleselect:true}); - this.acl_list.addEventListener('select', function(o) { rcmail.acl_list_select(o); }); - this.acl_list.addEventListener('dblclick', function(o) { rcmail.acl_list_dblclick(o); }); - this.acl_list.addEventListener('keypress', function(o) { rcmail.acl_list_keypress(o); }); - this.acl_list.init(); + {multiselect: true, draggable: false, keyboard: true}); + this.acl_list.addEventListener('select', function(o) { rcmail.acl_list_select(o); }) + .addEventListener('dblclick', function(o) { rcmail.acl_list_dblclick(o); }) + .addEventListener('keypress', function(o) { rcmail.acl_list_keypress(o); }) + .init(); } // ACL table row selection handler @@ -228,16 +229,23 @@ rcube_webmail.prototype.acl_add_row = function(o, sel) row = $('thead > tr', table).clone(); // Update new row - $('td', row).map(function() { - var r, cl = this.className.replace(/^acl/, ''); + $('th', row).map(function() { + var td = $('<td>'), + title = $(this).attr('title'), + cl = this.className.replace(/^acl/, ''); + + if (title) + td.attr('title', title); if (items && items[cl]) cl = items[cl]; if (cl == 'user') - $(this).text(o.username); + td.addClass(cl).append($('<a>').text(o.username)); else - $(this).addClass(rcmail.acl_class(o.acl, cl)).text(''); + td.addClass(this.className + ' ' + rcmail.acl_class(o.acl, cl)).text(''); + + $(this).replaceWith(td); }); row.attr('id', 'rcmrow'+id); @@ -281,10 +289,10 @@ rcube_webmail.prototype.acl_init_form = function(id) { var ul, row, td, val = '', type = 'user', li_elements, body = $('body'), adv_ul = $('#advancedrights'), sim_ul = $('#simplerights'), - name_input = $('#acluser'); + name_input = $('#acluser'), type_list = $('#usertype'); if (!this.acl_form) { - var fn = function () { $('input[value=user]').prop('checked', true); }; + var fn = function () { $('input[value="user"]').prop('checked', true); }; name_input.click(fn).keypress(fn); } @@ -329,23 +337,24 @@ rcube_webmail.prototype.acl_init_form = function(id) this.acl_id = id; - var me = this, inst = window.rcmail, body = document.body; - var buttons = {}; - buttons[rcmail.gettext('save')] = function(e) { inst.command('acl-save'); }; - buttons[rcmail.gettext('cancel')] = function(e) { inst.command('acl-cancel'); }; + var buttons = {}, me = this, body = document.body; + + buttons[this.gettext('save')] = function(e) { me.command('acl-save'); }; + buttons[this.gettext('cancel')] = function(e) { me.command('acl-cancel'); }; // display it as popup - this.acl_popup = rcmail.show_popup_dialog( + this.acl_popup = this.show_popup_dialog( '<div style="width:480px;height:280px"> </div>', - id ? rcmail.gettext('acl.editperms') : rcmail.gettext('acl.newuser'), + id ? this.gettext('acl.editperms') : this.gettext('acl.newuser'), buttons, { modal: true, - closeOnEscape: false, + closeOnEscape: true, close: function(e, ui) { - (rcmail.is_framed() ? parent.rcmail : rcmail).ksearch_hide(); + (me.is_framed() ? parent.rcmail : me).ksearch_hide(); me.acl_form.appendTo(body).hide(); $(this).remove(); + window.focus(); // focus iframe } } ); @@ -354,9 +363,8 @@ rcube_webmail.prototype.acl_init_form = function(id) if (type == 'user') name_input.focus(); - - // unfocus the list, make backspace key in name input field working - this.acl_list.blur(); + else + $('input:checked', type_list).focus(); } // Returns class name according to ACL comparision result diff --git a/plugins/acl/acl.php b/plugins/acl/acl.php index d7e50f978..95d4eda62 100644 --- a/plugins/acl/acl.php +++ b/plugins/acl/acl.php @@ -286,7 +286,7 @@ class acl extends rcube_plugin $textfield = new html_inputfield($attrib); - $fields['user'] = html::label(array('for' => 'iduser'), $this->gettext('username')) + $fields['user'] = html::label(array('for' => $attrib['id']), $this->gettext('username')) . ' ' . $textfield->show(); // Add special entries @@ -401,7 +401,7 @@ class acl extends rcube_plugin } $table->add_row(array('id' => 'rcmrow'.$userid)); - $table->add('user', rcube::Q($user)); + $table->add('user', html::a(array('id' => 'rcmlinkrow'.$userid), rcube::Q($user))); foreach ($items as $key => $right) { $in = $this->acl_compare($userrights, $right); diff --git a/plugins/acl/localization/en_US.inc b/plugins/acl/localization/en_US.inc index 23501dafe..ff8dde76c 100644 --- a/plugins/acl/localization/en_US.inc +++ b/plugins/acl/localization/en_US.inc @@ -87,6 +87,11 @@ $labels['longaclfull'] = 'Full control including folder administration'; $labels['longaclread'] = 'The folder can be opened for reading'; $labels['longaclwrite'] = 'Messages can be marked, written or copied to the folder'; $labels['longacldelete'] = 'Messages can be deleted'; +$labels['longaclother'] = 'Other access rights'; + +$labels['ariasummaryacltable'] = 'List of access rights'; +$labels['arialabelaclactions'] = 'List actions'; +$labels['arialabelaclform'] = 'Access rights form'; $messages['deleting'] = 'Deleting access rights...'; $messages['saving'] = 'Saving access rights...'; diff --git a/plugins/acl/skins/larry/acl.css b/plugins/acl/skins/larry/acl.css index 96c1092a0..bd72b3c85 100644 --- a/plugins/acl/skins/larry/acl.css +++ b/plugins/acl/skins/larry/acl.css @@ -26,44 +26,39 @@ border: none; } +#acltable th, #acltable td { white-space: nowrap; text-align: center; } -#acltable thead tr td +#acltable thead tr th { - border-left: #BBD3DA dotted 1px; font-size: 11px; font-weight: bold; - width: auto; } #acltable tbody td { - border-bottom: #DDDDDD 1px solid; text-align: center; height: 16px; cursor: default; } -#acltable thead td.user +#acltable thead tr > .user { width: 30%; + border-left: none; } -#acltable.advanced thead td.user { - width: 25%; +#acltable.advanced thead tr > .user { + width: 25%; } #acltable tbody td.user { text-align: left; - overflow: hidden; - text-overflow: ellipsis; - -o-text-overflow: ellipsis; - border-left: none; } #acltable tbody td.partial diff --git a/plugins/acl/skins/larry/templates/table.html b/plugins/acl/skins/larry/templates/table.html index c0b8329c6..3f203e44d 100644 --- a/plugins/acl/skins/larry/templates/table.html +++ b/plugins/acl/skins/larry/templates/table.html @@ -1,23 +1,26 @@ <div id="aclcontainer" class="uibox listbox"> -<div id="acllist-content" class="scroller withfooter"> - <roundcube:object name="acltable" id="acltable" class="records-table" /> +<div id="acllist-content" class="scroller withfooter" aria-labelledby="aria-label-acltable"> + <h2 class="boxtitle" id="aria-label-acltable"><roundcube:label name="acl.ariasummaryacltable" /></h2> + <roundcube:object name="acltable" id="acltable" class="records-table" summary="acl.ariasummaryacltable" role="listbox" /> </div> <div id="acllist-footer" class="boxfooter"> - <roundcube:button command="acl-create" id="aclcreatelink" type="link" title="acl.newuser" class="listbutton add disabled" classAct="listbutton add" innerClass="inner" content="+" /><roundcube:button name="aclmenulink" id="aclmenulink" type="link" title="acl.actions" class="listbutton groupactions"onclick="UI.show_popup('aclmenu', undefined, {above:1});return false" innerClass="inner" content="⚙" /> + <roundcube:button command="acl-create" id="aclcreatelink" type="link" title="acl.newuser" class="listbutton add disabled" classAct="listbutton add" innerClass="inner" content="+" /><roundcube:button name="aclmenulink" id="aclmenulink" type="link" title="acl.actions" class="listbutton groupactions" onclick="return UI.toggle_popup('aclmenu', event)" innerClass="inner" content="⚙" aria-haspopup="true" aria-expanded="false" aria-owns="aclmenu-menu" /> </div> </div> -<div id="aclmenu" class="popupmenu"> - <ul class="toolbarmenu selectable iconized"> - <li><roundcube:button command="acl-edit" label="edit" class="icon" classAct="icon active" innerclass="icon edit" /></li> - <li><roundcube:button command="acl-delete" label="delete" class="icon" classAct="icon active" innerclass="icon delete" /></li> +<div id="aclmenu" class="popupmenu" aria-hidden="true" data-align="bottom"> + <h3 id="aria-label-aclactions" class="voice"><roundcube:label name="acl.arialabelaclactions" /></h3> + <ul id="aclmenu-menu" class="toolbarmenu selectable iconized" role="menu" aria-labelledby="aria-label-aclactions"> + <li role="menuitem"><roundcube:button command="acl-edit" label="edit" class="icon" classAct="icon active" innerclass="icon edit" /></li> + <li role="menuitem"><roundcube:button command="acl-delete" label="delete" class="icon" classAct="icon active" innerclass="icon delete" /></li> <roundcube:if condition="!in_array('acl_advanced_mode', (array)config:dont_override)" /> - <li><roundcube:button name="acl-switch" id="acl-switch" label="acl.advanced" onclick="rcmail.command('acl-mode-switch');return false" class="active" /></li> + <li role="menuitem"><roundcube:button name="acl-switch" id="acl-switch" label="acl.advanced" onclick="rcmail.command('acl-mode-switch');return false" class="active" /></li> <roundcube:endif /> </ul> </div> -<div id="aclform" class="propform" style="position:absolute; width:480px; top:0; left:0; padding:8px"> +<div id="aclform" class="propform" style="position:absolute; width:480px; top:0; left:0; padding:8px" aria-labelledby="aria-label-aclform" aria-hidden="true" role="dialog"> + <h3 id="aria-label-aclform" class="voice"><roundcube:label name="acl.arialabelaclform" /></h3> <fieldset class="thinbordered"><legend><roundcube:label name="acl.identifier" /></legend> <roundcube:object name="acluser" id="acluser" size="35" class="proplist" /> </fieldset> diff --git a/plugins/emoticons/emoticons.php b/plugins/emoticons/emoticons.php index c986686e3..187e83827 100644 --- a/plugins/emoticons/emoticons.php +++ b/plugins/emoticons/emoticons.php @@ -71,8 +71,8 @@ class emoticons extends rcube_plugin } private function img_tag($ico, $title) - { - $path = './program/js/tiny_mce/plugins/emotions/img/'; + { + $path = './program/js/tinymce/plugins/emoticons/img/'; return html::img(array('src' => $path.$ico, 'title' => $title)); } } diff --git a/plugins/legacy_browser/skins/larry/ie7hacks.css b/plugins/legacy_browser/skins/larry/ie7hacks.css index 2a174001e..85ebaf239 100644 --- a/plugins/legacy_browser/skins/larry/ie7hacks.css +++ b/plugins/legacy_browser/skins/larry/ie7hacks.css @@ -37,6 +37,7 @@ input.button { a.iconbutton, a.deletebutton, .boxpagenav a.icon, +a.button span.icon, .pagenav a.button span.inner, .boxfooter .listbutton .inner, .attachmentslist li a.delete, diff --git a/plugins/managesieve/Changelog b/plugins/managesieve/Changelog index 29b359d7f..856b8acf4 100644 --- a/plugins/managesieve/Changelog +++ b/plugins/managesieve/Changelog @@ -1,6 +1,7 @@ - Added optional separate interface for out-of-office management (#1488266) - Fix disabled "create filter" action - Fix enotify/notify extension handling +- Improved UI accessibility * version 7.2 [2014-02-14] ----------------------------------------------------------- diff --git a/plugins/managesieve/lib/Roundcube/rcube_sieve_vacation.php b/plugins/managesieve/lib/Roundcube/rcube_sieve_vacation.php index 636b5fcc1..2f998744a 100644 --- a/plugins/managesieve/lib/Roundcube/rcube_sieve_vacation.php +++ b/plugins/managesieve/lib/Roundcube/rcube_sieve_vacation.php @@ -216,18 +216,18 @@ class rcube_sieve_vacation extends rcube_sieve_engine ) + $attrib); // form elements - $subject = new html_inputfield(array('name' => 'vacation_subject', 'size' => 50)); - $reason = new html_textarea(array('name' => 'vacation_reason', 'cols' => 60, 'rows' => 8)); - $interval = new html_inputfield(array('name' => 'vacation_interval', 'size' => 5)); - $addresses = '<textarea name="vacation_addresses" data-type="list" data-size="30" style="display: none">' + $subject = new html_inputfield(array('name' => 'vacation_subject', 'id' => 'vacation_subject', 'size' => 50)); + $reason = new html_textarea(array('name' => 'vacation_reason', 'id' => 'vacation_reason', 'cols' => 60, 'rows' => 8)); + $interval = new html_inputfield(array('name' => 'vacation_interval', 'id' => 'vacation_interval', 'size' => 5)); + $addresses = '<textarea name="vacation_addresses" id="vacation_addresses" data-type="list" data-size="30" style="display: none">' . rcube::Q(implode("\n", (array) $this->vacation['addresses']), 'strict', false) . '</textarea>'; - $status = new html_select(array('name' => 'vacation_status')); + $status = new html_select(array('name' => 'vacation_status', 'id' => 'vacation_status')); $status->add($this->plugin->gettext('vacation.on'), 'on'); $status->add($this->plugin->gettext('vacation.off'), 'off'); if ($this->rc->config->get('managesieve_vacation') != 2 && count($this->vacation['list'])) { - $after = new html_select(array('name' => 'vacation_after')); + $after = new html_select(array('name' => 'vacation_after', 'id' => 'vacation_after')); $after->add('', ''); foreach ($this->vacation['list'] as $idx => $rule) { @@ -247,7 +247,7 @@ class rcube_sieve_vacation extends rcube_sieve_engine } if ($date_extension) { - $date_from = new html_inputfield(array('name' => 'vacation_datefrom', 'class' => 'datepicker', 'size' => 12)); + $date_from = new html_inputfield(array('name' => 'vacation_datefrom', 'id' => 'vacation_datefrom', 'class' => 'datepicker', 'size' => 12)); $date_to = new html_inputfield(array('name' => 'vacation_dateto', 'class' => 'datepicker', 'size' => 12)); $date_format = $this->rc->config->get('date_format', 'Y-m-d'); @@ -283,12 +283,12 @@ class rcube_sieve_vacation extends rcube_sieve_engine // Advanced tab $table = new html_table(array('cols' => 2)); - $table->add('title', $this->plugin->gettext('vacation.addresses')); + $table->add('title', html::label('vacation_addresses', $this->plugin->gettext('vacation.addresses'))); $table->add(null, $addresses); - $table->add('title', $this->plugin->gettext('vacation.interval')); + $table->add('title', html::label('vacation_interval', $this->plugin->gettext('vacation.interval'))); $table->add(null, $interval_txt); if ($after) { - $table->add('title', $this->plugin->gettext('vacation.after')); + $table->add('title', html::label('vacation_after', $this->plugin->gettext('vacation.after'))); $table->add(null, $after->show($this->vacation['idx'] - 1)); } diff --git a/plugins/managesieve/localization/en_US.inc b/plugins/managesieve/localization/en_US.inc index 1ea7d969e..6b13eff17 100644 --- a/plugins/managesieve/localization/en_US.inc +++ b/plugins/managesieve/localization/en_US.inc @@ -177,6 +177,11 @@ $labels['vacation.addresses'] = 'My additional addresses'; $labels['vacation.interval'] = 'Reply interval'; $labels['vacation.after'] = 'Put vacation rule after'; $labels['vacation.saving'] = 'Saving data...'; +$labels['arialabelfiltersetactions'] = 'Filter set actions'; +$labels['arialabelfilteractions'] = 'Filter actions'; +$labels['arialabelfilterform'] = 'Filter properties'; +$labels['ariasummaryfilterslist'] = 'List of filters'; +$labels['ariasummaryfiltersetslist'] = 'List of filter sets'; $messages = array(); $messages['filterunknownerror'] = 'Unknown server error.'; diff --git a/plugins/managesieve/managesieve.js b/plugins/managesieve/managesieve.js index 27ab38a77..e81ab3332 100644 --- a/plugins/managesieve/managesieve.js +++ b/plugins/managesieve/managesieve.js @@ -73,7 +73,7 @@ if (window.rcmail) { changeMonth: true, showOtherMonths: true, selectOtherMonths: true, - onSelect: function(dateText) { $(this).focus().val(dateText) } + onSelect: function(dateText) { $(this).focus().val(dateText); } }); $('input.datepicker').datepicker(); } @@ -82,46 +82,47 @@ if (window.rcmail) { rcmail.enable_command('plugin.managesieve-add', 'plugin.managesieve-setadd', !rcmail.env.sieveconnerror); } - var i, p = rcmail, setcnt, set = rcmail.env.currentset; + var setcnt, set = rcmail.env.currentset; if (rcmail.gui_objects.filterslist) { rcmail.filters_list = new rcube_list_widget(rcmail.gui_objects.filterslist, - {multiselect:false, draggable:true, keyboard:false}); + {multiselect:false, draggable:true, keyboard:true}); rcmail.filters_list - .addEventListener('select', function(e) { p.managesieve_select(e); }) - .addEventListener('dragstart', function(e) { p.managesieve_dragstart(e); }) - .addEventListener('dragend', function(e) { p.managesieve_dragend(e); }) + .addEventListener('select', function(e) { rcmail.managesieve_select(e); }) + .addEventListener('dragstart', function(e) { rcmail.managesieve_dragstart(e); }) + .addEventListener('dragend', function(e) { rcmail.managesieve_dragend(e); }) .addEventListener('initrow', function(row) { - row.obj.onmouseover = function() { p.managesieve_focus_filter(row); }; - row.obj.onmouseout = function() { p.managesieve_unfocus_filter(row); }; + row.obj.onmouseover = function() { rcmail.managesieve_focus_filter(row); }; + row.obj.onmouseout = function() { rcmail.managesieve_unfocus_filter(row); }; }) - .init().focus(); + .init(); } if (rcmail.gui_objects.filtersetslist) { rcmail.filtersets_list = new rcube_list_widget(rcmail.gui_objects.filtersetslist, - {multiselect:false, draggable:false, keyboard:false}); + {multiselect:false, draggable:false, keyboard:true}); - rcmail.filtersets_list - .addEventListener('select', function(e) { p.managesieve_setselect(e); }) - .init().focus(); + rcmail.filtersets_list.init().focus(); if (set != null) { set = rcmail.managesieve_setid(set); - rcmail.filtersets_list.shift_start = set; - rcmail.filtersets_list.highlight_row(set, false); + rcmail.filtersets_list.select(set); } + // attach select event after initial record was selected + rcmail.filtersets_list.addEventListener('select', function(e) { rcmail.managesieve_setselect(e); }); + 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); // Fix dragging filters over sets list - $('tr', rcmail.gui_objects.filtersetslist).each(function (i, e) { p.managesieve_fixdragend(e); }); + $('tr', rcmail.gui_objects.filtersetslist).each(function (i, e) { rcmail.managesieve_fixdragend(e); }); } } + if (rcmail.gui_objects.sieveform && rcmail.env.rule_disabled) $('#disabled').attr('checked', true); }); @@ -778,6 +779,7 @@ function smart_field_row(value, name, idx, size) input = $('input', elem).attr(attrs).keydown(function(e) { var input = $(this); + // element creation event (on Enter) if (e.which == 13) { var name = input.attr('name').replace(/\[\]$/, ''), @@ -787,6 +789,21 @@ function smart_field_row(value, name, idx, size) input.parent().after(elem); $('input', elem).focus(); } + // backspace or delete: remove input, focus previous one + else if ((e.which == 8 || e.which == 46) && input.val() == '') { + + var parent = input.parent(), siblings = parent.parent().children(); + + if (siblings.length > 1) { + if (parent.prev().length) + parent.prev().children('input').focus(); + else + parent.next().children('input').focus(); + + parent.remove(); + return false; + } + } }); // element deletion event diff --git a/plugins/managesieve/skins/classic/templates/vacation.html b/plugins/managesieve/skins/classic/templates/vacation.html index bf94edb20..26e408eef 100644 --- a/plugins/managesieve/skins/classic/templates/vacation.html +++ b/plugins/managesieve/skins/classic/templates/vacation.html @@ -17,7 +17,7 @@ <roundcube:object name="vacationform" id="vacationform" style="margin: 10px 10px 0 10px" /> <div id="formfooter" style="padding: 0 10px"> <div class="footerleft"> - <roundcube:button command="save" type="input" class="button mainaction" label="save" /> + <roundcube:button command="plugin.managesieve-save" type="input" class="button mainaction" label="save" /> </div> </div> </div> diff --git a/plugins/managesieve/skins/larry/managesieve.css b/plugins/managesieve/skins/larry/managesieve.css index 1f954caf2..a0526eb68 100644 --- a/plugins/managesieve/skins/larry/managesieve.css +++ b/plugins/managesieve/skins/larry/managesieve.css @@ -306,6 +306,7 @@ a.button.disabled font-size: 11px; padding: 1px; vertical-align: middle; + max-width: 280px; } html.mozilla #filter-form select @@ -417,11 +418,13 @@ body.iframe.mail #filter-form /* vacation form */ -#settings-sections span.vacation a { - background: url(images/vacation_icons.png) no-repeat 7px 1px; +#settings-sections .vacation a { + background-image: url(images/vacation_icons.png); + background-repeat: no-repeat; + background-position: 7px 1px; } -#settings-sections span.vacation.selected a { +#settings-sections .vacation.selected a { background-position: 7px -23px; } diff --git a/plugins/managesieve/skins/larry/templates/managesieve.html b/plugins/managesieve/skins/larry/templates/managesieve.html index 471bbf4d2..8d648dbdc 100644 --- a/plugins/managesieve/skins/larry/templates/managesieve.html +++ b/plugins/managesieve/skins/larry/templates/managesieve.html @@ -8,35 +8,38 @@ <roundcube:include file="/includes/header.html" /> +<h1 class="voice"><roundcube:label name="settings" /> : <roundcube:label name="managesieve.filters" /></h1> + <div id="mainscreen" class="offset"> <roundcube:include file="/includes/settingstabs.html" /> -<div id="settings-right"> -<div id="filtersetslistbox" class="uibox listbox"> -<h2 class="boxtitle"><roundcube:label name="managesieve.filtersets" /></h2> +<div id="settings-right" role="main"> +<div id="filtersetslistbox" class="uibox listbox" aria-labelledby="aria-label-filtersets"> +<h2 class="boxtitle" id="aria-label-filtersets"><roundcube:label name="managesieve.filtersets" /></h2> <div class="scroller withfooter"> - <roundcube:object name="filtersetslist" id="filtersetslist" class="listing" cellspacing="0" summary="Filters list" type="list" noheader="true" /> + <roundcube:object name="filtersetslist" id="filtersetslist" class="listing" summary="managesieve.ariasummaryfiltersetslist" type="list" noheader="true" role="listbox" /> </div> <div class="boxfooter"> - <roundcube:button command="plugin.managesieve-setadd" type="link" title="managesieve.filtersetadd" class="listbutton add disabled" classAct="listbutton add" innerClass="inner" content="+" /><roundcube:button name="filtersetmenulink" id="filtersetmenulink" type="link" title="moreactions" class="listbutton groupactions" onclick="UI.show_popup('filtersetmenu');return false" innerClass="inner" content="⚙" /> + <roundcube:button command="plugin.managesieve-setadd" type="link" title="managesieve.filtersetadd" class="listbutton add disabled" classAct="listbutton add" innerClass="inner" content="+" /><roundcube:button name="filtersetmenulink" id="filtersetmenulink" type="link" title="moreactions" class="listbutton groupactions" onclick="return UI.toggle_popup('filtersetmenu', event)" innerClass="inner" content="⚙" aria-haspopup="true" aria-expanded="false" aria-owns="filtersetmenu-menu" /> </div> </div> <div id="filtersscreen"> -<div id="filterslistbox" class="uibox listbox"> -<h2 class="boxtitle"><roundcube:label name="managesieve.filters" /></h2> +<div id="filterslistbox" class="uibox listbox" aria-labelledby="aria-label-filters"> +<h2 class="boxtitle" id="aria-label-filters"><roundcube:label name="managesieve.filters" /></h2> <div class="scroller withfooter"> - <roundcube:object name="filterslist" id="filterslist" class="listing" cellspacing="0" summary="Filters list" noheader="true" /> + <roundcube:object name="filterslist" id="filterslist" class="listing" summary="managesieve.ariasummaryfilterslist" noheader="true" role="listbox" /> </div> <div class="boxfooter"> - <roundcube:button command="plugin.managesieve-add" type="link" title="managesieve.filteradd" class="listbutton add disabled" classAct="listbutton add" innerClass="inner" content="+" /><roundcube:button name="filtermenulink" id="filtermenulink" type="link" title="moreactions" class="listbutton groupactions" onclick="UI.show_popup('filtermenu');return false" innerClass="inner" content="⚙" /> + <roundcube:button command="plugin.managesieve-add" type="link" title="managesieve.filteradd" class="listbutton add disabled" classAct="listbutton add" innerClass="inner" content="+" /><roundcube:button name="filtermenulink" id="filtermenulink" type="link" title="moreactions" class="listbutton groupactions" onclick="return UI.toggle_popup('filtermenu', event)" innerClass="inner" content="⚙" aria-haspopup="true" aria-expanded="false" aria-owns="filtermenu-menu" /> </div> </div> <div id="filter-box" class="uibox contentbox"> - <div class="iframebox"> - <roundcube:object name="filterframe" id="filter-frame" style="width:100%; height:100%" frameborder="0" src="/watermark.html" /> + <div class="iframebox" role="complementary" aria-labelledby="aria-label-filterform"> + <h2 id="aria-label-filterframe" class="voice"><roundcube:label name="managesieve.arialabelfilterform" /></h2> + <roundcube:object name="filterframe" id="filter-frame" style="width:100%; height:100%" frameborder="0" src="/watermark.html" title="managesieve.arialabelfilterform" /> </div> </div> @@ -44,19 +47,21 @@ </div> </div> -<div id="filtersetmenu" class="popupmenu"> - <ul class="toolbarmenu"> - <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> +<div id="filtersetmenu" class="popupmenu" aria-hidden="true"> + <h3 id="aria-label-setactions" class="voice"><roundcube:label name="managesieve.arialabelfiltersetactions" /></h3> + <ul class="toolbarmenu" id="filtersetmenu-menu" role="menu" aria-labelledby="aria-label-setactions"> + <li role="menuitem"><roundcube:button command="plugin.managesieve-setact" label="managesieve.enable" classAct="active" /></li> + <li role="menuitem"><roundcube:button command="plugin.managesieve-setdel" label="delete" classAct="active" /></li> + <li role="menuitem" 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 class="toolbarmenu"> - <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> +<div id="filtermenu" class="popupmenu" aria-hidden="true"> + <h3 id="aria-label-filteractions" class="voice"><roundcube:label name="managesieve.arialabelfilteractions" /></h3> + <ul class="toolbarmenu" id="filtermenu-menu" role="menu" aria-labelledby="aria-label-filteractions"> + <li role="menuitem"><roundcube:button command="plugin.managesieve-act" label="managesieve.enable" classAct="active" /></li> + <li role="menuitem"><roundcube:button command="plugin.managesieve-del" label="delete" classAct="active" /></li> <roundcube:container name="filteroptions" id="filtermenu" /> </ul> </div> diff --git a/plugins/managesieve/skins/larry/templates/vacation.html b/plugins/managesieve/skins/larry/templates/vacation.html index c91eb87c8..26dd2027b 100644 --- a/plugins/managesieve/skins/larry/templates/vacation.html +++ b/plugins/managesieve/skins/larry/templates/vacation.html @@ -10,11 +10,13 @@ <div id="mainscreen" class="offset"> +<h1 class="voice"><roundcube:label name="settings" /> : <roundcube:label name="managesieve.vacation" /></h1> + <roundcube:include file="/includes/settingstabs.html" /> -<div id="managesieve-vacation" class="uibox contentbox"> +<div id="managesieve-vacation" class="uibox contentbox" role="main" aria-labelledby="aria-label-vacationform"> <div> - <h2 class="boxtitle"><roundcube:label name="managesieve.vacation" /></h2> + <h2 class="boxtitle" id="aria-label-vacationform"><roundcube:label name="managesieve.vacation" /></h2> <roundcube:object name="vacationform" id="vacationform" class="propform boxcontent tabbed" /> </div> <div class="footerleft formbuttons"> diff --git a/plugins/newmail_notifier/newmail_notifier.php b/plugins/newmail_notifier/newmail_notifier.php index 20c542f58..efac69116 100644 --- a/plugins/newmail_notifier/newmail_notifier.php +++ b/plugins/newmail_notifier/newmail_notifier.php @@ -52,8 +52,8 @@ class newmail_notifier extends rcube_plugin $this->add_hook('preferences_save', array($this, 'prefs_save')); } else { // if ($this->rc->task == 'mail') { - // add script when not in ajax and not in frame - if ($this->rc->output->type == 'html' && empty($_REQUEST['_framed'])) { + // add script when not in ajax and not in frame and only in main window + if ($this->rc->output->type == 'html' && empty($_REQUEST['_framed']) && $this->rc->action == '') { $this->add_texts('localization/'); $this->rc->output->add_label('newmail_notifier.title', 'newmail_notifier.body'); $this->include_script('newmail_notifier.js'); diff --git a/plugins/zipdownload/zipdownload.js b/plugins/zipdownload/zipdownload.js index 644c1e030..af9136c1d 100644 --- a/plugins/zipdownload/zipdownload.js +++ b/plugins/zipdownload/zipdownload.js @@ -43,21 +43,10 @@ window.rcmail && rcmail.addEventListener('init', function(evt) { link.html('').append(span); } - span.addClass('folder-selector-link').text(rcmail.gettext('zipdownload.download')); - + span.text(rcmail.gettext('zipdownload.download')); rcmail.env.download_link = link; }); - - // hide menu on click out of menu element - var fn = function(e) { - var menu = $('#zipdownload-menu'); - if (e.target != menu.get(0)) - menu.hide(); - }; - $(document.body).on('mouseup', fn); - $('iframe').contents().on('mouseup', fn) - .load(function(e) { try { $(this).contents().on('mouseup', fn); } catch(e) {}; }); -}); + }); function rcmail_zipdownload(mode) @@ -100,14 +89,10 @@ function rcmail_zipdownload(mode) } // display download options menu -function rcmail_zipdownload_menu() +function rcmail_zipdownload_menu(e) { - // fix menu style and display menu - var z_index = rcmail.env.download_link.parents('.popupmenu').css('z-index'), - menu = $('#zipdownload-menu').css({'max-height': 'none', 'z-index': z_index + 1}).show(); - - // position menu on the screen - rcmail.element_position(menu, rcmail.env.download_link); + // show (sub)menu for download selection + rcmail.command('menu-open', 'zipdownload-menu', e && e.target ? e.target : rcmail.env.download_link, e); // abort default download action return false; diff --git a/plugins/zipdownload/zipdownload.php b/plugins/zipdownload/zipdownload.php index 90a314437..edb8188cc 100644 --- a/plugins/zipdownload/zipdownload.php +++ b/plugins/zipdownload/zipdownload.php @@ -96,7 +96,10 @@ class zipdownload extends rcube_plugin $rcmail = rcmail::get_instance(); $menu = array(); - $ul_attr = $rcmail->config->get('skin') == 'classic' ? null : array('class' => 'toolbarmenu'); + $ul_attr = array('role' => 'menu', 'aria-labelledby' => 'aria-label-zipdownloadmenu'); + if ($rcmail->config->get('skin') != 'classic') { + $ul_attr['class'] = 'toolbarmenu'; + } foreach (array('eml', 'mbox', 'maildir') as $type) { $menu[] = html::tag('li', null, $rcmail->output->button(array( @@ -106,7 +109,8 @@ class zipdownload extends rcube_plugin ))); } - $rcmail->output->add_footer(html::div(array('id' => 'zipdownload-menu', 'class' => 'popupmenu'), + $rcmail->output->add_footer(html::div(array('id' => 'zipdownload-menu', 'class' => 'popupmenu', 'aria-hidden' => 'true'), + html::tag('h2', array('class' => 'voice', 'id' => 'aria-label-zipdownloadmenu'), "Message Download Options Menu") . html::tag('ul', $ul_attr, implode('', $menu)))); } |