Fix keyboard navigation and focus/blur behavior in list widgets; register real link element as menu opener

pull/195/head
Thomas Bruederli 10 years ago
parent e75d5e813a
commit f0928eac13

@ -453,9 +453,14 @@ function rcube_webmail()
if (this.gui_objects.identitieslist) { if (this.gui_objects.identitieslist) {
this.identity_list = new rcube_list_widget(this.gui_objects.identitieslist, this.identity_list = new rcube_list_widget(this.gui_objects.identitieslist,
{multiselect:false, draggable:false, keyboard:false}); {multiselect:false, draggable:false, keyboard:true});
this.identity_list this.identity_list
.addEventListener('select', function(o) { ref.identity_select(o); }) .addEventListener('select', function(o) { ref.identity_select(o); })
.addEventListener('keypress', function(o) {
if (o.key_pressed == o.ENTER_KEY) {
ref.identity_select(o);
}
})
.init() .init()
.focus(); .focus();
@ -463,9 +468,10 @@ function rcube_webmail()
this.identity_list.highlight_row(this.env.iid); this.identity_list.highlight_row(this.env.iid);
} }
else if (this.gui_objects.sectionslist) { else if (this.gui_objects.sectionslist) {
this.sections_list = new rcube_list_widget(this.gui_objects.sectionslist, {multiselect:false, draggable:false, keyboard:false}); this.sections_list = new rcube_list_widget(this.gui_objects.sectionslist, {multiselect:false, draggable:false, keyboard:true});
this.sections_list this.sections_list
.addEventListener('select', function(o) { ref.section_select(o); }) .addEventListener('select', function(o) { ref.section_select(o); })
.addEventListener('keypress', function(o) { if (o.key_pressed == o.ENTER_KEY) ref.section_select(o); })
.init() .init()
.focus(); .focus();
} }
@ -473,7 +479,7 @@ function rcube_webmail()
this.init_subscription_list(); this.init_subscription_list();
} }
else if (this.gui_objects.responseslist) { else if (this.gui_objects.responseslist) {
this.responses_list = new rcube_list_widget(this.gui_objects.responseslist, {multiselect:false, draggable:false, keyboard:false}); this.responses_list = new rcube_list_widget(this.gui_objects.responseslist, {multiselect:false, draggable:false, keyboard:true});
this.responses_list this.responses_list
.addEventListener('select', function(list) { .addEventListener('select', function(list) {
var win, id = list.get_single_selection(); var win, id = list.get_single_selection();
@ -1618,9 +1624,13 @@ function rcube_webmail()
if ($(target).closest('.ui-dialog, .ui-widget-overlay').length) if ($(target).closest('.ui-dialog, .ui-widget-overlay').length)
return; return;
list = this.message_list || this.contact_list; // remove focus from list widgets
if (list && !rcube_mouse_is_over(e, list.list.parentNode)) if (window.rcube_list_widget && rcube_list_widget._instances.length) {
list.blur(); $.each(rcube_list_widget._instances, function(i,list){
if (list && !rcube_mouse_is_over(e, list.list.parentNode))
list.blur();
});
}
// reset 'pressed' buttons // reset 'pressed' buttons
if (this.buttons_sel) { if (this.buttons_sel) {
@ -1632,7 +1642,7 @@ function rcube_webmail()
// reset popup menus; delayed to have updated menu_stack data // reset popup menus; delayed to have updated menu_stack data
window.setTimeout(function(e){ window.setTimeout(function(e){
var obj, skip, config, id, i; var obj, skip, config, id, i, parents = $(target).parents();
for (i = ref.menu_stack.length - 1; i >= 0; i--) { for (i = ref.menu_stack.length - 1; i >= 0; i--) {
id = ref.menu_stack[i]; id = ref.menu_stack[i];
obj = $('#' + id); obj = $('#' + id);
@ -1640,6 +1650,7 @@ function rcube_webmail()
if (obj.is(':visible') if (obj.is(':visible')
&& target != obj.data('opener') && target != obj.data('opener')
&& target != obj.get(0) // check if scroll bar was clicked (#1489832) && target != obj.get(0) // check if scroll bar was clicked (#1489832)
&& !parents.is(obj.data('opener'))
&& id != skip && id != skip
&& (obj.attr('data-editable') != 'true' || !$(target).parents('#' + id).length) && (obj.attr('data-editable') != 'true' || !$(target).parents('#' + id).length)
&& (obj.attr('data-sticky') != 'true' || !rcube_mouse_is_over(e, obj.get(0))) && (obj.attr('data-sticky') != 'true' || !rcube_mouse_is_over(e, obj.get(0)))
@ -5917,7 +5928,7 @@ function rcube_webmail()
this.last_sub_rx = RegExp('['+delim+']?[^'+delim+']+$'); this.last_sub_rx = RegExp('['+delim+']?[^'+delim+']+$');
this.subscription_list = new rcube_list_widget(this.gui_objects.subscriptionlist, this.subscription_list = new rcube_list_widget(this.gui_objects.subscriptionlist,
{multiselect:false, draggable:true, keyboard:false, toggleselect:true}); {multiselect:false, draggable:true, keyboard:true, toggleselect:true});
this.subscription_list this.subscription_list
.addEventListener('select', function(o){ ref.subscription_select(o); }) .addEventListener('select', function(o){ ref.subscription_select(o); })
.addEventListener('dragstart', function(o){ ref.drag_active = true; }) .addEventListener('dragstart', function(o){ ref.drag_active = true; })
@ -5926,7 +5937,8 @@ function rcube_webmail()
row.obj.onmouseover = function() { ref.focus_subscription(row.id); }; row.obj.onmouseover = function() { ref.focus_subscription(row.id); };
row.obj.onmouseout = function() { ref.unfocus_subscription(row.id); }; row.obj.onmouseout = function() { ref.unfocus_subscription(row.id); };
}) })
.init(); .init()
.focus();
$('#mailboxroot') $('#mailboxroot')
.mouseover(function(){ ref.focus_subscription(this.id); }) .mouseover(function(){ ref.focus_subscription(this.id); })
@ -6972,6 +6984,10 @@ function rcube_webmail()
align = obj.attr('data-align') || '', align = obj.attr('data-align') || '',
stack = false; stack = false;
// find "real" button element
if (ref.get(0).tagName != 'A' && ref.closest('a').length)
ref = ref.closest('a');
if (typeof prop == 'string') if (typeof prop == 'string')
prop = { menu:name }; prop = { menu:name };

@ -76,6 +76,9 @@ function rcube_list_widget(list, p)
if (p && typeof p === 'object') if (p && typeof p === 'object')
for (var n in p) for (var n in p)
this[n] = p[n]; this[n] = p[n];
// register this instance
rcube_list_widget._instances.push(this);
}; };
@ -1791,3 +1794,6 @@ column_replace: function(from, to)
rcube_list_widget.prototype.addEventListener = rcube_event_engine.prototype.addEventListener; rcube_list_widget.prototype.addEventListener = rcube_event_engine.prototype.addEventListener;
rcube_list_widget.prototype.removeEventListener = rcube_event_engine.prototype.removeEventListener; rcube_list_widget.prototype.removeEventListener = rcube_event_engine.prototype.removeEventListener;
rcube_list_widget.prototype.triggerEvent = rcube_event_engine.prototype.triggerEvent; rcube_list_widget.prototype.triggerEvent = rcube_event_engine.prototype.triggerEvent;
// static
rcube_list_widget._instances = [];

Loading…
Cancel
Save