UPDATE: WIP

This commit is contained in:
Nicolás Hatcher
2025-10-12 17:01:52 +02:00
committed by Nicolás Hatcher Andrés
parent 46d766c85c
commit 087211ebc3
3 changed files with 124 additions and 68 deletions

View File

@@ -24,6 +24,7 @@ import {
Grid2x2Check, Grid2x2Check,
Grid2x2X, Grid2x2X,
ImageDown, ImageDown,
Inbox,
Italic, Italic,
Minus, Minus,
PaintBucket, PaintBucket,
@@ -90,6 +91,7 @@ type ToolbarProperties = {
showGridLines: boolean; showGridLines: boolean;
onToggleShowGridLines: (show: boolean) => void; onToggleShowGridLines: (show: boolean) => void;
nameManagerProperties: NameManagerProperties; nameManagerProperties: NameManagerProperties;
openDrawer: () => void;
}; };
function Toolbar(properties: ToolbarProperties) { function Toolbar(properties: ToolbarProperties) {
@@ -541,6 +543,19 @@ function Toolbar(properties: ToolbarProperties) {
<ImageDown /> <ImageDown />
</StyledButton> </StyledButton>
</Tooltip> </Tooltip>
<Tooltip title={t("toolbar.open_drawer")}>
<StyledButton
type="button"
$pressed={false}
onClick={() => {
properties.openDrawer();
}}
disabled={!canEdit}
>
<Inbox />
</StyledButton>
</Tooltip>
</ButtonGroup> </ButtonGroup>
<ColorPicker <ColorPicker

View File

@@ -22,6 +22,7 @@ import {
CLIPBOARD_ID_SESSION_STORAGE_KEY, CLIPBOARD_ID_SESSION_STORAGE_KEY,
getNewClipboardId, getNewClipboardId,
} from "../clipboard"; } from "../clipboard";
import { TOOLBAR_HEIGHT } from "../constants";
import { import {
type NavigationKey, type NavigationKey,
getCellAddress, getCellAddress,
@@ -41,6 +42,8 @@ const Workbook = (props: { model: Model; workbookState: WorkbookState }) => {
// This is needed because `model` or `workbookState` can change without React being aware of it // This is needed because `model` or `workbookState` can change without React being aware of it
const setRedrawId = useState(0)[1]; const setRedrawId = useState(0)[1];
const [isDrawerOpen, setDrawerOpen] = useState(false);
const worksheets = model.getWorksheetsProperties(); const worksheets = model.getWorksheetsProperties();
const info = worksheets.map( const info = worksheets.map(
({ name, color, sheet_id, state }: WorksheetProperties) => { ({ name, color, sheet_id, state }: WorksheetProperties) => {
@@ -692,77 +695,119 @@ const Workbook = (props: { model: Model; workbookState: WorkbookState }) => {
worksheets, worksheets,
definedNameList: model.getDefinedNameList(), definedNameList: model.getDefinedNameList(),
}} }}
/> openDrawer={() => {
<FormulaBar setDrawerOpen(true);
cellAddress={cellAddress()}
formulaValue={formulaValue()}
onChange={() => {
setRedrawId((id) => id + 1);
focusWorkbook();
}} }}
onTextUpdated={() => {
setRedrawId((id) => id + 1);
}}
model={model}
workbookState={workbookState}
/>
<Worksheet
model={model}
workbookState={workbookState}
refresh={(): void => {
setRedrawId((id) => id + 1);
}}
ref={worksheetRef}
/> />
<WorksheetAreaLeft $drawerWidth={isDrawerOpen ? DRAWER_WIDTH : 0}>
<FormulaBar
cellAddress={cellAddress()}
formulaValue={formulaValue()}
onChange={() => {
setRedrawId((id) => id + 1);
focusWorkbook();
}}
onTextUpdated={() => {
setRedrawId((id) => id + 1);
}}
model={model}
workbookState={workbookState}
/>
<Worksheet
model={model}
workbookState={workbookState}
refresh={(): void => {
setRedrawId((id) => id + 1);
}}
ref={worksheetRef}
/>
<SheetTabBar <SheetTabBar
sheets={info} sheets={info}
selectedIndex={model.getSelectedSheet()} selectedIndex={model.getSelectedSheet()}
workbookState={workbookState} workbookState={workbookState}
onSheetSelected={(sheet: number): void => { onSheetSelected={(sheet: number): void => {
if (info[sheet].state !== "visible") { if (info[sheet].state !== "visible") {
model.unhideSheet(sheet); model.unhideSheet(sheet);
} }
model.setSelectedSheet(sheet); model.setSelectedSheet(sheet);
setRedrawId((value) => value + 1);
}}
onAddBlankSheet={(): void => {
model.newSheet();
setRedrawId((value) => value + 1);
}}
onSheetColorChanged={(hex: string): void => {
try {
model.setSheetColor(model.getSelectedSheet(), hex);
setRedrawId((value) => value + 1); setRedrawId((value) => value + 1);
} catch (e) { }}
// TODO: Show a proper modal dialog onAddBlankSheet={(): void => {
alert(`${e}`); model.newSheet();
}
}}
onSheetRenamed={(name: string): void => {
try {
model.renameSheet(model.getSelectedSheet(), name);
setRedrawId((value) => value + 1); setRedrawId((value) => value + 1);
} catch (e) { }}
// TODO: Show a proper modal dialog onSheetColorChanged={(hex: string): void => {
alert(`${e}`); try {
} model.setSheetColor(model.getSelectedSheet(), hex);
}} setRedrawId((value) => value + 1);
onSheetDeleted={(): void => { } catch (e) {
const selectedSheet = model.getSelectedSheet(); // TODO: Show a proper modal dialog
model.deleteSheet(selectedSheet); alert(`${e}`);
setRedrawId((value) => value + 1); }
}} }}
onHideSheet={(): void => { onSheetRenamed={(name: string): void => {
const selectedSheet = model.getSelectedSheet(); try {
model.hideSheet(selectedSheet); model.renameSheet(model.getSelectedSheet(), name);
setRedrawId((value) => value + 1); setRedrawId((value) => value + 1);
}} } catch (e) {
/> // TODO: Show a proper modal dialog
alert(`${e}`);
}
}}
onSheetDeleted={(): void => {
const selectedSheet = model.getSelectedSheet();
model.deleteSheet(selectedSheet);
setRedrawId((value) => value + 1);
}}
onHideSheet={(): void => {
const selectedSheet = model.getSelectedSheet();
model.hideSheet(selectedSheet);
setRedrawId((value) => value + 1);
}}
/>
</WorksheetAreaLeft>
<WorksheetAreaRight $drawerWidth={isDrawerOpen ? DRAWER_WIDTH : 0}>
<span
onClick={() => setDrawerOpen(false)}
onKeyDown={(e) => {
if (e.key === "Enter" || e.key === " ") {
setDrawerOpen(false);
}
}}
aria-label="Close drawer"
>
x
</span>
</WorksheetAreaRight>
</Container> </Container>
); );
}; };
const DRAWER_WIDTH = 300;
type WorksheetAreaLeftProps = { $drawerWidth: number };
const WorksheetAreaLeft = styled("div")<WorksheetAreaLeftProps>(
({ $drawerWidth }) => ({
position: "absolute",
top: `${TOOLBAR_HEIGHT + 1}px`,
width: `calc(100% - ${$drawerWidth}px)`,
height: `calc(100% - ${TOOLBAR_HEIGHT + 1}px)`,
}),
);
const WorksheetAreaRight = styled("div")<WorksheetAreaLeftProps>(
({ $drawerWidth }) => ({
position: "absolute",
overflow: "hidden",
backgroundColor: "red",
right: 0,
top: `${TOOLBAR_HEIGHT + 1}px`,
bottom: 0,
width: `${$drawerWidth}px`,
}),
);
const Container = styled("div")` const Container = styled("div")`
display: flex; display: flex;
flex-direction: column; flex-direction: column;

