@workday/canvas-kit-react
Version:
The parent module that contains all Workday Canvas Kit React components
37 lines (32 loc) • 1.25 kB
text/typescript
/**
* Programmatically change focus in a way that causes a focus ring around the new element.
* @param element Element that should be focused
*/
export const changeFocus = (element: unknown) => {
// Normally the browser will ignore calls to `focus` on an element that already has focus, but we
// don't want to accidentally show the focus ring in this case, so we'll detect and bail early.
// We'll also bail if there is no element
if (document.activeElement === element || !element) {
return;
}
if (hasCallableProperty(element, 'focus')) {
// Dispatch an unidentified keyboard event for an input provider prior to a focus change so that
// the ring will appear.
if (typeof KeyboardEvent === 'function' && hasCallableProperty(element, 'dispatchEvent')) {
const event = new KeyboardEvent('keydown', {bubbles: true, key: 'Unidentified'});
element.dispatchEvent(event);
}
element.focus();
}
};
type Callable<K extends string> = {
[P in K]: Function;
};
function hasCallableProperty<K extends string>(input: unknown, method: K): input is Callable<K> {
return (
!!input &&
typeof input === 'object' &&
method in input! &&
typeof (input as any)[method] === 'function'
);
}