summaryrefslogtreecommitdiff
path: root/plugins
diff options
context:
space:
mode:
Diffstat (limited to 'plugins')
-rw-r--r--plugins/acl/acl.js52
-rw-r--r--plugins/acl/acl.php4
-rw-r--r--plugins/acl/localization/en_US.inc5
-rw-r--r--plugins/acl/skins/larry/acl.css17
-rw-r--r--plugins/acl/skins/larry/templates/table.html21
-rw-r--r--plugins/emoticons/emoticons.php4
-rw-r--r--plugins/legacy_browser/skins/larry/ie7hacks.css1
-rw-r--r--plugins/managesieve/Changelog1
-rw-r--r--plugins/managesieve/lib/Roundcube/rcube_sieve_vacation.php20
-rw-r--r--plugins/managesieve/localization/en_US.inc5
-rw-r--r--plugins/managesieve/managesieve.js49
-rw-r--r--plugins/managesieve/skins/classic/templates/vacation.html2
-rw-r--r--plugins/managesieve/skins/larry/managesieve.css9
-rw-r--r--plugins/managesieve/skins/larry/templates/managesieve.html45
-rw-r--r--plugins/managesieve/skins/larry/templates/vacation.html6
-rw-r--r--plugins/newmail_notifier/newmail_notifier.php4
-rw-r--r--plugins/zipdownload/zipdownload.js25
-rw-r--r--plugins/zipdownload/zipdownload.php8
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">&nbsp;</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="&#9881;" />
+ <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="&#9881;" 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="&#9881;" />
+ <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="&#9881;" 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="&#9881;" />
+ <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="&#9881;" 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))));
}