changes to name manager after review

This commit is contained in:
francisco aloi
2024-12-30 20:15:58 +01:00
committed by Nicolás Hatcher Andrés
parent 75e04696b5
commit 5ca15033f7
5 changed files with 71 additions and 61 deletions

View File

@@ -1,4 +1,4 @@
import type { DefinedName, Model } from "@ironcalc/wasm"; import type { Model } from "@ironcalc/wasm";
import { import {
Box, Box,
Button, Button,
@@ -18,44 +18,40 @@ import NamedRange from "./NamedRange";
interface NameManagerDialogProperties { interface NameManagerDialogProperties {
onClose: () => void; onClose: () => void;
onNamesChanged: () => void;
open: boolean; open: boolean;
model: Model; model: Model;
} }
function NameManagerDialog({ function NameManagerDialog(properties: NameManagerDialogProperties) {
onClose, const { onClose, open, model, onNamesChanged } = properties;
open,
model,
}: NameManagerDialogProperties) {
const [definedNamesLocal, setDefinedNamesLocal] = useState<DefinedName[]>();
const [showNewName, setShowNewName] = useState(false); const [showNewName, setShowNewName] = useState(false);
const [showOptions, setShowOptions] = useState(true); const [showOptions, setShowOptions] = useState(true);
useEffect(() => { useEffect(() => {
// render definedNames from model
if (open) {
const definedNamesModel = model.getDefinedNameList();
setDefinedNamesLocal(definedNamesModel);
}
setShowNewName(false); setShowNewName(false);
setShowOptions(true); setShowOptions(true);
}, [open, model]); }, []);
const handleNewName = () => { const handleNewName = () => {
setShowNewName(true); toggleShowNewName();
setShowOptions(false); toggleOptions();
};
const handleCreate = () => {
toggleShowNewName();
}; };
const handleDelete = () => { const handleDelete = () => {
// re-render modal onNamesChanged();
setDefinedNamesLocal(model.getDefinedNameList());
}; };
const formatFormula = (): string => { const formatFormula = (): string => {
const worksheets = model.getWorksheetsProperties(); const worksheetNames = model.getWorksheetsProperties().map((s) => s.name);
const selectedView = model.getSelectedView(); const selectedView = model.getSelectedView();
return getFullRangeToString(selectedView, worksheets); return getFullRangeToString(selectedView, worksheetNames);
}; };
const toggleOptions = () => { const toggleOptions = () => {
@@ -63,9 +59,12 @@ function NameManagerDialog({
}; };
const toggleShowNewName = () => { const toggleShowNewName = () => {
setShowNewName(false); setShowNewName(!showNewName);
}; };
const worksheets = model.getWorksheetsProperties();
const definedNameList = model.getDefinedNameList();
return ( return (
<StyledDialog open={open} onClose={onClose} maxWidth={false} scroll="paper"> <StyledDialog open={open} onClose={onClose} maxWidth={false} scroll="paper">
<StyledDialogTitle> <StyledDialogTitle>
@@ -76,14 +75,14 @@ function NameManagerDialog({
</StyledDialogTitle> </StyledDialogTitle>
<StyledDialogContent dividers> <StyledDialogContent dividers>
<StyledRangesHeader> <StyledRangesHeader>
<Box width="171px">{t("name_manager_dialog.name")}</Box> <StyledBox>{t("name_manager_dialog.name")}</StyledBox>
<Box width="171px">{t("name_manager_dialog.range")}</Box> <StyledBox>{t("name_manager_dialog.range")}</StyledBox>
<Box width="171px">{t("name_manager_dialog.scope")}</Box> <StyledBox>{t("name_manager_dialog.scope")}</StyledBox>
</StyledRangesHeader> </StyledRangesHeader>
{definedNamesLocal?.map((definedName) => ( {definedNameList.map((definedName) => (
<NamedRange <NamedRange
model={model} model={model}
worksheets={model.getWorksheetsProperties()} worksheets={worksheets}
name={definedName.name} name={definedName.name}
scope={definedName.scope} scope={definedName.scope}
formula={definedName.formula} formula={definedName.formula}
@@ -96,11 +95,13 @@ function NameManagerDialog({
{showNewName && ( {showNewName && (
<NamedRange <NamedRange
model={model} model={model}
worksheets={model.getWorksheetsProperties()} worksheets={worksheets}
name={""}
formula={formatFormula()} formula={formatFormula()}
showOptions={showOptions} showOptions={showOptions}
toggleOptions={toggleOptions} toggleOptions={toggleOptions}
toggleShowNewName={toggleShowNewName} toggleShowNewName={toggleShowNewName}
onCreate={handleCreate}
/> />
)} )}
</StyledDialogContent> </StyledDialogContent>
@@ -117,7 +118,7 @@ function NameManagerDialog({
disableElevation disableElevation
sx={{ textTransform: "none" }} sx={{ textTransform: "none" }}
startIcon={<Plus size={16} />} startIcon={<Plus size={16} />}
disabled={!showOptions} // disable when editing disabled={!showOptions}
> >
{t("name_manager_dialog.new")} {t("name_manager_dialog.new")}
</Button> </Button>
@@ -142,6 +143,10 @@ align-items: center;
justify-content: space-between; justify-content: space-between;
`; `;
const StyledBox = styled(Box)`
width: 171px;
`;
const StyledDialogContent = styled(DialogContent)` const StyledDialogContent = styled(DialogContent)`
display: flex; display: flex;
flex-direction: column; flex-direction: column;

View File

@@ -14,27 +14,31 @@ import { useEffect, useState } from "react";
interface NamedRangeProperties { interface NamedRangeProperties {
model: Model; model: Model;
worksheets: WorksheetProperties[]; worksheets: WorksheetProperties[];
name?: string; name: string;
scope?: number; scope?: number;
formula: string; formula: string;
onCreate?: () => void;
onDelete?: () => void; onDelete?: () => void;
toggleShowNewName?: () => void; toggleShowNewName?: () => void;
toggleOptions: () => void; toggleOptions: () => void;
showOptions?: boolean; showOptions?: boolean;
} }
function NamedRange({ function NamedRange(properties: NamedRangeProperties) {
model, const {
worksheets, model,
name, worksheets,
scope, name,
formula, scope,
onDelete, formula,
toggleShowNewName, onCreate,
toggleOptions, onDelete,
showOptions, toggleShowNewName,
}: NamedRangeProperties) { toggleOptions,
const [newName, setNewName] = useState(name || ""); showOptions,
} = properties;
const [newName, setNewName] = useState(name);
const [newScope, setNewScope] = useState(scope); const [newScope, setNewScope] = useState(scope);
const [newFormula, setNewFormula] = useState(formula); const [newFormula, setNewFormula] = useState(formula);
const [readOnly, setReadOnly] = useState(true); const [readOnly, setReadOnly] = useState(true);
@@ -53,30 +57,24 @@ function NamedRange({
} }
}, [newName, model]); }, [newName, model]);
const handleSaveUpdate = () => { const handleCreateUpdate = () => {
const definedNamesModel = model.getDefinedNameList(); const definedNamesModel = model.getDefinedNameList();
if (definedNamesModel.find((n) => n.name === name)) { if (definedNamesModel.find((n) => n.name === name)) {
// update name // update
try { try {
model.updateDefinedName( model.updateDefinedName(name, scope, newName, newScope, newFormula);
name || "",
scope,
newName,
newScope,
newFormula,
);
} catch (error) { } catch (error) {
console.log("DefinedName update failed", error); console.log("DefinedName update failed", error);
} }
} else { } else {
// create name // create
try { try {
model.newDefinedName(newName, newScope, newFormula); model.newDefinedName(newName, newScope, newFormula);
} catch (error) { } catch (error) {
console.log("DefinedName save failed", error); console.log("DefinedName save failed", error);
} }
setReadOnly(true); onCreate?.();
} }
setShowEditDelete(false); setShowEditDelete(false);
toggleOptions(); toggleOptions();
@@ -86,11 +84,9 @@ function NamedRange({
setReadOnly(true); setReadOnly(true);
setShowEditDelete(false); setShowEditDelete(false);
toggleOptions(); toggleOptions();
setNewName(name || ""); setNewName(name);
setNewScope(scope); setNewScope(scope);
toggleShowNewName?.(); // if it's newName remove it from modal
// if it's newName remove it from modal
toggleShowNewName?.();
}; };
const handleEdit = () => { const handleEdit = () => {
@@ -105,7 +101,7 @@ function NamedRange({
} catch (error) { } catch (error) {
console.log("DefinedName delete failed", error); console.log("DefinedName delete failed", error);
} }
onDelete?.(); // refresh modal onDelete?.();
}; };
return ( return (
@@ -169,12 +165,18 @@ function NamedRange({
{showEditDelete ? ( {showEditDelete ? (
// save cancel // save cancel
<> <>
<IconButton onClick={handleSaveUpdate}> <IconButton
onClick={handleCreateUpdate}
sx={{ color: (theme) => theme.palette.success.main }}
>
<Check size={12} /> <Check size={12} />
</IconButton> </IconButton>
<StyledIconButton onClick={handleCancel}> <IconButton
onClick={handleCancel}
sx={{ color: (theme) => theme.palette.error.main }}
>
<X size={12} /> <X size={12} />
</StyledIconButton> </IconButton>
</> </>
) : ( ) : (
// edit delete // edit delete

View File

@@ -0,0 +1 @@
export { default } from "./NameManagerDialog";

View File

@@ -36,7 +36,7 @@ import {
DecimalPlacesIncreaseIcon, DecimalPlacesIncreaseIcon,
} from "../icons"; } from "../icons";
import { theme } from "../theme"; import { theme } from "../theme";
import NameManagerDialog from "./NameManager/NameManagerDialog"; import NameManagerDialog from "./NameManager";
import BorderPicker from "./borderPicker"; import BorderPicker from "./borderPicker";
import ColorPicker from "./colorPicker"; import ColorPicker from "./colorPicker";
import { TOOLBAR_HEIGHT } from "./constants"; import { TOOLBAR_HEIGHT } from "./constants";
@@ -63,7 +63,7 @@ type ToolbarProperties = {
onFillColorPicked: (hex: string) => void; onFillColorPicked: (hex: string) => void;
onNumberFormatPicked: (numberFmt: string) => void; onNumberFormatPicked: (numberFmt: string) => void;
onBorderChanged: (border: BorderOptions) => void; onBorderChanged: (border: BorderOptions) => void;
onNamedRangesUpdate: () => void; onNamesChanged: () => void;
fillColor: string; fillColor: string;
fontColor: string; fontColor: string;
bold: boolean; bold: boolean;
@@ -398,6 +398,7 @@ function Toolbar(properties: ToolbarProperties) {
onClose={() => { onClose={() => {
setNameManagerDialogOpen(false); setNameManagerDialogOpen(false);
}} }}
onNamesChanged={properties.onNamesChanged}
model={properties.model} model={properties.model}
/> />
</ToolbarContainer> </ToolbarContainer>

View File

@@ -569,6 +569,7 @@ const Workbook = (props: { model: Model; workbookState: WorkbookState }) => {
model.setShowGridLines(sheet, show); model.setShowGridLines(sheet, show);
setRedrawId((id) => id + 1); setRedrawId((id) => id + 1);
}} }}
onNamesChanged={() => setRedrawId((id) => id + 1)}
model={model} model={model}
/> />
<FormulaBar <FormulaBar