update: click on list items selects cells and ranges
This commit is contained in:
committed by
Nicolás Hatcher Andrés
parent
a3c201e4e4
commit
c196db2115
@@ -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) =>
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user