update: click on list items selects cells and ranges

This commit is contained in:
Daniel
2025-11-22 01:48:36 +01:00
committed by Nicolás Hatcher Andrés
parent a3c201e4e4
commit c196db2115
2 changed files with 31 additions and 25 deletions

View File

@@ -33,14 +33,9 @@ function FormulaBar(properties: FormulaBarProps) {
onTextUpdated, onTextUpdated,
workbookState, workbookState,
} = properties; } = properties;
const [selectedMenuOption, setSelectedMenuOption] =
useState<string>("show_values");
const [isMenuOpen, setIsMenuOpen] = useState(false); const [isMenuOpen, setIsMenuOpen] = useState(false);
const handleMenuChange = (option: string): void => { const handleMenuChange = (_option: string): void => {};
setSelectedMenuOption(option);
// Handle menu option change here
};
const handleMenuOpenChange = (isOpen: boolean): void => { const handleMenuOpenChange = (isOpen: boolean): void => {
setIsMenuOpen(isOpen); setIsMenuOpen(isOpen);
@@ -50,12 +45,12 @@ function FormulaBar(properties: FormulaBarProps) {
<Container> <Container>
<AddressContainer> <AddressContainer>
<FormulaBarMenu <FormulaBarMenu
selectedOption={selectedMenuOption}
onChange={handleMenuChange} onChange={handleMenuChange}
onMenuOpenChange={handleMenuOpenChange} onMenuOpenChange={handleMenuOpenChange}
openDrawer={properties.openDrawer} openDrawer={properties.openDrawer}
canEdit={properties.canEdit} canEdit={properties.canEdit}
model={model} model={model}
onUpdate={onChange}
> >
<CellBarAddress $active={isMenuOpen}>{cellAddress}</CellBarAddress> <CellBarAddress $active={isMenuOpen}>{cellAddress}</CellBarAddress>
<MenuButton $active={isMenuOpen}> <MenuButton $active={isMenuOpen}>
@@ -156,7 +151,6 @@ const Container = styled("div")`
const AddressContainer = styled("div")` const AddressContainer = styled("div")`
color: ${theme.palette.common.black}; color: ${theme.palette.common.black};
font-style: normal; font-style: normal;
font-weight: normal;
font-size: 12px; font-size: 12px;
display: flex; display: flex;
font-weight: 600; font-weight: 600;
@@ -177,7 +171,7 @@ const CellBarAddress = styled("div")<{ $active?: boolean }>`
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
text-align: "center"; text-align: center;
padding: 4px 8px; padding: 4px 8px;
border-radius: 4px 0px 0px 4px; border-radius: 4px 0px 0px 4px;
background-color: ${(props) => background-color: ${(props) =>

View File

@@ -1,20 +1,19 @@
import type { Model } from "@ironcalc/wasm"; import type { Model } from "@ironcalc/wasm";
import { Menu, MenuItem, styled } from "@mui/material"; import { Menu, MenuItem, styled } from "@mui/material";
import { Tag } from "lucide-react"; import { Tag } from "lucide-react";
import { type ComponentProps, useCallback, useRef, useState } from "react"; import { useCallback, useRef, useState } from "react";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import { theme } from "../../theme"; import { theme } from "../../theme";
import { parseRangeInSheet } from "../Editor/util";
type FormulaBarMenuProps = { type FormulaBarMenuProps = {
children: React.ReactNode; children: React.ReactNode;
selectedOption?: string;
onChange: (option: string) => void; onChange: (option: string) => void;
onExited?: () => void; onMenuOpenChange: (isOpen: boolean) => void;
onMenuOpenChange?: (isOpen: boolean) => void;
anchorOrigin?: ComponentProps<typeof Menu>["anchorOrigin"];
openDrawer: () => void; openDrawer: () => void;
canEdit: boolean; canEdit: boolean;
model: Model; model: Model;
onUpdate: () => void;
}; };
const FormulaBarMenu = (properties: FormulaBarMenuProps) => { const FormulaBarMenu = (properties: FormulaBarMenuProps) => {
@@ -24,12 +23,12 @@ const FormulaBarMenu = (properties: FormulaBarMenuProps) => {
const handleMenuOpen = useCallback((): void => { const handleMenuOpen = useCallback((): void => {
setMenuOpen(true); setMenuOpen(true);
properties.onMenuOpenChange?.(true); properties.onMenuOpenChange(true);
}, [properties.onMenuOpenChange]); }, [properties.onMenuOpenChange]);
const handleMenuClose = useCallback((): void => { const handleMenuClose = useCallback((): void => {
setMenuOpen(false); setMenuOpen(false);
properties.onMenuOpenChange?.(false); properties.onMenuOpenChange(false);
}, [properties.onMenuOpenChange]); }, [properties.onMenuOpenChange]);
const definedNameList = properties.model.getDefinedNameList(); const definedNameList = properties.model.getDefinedNameList();
@@ -56,16 +55,32 @@ const FormulaBarMenu = (properties: FormulaBarMenuProps) => {
{definedNameList.length > 0 ? ( {definedNameList.length > 0 ? (
<> <>
{definedNameList.map((definedName) => { {definedNameList.map((definedName) => {
const worksheets = properties.model.getWorksheetsProperties();
const scopeName =
definedName.scope != null
? worksheets[definedName.scope]?.name || "[Unknown]"
: "[Global]";
return ( return (
<MenuItemWrapper <MenuItemWrapper
key={`${definedName.name}-${definedName.scope}`} key={`${definedName.name}-${definedName.scope}`}
disableRipple disableRipple
onClick={() => { onClick={() => {
// select the area corresponding to the defined name
const formula = definedName.formula;
const range = parseRangeInSheet(properties.model, formula);
if (range) {
const [
sheetIndex,
rowStart,
columnStart,
rowEnd,
columnEnd,
] = range;
properties.model.setSelectedSheet(sheetIndex);
properties.model.setSelectedCell(rowStart, columnStart);
properties.model.setSelectedRange(
rowStart,
columnStart,
rowEnd,
columnEnd,
);
}
properties.onUpdate();
properties.onChange(definedName.name); properties.onChange(definedName.name);
handleMenuClose(); handleMenuClose();
}} }}
@@ -80,7 +95,6 @@ const FormulaBarMenu = (properties: FormulaBarMenuProps) => {
</> </>
) : null} ) : null}
<MenuItemWrapper <MenuItemWrapper
$pressed={false}
onClick={() => { onClick={() => {
properties.openDrawer(); properties.openDrawer();
handleMenuClose(); handleMenuClose();
@@ -108,9 +122,7 @@ const StyledMenu = styled(Menu)`
} }
`; `;
const MenuItemWrapper = styled(MenuItem, { const MenuItemWrapper = styled(MenuItem)`
shouldForwardProp: (prop) => prop !== "$pressed",
})<{ $pressed?: boolean }>`
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: space-between; justify-content: space-between;