UNPKG

@sanity/ui

Version:

The Sanity UI components.

106 lines (77 loc) 1.94 kB
import {TreeState} from './types' export function _findPrevItemElement( state: TreeState, itemElements: HTMLElement[], focusedElement: HTMLElement, ): HTMLElement | null { const idx = itemElements.indexOf(focusedElement) const els = itemElements.slice(0, idx) const len = els.length for (let i = len - 1; i >= 0; i -= 1) { const itemKey = els[i].getAttribute('data-tree-key') if (!itemKey) { continue } const segments = itemKey.split('/') segments.pop() const p: string[] = [] let expanded = true for (let j = 0; j < segments.length; j += 1) { p.push(segments[j]) const k = p.join('/') if (!state[k]?.expanded) { expanded = false break } } if (expanded) { return els[i] } } return null } export function _findNextItemElement( state: TreeState, itemElements: HTMLElement[], focusedElement: HTMLElement, ): HTMLElement | null { const idx = itemElements.indexOf(focusedElement) const els = itemElements.slice(idx) const len = itemElements.length for (let i = 1; i < len; i += 1) { if (!els[i]) { continue } const itemKey = els[i].getAttribute('data-tree-key') if (!itemKey) { continue } const segments = itemKey.split('/') segments.pop() const p: string[] = [] let expanded = true for (let j = 0; j < segments.length; j += 1) { p.push(segments[j]) const k = p.join('/') if (!state[k]?.expanded) { expanded = false break } } if (expanded) { return els[i] } } return null } export function _focusItemElement(el: HTMLElement): void { if (el.getAttribute('role') === 'treeitem') { el.focus() } if (el.getAttribute('role') === 'none') { const firstChild = el.firstChild if (firstChild && firstChild instanceof HTMLElement) { firstChild.focus() } } }