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