MCPcopy Index your code
hub / github.com/adobe/react-spectrum / EditableCellInner

Function EditableCellInner

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

Source from the content-addressed store, hash-verified

1624]);
1625
1626function 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

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