From 170e45e03587f983354d20f18184d465216deb0c Mon Sep 17 00:00:00 2001 From: Thomas Bruederli Date: Mon, 12 May 2014 11:29:33 +0200 Subject: Use localized labels for voice-only headings and link texts --- program/localization/en_US/labels.inc | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) (limited to 'program/localization/en_US/labels.inc') diff --git a/program/localization/en_US/labels.inc b/program/localization/en_US/labels.inc index 5bb645d29..3ac7f03aa 100644 --- a/program/localization/en_US/labels.inc +++ b/program/localization/en_US/labels.inc @@ -157,6 +157,10 @@ $labels['more'] = 'More'; $labels['back'] = 'Back'; $labels['options'] = 'Options'; +$labels['first'] = 'First'; +$labels['last'] = 'Last'; +$labels['previous'] = 'Previous'; +$labels['next'] = 'Next'; $labels['select'] = 'Select'; $labels['all'] = 'All'; $labels['none'] = 'None'; @@ -565,4 +569,28 @@ $labels['japanese'] = 'Japanese'; $labels['korean'] = 'Korean'; $labels['chinese'] = 'Chinese'; +// accessibility (voice-only) headings and descriptions +$labels['arialabeltopnav'] = 'Window control'; +$labels['arialabeltasknav'] = 'Application tasks'; +$labels['arialabeltoolbar'] = 'Application toolbar'; +$labels['arialabelmessagessearchfilter'] = 'Email listing filter'; +$labels['arialabelsearchform'] = 'Email message search form'; +$labels['arialabelquicksearchbox'] = 'Email search input'; +$labels['arialabelfolderlist'] = 'Email folder selection'; +$labels['arialabelmessagelist'] = 'Email Messages Listing'; +$labels['arialabelmailpreviewframe'] = 'Message preview'; +$labels['arialabelmailboxmenu'] = 'Folder actions menu'; +$labels['arialabellistselectmenu'] = 'List selection menu'; +$labels['arialabelthreadselectmenu'] = 'Threads listing menu'; +$labels['arialabelmessagelistoptions'] = 'Message list display and sorting options'; +$labels['arialabelmailimportdialog'] = 'Message import dialog'; +$labels['arialabelmessagenav'] = 'Message navigation'; +$labels['arialabelmessagebody'] = 'Message Body'; +$labels['arialabelcontactquicksearch'] = 'Contacts search form'; +$labels['arialabelcontactsearchbox'] = 'Contact search input'; +$labels['arialabelmessageheaders'] = 'Message headers'; +$labels['arialabelcomposeoptions'] = 'Composition options'; +$labels['arialabelresponsesmenu'] = 'Canned responses menu'; +$labels['arialabelattachmentuploadform'] = 'Attachment upload form'; + ?> -- cgit v1.2.3 From d0d7f43ef53d71322a8793ec10f7179f30615127 Mon Sep 17 00:00:00 2001 From: Thomas Bruederli Date: Tue, 27 May 2014 19:22:11 +0200 Subject: More aria-* improvements to toggle buttons and autocompletion lists --- program/js/app.js | 19 ++++++++++--------- program/localization/en_US/labels.inc | 1 + skins/larry/templates/compose.html | 8 ++++---- skins/larry/templates/messagepreview.html | 10 +++++----- skins/larry/ui.js | 14 +++++++------- 5 files changed, 27 insertions(+), 25 deletions(-) (limited to 'program/localization/en_US/labels.inc') diff --git a/program/js/app.js b/program/js/app.js index 658f3c569..41f9a3859 100644 --- a/program/js/app.js +++ b/program/js/app.js @@ -4522,11 +4522,11 @@ function rcube_webmail() this.ksearch_select = function(node) { if (this.ksearch_pane && node) { - this.ksearch_pane.find('li.selected').removeClass('selected'); + this.ksearch_pane.find('li.selected').removeClass('selected').removeAttr('aria-selected'); } if (node) { - $(node).addClass('selected'); + $(node).addClass('selected').removeAttr('aria-selected', 'true'); this.ksearch_selected = node._rcm_id; $(this.ksearch_input).attr('aria-activedecendant', 'rcmkSearchItem' + this.ksearch_selected); } @@ -4659,7 +4659,7 @@ function rcube_webmail() return; // display search results - var i, len, ul, li, text, type, init, + var i, id, len, ul, text, type, init, value = this.ksearch_value, maxlen = this.env.autocomplete_max ? this.env.autocomplete_max : 15; @@ -4697,12 +4697,13 @@ function rcube_webmail() for (i=0; i < len && maxlen > 0; i++) { text = typeof results[i] === 'object' ? results[i].name : results[i]; type = typeof results[i] === 'object' ? results[i].type : ''; - li = document.createElement('LI'); - li._rcm_id = i + this.env.contacts.length; - li.id = 'rcmkSearchItem' + li._rcm_id; - li.innerHTML = this.quote_html(text.replace(new RegExp('('+RegExp.escape(value)+')', 'ig'), '##$1%%')).replace(/##([^%]+)%%/g, '$1'); - if (type) li.className = type; - ul.appendChild(li); + id = i + this.env.contacts.length; + $('
  • ').attr('id', 'rcmkSearchItem' + id) + .attr('role', 'option') + .html(this.quote_html(text.replace(new RegExp('('+RegExp.escape(value)+')', 'ig'), '##$1%%')).replace(/##([^%]+)%%/g, '$1')) + .addClass(type || '') + .appendTo(ul) + .get(0)._rcm_id = id; maxlen -= 1; } } diff --git a/program/localization/en_US/labels.inc b/program/localization/en_US/labels.inc index 3ac7f03aa..23f22a969 100644 --- a/program/localization/en_US/labels.inc +++ b/program/localization/en_US/labels.inc @@ -259,6 +259,7 @@ $labels['upload'] = 'Upload'; $labels['uploadprogress'] = '$percent ($current from $total)'; $labels['close'] = 'Close'; $labels['messageoptions'] = 'Message options...'; +$labels['togglecomposeoptions'] = 'Toggle composition options'; $labels['low'] = 'Low'; $labels['lowest'] = 'Lowest'; diff --git a/skins/larry/templates/compose.html b/skins/larry/templates/compose.html index d51a30f34..87993ed70 100644 --- a/skins/larry/templates/compose.html +++ b/skins/larry/templates/compose.html @@ -77,7 +77,7 @@

    - + @@ -130,7 +130,7 @@
    - +
    @@ -170,8 +170,8 @@
    -
    -

    +
    +

    diff --git a/skins/larry/templates/messagepreview.html b/skins/larry/templates/messagepreview.html index 0acc0d0ad..97efdf3e7 100644 --- a/skins/larry/templates/messagepreview.html +++ b/skins/larry/templates/messagepreview.html @@ -23,17 +23,17 @@   - - - + + +   - +

    :

    - +
    diff --git a/skins/larry/ui.js b/skins/larry/ui.js index 5df2ea194..af801088d 100644 --- a/skins/larry/ui.js +++ b/skins/larry/ui.js @@ -191,10 +191,10 @@ function rcube_mail_ui() } $('#composeoptionstoggle').click(function(e){ - $('#composeoptionstoggle').toggleClass('remove'); - $('#composeoptions').toggle(); + var expanded = $('#composeoptions').toggle().is(':visible'); + $('#composeoptionstoggle').toggleClass('remove').attr('aria-expanded', expanded ? 'true' : 'false'); layout_composeview(); - save_pref('composeoptions', $('#composeoptions').is(':visible') ? '1' : '0'); + save_pref('composeoptions', expanded ? '1' : '0'); if (!rcube_event.is_keyboard(e)) this.blur(); return false; @@ -218,7 +218,7 @@ function rcube_mail_ui() } else if (rcmail.env.action == 'list' || !rcmail.env.action) { var previewframe = $('#mailpreviewframe').is(':visible'); - $('#mailpreviewtoggle').addClass(previewframe ? 'enabled' : 'closed').click(function(e){ toggle_preview_pane(e); return false }); + $('#mailpreviewtoggle').addClass(previewframe ? 'enabled' : 'closed').attr('aria-expanded', previewframe ? 'true' : 'false').click(function(e){ toggle_preview_pane(e); return false }); $('#maillistmode').addClass(rcmail.env.threading ? '' : 'selected').click(function(e){ switch_view_mode('list'); return false }); $('#mailthreadmode').addClass(rcmail.env.threading ? 'selected' : '').click(function(e){ switch_view_mode('thread'); return false }); @@ -593,7 +593,7 @@ function rcube_mail_ui() topstyles, bottomstyles, uid; frame.toggle(); - button.removeClass().addClass(visible ? 'enabled' : 'closed'); + button.removeClass().toggleClass('enabled closed').attr('aria-expanded', visible ? 'true' : 'false'); if (visible) { $('#mailview-top').removeClass('fullheight').css({ bottom:'auto' }); @@ -643,9 +643,9 @@ function rcube_mail_ui() // add toggle button to full headers table if (full.is(':visible')) - button.attr('href', '#hide').removeClass('add').addClass('remove') + button.attr('href', '#hide').removeClass('add').addClass('remove').attr('aria-expanded', 'true'); else - button.attr('href', '#details').removeClass('remove').addClass('add') + button.attr('href', '#details').removeClass('remove').addClass('add').attr('aria-expanded', 'false'); save_pref('previewheaders', full.is(':visible') ? '1' : '0'); } -- cgit v1.2.3 From b4446aa7a9b0722bc68d61ed1e03b7c399122016 Mon Sep 17 00:00:00 2001 From: Thomas Bruederli Date: Wed, 28 May 2014 17:35:08 +0200 Subject: Add message status labels to client --- program/localization/en_US/labels.inc | 4 ++++ program/steps/mail/func.inc | 4 +++- 2 files changed, 7 insertions(+), 1 deletion(-) (limited to 'program/localization/en_US/labels.inc') diff --git a/program/localization/en_US/labels.inc b/program/localization/en_US/labels.inc index 23f22a969..0b5ff8c5a 100644 --- a/program/localization/en_US/labels.inc +++ b/program/localization/en_US/labels.inc @@ -165,12 +165,16 @@ $labels['select'] = 'Select'; $labels['all'] = 'All'; $labels['none'] = 'None'; $labels['currpage'] = 'Current page'; +$labels['isread'] = 'Read'; $labels['unread'] = 'Unread'; $labels['flagged'] = 'Flagged'; +$labels['unflagged'] = 'Not Flagged'; $labels['unanswered'] = 'Unanswered'; $labels['withattachment'] = 'With attachment'; $labels['deleted'] = 'Deleted'; $labels['undeleted'] = 'Not deleted'; +$labels['replied'] = 'Replied'; +$labels['forwarded'] = 'Forwarded'; $labels['invert'] = 'Invert'; $labels['filter'] = 'Filter'; $labels['list'] = 'List'; diff --git a/program/steps/mail/func.inc b/program/steps/mail/func.inc index 811e8782d..cbfb1200b 100644 --- a/program/steps/mail/func.inc +++ b/program/steps/mail/func.inc @@ -142,7 +142,9 @@ if (empty($RCMAIL->action) || $RCMAIL->action == 'list') { if (!$OUTPUT->ajax_call) { $OUTPUT->add_label('checkingmail', 'deletemessage', 'movemessagetotrash', 'movingmessage', 'copyingmessage', 'deletingmessage', 'markingmessage', - 'copy', 'move', 'quota', 'replyall', 'replylist', 'stillsearching'); + 'copy', 'move', 'quota', 'replyall', 'replylist', 'stillsearching', + 'flagged', 'unflagged', 'unread', 'deleted', 'replied', 'forwarded', + 'priority', 'withattachment'); } $pagetitle = $RCMAIL->localize_foldername($mbox_name, true); -- cgit v1.2.3 From d58c39126f6e1754e29b6f3bbc01f0f6a3ea2581 Mon Sep 17 00:00:00 2001 From: Thomas Bruederli Date: Mon, 2 Jun 2014 16:35:12 +0200 Subject: Some more improvemements on content structure, text representation and keyboard navigation within the mail view --- program/include/rcmail.php | 2 +- program/include/rcmail_output_html.php | 4 ++-- program/js/app.js | 35 ++++++++++++++++++++++++------- program/js/list.js | 3 +-- program/localization/en_US/labels.inc | 3 +++ program/steps/mail/list_contacts.inc | 2 +- program/steps/mail/search_contacts.inc | 2 +- skins/classic/mail.css | 1 + skins/larry/styles.css | 6 ++++++ skins/larry/templates/compose.html | 10 ++++----- skins/larry/templates/mail.html | 1 + skins/larry/templates/messagepart.html | 4 ++-- skins/larry/templates/messagepreview.html | 4 ++-- 13 files changed, 54 insertions(+), 23 deletions(-) (limited to 'program/localization/en_US/labels.inc') diff --git a/program/include/rcmail.php b/program/include/rcmail.php index cc70739cf..8e66e85e7 100644 --- a/program/include/rcmail.php +++ b/program/include/rcmail.php @@ -1501,7 +1501,7 @@ class rcmail extends rcube $html_name = $this->Q($foldername) . ($unread ? html::span('unreadcount', sprintf($attrib['unreadwrap'], $unread)) : ''); $link_attrib = $folder['virtual'] ? array() : array( 'href' => $this->url(array('_mbox' => $folder['id'])), - 'onclick' => sprintf("return %s.command('list','%s',this)", rcmail_output::JS_OBJECT_NAME, $js_name), + 'onclick' => sprintf("return %s.command('list','%s',this,event)", rcmail_output::JS_OBJECT_NAME, $js_name), 'rel' => $folder['id'], 'title' => $title, ); diff --git a/program/include/rcmail_output_html.php b/program/include/rcmail_output_html.php index 1fa0376fb..e8b5c9828 100644 --- a/program/include/rcmail_output_html.php +++ b/program/include/rcmail_output_html.php @@ -859,10 +859,10 @@ EOF; } // localize title and summary attributes - if (!empty($attrib['title']) && $this->app->text_exists($attrib['title'])) { + if ($command != 'button' && !empty($attrib['title']) && $this->app->text_exists($attrib['title'])) { $attrib['title'] = $this->app->gettext($attrib['title']); } - if (!empty($attrib['summary']) && $this->app->text_exists($attrib['summary'])) { + if ($command != 'button' && !empty($attrib['summary']) && $this->app->text_exists($attrib['summary'])) { $attrib['summary'] = $this->app->gettext($attrib['summary']); } diff --git a/program/js/app.js b/program/js/app.js index bf163c614..e7f9d02b6 100644 --- a/program/js/app.js +++ b/program/js/app.js @@ -342,7 +342,16 @@ function rcube_webmail() .addEventListener('initrow', function(o) { ref.triggerEvent('insertrow', { cid:o.uid, row:o }); }) .addEventListener('select', function(o) { ref.compose_recipient_select(o); }) .addEventListener('dblclick', function(o) { ref.compose_add_recipient('to'); }) - .addEventListener('keypress', function(o) { if (o.key_pressed == o.ENTER_KEY) ref.compose_add_recipient('to'); }) + .addEventListener('keypress', function(o) { + if (o.key_pressed == o.ENTER_KEY) { + if (!ref.compose_add_recipient('to')) { + // execute link action on if not a recipient entry + if (o.last_selected && String(o.last_selected).charAt(0) == 'G') { + $(o.rows[o.last_selected].obj).find('a').first().click(); + } + } + } + }) .init(); } @@ -602,7 +611,7 @@ function rcube_webmail() { var ret, uid, cid, url, flag, aborted = false; - if (obj && obj.blur) + if (obj && obj.blur && !(event || rcube_event.is_keyboard(event))) obj.blur(); // do nothing if interface is locked by other command (with exception for searching reset) @@ -1647,9 +1656,12 @@ function rcube_webmail() { // Helper method to move focus to the next/prev active menu item var focus_menu_item = function(dir) { - var obj, mod = dir < 0 ? 'prevAll' : 'nextAll', limit = dir < 0 ? 'last' : 'first'; + var obj, item, mod = dir < 0 ? 'prevAll' : 'nextAll', limit = dir < 0 ? 'last' : 'first'; if (ref.focused_menu && (obj = $('#'+ref.focused_menu))) { - return obj.find(':focus').closest('li')[mod](':has(:not([aria-disabled=true]))').find('a,input')[limit]().focus().length; + item = obj.find(':focus').closest('li')[mod](':has(:not([aria-disabled=true]))').find('a,input')[limit](); + if (!item.length) + item = obj.find(':focus').closest('ul')[mod](':has(:not([aria-disabled=true]))').find('a,input')[limit](); + return item.focus().length; } return 0; @@ -2402,7 +2414,6 @@ function rcube_webmail() this.clear_message_list = function() { this.env.messages = {}; - this.last_selected = 0; this.show_contentframe(false); if (this.message_list) @@ -3490,6 +3501,8 @@ function rcube_webmail() input.val(oldval + recipients.join(delim + ' ') + delim + ' '); this.triggerEvent('add-recipient', { field:field, recipients:recipients }); } + + return recipients.length; }; // checks the input fields before sending a message @@ -7405,7 +7418,8 @@ function rcube_webmail() this.enable_command('set-listmode', this.env.threads && !is_multifolder); if ((response.action == 'list' || response.action == 'search') && this.message_list) { - this.message_list.focus(); + if (this.message_list.rowcount > 0) + this.message_list.focus(); this.msglist_select(this.message_list); this.triggerEvent('listupdate', { folder:this.env.mailbox, rowcount:this.message_list.rowcount }); } @@ -7417,11 +7431,18 @@ function rcube_webmail() this.enable_command('search-create', this.env.source == ''); this.enable_command('search-delete', this.env.search_id); this.update_group_commands(); - this.contact_list.focus(); + if (this.contact_list.rowcount > 0) + this.contact_list.focus(); this.triggerEvent('listupdate', { folder:this.env.source, rowcount:this.contact_list.rowcount }); } } break; + + case 'list-contacts': + case 'search-contacts': + if (this.contact_list && this.contact_list.rowcount > 0) + this.contact_list.focus(); + break; } if (response.unlock) diff --git a/program/js/list.js b/program/js/list.js index 0bf5d568b..65d4a9260 100644 --- a/program/js/list.js +++ b/program/js/list.js @@ -274,11 +274,10 @@ clear: function(sel) this.rows = {}; this.rowcount = 0; + this.last_selected = 0; if (sel) this.clear_selection(); - else - this.last_selected = 0; // reset scroll position (in Opera) if (this.frame) diff --git a/program/localization/en_US/labels.inc b/program/localization/en_US/labels.inc index 0b5ff8c5a..874f19be2 100644 --- a/program/localization/en_US/labels.inc +++ b/program/localization/en_US/labels.inc @@ -591,11 +591,14 @@ $labels['arialabelmessagelistoptions'] = 'Message list display and sorting optio $labels['arialabelmailimportdialog'] = 'Message import dialog'; $labels['arialabelmessagenav'] = 'Message navigation'; $labels['arialabelmessagebody'] = 'Message Body'; +$labels['arialabelmessageactions'] = 'Message actions'; $labels['arialabelcontactquicksearch'] = 'Contacts search form'; $labels['arialabelcontactsearchbox'] = 'Contact search input'; $labels['arialabelmessageheaders'] = 'Message headers'; $labels['arialabelcomposeoptions'] = 'Composition options'; $labels['arialabelresponsesmenu'] = 'Canned responses menu'; $labels['arialabelattachmentuploadform'] = 'Attachment upload form'; +$labels['arialabelattachmentpreview'] = 'Attachment preview'; +$labels['ariasummarycomposecontacts'] = 'List of contacts and groups to select as recipients'; ?> diff --git a/program/steps/mail/list_contacts.inc b/program/steps/mail/list_contacts.inc index 0ee81135b..4f17beffd 100644 --- a/program/steps/mail/list_contacts.inc +++ b/program/steps/mail/list_contacts.inc @@ -110,7 +110,7 @@ else if (!empty($result) && $result->count > 0) { $keyname = $row['_type'] == 'group' ? 'contactgroup' : 'contact'; $OUTPUT->command('add_contact_row', $row_id, array( - $keyname => html::span(array('title' => $email), rcube::Q($name ? $name : $email) . + $keyname => html::a(array('title' => $email), rcube::Q($name ? $name : $email) . ($name && count($emails) > 1 ? ' ' . html::span('email', rcube::Q($email)) : '') )), $classname); } diff --git a/program/steps/mail/search_contacts.inc b/program/steps/mail/search_contacts.inc index d56581695..ccef32dd2 100644 --- a/program/steps/mail/search_contacts.inc +++ b/program/steps/mail/search_contacts.inc @@ -87,7 +87,7 @@ if (!empty($result) && $result->count > 0) { $row_id = $row['ID'].'-'.$i; $jsresult[$row_id] = format_email_recipient($email, $name); $OUTPUT->command('add_contact_row', $row_id, array( - 'contact' => html::span(array('title' => $email), rcube::Q($name ? $name : $email) . + 'contact' => html::a(array('title' => $email), rcube::Q($name ? $name : $email) . ($name && count($emails) > 1 ? ' ' . html::span('email', rcube::Q($email)) : '') )), 'person'); } diff --git a/skins/classic/mail.css b/skins/classic/mail.css index 0a4653a3a..3310ac54f 100644 --- a/skins/classic/mail.css +++ b/skins/classic/mail.css @@ -780,6 +780,7 @@ table.messagelist.fixedcopy -o-text-overflow: ellipsis; border-bottom: 1px solid #EBEBEB; cursor: default; + outline: none; } .messagelist tbody tr td a diff --git a/skins/larry/styles.css b/skins/larry/styles.css index d7ad74c01..add47324d 100644 --- a/skins/larry/styles.css +++ b/skins/larry/styles.css @@ -1187,6 +1187,12 @@ a.iconlink.upload { outline: none; } +.listing tbody td a { + color: #376572; + text-shadow: 0px 1px 1px #fff; + text-decoration: none; +} + .webkit .listing tbody td { height: 14px; } diff --git a/skins/larry/templates/compose.html b/skins/larry/templates/compose.html index 87993ed70..c643b36f5 100644 --- a/skins/larry/templates/compose.html +++ b/skins/larry/templates/compose.html @@ -52,7 +52,7 @@ - +
    @@ -93,25 +93,25 @@
    diff --git a/skins/larry/templates/mail.html b/skins/larry/templates/mail.html index 92b01e019..cf8ff2f7d 100644 --- a/skins/larry/templates/mail.html +++ b/skins/larry/templates/mail.html @@ -75,6 +75,7 @@ diff --git a/skins/larry/templates/messagepart.html b/skins/larry/templates/messagepart.html index 2df9c7b77..edf275f6e 100644 --- a/skins/larry/templates/messagepart.html +++ b/skins/larry/templates/messagepart.html @@ -29,9 +29,9 @@
    -

    Attachment preview

    +

    - +
    diff --git a/skins/larry/templates/messagepreview.html b/skins/larry/templates/messagepreview.html index 97efdf3e7..82ecd7a43 100644 --- a/skins/larry/templates/messagepreview.html +++ b/skins/larry/templates/messagepreview.html @@ -10,7 +10,7 @@
    -

    Message Body

    +

    -- cgit v1.2.3 From 458af8d30a1bca153f770358b8f914554b0da6c3 Mon Sep 17 00:00:00 2001 From: Thomas Bruederli Date: Tue, 3 Jun 2014 14:11:13 +0200 Subject: Apply accessibility improvements to the address book task --- program/js/app.js | 1 + program/localization/en_US/labels.inc | 19 +++++- program/steps/addressbook/func.inc | 8 +-- skins/larry/addressbook.css | 4 +- skins/larry/includes/mailtoolbar.html | 8 +-- skins/larry/templates/addressbook.html | 120 +++++++++++++++++++-------------- skins/larry/templates/compose.html | 4 +- skins/larry/templates/mail.html | 24 ++++--- 8 files changed, 116 insertions(+), 72 deletions(-) (limited to 'program/localization/en_US/labels.inc') diff --git a/program/js/app.js b/program/js/app.js index e7f9d02b6..9398c6a21 100644 --- a/program/js/app.js +++ b/program/js/app.js @@ -5014,6 +5014,7 @@ function rcube_webmail() // add link to pop back to parent group if (this.env.address_group_stack.length > 1) { $('...') + .attr('title', this.gettext('uponelevel')) .addClass('poplink') .appendTo(boxtitle) .click(function(e){ return ref.command('popgroup','',this); }); diff --git a/program/localization/en_US/labels.inc b/program/localization/en_US/labels.inc index 874f19be2..2b44ac188 100644 --- a/program/localization/en_US/labels.inc +++ b/program/localization/en_US/labels.inc @@ -377,6 +377,7 @@ $labels['newcontactgroup'] = 'Create new contact group'; $labels['grouprename'] = 'Rename group'; $labels['groupdelete'] = 'Delete group'; $labels['groupremoveselected'] = 'Remove selected contacts from group'; +$labels['uponelevel'] = 'Up one level'; $labels['previouspage'] = 'Show previous page'; $labels['firstpage'] = 'Show first page'; @@ -579,8 +580,10 @@ $labels['arialabeltopnav'] = 'Window control'; $labels['arialabeltasknav'] = 'Application tasks'; $labels['arialabeltoolbar'] = 'Application toolbar'; $labels['arialabelmessagessearchfilter'] = 'Email listing filter'; -$labels['arialabelsearchform'] = 'Email message search form'; -$labels['arialabelquicksearchbox'] = 'Email search input'; +$labels['arialabelmailsearchform'] = 'Email message search form'; +$labels['arialabelcontactsearchform'] = 'Contacts search form'; +$labels['arialabelmailquicksearchbox'] = 'Email search input'; +$labels['arialabelquicksearchbox'] = 'Search input'; $labels['arialabelfolderlist'] = 'Email folder selection'; $labels['arialabelmessagelist'] = 'Email Messages Listing'; $labels['arialabelmailpreviewframe'] = 'Message preview'; @@ -600,5 +603,17 @@ $labels['arialabelresponsesmenu'] = 'Canned responses menu'; $labels['arialabelattachmentuploadform'] = 'Attachment upload form'; $labels['arialabelattachmentpreview'] = 'Attachment preview'; $labels['ariasummarycomposecontacts'] = 'List of contacts and groups to select as recipients'; +$labels['arialabelcontactexportoptions'] = 'Contact export options'; +$labels['arialabelabookgroupoptions'] = 'Addressbook/group options'; + +$labels['helplistnavigation'] = 'List keyboard navigation'; +$labels['helplistkeyboardnavigation'] = "Arrows up/down: Move row focus/selection. +Space: Select focused row. +Shift + up/down: Select additional row above/below. +Ctrl + Space: Add focused row to selection/remove from selection."; +$labels['helplistkeyboardnavmessages'] = "Arrows right/left: expand/collapse message thread (in threads mode only). +Enter: Open the selected/focused message. +Delete: Move selected messages to Trash."; +$labels['helplistkeyboardnavcontacts'] = "Enter: Open the selected/focused contact."; ?> diff --git a/program/steps/addressbook/func.inc b/program/steps/addressbook/func.inc index be0dd2a33..e68a694ef 100644 --- a/program/steps/addressbook/func.inc +++ b/program/steps/addressbook/func.inc @@ -395,7 +395,7 @@ function rcmail_js_contacts_list($result, $prefix='') ), '»'); } else - $val = ' '; + $val = ''; break; default: @@ -422,7 +422,7 @@ function rcmail_contacts_list_title($attrib) unset($attrib['name']); $OUTPUT->add_gui_object('addresslist_title', $attrib['id']); - $OUTPUT->add_label('contacts'); + $OUTPUT->add_label('contacts','uponelevel'); return html::tag($attrib['tag'], $attrib, $RCMAIL->gettext($attrib['label']), html::$common_attrib); } @@ -518,7 +518,7 @@ function rcmail_contact_form($form, $record, $attrib = null) foreach ($coltypes as $col => $prop) { if ($prop['subtypes']) { $subtype_names = array_map('rcmail_get_type_label', $prop['subtypes']); - $select_subtype = new html_select(array('name' => '_subtype_'.$col.'[]', 'class' => 'contactselectsubtype')); + $select_subtype = new html_select(array('name' => '_subtype_'.$col.'[]', 'class' => 'contactselectsubtype', 'title' => $prop['label'] . ' ' . $RCMAIL->gettext('type'))); $select_subtype->add($subtype_names, $prop['subtypes']); $coltypes[$col]['subtypes_select'] = $select_subtype->show(); } @@ -607,7 +607,7 @@ function rcmail_contact_form($form, $record, $attrib = null) // prepare subtype selector in edit mode if ($edit_mode && is_array($colprop['subtypes'])) { $subtype_names = array_map('rcmail_get_type_label', $colprop['subtypes']); - $select_subtype = new html_select(array('name' => '_subtype_'.$col.'[]', 'class' => 'contactselectsubtype')); + $select_subtype = new html_select(array('name' => '_subtype_'.$col.'[]', 'class' => 'contactselectsubtype', 'title' => $colprop['label'] . ' ' . $RCMAIL->gettext('type'))); $select_subtype->add($subtype_names, $colprop['subtypes']); } else diff --git a/skins/larry/addressbook.css b/skins/larry/addressbook.css index 8350d0a59..e590831a1 100644 --- a/skins/larry/addressbook.css +++ b/skins/larry/addressbook.css @@ -142,7 +142,7 @@ background-position: 6px -1603px; } -#contacts-table .contact.focused td.name { +#contacts-table.focus .contact.focused td.name { background-position: 4px -1603px; } @@ -159,7 +159,7 @@ background-position: 6px -1555px; } -#contacts-table .group.focused td.name { +#contacts-table.focus .group.focused td.name { background-position: 4px -1555px; } diff --git a/skins/larry/includes/mailtoolbar.html b/skins/larry/includes/mailtoolbar.html index a70cc023a..691345bb4 100644 --- a/skins/larry/includes/mailtoolbar.html +++ b/skins/larry/includes/mailtoolbar.html @@ -3,11 +3,11 @@ - + - + @@ -15,8 +15,8 @@ -
    - x +
    - x +
    - x +
    - x +