47 lines
1.9 KiB
JavaScript
47 lines
1.9 KiB
JavaScript
/**
|
|
* Validate that the proper roles are used for the given combination of roles and states.
|
|
* If the roles are invalid and we're not running in production mode, an warning will be logged to the console.
|
|
*
|
|
* @param role - the role of the list
|
|
* @param listItemRole - the role of the list item
|
|
* @param hasSelection - whether the list has selection enabled
|
|
* @param hasFocusableChildren - whether the list has focusable children
|
|
* @returns
|
|
*/ "use strict";
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
Object.defineProperty(exports, "validateProperRolesAreUsed", {
|
|
enumerable: true,
|
|
get: function() {
|
|
return validateProperRolesAreUsed;
|
|
}
|
|
});
|
|
const validateProperRolesAreUsed = (role, listItemRole, hasSelection, hasFocusableChildren)=>{
|
|
// Explode when the pair of roles is invalid
|
|
if (role === 'list' && listItemRole !== 'listitem') {
|
|
throw new Error('When the List role is "list", ListItem role must be "listitem".');
|
|
}
|
|
if (role === 'listbox' && listItemRole !== 'option') {
|
|
throw new Error('When the List role is "listbox", ListItem role must be "option".');
|
|
}
|
|
if (role === 'grid' && listItemRole !== 'row') {
|
|
throw new Error('When the List role is "grid", ListItem role must be "row".');
|
|
}
|
|
const expectedRole = (()=>{
|
|
if (hasFocusableChildren) {
|
|
return 'grid';
|
|
} else {
|
|
if (hasSelection) {
|
|
return 'listbox';
|
|
} else {
|
|
return 'list';
|
|
}
|
|
}
|
|
})();
|
|
if (role !== expectedRole) {
|
|
/* eslint-disable-next-line no-console */ console.warn(`@fluentui/react-list [useList]:\nThe role "${role}" does not match the expected role "${expectedRole}".\nPlease use the "navigationMode" property for automatic role assignment and keyboard navigation.\nIf you are using this role intentionally, make sure to verify screen reader support.
|
|
`);
|
|
}
|
|
};
|