Skip to content

Commit b1dd61d

Browse files
FIX: Pivot Columns Dropdown Empty on First Render in "More" Menu (#51)
* fix: resolve empty dropdown issue for Pivot columns in More menu When the Pivot toolbar item was displayed inside the "More" dropdown (due to toolbar overflow), the columns dropdown appeared empty on first render. This occurred because the memoized dropdownMenu was capturing stale JSX snapshots of components. Changed from using Ant Design's menu prop to dropdownRender to ensure components are rendered fresh with current state on each dropdown open, rather than relying on cached React element references. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> * fix: use custom classes and memoize dropdownRender for More menu - Replace internal Ant Design class names with custom classes (no-code-toolbar-more-menu, no-code-toolbar-more-item) - Memoize dropdownRender with useCallback to avoid unnecessary re-renders - Add CSS styles for the custom dropdown classes 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Claude <noreply@anthropic.com>
1 parent 1da805a commit b1dd61d

File tree

2 files changed

+33
-15
lines changed

2 files changed

+33
-15
lines changed

frontend/src/ide/editor/no-code-toolbar/no-code-toolbar.css

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,3 +119,18 @@
119119
min-width: 16px;
120120
height: 16px;
121121
}
122+
123+
/* Custom dropdown menu for "More" button */
124+
.no-code-toolbar-more-menu {
125+
max-height: 400px;
126+
overflow-y: auto;
127+
background-color: var(--modal-bg);
128+
border: 1px solid var(--border-color-3);
129+
border-radius: 8px;
130+
padding: 4px 0;
131+
}
132+
133+
.no-code-toolbar-more-item {
134+
padding: 0;
135+
margin: 0;
136+
}

frontend/src/ide/editor/no-code-toolbar/no-code-toolbar.jsx

Lines changed: 18 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -435,26 +435,29 @@ const NoCodeToolbar = memo(function NoCodeToolbar({
435435
};
436436
}, [items, calculateVisibleItems, debouncedCalculate]);
437437

438-
// Create dropdown menu items from hidden items
439-
const dropdownMenu = useMemo(
440-
() => ({
441-
items: hiddenItems.map((item) => {
442-
const freshItem = items.find((i) => i.key === item.key);
443-
return {
444-
key: item.key,
445-
label: freshItem?.label ?? item.label,
446-
};
447-
}),
448-
}),
449-
[hiddenItems, items]
450-
);
451-
452438
// Create a set of hidden item keys for quick lookup
453439
const hiddenItemKeys = useMemo(
454440
() => new Set(hiddenItems.map((item) => item.key)),
455441
[hiddenItems]
456442
);
457443

444+
// Render function for the "More" dropdown - memoized to avoid unnecessary re-renders
445+
const renderMoreDropdown = useCallback(
446+
() => (
447+
<div className="no-code-toolbar-more-menu">
448+
{hiddenItems.map((item) => {
449+
const freshItem = items.find((i) => i.key === item.key);
450+
return (
451+
<div key={item.key} className="no-code-toolbar-more-item">
452+
{freshItem?.label ?? item.label}
453+
</div>
454+
);
455+
})}
456+
</div>
457+
),
458+
[hiddenItems, items]
459+
);
460+
458461
return (
459462
<div className="no-code-toolbar-wrapper">
460463
<div className="no-code-toolbar-content" ref={containerRef}>
@@ -472,7 +475,7 @@ const NoCodeToolbar = memo(function NoCodeToolbar({
472475
{hasOverflow && (
473476
<div className="toolbar-item toolbar-more-item">
474477
<Dropdown
475-
menu={dropdownMenu}
478+
dropdownRender={renderMoreDropdown}
476479
trigger={["click"]}
477480
placement="bottomRight"
478481
overlayClassName="no-code-toolbar-dropdown"

0 commit comments

Comments
 (0)