changes to name manager after review
This commit is contained in:
committed by
Nicolás Hatcher Andrés
parent
75e04696b5
commit
5ca15033f7
@@ -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;
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
1
webapp/src/components/NameManager/index.ts
Normal file
1
webapp/src/components/NameManager/index.ts
Normal file
@@ -0,0 +1 @@
|
|||||||
|
export { default } from "./NameManagerDialog";
|
||||||
@@ -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>
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user