outlookemailmicrosoft-teamsdiscordmessengercustom-servicesmacoslinuxwindowsinboxwhatsappicloudtweetdeckhipchattelegramhangoutsslackgmailskypefacebook-workplace
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
129 lines
3.2 KiB
129 lines
3.2 KiB
/** */ |
|
Ext.define('Ext.aria.view.View', { |
|
override: 'Ext.view.View', |
|
|
|
initComponent: function() { |
|
var me = this, |
|
selModel; |
|
|
|
me.callParent(); |
|
|
|
selModel = me.getSelectionModel(); |
|
|
|
selModel.on({ |
|
scope: me, |
|
select: me.ariaSelect, |
|
deselect: me.ariaDeselect |
|
}); |
|
|
|
me.on({ |
|
scope: me, |
|
refresh: me.ariaInitViewItems, |
|
itemadd: me.ariaItemAdd, |
|
itemremove: me.ariaItemRemove |
|
}); |
|
}, |
|
|
|
ariaGetRenderAttributes: function() { |
|
var me = this, |
|
attrs, mode; |
|
|
|
attrs = me.callParent(); |
|
mode = me.getSelectionModel().getSelectionMode(); |
|
|
|
if (mode !== 'SINGLE') { |
|
attrs['aria-multiselectable'] = true; |
|
} |
|
|
|
if (me.title) { |
|
attrs['aria-label'] = me.title; |
|
} |
|
|
|
return attrs; |
|
}, |
|
|
|
// For Views, we have to apply ARIA attributes to the list items |
|
// post factum, because we have no control over the template |
|
// that is used to create the items. |
|
ariaInitViewItems: function() { |
|
var me = this, |
|
updateSize = me.pageSize || me.store.buffered, |
|
pos = me.store.requestStart + 1, |
|
nodes, node, size, i, len; |
|
|
|
nodes = me.getNodes(); |
|
size = me.store.getTotalCount(); |
|
|
|
for (i = 0, len = nodes.length; i < len; i++) { |
|
node = nodes[i]; |
|
|
|
if (!node.id) { |
|
node.setAttribute('id', Ext.id()); |
|
} |
|
|
|
node.setAttribute('role', me.itemAriaRole); |
|
node.setAttribute('aria-selected', false); |
|
|
|
if (updateSize) { |
|
node.setAttribute('aria-setsize', size); |
|
node.setAttribute('aria-posinset', pos + i); |
|
} |
|
} |
|
}, |
|
|
|
ariaSelect: function(selModel, record) { |
|
var me = this, |
|
node; |
|
|
|
node = me.getNode(record); |
|
|
|
if (node) { |
|
node.setAttribute('aria-selected', true); |
|
|
|
me.ariaUpdate({ 'aria-activedescendant': node.id }); |
|
} |
|
}, |
|
|
|
ariaDeselect: function(selModel, record) { |
|
var me = this, |
|
node; |
|
|
|
node = me.getNode(record); |
|
|
|
if (node) { |
|
node.removeAttribute('aria-selected'); |
|
|
|
me.ariaUpdate({ 'aria-activedescendant': undefined }); |
|
} |
|
}, |
|
|
|
ariaItemRemove: function(records, index, nodes) { |
|
if (!nodes) { |
|
return; |
|
} |
|
|
|
var me = this, |
|
ariaSelected, i, len; |
|
|
|
ariaSelected = me.el.getAttribute('aria-activedescendant'); |
|
|
|
for (i = 0, len = nodes.length; i < len; i++) { |
|
if (ariaSelected === nodes[i].id) { |
|
me.ariaUpdate({ 'aria-activedescendant': undefined }); |
|
|
|
break; |
|
} |
|
} |
|
}, |
|
|
|
ariaItemAdd: function(records, index, nodes) { |
|
this.ariaInitViewItems(records, index, nodes); |
|
}, |
|
|
|
setTitle: function(title) { |
|
var me = this; |
|
|
|
me.title = title; |
|
me.ariaUpdate({ 'aria-label': title }); |
|
} |
|
});
|
|
|