[DevTools] Make a non-editable name of KeyValue clickable (#34095)

This has been bothering me. You can click the arrow and the value to
expand/collapse a KeyValue row but not the name.

When the name is not editable it should be clickable. Such as when
inspecting a Promise value.
This commit is contained in:
Sebastian Markbåge 2025-08-04 09:27:37 -04:00 committed by GitHub
parent 041754697c
commit 8e3db095aa
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -210,6 +210,13 @@ export default function KeyValue({
canRenameTheCurrentPath = canRenamePathsAtDepth(depth); canRenameTheCurrentPath = canRenamePathsAtDepth(depth);
} }
const hasChildren =
typeof value === 'object' &&
value !== null &&
(canEditValues ||
(isArray(value) && value.length > 0) ||
Object.entries(value).length > 0);
let renderedName; let renderedName;
if (isDirectChildOfAnArray) { if (isDirectChildOfAnArray) {
if (canDeletePaths) { if (canDeletePaths) {
@ -218,14 +225,18 @@ export default function KeyValue({
); );
} else { } else {
renderedName = ( renderedName = (
<span className={styles.Name}> <span
className={styles.Name}
onClick={isInspectable || hasChildren ? toggleIsOpen : null}>
{name} {name}
{!!hookName && <span className={styles.HookName}>({hookName})</span>} {!!hookName && <span className={styles.HookName}>({hookName})</span>}
<span className={styles.AfterName}>:</span>
</span> </span>
); );
} }
} else if (canRenameTheCurrentPath) { } else if (canRenameTheCurrentPath) {
renderedName = ( renderedName = (
<>
<EditableName <EditableName
allowEmpty={canDeletePaths} allowEmpty={canDeletePaths}
className={styles.EditableName} className={styles.EditableName}
@ -233,12 +244,18 @@ export default function KeyValue({
overrideName={renamePath} overrideName={renamePath}
path={path} path={path}
/> />
<span className={styles.AfterName}>:</span>
</>
); );
} else { } else {
renderedName = ( renderedName = (
<span className={styles.Name} data-testname="NonEditableName"> <span
className={styles.Name}
data-testname="NonEditableName"
onClick={isInspectable || hasChildren ? toggleIsOpen : null}>
{name} {name}
{!!hookName && <span className={styles.HookName}>({hookName})</span>} {!!hookName && <span className={styles.HookName}>({hookName})</span>}
<span className={styles.AfterName}>:</span>
</span> </span>
); );
} }
@ -286,7 +303,6 @@ export default function KeyValue({
style={style}> style={style}>
<div className={styles.ExpandCollapseToggleSpacer} /> <div className={styles.ExpandCollapseToggleSpacer} />
{renderedName} {renderedName}
<div className={styles.AfterName}>:</div>
{canEditValues ? ( {canEditValues ? (
<EditableValue <EditableValue
overrideValue={overrideValue} overrideValue={overrideValue}
@ -328,7 +344,6 @@ export default function KeyValue({
style={style}> style={style}>
<div className={styles.ExpandCollapseToggleSpacer} /> <div className={styles.ExpandCollapseToggleSpacer} />
{renderedName} {renderedName}
<div className={styles.AfterName}>:</div>
<span <span
className={styles.Link} className={styles.Link}
onClick={() => { onClick={() => {
@ -365,7 +380,6 @@ export default function KeyValue({
<div className={styles.ExpandCollapseToggleSpacer} /> <div className={styles.ExpandCollapseToggleSpacer} />
)} )}
{renderedName} {renderedName}
<div className={styles.AfterName}>:</div>
<span <span
className={styles.Value} className={styles.Value}
onClick={isInspectable ? toggleIsOpen : undefined}> onClick={isInspectable ? toggleIsOpen : undefined}>
@ -388,7 +402,6 @@ export default function KeyValue({
} }
} else { } else {
if (isArray(value)) { if (isArray(value)) {
const hasChildren = value.length > 0 || canEditValues;
const displayName = getMetaValueLabel(value); const displayName = getMetaValueLabel(value);
children = value.map((innerValue, index) => ( children = value.map((innerValue, index) => (
@ -449,12 +462,11 @@ export default function KeyValue({
ref={contextMenuTriggerRef} ref={contextMenuTriggerRef}
style={style}> style={style}>
{hasChildren ? ( {hasChildren ? (
<ExpandCollapseToggle isOpen={isOpen} setIsOpen={setIsOpen} /> <ExpandCollapseToggle isOpen={isOpen} setIsOpen={toggleIsOpen} />
) : ( ) : (
<div className={styles.ExpandCollapseToggleSpacer} /> <div className={styles.ExpandCollapseToggleSpacer} />
)} )}
{renderedName} {renderedName}
<div className={styles.AfterName}>:</div>
<span <span
className={styles.Value} className={styles.Value}
onClick={hasChildren ? toggleIsOpen : undefined}> onClick={hasChildren ? toggleIsOpen : undefined}>
@ -472,7 +484,6 @@ export default function KeyValue({
entries.sort(alphaSortEntries); entries.sort(alphaSortEntries);
} }
const hasChildren = entries.length > 0 || canEditValues;
const displayName = getMetaValueLabel(value); const displayName = getMetaValueLabel(value);
children = entries.map(([key, keyValue]): ReactElement<any> => ( children = entries.map(([key, keyValue]): ReactElement<any> => (
@ -531,12 +542,11 @@ export default function KeyValue({
ref={contextMenuTriggerRef} ref={contextMenuTriggerRef}
style={style}> style={style}>
{hasChildren ? ( {hasChildren ? (
<ExpandCollapseToggle isOpen={isOpen} setIsOpen={setIsOpen} /> <ExpandCollapseToggle isOpen={isOpen} setIsOpen={toggleIsOpen} />
) : ( ) : (
<div className={styles.ExpandCollapseToggleSpacer} /> <div className={styles.ExpandCollapseToggleSpacer} />
)} )}
{renderedName} {renderedName}
<div className={styles.AfterName}>:</div>
<span <span
className={styles.Value} className={styles.Value}
onClick={hasChildren ? toggleIsOpen : undefined}> onClick={hasChildren ? toggleIsOpen : undefined}>
@ -567,7 +577,10 @@ function DeleteToggle({deletePath, name, path}) {
title="Delete entry"> title="Delete entry">
<ButtonIcon type="delete" /> <ButtonIcon type="delete" />
</Button> </Button>
<span className={styles.Name}>{name}</span> <span className={styles.Name}>
{name}
<span className={styles.AfterName}>:</span>
</span>
</> </>
); );
} }