(
props: EditableCellProps & {isFocusVisible: boolean; cellRef: RefObject<HTMLDivElement>}
)
| 1633 | ]); |
| 1634 | |
| 1635 | function EditableCellInner( |
| 1636 | props: EditableCellProps & {isFocusVisible: boolean; cellRef: RefObject<HTMLDivElement>} |
| 1637 | ) { |
| 1638 | let { |
| 1639 | children, |
| 1640 | align, |
| 1641 | renderEditing, |
| 1642 | isSaving, |
| 1643 | onSubmit, |
| 1644 | isFocusVisible, |
| 1645 | cellRef, |
| 1646 | action, |
| 1647 | onCancel |
| 1648 | } = props; |
| 1649 | let [isOpen, setIsOpen] = useState(false); |
| 1650 | let popoverRef = useRef<HTMLDivElement>(null); |
| 1651 | let formRef = useRef<HTMLFormElement>(null); |
| 1652 | let [triggerWidth, setTriggerWidth] = useState(0); |
| 1653 | let [tableWidth, setTableWidth] = useState(0); |
| 1654 | let [verticalOffset, setVerticalOffset] = useState(0); |
| 1655 | let tableVisualOptions = useContext(InternalTableContext); |
| 1656 | let stringFormatter = useLocalizedStringFormatter(intlMessages, '@react-spectrum/s2'); |
| 1657 | let dialogRef = useRef<DOMRefValue<HTMLElement>>(null); |
| 1658 | |
| 1659 | let {density, keyboardNavigationBehavior} = useContext(InternalTableContext); |
| 1660 | let size: 'XS' | 'S' | 'M' | 'L' | 'XL' | undefined = 'M'; |
| 1661 | if (density === 'compact') { |
| 1662 | size = 'S'; |
| 1663 | } else if (density === 'spacious') { |
| 1664 | size = 'L'; |
| 1665 | } |
| 1666 | |
| 1667 | // Popover positioning |
| 1668 | useLayoutEffect(() => { |
| 1669 | if (!isOpen) { |
| 1670 | return; |
| 1671 | } |
| 1672 | let width = cellRef.current?.clientWidth || 0; |
| 1673 | let cell = cellRef.current; |
| 1674 | let boundingRect = cell?.parentElement?.getBoundingClientRect(); |
| 1675 | let verticalOffset = (boundingRect?.top ?? 0) - (boundingRect?.bottom ?? 0); |
| 1676 | |
| 1677 | let tableWidth = cellRef.current?.closest('[role="grid"],[role="treegrid"]')?.clientWidth || 0; |
| 1678 | setTriggerWidth(width); |
| 1679 | setVerticalOffset(verticalOffset); |
| 1680 | setTableWidth(tableWidth); |
| 1681 | }, [cellRef, density, isOpen]); |
| 1682 | |
| 1683 | // Auto select the entire text range of the autofocused input on overlay opening |
| 1684 | // Maybe replace with FocusScope or one of those utilities |
| 1685 | useEffect(() => { |
| 1686 | if (isOpen) { |
| 1687 | let activeElement = getActiveElement(getOwnerDocument(formRef.current)); |
| 1688 | if ( |
| 1689 | activeElement && |
| 1690 | nodeContains(formRef.current, activeElement) && |
| 1691 | // not going to handle contenteditable https://stackoverflow.com/questions/6139107/programmatically-select-text-in-a-contenteditable-html-element |
| 1692 | // seems like an edge case anyways |
nothing calls this directly
no test coverage detected