View File

@@ -18,11 +18,7 @@ import {
outlineColor, outlineColor,
} from "../WorksheetCanvas/constants"; } from "../WorksheetCanvas/constants";
import WorksheetCanvas from "../WorksheetCanvas/worksheetCanvas"; import WorksheetCanvas from "../WorksheetCanvas/worksheetCanvas";
import { import { FORMULA_BAR_HEIGHT, NAVIGATION_HEIGHT } from "../constants";
FORMULA_BAR_HEIGHT,
NAVIGATION_HEIGHT,
TOOLBAR_HEIGHT,
} from "../constants";
import type { Cell } from "../types"; import type { Cell } from "../types";
import type { WorkbookState } from "../workbookState"; import type { WorkbookState } from "../workbookState";
import CellContextMenu from "./CellContextMenu"; import CellContextMenu from "./CellContextMenu";
@@ -459,7 +455,7 @@ const SheetContainer = styled("div")`
const Wrapper = styled("div")({ const Wrapper = styled("div")({
position: "absolute", position: "absolute",
overflow: "scroll", overflow: "scroll",
top: TOOLBAR_HEIGHT + FORMULA_BAR_HEIGHT + 1, top: FORMULA_BAR_HEIGHT + 1,
left: 0, left: 0,
right: 0, right: 0,
bottom: NAVIGATION_HEIGHT + 1, bottom: NAVIGATION_HEIGHT + 1,