MCPcopy Create free account
hub / github.com/adobe/react-spectrum / EditableCellInner

Function EditableCellInner

packages/@react-spectrum/s2/src/TableView.tsx:1635–1866  ·  view source on GitHub ↗
(
  props: EditableCellProps & {isFocusVisible: boolean; cellRef: RefObject<HTMLDivElement>}
)

Source from the content-addressed store, hash-verified

1633]);
1634
1635function 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

Callers

nothing calls this directly

Calls 13

getActiveElementFunction · 0.90
getOwnerDocumentFunction · 0.90
nodeContainsFunction · 0.90
useMediaQueryFunction · 0.90
isFocusWithinFunction · 0.90
UNSAFE_getDOMNodeMethod · 0.80
addEventListenerMethod · 0.80
removeEventListenerMethod · 0.80
hasMethod · 0.65
selectMethod · 0.65
onSubmitFunction · 0.50

Tested by

no test coverage detected