Форк Rambox
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

/** */
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 });
}
});