@candidstartup/react-spreadsheet 0.12.0 → 0.13.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +13 -6
- package/dist/index.js.map +1 -1
- package/package.json +17 -15
package/dist/index.js
CHANGED
|
@@ -169,12 +169,23 @@ function VirtualSpreadsheetGeneric(props) {
|
|
|
169
169
|
const columnCount = Math.max(minColumnCount, dataColumnCount, hwmColumnIndex + 1, focusCell ? focusCell[1] + 1 : 0);
|
|
170
170
|
const columnMapping = data.getColumnItemOffsetMapping(snapshot);
|
|
171
171
|
const columnOffset = columnMapping.itemOffset(columnCount);
|
|
172
|
+
const minWidth = rowHeaderWidth * 2;
|
|
173
|
+
const minHeight = inputBarHeight + columnHeaderHeight * 2;
|
|
174
|
+
const gridWidth = Math.max(width - rowHeaderWidth, rowHeaderWidth);
|
|
175
|
+
const gridHeight = Math.max(height - columnHeaderHeight - inputBarHeight, columnHeaderHeight);
|
|
172
176
|
React.useEffect(() => {
|
|
173
177
|
scrollRef.current?.scrollTo(gridRowOffset, gridColumnOffset);
|
|
174
178
|
}, [gridRowOffset, gridColumnOffset]);
|
|
175
179
|
React.useEffect(() => {
|
|
176
180
|
focusSinkRef.current?.focus({ preventScroll: true });
|
|
177
181
|
}, [focusCell]);
|
|
182
|
+
React.useEffect(() => {
|
|
183
|
+
data.setViewport({ rowMinOffset: gridRowOffset, columnMinOffset: gridColumnOffset, width: gridWidth, height: gridHeight });
|
|
184
|
+
}, [data, gridRowOffset, gridColumnOffset, gridWidth, gridHeight]);
|
|
185
|
+
function updateGridScrollState(rowOffset, columnOffset) {
|
|
186
|
+
setGridScrollState([rowOffset, columnOffset]);
|
|
187
|
+
data.setViewport({ rowMinOffset: rowOffset, columnMinOffset: columnOffset, width: gridWidth, height: gridHeight });
|
|
188
|
+
}
|
|
178
189
|
function onScroll(rowOffsetValue, columnOffsetValue) {
|
|
179
190
|
if (rowOffsetValue == gridRowOffset && columnOffsetValue == gridColumnOffset)
|
|
180
191
|
return;
|
|
@@ -192,7 +203,7 @@ function VirtualSpreadsheetGeneric(props) {
|
|
|
192
203
|
if (hwmColumnIndex < columnCount && columnCount < maxColumnCount)
|
|
193
204
|
setHwmColumnIndex(columnCount);
|
|
194
205
|
}
|
|
195
|
-
|
|
206
|
+
updateGridScrollState(rowOffsetValue, columnOffsetValue);
|
|
196
207
|
}
|
|
197
208
|
function updateFormula(rowIndex, colIndex, editMode) {
|
|
198
209
|
if (rowIndex < dataRowCount && colIndex < dataColumnCount) {
|
|
@@ -252,7 +263,7 @@ function VirtualSpreadsheetGeneric(props) {
|
|
|
252
263
|
const newRowOffset = getOffsetToScrollRange(...rowRange, scroll.clientHeight, gridRowOffset, 'visible');
|
|
253
264
|
const newColOffset = getOffsetToScrollRange(...colRange, scroll.clientWidth, gridColumnOffset, 'visible');
|
|
254
265
|
if (newRowOffset !== undefined || newColOffset !== undefined) {
|
|
255
|
-
|
|
266
|
+
updateGridScrollState((newRowOffset === undefined) ? gridRowOffset : newRowOffset, (newColOffset === undefined) ? gridColumnOffset : newColOffset);
|
|
256
267
|
}
|
|
257
268
|
}
|
|
258
269
|
// Is cell in selected row or column?
|
|
@@ -566,10 +577,6 @@ function VirtualSpreadsheetGeneric(props) {
|
|
|
566
577
|
};
|
|
567
578
|
const columnTemplate = `${rowHeaderWidth}px 1fr`;
|
|
568
579
|
const rowTemplate = `${inputBarHeight}px ${columnHeaderHeight}px 1fr`;
|
|
569
|
-
const minWidth = rowHeaderWidth * 2;
|
|
570
|
-
const minHeight = inputBarHeight + columnHeaderHeight * 2;
|
|
571
|
-
const gridWidth = Math.max(width - rowHeaderWidth, rowHeaderWidth);
|
|
572
|
-
const gridHeight = Math.max(height - columnHeaderHeight - inputBarHeight, columnHeaderHeight);
|
|
573
580
|
return (jsxs("div", { className: join(props.className, theme?.VirtualSpreadsheet), style: { width, height, minWidth, minHeight, display: "grid", gridTemplateColumns: columnTemplate, gridTemplateRows: rowTemplate }, children: [jsxs("div", { className: theme?.VirtualSpreadsheet_InputBar, style: { overflow: 'hidden', display: 'flex', gridColumnStart: 1, gridColumnEnd: 3 }, children: [jsx("input", { className: theme?.VirtualSpreadsheet_Name, type: "text", name: "name", title: "Name", value: name, size: 20, onChange: (event) => {
|
|
574
581
|
setName(event.target?.value);
|
|
575
582
|
}, onKeyUp: onNameKeyUp }), jsx("label", { className: theme?.VirtualSpreadsheet_Fx, children: "fx" }), jsx("input", { className: join(theme?.VirtualSpreadsheet_Formula, ifdef(dataError, theme?.VirtualSpreadsheet_Formula__DataError)), style: { flexGrow: 1 }, type: "text", readOnly: readOnly, name: "formula", title: "Formula", value: formula, onChange: (event) => {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/VirtualSpreadsheetTheme.ts","../src/VirtualSpreadsheet.tsx"],"sourcesContent":["/**\n * Theme that defines class names for all DOM elements within {@link VirtualSpreadsheet}. Provide an appropriate\n * theme to use VirtualSpreadsheet with whatever CSS management system you prefer.\n * \n * Properties are named using a BEM style with the form `ComponentName_ElementName__modifierName_modifierValue`\n */\nexport interface VirtualSpreadsheetTheme {\n /** Class applied to the overall component */\n VirtualSpreadsheet: string,\n\n /** Class applied to the input bar at the top of the component */\n VirtualSpreadsheet_InputBar: string,\n\n /** Class applied to the Name input on the left end of the input bar */\n VirtualSpreadsheet_Name: string,\n\n /** Class applied to the \"fx\" label in the input bar */\n VirtualSpreadsheet_Fx: string,\n\n /** Class applied to the Formula input on the right end of the input bar */\n VirtualSpreadsheet_Formula: string,\n\n /** Modifier class applied to the Formula input when the user has entered invalid data */\n VirtualSpreadsheet_Formula__DataError: string,\n\n /** Class applied to the grid of cells */\n VirtualSpreadsheet_Grid: string,\n\n /** Class applied to the top left corner where the row and column headers meet */\n VirtualSpreadsheet_CornerHeader: string,\n\n /** Class applied to the column header */\n VirtualSpreadsheet_ColumnHeader: string,\n\n /** Class applied to an individual column within the column header */\n VirtualSpreadsheet_Column: string,\n\n /** Modifier class applied to a column when it's selected */\n VirtualSpreadsheet_Column__Selected: string,\n\n /** Modifier class applied to a column when a cell in that column is selected */\n VirtualSpreadsheet_Column__CellSelected: string,\n\n /** Class applied to the row header */\n VirtualSpreadsheet_RowHeader: string,\n\n /** Class applied to an individual row within the row header */\n VirtualSpreadsheet_Row: string,\n\n /** Modifier class applied to a row when it's selected */\n VirtualSpreadsheet_Row__Selected: string,\n\n /** Modifier class applied to a row when a cell in that row is selected */\n VirtualSpreadsheet_Row__CellSelected: string,\n\n /** Class applied to a cell within the grid*/ \n VirtualSpreadsheet_Cell: string,\n\n /** Modifier class applied to a cell when it contains a string value */\n VirtualSpreadsheet_Cell__Type_string: string,\n\n /** Modifier class applied to a cell when it contains a number value */\n VirtualSpreadsheet_Cell__Type_number: string,\n\n /** Modifier class applied to a cell when it contains a boolean value */\n VirtualSpreadsheet_Cell__Type_boolean: string,\n\n /** Modifier class applied to a cell when it contains a null value */\n VirtualSpreadsheet_Cell__Type_null: string,\n\n /** Modifier class applied to a cell when it contains an undefined value */\n VirtualSpreadsheet_Cell__Type_undefined: string,\n\n /** Modifier class applied to a cell when it contains an error value */\n VirtualSpreadsheet_Cell__Type_CellError: string,\n\n /** Modifier class applied to a cell when it has the focus */\n VirtualSpreadsheet_Cell__Focus: string,\n\n /** Modifier class applied to a cell when it's within a selected row */\n VirtualSpreadsheet_Cell__RowSelected: string,\n\n /** Modifier class applied to a cell when it's within a selected column */\n VirtualSpreadsheet_Cell__ColumnSelected: string,\n\n /** Modifier class applied to a cell when an update is pending */\n VirtualSpreadsheet_Cell__UpdatePending: string,\n\n /** Modifier class applied to a cell when the user has entered invalid data */\n VirtualSpreadsheet_Cell__DataError: string,\n\n /** Class applied to an in grid error tag */\n VirtualSpreadsheet_ErrorTag: string,\n}\n\n/** Default implementation of theme provided by `VirtualSpreadsheet.css` */\nexport const VirtualSpreadsheetDefaultTheme: VirtualSpreadsheetTheme = {\n VirtualSpreadsheet: \"VirtualSpreadsheet\",\n VirtualSpreadsheet_InputBar: \"VirtualSpreadsheet_InputBar\",\n VirtualSpreadsheet_Name: \"VirtualSpreadsheet_Name\",\n VirtualSpreadsheet_Fx: \"VirtualSpreadsheet_Fx\",\n VirtualSpreadsheet_Formula: \"VirtualSpreadsheet_Formula\",\n VirtualSpreadsheet_Formula__DataError: \"VirtualSpreadsheet_Formula__DataError\",\n VirtualSpreadsheet_Grid: \"VirtualSpreadsheet_Grid\",\n VirtualSpreadsheet_CornerHeader: \"VirtualSpreadsheet_CornerHeader\",\n VirtualSpreadsheet_ColumnHeader: \"VirtualSpreadsheet_ColumnHeader\",\n VirtualSpreadsheet_Column: \"VirtualSpreadsheet_Column\",\n VirtualSpreadsheet_Column__Selected: \"VirtualSpreadsheet_Column__Selected\",\n VirtualSpreadsheet_Column__CellSelected: \"VirtualSpreadsheet_Column__CellSelected\",\n VirtualSpreadsheet_RowHeader: \"VirtualSpreadsheet_RowHeader\",\n VirtualSpreadsheet_Row: \"VirtualSpreadsheet_Row\",\n VirtualSpreadsheet_Row__Selected: \"VirtualSpreadsheet_Row__Selected\",\n VirtualSpreadsheet_Row__CellSelected: \"VirtualSpreadsheet_Row__CellSelected\",\n VirtualSpreadsheet_Cell__UpdatePending: \"VirtualSpreadsheet_Cell__UpdatePending\",\n VirtualSpreadsheet_Cell: \"VirtualSpreadsheet_Cell\",\n VirtualSpreadsheet_Cell__Type_string: \"VirtualSpreadsheet_Cell__Type_string\",\n VirtualSpreadsheet_Cell__Type_number: \"VirtualSpreadsheet_Cell__Type_number\",\n VirtualSpreadsheet_Cell__Type_boolean: \"VirtualSpreadsheet_Cell__Type_boolean\",\n VirtualSpreadsheet_Cell__Type_null: \"VirtualSpreadsheet_Cell__Type_null\",\n VirtualSpreadsheet_Cell__Type_undefined: \"VirtualSpreadsheet_Cell__Type_undefined\",\n VirtualSpreadsheet_Cell__Type_CellError: \"VirtualSpreadsheet_Cell__Type_CellError\",\n VirtualSpreadsheet_Cell__Focus: \"VirtualSpreadsheet_Cell__Focus\",\n VirtualSpreadsheet_Cell__RowSelected: \"VirtualSpreadsheet_Cell__RowSelected\",\n VirtualSpreadsheet_Cell__ColumnSelected: \"VirtualSpreadsheet_Cell__ColumnSelected\",\n VirtualSpreadsheet_Cell__DataError: \"VirtualSpreadsheet_Cell__DataError\",\n VirtualSpreadsheet_ErrorTag: \"VirtualSpreadsheet_ErrorTag\"\n}\n","import React from 'react';\nimport { DisplayList, DisplayGrid, AutoSizer, VirtualContainerRender, VirtualScroll, VirtualScrollProxy,\n getRangeToScroll, getOffsetToScrollRange } from '@candidstartup/react-virtual-scroll';\nimport type { VirtualSpreadsheetTheme } from './VirtualSpreadsheetTheme';\nimport { SpreadsheetData, SpreadsheetDataError, CellValue, indexToColRef, RowColCoords, \n rowColRefToCoords, rowColCoordsToRef, storageError} from '@candidstartup/infinisheet-types'\nimport * as numfmt from 'numfmt'\n\n/** Extension of {@link SpreadsheetData} interface so that it's compatible with React's `useSyncExternalStore` hook\n * \n * Additional properties are optional, so anything that implements `SpreadsheetData` is compatible with something\n * that accepts `ReactSpreadsheetData`.\n */\nexport interface ReactSpreadsheetData<Snapshot> extends SpreadsheetData<Snapshot> {\n /** Used by `useSyncExternalStore` to support server side rendering */\ngetServerSnapshot?: (() => Snapshot) | undefined\n}\n\n/**\n * Props for {@link VirtualSpreadsheetGeneric}\n * \n * @typeParam Snapshot - Type of snapshot for `SpreadsheetData`\n */\nexport interface VirtualSpreadsheetGenericProps<Snapshot> {\n /** The `className` applied to the spreadsheet as a whole */\n className?: string | undefined,\n\n /** Spreadsheet theme which defines the CSS classes to apply\n * \n * Defined as a union so that it supports both hand written themes\n * defined as implementations of {@link VirtualSpreadsheetTheme} and themes\n * implicitly defined by importing a CSS module. \n */\n theme?: VirtualSpreadsheetTheme | Record<string, string> | undefined,\n\n /** Component height */\n height: number,\n\n /** Component width */\n width: number,\n\n /** Height of input bar\n * @defaultValue 30\n */\n inputBarHeight?: number | undefined,\n\n /** Height of column header\n * @defaultValue 50\n */\n columnHeaderHeight?: number | undefined,\n\n /** Width of row header\n * @defaultValue 100\n */\n rowHeaderWidth?: number | undefined,\n\n /** Data to display and edit */\n data: ReactSpreadsheetData<Snapshot>,\n\n /** Disables edit mode if true\n * @defaultValue false\n */\n readOnly?: boolean, \n\n /** Minimum number of rows in the spreadsheet \n * @defaultValue 100\n */\n minRowCount?: number | undefined,\n\n /** Maximum number of rows in the spreadsheet \n * @defaultValue 1000000000000\n */\n maxRowCount?: number | undefined,\n\n /** Minimum number of columns in the grid \n * @defaultValue 26\n */\n minColumnCount?: number | undefined,\n\n /** Maximum umber of columns in the grid \n * @defaultValue 1000000000000\n */\n maxColumnCount?: number | undefined,\n\n /** \n * Maximum size for CSS element beyond which layout breaks. You should never normally need to change this. \n * The default value is compatible with all major browsers.\n * \n * @defaultValue 6000000\n * */\n maxCssSize?: number | undefined,\n\n /**\n * The minimum number of virtual pages to use when inner container would otherwise be more than {@link VirtualSpreadsheetProps.maxCssSize} big.\n * You should never normally need to change this.\n * \n * @defaultValue 100\n */\n minNumPages?: number | undefined\n}\n\n/**\n * Props for {@link VirtualSpreadsheet}\n */\nexport interface VirtualSpreadsheetProps extends VirtualSpreadsheetGenericProps<unknown> {\n}\n\nfunction join(...v: (string|undefined)[]) {\n let s: string|undefined = undefined;\n v.forEach(a => {\n if (s && a)\n s = s + ' ' + a;\n else if (a)\n s = a;\n });\n return s;\n}\n\nfunction ifdef(b: boolean|object|null, s: string|undefined) { return (b) ? s : undefined }\n\n// Options for numfmt that match Google Sheets and ECMA-376 behavior. This is compatible with supported dates in Excel apart from Jan/Feb 1900. \n// This is due to Excel's backwards compatibility support for the Lotus 1-2-3 leap year bug that incorrectly thinks 1900 is a leap year.\nconst numfmtOptions = {\n leap1900: false,\n dateSpanLarge: true\n}\n\nfunction formatContent(value: CellValue, format: string | undefined): string {\n if (value === null || value === undefined)\n return \"\";\n\n if (typeof value === 'object')\n return value.value;\n\n if (typeof value === 'string' && value[0] == '\\'') {\n // Leading apostrophe means display rest of string as is\n return value.substring(1);\n }\n\n if (format === undefined)\n format = \"\";\n\n return numfmt.format(format, value, numfmtOptions);\n}\n\nfunction classForType(value: CellValue) {\n if (value === null)\n return 'VirtualSpreadsheet_Cell__Type_null';\n if (value === undefined)\n return 'VirtualSpreadsheet_Cell__Type_undefined';\n\n const type = typeof value;\n if (type === 'object')\n return 'VirtualSpreadsheet_Cell__Type_CellError';\n\n return 'VirtualSpreadsheet_Cell__Type_' + type;\n}\n\nfunction inRect(x: number, y: number, rect: DOMRect) {\n return (x >= rect.left && x < rect.right && y >= rect.top && y < rect.bottom);\n}\n\n// Return mouse coordinates in space of current event target. Not directly available so we convert\n// using client coordinates.\nfunction getCurrentTargetXY(event: React.MouseEvent<HTMLDivElement>): [number,number] {\n let clientX = event.clientX;\n let clientY = event.clientY;\n if (event.target !== event.currentTarget) {\n const target = event.target as Element;\n const targetRect = target.getBoundingClientRect();\n if (!inRect(clientX, clientY, targetRect))\n {\n // Sometimes get events with bogus client XY, often generated by some form of automation\n // If this happens behave as if middle of target rect was clicked\n clientX = (targetRect.left + targetRect.right) / 2;\n clientY = (targetRect.top + targetRect.bottom) / 2;\n }\n }\n\n const currentRect = event.currentTarget.getBoundingClientRect();\n if (!inRect(clientX, clientY, currentRect)) {\n // Somethings gone horribly wrong\n return [0,0];\n }\n\n return [clientX - currentRect.left, clientY - currentRect.top];\n}\n\ntype HeaderItemRender = (index: number, style: React.CSSProperties) => React.JSX.Element;\nfunction HeaderItem({ index, data, style }: { index: number, data:unknown, style: React.CSSProperties }) {\n const itemRender = data as HeaderItemRender;\n return itemRender(index, style);\n}\n\ntype CellRender = (rowIndex: number, columnIndex: number, style: React.CSSProperties) => React.JSX.Element;\nfunction Cell({ rowIndex, columnIndex, data, style }: { rowIndex: number, columnIndex: number, data: unknown, style: React.CSSProperties }) {\n const cellRender = data as CellRender;\n return cellRender(rowIndex, columnIndex, style);\n}\n\ninterface PendingCellValueAndFormat {\n row: number, \n column: number,\n value: CellValue,\n format?: string | undefined\n};\n\n/**\n * Virtual Spreadsheet\n * \n * Accepts props defined by {@link VirtualSpreadsheetProps}. \n * You must pass an instance of {@link SpreadsheetData} using the `data` prop.\n * \n * @remarks\n * \n * For most cases use this rather than {@link VirtualSpreadsheetGeneric}.\n * \n * Accepts all parameterizations of `SpreadsheetData`. Implemented as `VirtualSpreadsheetGeneric<unknown>`.\n * \n * @group Components\n */\nexport function VirtualSpreadsheet(props: VirtualSpreadsheetProps) {\n return VirtualSpreadsheetGeneric(props);\n}\n\n/**\n * Generic version of Virtual Spreadsheet\n * \n * Accepts props defined by {@link VirtualSpreadsheetGenericProps}. \n * You must pass an instance of {@link SpreadsheetData} with a compatible `Snapshot` parameter using the `data` prop.\n * \n * @remarks\n * \n * In almost all cases use {@link VirtualSpreadsheet} instead. Only use this if you need to restrict the types of `SpreadsheetData`\n * that can be used based on `Snapshot` type.\n * \n * @typeParam Snapshot - Type of snapshot for `SpreadsheetData`\n * \n * @group Components\n */\nexport function VirtualSpreadsheetGeneric<Snapshot>(props: VirtualSpreadsheetGenericProps<Snapshot>) {\n const { width, height, inputBarHeight=30, columnHeaderHeight=50, rowHeaderWidth=100,\n theme, data, readOnly=false, minRowCount=100, minColumnCount=26, maxRowCount=1000000000000, maxColumnCount=1000000000000 } = props;\n const scrollRef = React.useRef<VirtualScrollProxy>(null);\n const focusSinkRef = React.useRef<HTMLInputElement>(null);\n\n // Originally passed data.subscribe.bind(data) to useCallback. It works but React hooks lint fails because it can only validate\n // dependencies for an inline function.\n const subscribeFn = React.useCallback((cb: () => void) => data.subscribe(cb), [data]); \n const snapshot = React.useSyncExternalStore<Snapshot>(subscribeFn, data.getSnapshot.bind(data), data.getServerSnapshot?.bind(data));\n\n const [name, setName] = React.useState(\"\");\n const [formula, setFormula] = React.useState(\"\");\n const [cellValue, setCellValue] = React.useState(\"\");\n const [editMode, setEditMode] = React.useState(false);\n const [hwmRowIndex, setHwmRowIndex] = React.useState(0);\n const [hwmColumnIndex, setHwmColumnIndex] = React.useState(0);\n const [selection, setSelection] = React.useState<RowColCoords>([undefined,undefined]);\n const [focusCell, setFocusCell] = React.useState<[number,number]|null>(null);\n const [dataError, setDataError] = React.useState<SpreadsheetDataError|null>(null);\n const [pendingCellValueAndFormat, setPendingCellValueAndFormat] = React.useState<PendingCellValueAndFormat|null>(null);\n const [[gridRowOffset, gridColumnOffset], setGridScrollState] = React.useState<[number,number]>([0, 0]);\n\n const dataRowCount = data.getRowCount(snapshot);\n const rowCount = Math.max(minRowCount, dataRowCount, hwmRowIndex+1, focusCell ? focusCell[0]+1 : 0);\n const rowMapping = data.getRowItemOffsetMapping(snapshot);\n const rowOffset = rowMapping.itemOffset(rowCount);\n const dataColumnCount = data.getColumnCount(snapshot);\n const columnCount = Math.max(minColumnCount, dataColumnCount, hwmColumnIndex+1, focusCell ? focusCell[1]+1 : 0);\n const columnMapping = data.getColumnItemOffsetMapping(snapshot);\n const columnOffset = columnMapping.itemOffset(columnCount);\n\n React.useEffect(() => {\n scrollRef.current?.scrollTo(gridRowOffset, gridColumnOffset);\n }, [gridRowOffset, gridColumnOffset])\n\n React.useEffect(() => {\n focusSinkRef.current?.focus({preventScroll: true})\n }, [focusCell])\n\n function onScroll(rowOffsetValue: number, columnOffsetValue: number) {\n if (rowOffsetValue == gridRowOffset && columnOffsetValue == gridColumnOffset)\n return;\n\n if (rowOffsetValue == 0)\n setHwmRowIndex(0);\n else if (scrollRef.current && (rowOffsetValue + scrollRef.current.clientHeight == rowOffset)) {\n // Infinite scrolling if we've reached the end\n if (hwmRowIndex < rowCount && rowCount < maxRowCount)\n setHwmRowIndex(rowCount);\n }\n\n if (columnOffsetValue == 0)\n setHwmColumnIndex(0);\n else if (scrollRef.current && (columnOffsetValue + scrollRef.current.clientWidth == columnOffset)) {\n // Infinite scrolling if we've reached the end\n if (hwmColumnIndex < columnCount && columnCount < maxColumnCount)\n setHwmColumnIndex(columnCount);\n }\n\n setGridScrollState([rowOffsetValue, columnOffsetValue]);\n }\n\n function updateFormula(rowIndex: number, colIndex: number, editMode: boolean) {\n if (rowIndex < dataRowCount && colIndex < dataColumnCount) {\n const dataValue = data.getCellValue(snapshot, rowIndex, colIndex);\n const format = data.getCellFormat(snapshot, rowIndex, colIndex);\n const value = formatContent(dataValue, format);\n setFormula(value);\n setCellValue(editMode ? value : \"\");\n } else {\n setFormula(\"\");\n setCellValue(\"\");\n }\n }\n\n function updateFocus(rowIndex: number, colIndex: number) {\n if (!focusCell || rowIndex != focusCell[0] || colIndex != focusCell[1]) {\n // Reset formula and edit mode only if the focus cell is changing\n updateFormula(rowIndex, colIndex, false);\n setEditMode(false);\n setDataError(null);\n }\n\n // We use change of focusCell state to trigger effect that gives focus to the focus sink\n // Make sure we always change state, even if focus cell hasn't changed. Any click in grid\n // removes focus from focus sink. Need to make sure it's always given back, even if user\n // clicked on focus cell again. \n setFocusCell([rowIndex, colIndex]);\n }\n\n function updateSelection(row: number|undefined, col: number|undefined) {\n if (row === undefined && col === undefined) {\n // Clear out and bail if nothing selected\n setFocusCell(null);\n setFormula(\"\");\n setCellValue(\"\");\n setEditMode(false);\n setDataError(null);\n return;\n }\n\n if (row !== selection[0] || col !== selection[1]) {\n setSelection([row,col]);\n setName(rowColCoordsToRef(row,col));\n }\n\n const rowIndex = row ? row : 0;\n const colIndex = col ? col : 0;\n updateFocus(rowIndex, colIndex);\n }\n\n function ensureVisible(row: number|undefined, col: number|undefined) {\n const scroll = scrollRef.current;\n if (!scroll)\n return;\n\n // Implements same logic as VirtualScrollProxy.scrollToArea so that we can directly update our grid scroll state.\n // React 18+ gives scroll events a lower priority than discrete events like key and mouse clicks. If we use\n // scrollToArea + OnScroll callback we can end up with other state changes being rendered immediately with the\n // scroll related changes being rendered a frame later. \n // Scroll bar position is synchronized with state in an effect post render.\n const rowRange = getRangeToScroll(row, rowMapping);\n const colRange = getRangeToScroll(col, columnMapping);\n\n const newRowOffset = getOffsetToScrollRange(...rowRange, scroll.clientHeight, gridRowOffset, 'visible');\n const newColOffset = getOffsetToScrollRange(...colRange, scroll.clientWidth, gridColumnOffset, 'visible');\n if (newRowOffset !== undefined || newColOffset !== undefined) {\n setGridScrollState([(newRowOffset === undefined) ? gridRowOffset : newRowOffset, (newColOffset === undefined) ? gridColumnOffset : newColOffset]);\n }\n }\n\n // Is cell in selected row or column?\n function isInSelection(row: number|undefined, col: number|undefined): boolean {\n if (row === undefined || col === undefined)\n return false;\n\n return (selection[0] === undefined && col === selection[1]) ||\n (selection[1] === undefined && row === selection[0]);\n }\n\n // Expands grid as needed for target cell\n function selectItem(row: number|undefined, col: number|undefined, keepSelection?: boolean) {\n if (row !== undefined) {\n if (row < 0)\n return;\n if (row >= maxRowCount)\n row = maxRowCount - 1;\n if (row > hwmRowIndex) {\n setHwmRowIndex(row);\n } else if (row == 0)\n setHwmRowIndex(0);\n }\n\n if (col !== undefined) {\n if (col < 0)\n return;\n if (col >= maxColumnCount)\n col = maxColumnCount - 1;\n if (col > hwmColumnIndex) {\n setHwmColumnIndex(col);\n } else if (col == 0)\n setHwmColumnIndex(0);\n }\n\n // If desired and possible move focus within existing selection rather than changing selection\n if (keepSelection && isInSelection(row,col)) {\n const rowIndex = row ? row : 0;\n const colIndex = col ? col : 0;\n updateFocus(rowIndex, colIndex);\n } else {\n updateSelection(row,col);\n }\n ensureVisible(row,col);\n }\n\n // Move on to next cell. \n // Moves within selected row or column. If none moves vertically if isVertical otherwise horizontally. \n // Move backwards (left/dup) if isBackwards, otherwise forwards\n function nextCell(row: number, col: number, isVertical: boolean, isBackwards: boolean) {\n if (selection[0] === undefined && selection[1] === undefined)\n return;\n\n const offset = isBackwards ? -1 : 1;\n\n if (selection[0] === undefined) {\n // Column selected - move vertically within existing selection\n selectItem(row+offset, col, true);\n } else if (selection[1] === undefined) {\n // Row selected - move horizontally within existing selection\n selectItem(row, col+offset, true);\n } else {\n // Cell selected\n if (isVertical)\n selectItem(row+offset,col);\n else\n selectItem(row,col+offset);\n }\n }\n\n function onNameKeyUp(event: React.KeyboardEvent<HTMLInputElement>) {\n if (event.key !== \"Enter\")\n return;\n\n const [row, col] = rowColRefToCoords(name);\n selectItem(row,col);\n }\n\n function parseFormula(formula: string): [CellValue, string|undefined] {\n let value: CellValue = undefined;\n let format: string | undefined = undefined;\n const parseData = numfmt.parseValue(formula);\n if (parseData) {\n // number or boolean\n value = parseData.v;\n format = parseData.z;\n } else {\n // string\n value = formula;\n }\n\n return [value, format];\n }\n\n async function commitFormulaChange(row: number, column: number, isVertical: boolean, nextCellBackwards: boolean): Promise<void> {\n if (pendingCellValueAndFormat) {\n setDataError(storageError(\"Waiting for previous update to complete ...\"));\n return;\n }\n\n // Optimistic update\n const [value, format] = parseFormula(formula);\n setEditMode(false);\n setDataError(null);\n nextCell(row, column, isVertical, nextCellBackwards);\n\n setPendingCellValueAndFormat({ row, column, value, format })\n const result = await data.setCellValueAndFormat(row, column, value, format);\n setPendingCellValueAndFormat(null);\n\n if (result.isOk()) {\n // In case we tried to commit while pending\n setDataError(null);\n } else {\n // Update failed so put things back how they were at point of save\n setSelection(selection);\n setFocusCell(focusCell);\n setName(name);\n setEditMode(editMode);\n setFormula(formula);\n setCellValue(cellValue);\n setDataError(result.error);\n }\n }\n\n function validateFocusFormula(formula: string) {\n if (!focusCell)\n return;\n\n const row = focusCell[0];\n const col = focusCell[1];\n\n const [value, format] = parseFormula(formula);\n const result = data.isValidCellValueAndFormat(row, col, value, format);\n setDataError(result.isOk() ? null : result.error);\n return result.isOk();\n }\n\n // Used by both formula and focus sink input fields\n function onEditValueKeyDown(event: React.KeyboardEvent<HTMLInputElement>) {\n if (!focusCell)\n return;\n\n const row = focusCell[0];\n const col = focusCell[1];\n\n if (editMode) {\n switch (event.key) {\n case \"Escape\": { \n updateFormula(row, col, false); \n setEditMode(false);\n setDataError(null);\n setFocusCell([row, col]); \n } \n break;\n\n case \"Enter\": { \n void commitFormulaChange(row, col, true, event.shiftKey);\n } \n break;\n\n case \"Tab\": { \n void commitFormulaChange(row, col, false, event.shiftKey);\n event.preventDefault();\n }\n break;\n }\n } else {\n switch (event.key) {\n case \"ArrowDown\": { selectItem(row+1,col); event.preventDefault(); } break;\n case \"ArrowUp\": { selectItem(row-1,col); event.preventDefault(); } break;\n case \"ArrowLeft\": { selectItem(row,col-1); event.preventDefault(); } break;\n case \"ArrowRight\": { selectItem(row,col+1); event.preventDefault(); } break;\n case \"Tab\": { nextCell(row,col,false,event.shiftKey); event.preventDefault(); } break;\n case \"Enter\": { \n if (isInSelection(row,col)) {\n nextCell(row,col,true,event.shiftKey);\n } else {\n updateFormula(row, col, true); \n if (readOnly)\n nextCell(row,col,true,event.shiftKey);\n else\n setEditMode(true);\n }\n } \n break;\n }\n }\n }\n\n function colSelected(index: number) { return (selection[0] == undefined && selection[1] == index) }\n function colCellSelected(index: number) { \n return (selection[0] != undefined) && (selection[1] == undefined || selection[1] == index)\n }\n function rowSelected(index: number) { return (selection[0] == index && selection[1] == undefined) }\n function rowCellSelected(index: number) { \n return (selection[1] != undefined) && (selection[0] == undefined || selection[0] == index)\n }\n\n const colHeaderRender: VirtualContainerRender = ({...rest}, ref) => (\n <div ref={ref}\n onClick={(event) => {\n const [x,_] = getCurrentTargetXY(event);\n const colOffset = x + gridColumnOffset;\n const [colIndex] = columnMapping.offsetToItem(colOffset);\n updateSelection(undefined,colIndex);\n }} \n {...rest}/>\n )\n\n const rowHeaderRender: VirtualContainerRender = ({...rest}, ref) => (\n <div ref={ref}\n onClick={(event) => {\n const [_,y] = getCurrentTargetXY(event);\n const rowOffset = y + gridRowOffset;\n const [rowIndex] = rowMapping.offsetToItem(rowOffset);\n updateSelection(rowIndex, undefined);\n }} \n {...rest}/>\n )\n \n const colRender: HeaderItemRender = (index, style ) => (\n <div className={join(theme?.VirtualSpreadsheet_Column, \n ifdef(colSelected(index), theme?.VirtualSpreadsheet_Column__Selected),\n ifdef(colCellSelected(index), theme?.VirtualSpreadsheet_Column__CellSelected))} \n style={style}>\n { indexToColRef(index) }\n </div>\n );\n \n const rowRender: HeaderItemRender = (index, style) => (\n <div className={join(theme?.VirtualSpreadsheet_Row, \n ifdef(rowSelected(index), theme?.VirtualSpreadsheet_Row__Selected),\n ifdef(rowCellSelected(index), theme?.VirtualSpreadsheet_Row__CellSelected))}\n style={style}>\n { index+1 }\n </div>\n );\n \n const outerGridRender: VirtualContainerRender = ({children, style, ...rest}, ref) => {\n let focusSink, errorTag, errorTagAlign;\n if (focusCell) {\n const row = focusCell[0];\n const col = focusCell[1];\n\n // Position focus sink underneath focused cell. If outside viewport clamp position.\n // Careful - focus cell might be bigger than the viewport!\n const focusHeight = rowMapping.itemSize(row);\n let focusTop = rowMapping.itemOffset(row) - gridRowOffset;\n if (focusTop < -focusHeight)\n focusTop = -focusHeight;\n else if (focusTop > height)\n focusTop = height;\n\n const focusWidth = columnMapping.itemSize(col);\n let focusLeft = columnMapping.itemOffset(col) - gridColumnOffset;\n if (focusLeft < -focusWidth)\n focusLeft = -focusWidth;\n else if (focusLeft > width)\n focusLeft = width;\n\n // Browser will try and bring focus sink into view in various scenarios like text being typed or user\n // giving it focus by tabbing between fields. All browsers I tested make a horrible mess of things\n // due to the sticky positioning. Need to use my own ensureVisible method to clean up.\n focusSink = <input\n ref={focusSinkRef}\n className={join(theme?.VirtualSpreadsheet_Cell, theme?.VirtualSpreadsheet_Cell__Focus, \n ifdef(dataError, theme?.VirtualSpreadsheet_Cell__DataError)) }\n type={\"text\"}\n name={\"edit\"}\n title={\"Edit\"}\n readOnly={readOnly}\n value={cellValue}\n onChange={(event) => {\n const value = event.target?.value;\n setCellValue(value);\n setEditMode(!readOnly);\n setFormula(value);\n validateFocusFormula(value);\n }}\n onFocus={() => { ensureVisible(row,col) }}\n onBeforeInput={() => { ensureVisible(row,col) }}\n onKeyDown={onEditValueKeyDown}\n style={{ zIndex: editMode ? 1 : -1, position: \"absolute\", top: focusTop, height: focusHeight, left: focusLeft, width: focusWidth }}\n />\n\n if (dataError) {\n let message = dataError.message;\n if (dataError.type == 'StorageError' && dataError.statusCode == 409) {\n const status = data.getLoadStatus(snapshot);\n if (status.isOk()) {\n if (status.value)\n message = \"Client was out of sync, review changes and try again\";\n else\n message = \"Client out of sync, loading ...\"\n }\n }\n errorTagAlign = (focusTop > height/2) ? \"start\" : \"end\";\n errorTag = <div className={theme?.VirtualSpreadsheet_ErrorTag} style={{ zIndex: 2 }}>\n {message}\n </div>\n }\n }\n\n if (!dataError) {\n const status = data.getLoadStatus(snapshot);\n if (status.isErr()) {\n errorTagAlign = \"end\";\n errorTag = <div className={theme?.VirtualSpreadsheet_ErrorTag} style={{ zIndex: 2 }}>\n {status.error.message}\n </div>\n } else if (!status.value) {\n errorTagAlign = \"end\";\n errorTag = <div className={theme?.VirtualSpreadsheet_ErrorTag} style={{ zIndex: 2 }}>\n {\"Loading ...\"}\n </div>\n }\n }\n\n return <div ref={ref}\n style={{...style, display: \"flex\", alignItems: errorTagAlign, justifyContent: \"center\"}}\n onClick={(event) => {\n const [x,y] = getCurrentTargetXY(event);\n const colOffset = x + gridColumnOffset;\n const rowOffset = y + gridRowOffset;\n const [rowIndex] = rowMapping.offsetToItem(rowOffset);\n const [colIndex] = columnMapping.offsetToItem(colOffset);\n updateSelection(rowIndex,colIndex);\n }} \n onDoubleClick={(_event) => {\n setCellValue(formula);\n setEditMode(!readOnly);\n }} \n {...rest}>\n {children}\n {focusSink}\n {errorTag}\n </div>\n }\n\n const cellRender: CellRender = (rowIndex, columnIndex, style) => {\n let dataValue: CellValue = undefined;\n let value:string = \"\";\n let isPending = false;\n\n if (pendingCellValueAndFormat && pendingCellValueAndFormat.row == rowIndex && pendingCellValueAndFormat.column == columnIndex) {\n dataValue = pendingCellValueAndFormat.value\n value = formatContent(dataValue, pendingCellValueAndFormat.format);\n isPending = true;\n } else if (rowIndex < dataRowCount && columnIndex < dataColumnCount) {\n dataValue = data.getCellValue(snapshot, rowIndex, columnIndex);\n const format = data.getCellFormat(snapshot, rowIndex, columnIndex);\n value = formatContent(dataValue, format);\n }\n\n const focused = focusCell && rowIndex == focusCell[0] && columnIndex == focusCell[1];\n const classNames = join(theme?.VirtualSpreadsheet_Cell,\n ifdef(rowSelected(rowIndex), theme?.VirtualSpreadsheet_Cell__RowSelected),\n ifdef(colSelected(columnIndex), theme?.VirtualSpreadsheet_Cell__ColumnSelected),\n ifdef(isPending, theme?.VirtualSpreadsheet_Cell__UpdatePending),\n classForType(dataValue),\n ifdef(focused, theme?.VirtualSpreadsheet_Cell__Focus));\n\n return <div className={classNames} style={style}>\n { value }\n </div>\n };\n\n const columnTemplate = `${rowHeaderWidth}px 1fr`;\n const rowTemplate = `${inputBarHeight}px ${columnHeaderHeight}px 1fr`;\n const minWidth = rowHeaderWidth * 2;\n const minHeight = inputBarHeight + columnHeaderHeight * 2;\n const gridWidth = Math.max(width - rowHeaderWidth, rowHeaderWidth);\n const gridHeight = Math.max(height - columnHeaderHeight - inputBarHeight, columnHeaderHeight);\n\n return (\n <div className={join(props.className, theme?.VirtualSpreadsheet)} \n style={{ width, height, minWidth, minHeight, display: \"grid\", gridTemplateColumns: columnTemplate, gridTemplateRows: rowTemplate }}>\n <div className={theme?.VirtualSpreadsheet_InputBar} style={{overflow: 'hidden', display: 'flex', gridColumnStart: 1, gridColumnEnd: 3}}>\n <input className={theme?.VirtualSpreadsheet_Name}\n type={\"text\"}\n name={\"name\"}\n title={\"Name\"}\n value={name}\n size={20}\n onChange={(event) => {\n setName(event.target?.value);\n }}\n onKeyUp={onNameKeyUp}\n />\n <label className={theme?.VirtualSpreadsheet_Fx}>fx</label>\n <input className={join(theme?.VirtualSpreadsheet_Formula, ifdef(dataError, theme?.VirtualSpreadsheet_Formula__DataError))}\n style={{flexGrow: 1}}\n type={\"text\"}\n readOnly={readOnly}\n name={\"formula\"}\n title={\"Formula\"}\n value={formula}\n onChange={(event) => {\n const value = event.target?.value;\n setFormula(value);\n setEditMode(!readOnly);\n if (focusCell)\n setCellValue(value);\n validateFocusFormula(value);\n }}\n onFocus={() => {\n if (focusCell) {\n setCellValue(formula);\n setEditMode(!readOnly);\n }\n }}\n onKeyDown={onEditValueKeyDown}\n />\n </div>\n\n <div className={theme?.VirtualSpreadsheet_CornerHeader}></div>\n\n <DisplayList\n offset={gridColumnOffset}\n className={theme?.VirtualSpreadsheet_ColumnHeader}\n itemData={colRender}\n outerRender={colHeaderRender}\n height={columnHeaderHeight}\n itemCount={columnCount}\n itemOffsetMapping={columnMapping}\n layout={'horizontal'}\n width={gridWidth}>\n {HeaderItem}\n </DisplayList>\n\n <DisplayList\n offset={gridRowOffset}\n className={theme?.VirtualSpreadsheet_RowHeader}\n itemData={rowRender}\n outerRender={rowHeaderRender}\n height={gridHeight}\n itemCount={rowCount}\n itemOffsetMapping={rowMapping}\n width={rowHeaderWidth}>\n {HeaderItem}\n </DisplayList>\n\n <VirtualScroll\n className={theme?.VirtualSpreadsheet_Grid}\n ref={scrollRef}\n onScroll={onScroll}\n height={gridHeight}\n width={gridWidth}\n scrollHeight={rowOffset}\n scrollWidth={columnOffset}\n useOffsets={false}\n maxCssSize={props.maxCssSize}\n minNumPages={props.minNumPages}>\n {(_) => (\n <AutoSizer style={{ height: '100%', width: '100%' }}>\n {({height,width}) => (\n <DisplayGrid\n rowOffset={gridRowOffset}\n columnOffset={gridColumnOffset}\n height={height}\n width={width}\n itemData={cellRender}\n outerRender={outerGridRender}\n rowCount={rowCount}\n rowOffsetMapping={rowMapping}\n columnCount={columnCount}\n columnOffsetMapping={columnMapping}>\n {Cell}\n </DisplayGrid>\n )}\n </AutoSizer>\n )}\n </VirtualScroll>\n </div>\n )\n}\n"],"names":["_jsx","_jsxs"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/VirtualSpreadsheetTheme.ts","../src/VirtualSpreadsheet.tsx"],"sourcesContent":["/**\n * Theme that defines class names for all DOM elements within {@link VirtualSpreadsheet}. Provide an appropriate\n * theme to use VirtualSpreadsheet with whatever CSS management system you prefer.\n * \n * Properties are named using a BEM style with the form `ComponentName_ElementName__modifierName_modifierValue`\n */\nexport interface VirtualSpreadsheetTheme {\n /** Class applied to the overall component */\n VirtualSpreadsheet: string,\n\n /** Class applied to the input bar at the top of the component */\n VirtualSpreadsheet_InputBar: string,\n\n /** Class applied to the Name input on the left end of the input bar */\n VirtualSpreadsheet_Name: string,\n\n /** Class applied to the \"fx\" label in the input bar */\n VirtualSpreadsheet_Fx: string,\n\n /** Class applied to the Formula input on the right end of the input bar */\n VirtualSpreadsheet_Formula: string,\n\n /** Modifier class applied to the Formula input when the user has entered invalid data */\n VirtualSpreadsheet_Formula__DataError: string,\n\n /** Class applied to the grid of cells */\n VirtualSpreadsheet_Grid: string,\n\n /** Class applied to the top left corner where the row and column headers meet */\n VirtualSpreadsheet_CornerHeader: string,\n\n /** Class applied to the column header */\n VirtualSpreadsheet_ColumnHeader: string,\n\n /** Class applied to an individual column within the column header */\n VirtualSpreadsheet_Column: string,\n\n /** Modifier class applied to a column when it's selected */\n VirtualSpreadsheet_Column__Selected: string,\n\n /** Modifier class applied to a column when a cell in that column is selected */\n VirtualSpreadsheet_Column__CellSelected: string,\n\n /** Class applied to the row header */\n VirtualSpreadsheet_RowHeader: string,\n\n /** Class applied to an individual row within the row header */\n VirtualSpreadsheet_Row: string,\n\n /** Modifier class applied to a row when it's selected */\n VirtualSpreadsheet_Row__Selected: string,\n\n /** Modifier class applied to a row when a cell in that row is selected */\n VirtualSpreadsheet_Row__CellSelected: string,\n\n /** Class applied to a cell within the grid*/ \n VirtualSpreadsheet_Cell: string,\n\n /** Modifier class applied to a cell when it contains a string value */\n VirtualSpreadsheet_Cell__Type_string: string,\n\n /** Modifier class applied to a cell when it contains a number value */\n VirtualSpreadsheet_Cell__Type_number: string,\n\n /** Modifier class applied to a cell when it contains a boolean value */\n VirtualSpreadsheet_Cell__Type_boolean: string,\n\n /** Modifier class applied to a cell when it contains a null value */\n VirtualSpreadsheet_Cell__Type_null: string,\n\n /** Modifier class applied to a cell when it contains an undefined value */\n VirtualSpreadsheet_Cell__Type_undefined: string,\n\n /** Modifier class applied to a cell when it contains an error value */\n VirtualSpreadsheet_Cell__Type_CellError: string,\n\n /** Modifier class applied to a cell when it has the focus */\n VirtualSpreadsheet_Cell__Focus: string,\n\n /** Modifier class applied to a cell when it's within a selected row */\n VirtualSpreadsheet_Cell__RowSelected: string,\n\n /** Modifier class applied to a cell when it's within a selected column */\n VirtualSpreadsheet_Cell__ColumnSelected: string,\n\n /** Modifier class applied to a cell when an update is pending */\n VirtualSpreadsheet_Cell__UpdatePending: string,\n\n /** Modifier class applied to a cell when the user has entered invalid data */\n VirtualSpreadsheet_Cell__DataError: string,\n\n /** Class applied to an in grid error tag */\n VirtualSpreadsheet_ErrorTag: string,\n}\n\n/** Default implementation of theme provided by `VirtualSpreadsheet.css` */\nexport const VirtualSpreadsheetDefaultTheme: VirtualSpreadsheetTheme = {\n VirtualSpreadsheet: \"VirtualSpreadsheet\",\n VirtualSpreadsheet_InputBar: \"VirtualSpreadsheet_InputBar\",\n VirtualSpreadsheet_Name: \"VirtualSpreadsheet_Name\",\n VirtualSpreadsheet_Fx: \"VirtualSpreadsheet_Fx\",\n VirtualSpreadsheet_Formula: \"VirtualSpreadsheet_Formula\",\n VirtualSpreadsheet_Formula__DataError: \"VirtualSpreadsheet_Formula__DataError\",\n VirtualSpreadsheet_Grid: \"VirtualSpreadsheet_Grid\",\n VirtualSpreadsheet_CornerHeader: \"VirtualSpreadsheet_CornerHeader\",\n VirtualSpreadsheet_ColumnHeader: \"VirtualSpreadsheet_ColumnHeader\",\n VirtualSpreadsheet_Column: \"VirtualSpreadsheet_Column\",\n VirtualSpreadsheet_Column__Selected: \"VirtualSpreadsheet_Column__Selected\",\n VirtualSpreadsheet_Column__CellSelected: \"VirtualSpreadsheet_Column__CellSelected\",\n VirtualSpreadsheet_RowHeader: \"VirtualSpreadsheet_RowHeader\",\n VirtualSpreadsheet_Row: \"VirtualSpreadsheet_Row\",\n VirtualSpreadsheet_Row__Selected: \"VirtualSpreadsheet_Row__Selected\",\n VirtualSpreadsheet_Row__CellSelected: \"VirtualSpreadsheet_Row__CellSelected\",\n VirtualSpreadsheet_Cell__UpdatePending: \"VirtualSpreadsheet_Cell__UpdatePending\",\n VirtualSpreadsheet_Cell: \"VirtualSpreadsheet_Cell\",\n VirtualSpreadsheet_Cell__Type_string: \"VirtualSpreadsheet_Cell__Type_string\",\n VirtualSpreadsheet_Cell__Type_number: \"VirtualSpreadsheet_Cell__Type_number\",\n VirtualSpreadsheet_Cell__Type_boolean: \"VirtualSpreadsheet_Cell__Type_boolean\",\n VirtualSpreadsheet_Cell__Type_null: \"VirtualSpreadsheet_Cell__Type_null\",\n VirtualSpreadsheet_Cell__Type_undefined: \"VirtualSpreadsheet_Cell__Type_undefined\",\n VirtualSpreadsheet_Cell__Type_CellError: \"VirtualSpreadsheet_Cell__Type_CellError\",\n VirtualSpreadsheet_Cell__Focus: \"VirtualSpreadsheet_Cell__Focus\",\n VirtualSpreadsheet_Cell__RowSelected: \"VirtualSpreadsheet_Cell__RowSelected\",\n VirtualSpreadsheet_Cell__ColumnSelected: \"VirtualSpreadsheet_Cell__ColumnSelected\",\n VirtualSpreadsheet_Cell__DataError: \"VirtualSpreadsheet_Cell__DataError\",\n VirtualSpreadsheet_ErrorTag: \"VirtualSpreadsheet_ErrorTag\"\n}\n","import React from 'react';\nimport { DisplayList, DisplayGrid, AutoSizer, VirtualContainerRender, VirtualScroll, VirtualScrollProxy,\n getRangeToScroll, getOffsetToScrollRange } from '@candidstartup/react-virtual-scroll';\nimport type { VirtualSpreadsheetTheme } from './VirtualSpreadsheetTheme';\nimport { SpreadsheetData, SpreadsheetDataError, CellValue, CellFormat, CellData, indexToColRef, RowColCoords, \n rowColRefToCoords, rowColCoordsToRef, storageError} from '@candidstartup/infinisheet-types'\nimport * as numfmt from 'numfmt'\n\n/** Extension of {@link SpreadsheetData} interface so that it's compatible with React's `useSyncExternalStore` hook\n * \n * Additional properties are optional, so anything that implements `SpreadsheetData` is compatible with something\n * that accepts `ReactSpreadsheetData`.\n */\nexport interface ReactSpreadsheetData<Snapshot> extends SpreadsheetData<Snapshot> {\n /** Used by `useSyncExternalStore` to support server side rendering */\ngetServerSnapshot?: (() => Snapshot) | undefined\n}\n\n/**\n * Props for {@link VirtualSpreadsheetGeneric}\n * \n * @typeParam Snapshot - Type of snapshot for `SpreadsheetData`\n */\nexport interface VirtualSpreadsheetGenericProps<Snapshot> {\n /** The `className` applied to the spreadsheet as a whole */\n className?: string | undefined,\n\n /** Spreadsheet theme which defines the CSS classes to apply\n * \n * Defined as a union so that it supports both hand written themes\n * defined as implementations of {@link VirtualSpreadsheetTheme} and themes\n * implicitly defined by importing a CSS module. \n */\n theme?: VirtualSpreadsheetTheme | Record<string, string> | undefined,\n\n /** Component height */\n height: number,\n\n /** Component width */\n width: number,\n\n /** Height of input bar\n * @defaultValue 30\n */\n inputBarHeight?: number | undefined,\n\n /** Height of column header\n * @defaultValue 50\n */\n columnHeaderHeight?: number | undefined,\n\n /** Width of row header\n * @defaultValue 100\n */\n rowHeaderWidth?: number | undefined,\n\n /** Data to display and edit */\n data: ReactSpreadsheetData<Snapshot>,\n\n /** Disables edit mode if true\n * @defaultValue false\n */\n readOnly?: boolean, \n\n /** Minimum number of rows in the spreadsheet \n * @defaultValue 100\n */\n minRowCount?: number | undefined,\n\n /** Maximum number of rows in the spreadsheet \n * @defaultValue 1000000000000\n */\n maxRowCount?: number | undefined,\n\n /** Minimum number of columns in the grid \n * @defaultValue 26\n */\n minColumnCount?: number | undefined,\n\n /** Maximum umber of columns in the grid \n * @defaultValue 1000000000000\n */\n maxColumnCount?: number | undefined,\n\n /** \n * Maximum size for CSS element beyond which layout breaks. You should never normally need to change this. \n * The default value is compatible with all major browsers.\n * \n * @defaultValue 6000000\n * */\n maxCssSize?: number | undefined,\n\n /**\n * The minimum number of virtual pages to use when inner container would otherwise be more than {@link VirtualSpreadsheetProps.maxCssSize} big.\n * You should never normally need to change this.\n * \n * @defaultValue 100\n */\n minNumPages?: number | undefined\n}\n\n/**\n * Props for {@link VirtualSpreadsheet}\n */\nexport interface VirtualSpreadsheetProps extends VirtualSpreadsheetGenericProps<unknown> {\n}\n\nfunction join(...v: (string|undefined)[]) {\n let s: string|undefined = undefined;\n v.forEach(a => {\n if (s && a)\n s = s + ' ' + a;\n else if (a)\n s = a;\n });\n return s;\n}\n\nfunction ifdef(b: boolean|object|null, s: string|undefined) { return (b) ? s : undefined }\n\n// Options for numfmt that match Google Sheets and ECMA-376 behavior. This is compatible with supported dates in Excel apart from Jan/Feb 1900. \n// This is due to Excel's backwards compatibility support for the Lotus 1-2-3 leap year bug that incorrectly thinks 1900 is a leap year.\nconst numfmtOptions = {\n leap1900: false,\n dateSpanLarge: true\n}\n\nfunction formatContent(value: CellValue, format: CellFormat): string {\n if (value === null || value === undefined)\n return \"\";\n\n if (typeof value === 'object')\n return value.value;\n\n if (typeof value === 'string' && value[0] == '\\'') {\n // Leading apostrophe means display rest of string as is\n return value.substring(1);\n }\n\n if (format === undefined)\n format = \"\";\n\n return numfmt.format(format, value, numfmtOptions);\n}\n\nfunction classForType(value: CellValue) {\n if (value === null)\n return 'VirtualSpreadsheet_Cell__Type_null';\n if (value === undefined)\n return 'VirtualSpreadsheet_Cell__Type_undefined';\n\n const type = typeof value;\n if (type === 'object')\n return 'VirtualSpreadsheet_Cell__Type_CellError';\n\n return 'VirtualSpreadsheet_Cell__Type_' + type;\n}\n\nfunction inRect(x: number, y: number, rect: DOMRect) {\n return (x >= rect.left && x < rect.right && y >= rect.top && y < rect.bottom);\n}\n\n// Return mouse coordinates in space of current event target. Not directly available so we convert\n// using client coordinates.\nfunction getCurrentTargetXY(event: React.MouseEvent<HTMLDivElement>): [number,number] {\n let clientX = event.clientX;\n let clientY = event.clientY;\n if (event.target !== event.currentTarget) {\n const target = event.target as Element;\n const targetRect = target.getBoundingClientRect();\n if (!inRect(clientX, clientY, targetRect))\n {\n // Sometimes get events with bogus client XY, often generated by some form of automation\n // If this happens behave as if middle of target rect was clicked\n clientX = (targetRect.left + targetRect.right) / 2;\n clientY = (targetRect.top + targetRect.bottom) / 2;\n }\n }\n\n const currentRect = event.currentTarget.getBoundingClientRect();\n if (!inRect(clientX, clientY, currentRect)) {\n // Somethings gone horribly wrong\n return [0,0];\n }\n\n return [clientX - currentRect.left, clientY - currentRect.top];\n}\n\ntype HeaderItemRender = (index: number, style: React.CSSProperties) => React.JSX.Element;\nfunction HeaderItem({ index, data, style }: { index: number, data:unknown, style: React.CSSProperties }) {\n const itemRender = data as HeaderItemRender;\n return itemRender(index, style);\n}\n\ntype CellRender = (rowIndex: number, columnIndex: number, style: React.CSSProperties) => React.JSX.Element;\nfunction Cell({ rowIndex, columnIndex, data, style }: { rowIndex: number, columnIndex: number, data: unknown, style: React.CSSProperties }) {\n const cellRender = data as CellRender;\n return cellRender(rowIndex, columnIndex, style);\n}\n\ninterface PendingCellValueAndFormat extends CellData {\n row: number, \n column: number,\n};\n\n/**\n * Virtual Spreadsheet\n * \n * Accepts props defined by {@link VirtualSpreadsheetProps}. \n * You must pass an instance of {@link SpreadsheetData} using the `data` prop.\n * \n * @remarks\n * \n * For most cases use this rather than {@link VirtualSpreadsheetGeneric}.\n * \n * Accepts all parameterizations of `SpreadsheetData`. Implemented as `VirtualSpreadsheetGeneric<unknown>`.\n * \n * @group Components\n */\nexport function VirtualSpreadsheet(props: VirtualSpreadsheetProps) {\n return VirtualSpreadsheetGeneric(props);\n}\n\n/**\n * Generic version of Virtual Spreadsheet\n * \n * Accepts props defined by {@link VirtualSpreadsheetGenericProps}. \n * You must pass an instance of {@link SpreadsheetData} with a compatible `Snapshot` parameter using the `data` prop.\n * \n * @remarks\n * \n * In almost all cases use {@link VirtualSpreadsheet} instead. Only use this if you need to restrict the types of `SpreadsheetData`\n * that can be used based on `Snapshot` type.\n * \n * @typeParam Snapshot - Type of snapshot for `SpreadsheetData`\n * \n * @group Components\n */\nexport function VirtualSpreadsheetGeneric<Snapshot>(props: VirtualSpreadsheetGenericProps<Snapshot>) {\n const { width, height, inputBarHeight=30, columnHeaderHeight=50, rowHeaderWidth=100,\n theme, data, readOnly=false, minRowCount=100, minColumnCount=26, maxRowCount=1000000000000, maxColumnCount=1000000000000 } = props;\n const scrollRef = React.useRef<VirtualScrollProxy>(null);\n const focusSinkRef = React.useRef<HTMLInputElement>(null);\n\n // Originally passed data.subscribe.bind(data) to useCallback. It works but React hooks lint fails because it can only validate\n // dependencies for an inline function.\n const subscribeFn = React.useCallback((cb: () => void) => data.subscribe(cb), [data]); \n const snapshot = React.useSyncExternalStore<Snapshot>(subscribeFn, data.getSnapshot.bind(data), data.getServerSnapshot?.bind(data));\n\n const [name, setName] = React.useState(\"\");\n const [formula, setFormula] = React.useState(\"\");\n const [cellValue, setCellValue] = React.useState(\"\");\n const [editMode, setEditMode] = React.useState(false);\n const [hwmRowIndex, setHwmRowIndex] = React.useState(0);\n const [hwmColumnIndex, setHwmColumnIndex] = React.useState(0);\n const [selection, setSelection] = React.useState<RowColCoords>([undefined,undefined]);\n const [focusCell, setFocusCell] = React.useState<[number,number]|null>(null);\n const [dataError, setDataError] = React.useState<SpreadsheetDataError|null>(null);\n const [pendingCellValueAndFormat, setPendingCellValueAndFormat] = React.useState<PendingCellValueAndFormat|null>(null);\n const [[gridRowOffset, gridColumnOffset], setGridScrollState] = React.useState<[number,number]>([0, 0]);\n\n const dataRowCount = data.getRowCount(snapshot);\n const rowCount = Math.max(minRowCount, dataRowCount, hwmRowIndex+1, focusCell ? focusCell[0]+1 : 0);\n const rowMapping = data.getRowItemOffsetMapping(snapshot);\n const rowOffset = rowMapping.itemOffset(rowCount);\n const dataColumnCount = data.getColumnCount(snapshot);\n const columnCount = Math.max(minColumnCount, dataColumnCount, hwmColumnIndex+1, focusCell ? focusCell[1]+1 : 0);\n const columnMapping = data.getColumnItemOffsetMapping(snapshot);\n const columnOffset = columnMapping.itemOffset(columnCount);\n\n const minWidth = rowHeaderWidth * 2;\n const minHeight = inputBarHeight + columnHeaderHeight * 2;\n const gridWidth = Math.max(width - rowHeaderWidth, rowHeaderWidth);\n const gridHeight = Math.max(height - columnHeaderHeight - inputBarHeight, columnHeaderHeight);\n\n React.useEffect(() => {\n scrollRef.current?.scrollTo(gridRowOffset, gridColumnOffset);\n }, [gridRowOffset, gridColumnOffset])\n\n React.useEffect(() => {\n focusSinkRef.current?.focus({preventScroll: true})\n }, [focusCell])\n\n React.useEffect(() => {\n data.setViewport({rowMinOffset: gridRowOffset, columnMinOffset: gridColumnOffset, width: gridWidth, height: gridHeight});\n }, [data, gridRowOffset, gridColumnOffset, gridWidth, gridHeight])\n\n function updateGridScrollState(rowOffset: number, columnOffset: number) {\n setGridScrollState([rowOffset, columnOffset]);\n data.setViewport({rowMinOffset: rowOffset, columnMinOffset: columnOffset, width: gridWidth, height: gridHeight});\n }\n\n function onScroll(rowOffsetValue: number, columnOffsetValue: number) {\n if (rowOffsetValue == gridRowOffset && columnOffsetValue == gridColumnOffset)\n return;\n\n if (rowOffsetValue == 0)\n setHwmRowIndex(0);\n else if (scrollRef.current && (rowOffsetValue + scrollRef.current.clientHeight == rowOffset)) {\n // Infinite scrolling if we've reached the end\n if (hwmRowIndex < rowCount && rowCount < maxRowCount)\n setHwmRowIndex(rowCount);\n }\n\n if (columnOffsetValue == 0)\n setHwmColumnIndex(0);\n else if (scrollRef.current && (columnOffsetValue + scrollRef.current.clientWidth == columnOffset)) {\n // Infinite scrolling if we've reached the end\n if (hwmColumnIndex < columnCount && columnCount < maxColumnCount)\n setHwmColumnIndex(columnCount);\n }\n\n updateGridScrollState(rowOffsetValue, columnOffsetValue);\n }\n\n function updateFormula(rowIndex: number, colIndex: number, editMode: boolean) {\n if (rowIndex < dataRowCount && colIndex < dataColumnCount) {\n const dataValue = data.getCellValue(snapshot, rowIndex, colIndex);\n const format = data.getCellFormat(snapshot, rowIndex, colIndex);\n const value = formatContent(dataValue, format);\n setFormula(value);\n setCellValue(editMode ? value : \"\");\n } else {\n setFormula(\"\");\n setCellValue(\"\");\n }\n }\n\n function updateFocus(rowIndex: number, colIndex: number) {\n if (!focusCell || rowIndex != focusCell[0] || colIndex != focusCell[1]) {\n // Reset formula and edit mode only if the focus cell is changing\n updateFormula(rowIndex, colIndex, false);\n setEditMode(false);\n setDataError(null);\n }\n\n // We use change of focusCell state to trigger effect that gives focus to the focus sink\n // Make sure we always change state, even if focus cell hasn't changed. Any click in grid\n // removes focus from focus sink. Need to make sure it's always given back, even if user\n // clicked on focus cell again. \n setFocusCell([rowIndex, colIndex]);\n }\n\n function updateSelection(row: number|undefined, col: number|undefined) {\n if (row === undefined && col === undefined) {\n // Clear out and bail if nothing selected\n setFocusCell(null);\n setFormula(\"\");\n setCellValue(\"\");\n setEditMode(false);\n setDataError(null);\n return;\n }\n\n if (row !== selection[0] || col !== selection[1]) {\n setSelection([row,col]);\n setName(rowColCoordsToRef(row,col));\n }\n\n const rowIndex = row ? row : 0;\n const colIndex = col ? col : 0;\n updateFocus(rowIndex, colIndex);\n }\n\n function ensureVisible(row: number|undefined, col: number|undefined) {\n const scroll = scrollRef.current;\n if (!scroll)\n return;\n\n // Implements same logic as VirtualScrollProxy.scrollToArea so that we can directly update our grid scroll state.\n // React 18+ gives scroll events a lower priority than discrete events like key and mouse clicks. If we use\n // scrollToArea + OnScroll callback we can end up with other state changes being rendered immediately with the\n // scroll related changes being rendered a frame later. \n // Scroll bar position is synchronized with state in an effect post render.\n const rowRange = getRangeToScroll(row, rowMapping);\n const colRange = getRangeToScroll(col, columnMapping);\n\n const newRowOffset = getOffsetToScrollRange(...rowRange, scroll.clientHeight, gridRowOffset, 'visible');\n const newColOffset = getOffsetToScrollRange(...colRange, scroll.clientWidth, gridColumnOffset, 'visible');\n if (newRowOffset !== undefined || newColOffset !== undefined) {\n updateGridScrollState((newRowOffset === undefined) ? gridRowOffset : newRowOffset, (newColOffset === undefined) ? gridColumnOffset : newColOffset);\n }\n }\n\n // Is cell in selected row or column?\n function isInSelection(row: number|undefined, col: number|undefined): boolean {\n if (row === undefined || col === undefined)\n return false;\n\n return (selection[0] === undefined && col === selection[1]) ||\n (selection[1] === undefined && row === selection[0]);\n }\n\n // Expands grid as needed for target cell\n function selectItem(row: number|undefined, col: number|undefined, keepSelection?: boolean) {\n if (row !== undefined) {\n if (row < 0)\n return;\n if (row >= maxRowCount)\n row = maxRowCount - 1;\n if (row > hwmRowIndex) {\n setHwmRowIndex(row);\n } else if (row == 0)\n setHwmRowIndex(0);\n }\n\n if (col !== undefined) {\n if (col < 0)\n return;\n if (col >= maxColumnCount)\n col = maxColumnCount - 1;\n if (col > hwmColumnIndex) {\n setHwmColumnIndex(col);\n } else if (col == 0)\n setHwmColumnIndex(0);\n }\n\n // If desired and possible move focus within existing selection rather than changing selection\n if (keepSelection && isInSelection(row,col)) {\n const rowIndex = row ? row : 0;\n const colIndex = col ? col : 0;\n updateFocus(rowIndex, colIndex);\n } else {\n updateSelection(row,col);\n }\n ensureVisible(row,col);\n }\n\n // Move on to next cell. \n // Moves within selected row or column. If none moves vertically if isVertical otherwise horizontally. \n // Move backwards (left/dup) if isBackwards, otherwise forwards\n function nextCell(row: number, col: number, isVertical: boolean, isBackwards: boolean) {\n if (selection[0] === undefined && selection[1] === undefined)\n return;\n\n const offset = isBackwards ? -1 : 1;\n\n if (selection[0] === undefined) {\n // Column selected - move vertically within existing selection\n selectItem(row+offset, col, true);\n } else if (selection[1] === undefined) {\n // Row selected - move horizontally within existing selection\n selectItem(row, col+offset, true);\n } else {\n // Cell selected\n if (isVertical)\n selectItem(row+offset,col);\n else\n selectItem(row,col+offset);\n }\n }\n\n function onNameKeyUp(event: React.KeyboardEvent<HTMLInputElement>) {\n if (event.key !== \"Enter\")\n return;\n\n const [row, col] = rowColRefToCoords(name);\n selectItem(row,col);\n }\n\n function parseFormula(formula: string): [CellValue, string|undefined] {\n let value: CellValue = undefined;\n let format: CellFormat = undefined;\n const parseData = numfmt.parseValue(formula);\n if (parseData) {\n // number or boolean\n value = parseData.v;\n format = parseData.z;\n } else {\n // string\n value = formula;\n }\n\n return [value, format];\n }\n\n async function commitFormulaChange(row: number, column: number, isVertical: boolean, nextCellBackwards: boolean): Promise<void> {\n if (pendingCellValueAndFormat) {\n setDataError(storageError(\"Waiting for previous update to complete ...\"));\n return;\n }\n\n // Optimistic update\n const [value, format] = parseFormula(formula);\n setEditMode(false);\n setDataError(null);\n nextCell(row, column, isVertical, nextCellBackwards);\n\n setPendingCellValueAndFormat({ row, column, value, format })\n const result = await data.setCellValueAndFormat(row, column, value, format);\n setPendingCellValueAndFormat(null);\n\n if (result.isOk()) {\n // In case we tried to commit while pending\n setDataError(null);\n } else {\n // Update failed so put things back how they were at point of save\n setSelection(selection);\n setFocusCell(focusCell);\n setName(name);\n setEditMode(editMode);\n setFormula(formula);\n setCellValue(cellValue);\n setDataError(result.error);\n }\n }\n\n function validateFocusFormula(formula: string) {\n if (!focusCell)\n return;\n\n const row = focusCell[0];\n const col = focusCell[1];\n\n const [value, format] = parseFormula(formula);\n const result = data.isValidCellValueAndFormat(row, col, value, format);\n setDataError(result.isOk() ? null : result.error);\n return result.isOk();\n }\n\n // Used by both formula and focus sink input fields\n function onEditValueKeyDown(event: React.KeyboardEvent<HTMLInputElement>) {\n if (!focusCell)\n return;\n\n const row = focusCell[0];\n const col = focusCell[1];\n\n if (editMode) {\n switch (event.key) {\n case \"Escape\": { \n updateFormula(row, col, false); \n setEditMode(false);\n setDataError(null);\n setFocusCell([row, col]); \n } \n break;\n\n case \"Enter\": { \n void commitFormulaChange(row, col, true, event.shiftKey);\n } \n break;\n\n case \"Tab\": { \n void commitFormulaChange(row, col, false, event.shiftKey);\n event.preventDefault();\n }\n break;\n }\n } else {\n switch (event.key) {\n case \"ArrowDown\": { selectItem(row+1,col); event.preventDefault(); } break;\n case \"ArrowUp\": { selectItem(row-1,col); event.preventDefault(); } break;\n case \"ArrowLeft\": { selectItem(row,col-1); event.preventDefault(); } break;\n case \"ArrowRight\": { selectItem(row,col+1); event.preventDefault(); } break;\n case \"Tab\": { nextCell(row,col,false,event.shiftKey); event.preventDefault(); } break;\n case \"Enter\": { \n if (isInSelection(row,col)) {\n nextCell(row,col,true,event.shiftKey);\n } else {\n updateFormula(row, col, true); \n if (readOnly)\n nextCell(row,col,true,event.shiftKey);\n else\n setEditMode(true);\n }\n } \n break;\n }\n }\n }\n\n function colSelected(index: number) { return (selection[0] == undefined && selection[1] == index) }\n function colCellSelected(index: number) { \n return (selection[0] != undefined) && (selection[1] == undefined || selection[1] == index)\n }\n function rowSelected(index: number) { return (selection[0] == index && selection[1] == undefined) }\n function rowCellSelected(index: number) { \n return (selection[1] != undefined) && (selection[0] == undefined || selection[0] == index)\n }\n\n const colHeaderRender: VirtualContainerRender = ({...rest}, ref) => (\n <div ref={ref}\n onClick={(event) => {\n const [x,_] = getCurrentTargetXY(event);\n const colOffset = x + gridColumnOffset;\n const [colIndex] = columnMapping.offsetToItem(colOffset);\n updateSelection(undefined,colIndex);\n }} \n {...rest}/>\n )\n\n const rowHeaderRender: VirtualContainerRender = ({...rest}, ref) => (\n <div ref={ref}\n onClick={(event) => {\n const [_,y] = getCurrentTargetXY(event);\n const rowOffset = y + gridRowOffset;\n const [rowIndex] = rowMapping.offsetToItem(rowOffset);\n updateSelection(rowIndex, undefined);\n }} \n {...rest}/>\n )\n \n const colRender: HeaderItemRender = (index, style ) => (\n <div className={join(theme?.VirtualSpreadsheet_Column, \n ifdef(colSelected(index), theme?.VirtualSpreadsheet_Column__Selected),\n ifdef(colCellSelected(index), theme?.VirtualSpreadsheet_Column__CellSelected))} \n style={style}>\n { indexToColRef(index) }\n </div>\n );\n \n const rowRender: HeaderItemRender = (index, style) => (\n <div className={join(theme?.VirtualSpreadsheet_Row, \n ifdef(rowSelected(index), theme?.VirtualSpreadsheet_Row__Selected),\n ifdef(rowCellSelected(index), theme?.VirtualSpreadsheet_Row__CellSelected))}\n style={style}>\n { index+1 }\n </div>\n );\n \n const outerGridRender: VirtualContainerRender = ({children, style, ...rest}, ref) => {\n let focusSink, errorTag, errorTagAlign;\n if (focusCell) {\n const row = focusCell[0];\n const col = focusCell[1];\n\n // Position focus sink underneath focused cell. If outside viewport clamp position.\n // Careful - focus cell might be bigger than the viewport!\n const focusHeight = rowMapping.itemSize(row);\n let focusTop = rowMapping.itemOffset(row) - gridRowOffset;\n if (focusTop < -focusHeight)\n focusTop = -focusHeight;\n else if (focusTop > height)\n focusTop = height;\n\n const focusWidth = columnMapping.itemSize(col);\n let focusLeft = columnMapping.itemOffset(col) - gridColumnOffset;\n if (focusLeft < -focusWidth)\n focusLeft = -focusWidth;\n else if (focusLeft > width)\n focusLeft = width;\n\n // Browser will try and bring focus sink into view in various scenarios like text being typed or user\n // giving it focus by tabbing between fields. All browsers I tested make a horrible mess of things\n // due to the sticky positioning. Need to use my own ensureVisible method to clean up.\n focusSink = <input\n ref={focusSinkRef}\n className={join(theme?.VirtualSpreadsheet_Cell, theme?.VirtualSpreadsheet_Cell__Focus, \n ifdef(dataError, theme?.VirtualSpreadsheet_Cell__DataError)) }\n type={\"text\"}\n name={\"edit\"}\n title={\"Edit\"}\n readOnly={readOnly}\n value={cellValue}\n onChange={(event) => {\n const value = event.target?.value;\n setCellValue(value);\n setEditMode(!readOnly);\n setFormula(value);\n validateFocusFormula(value);\n }}\n onFocus={() => { ensureVisible(row,col) }}\n onBeforeInput={() => { ensureVisible(row,col) }}\n onKeyDown={onEditValueKeyDown}\n style={{ zIndex: editMode ? 1 : -1, position: \"absolute\", top: focusTop, height: focusHeight, left: focusLeft, width: focusWidth }}\n />\n\n if (dataError) {\n let message = dataError.message;\n if (dataError.type == 'StorageError' && dataError.statusCode == 409) {\n const status = data.getLoadStatus(snapshot);\n if (status.isOk()) {\n if (status.value)\n message = \"Client was out of sync, review changes and try again\";\n else\n message = \"Client out of sync, loading ...\"\n }\n }\n errorTagAlign = (focusTop > height/2) ? \"start\" : \"end\";\n errorTag = <div className={theme?.VirtualSpreadsheet_ErrorTag} style={{ zIndex: 2 }}>\n {message}\n </div>\n }\n }\n\n if (!dataError) {\n const status = data.getLoadStatus(snapshot);\n if (status.isErr()) {\n errorTagAlign = \"end\";\n errorTag = <div className={theme?.VirtualSpreadsheet_ErrorTag} style={{ zIndex: 2 }}>\n {status.error.message}\n </div>\n } else if (!status.value) {\n errorTagAlign = \"end\";\n errorTag = <div className={theme?.VirtualSpreadsheet_ErrorTag} style={{ zIndex: 2 }}>\n {\"Loading ...\"}\n </div>\n }\n }\n\n return <div ref={ref}\n style={{...style, display: \"flex\", alignItems: errorTagAlign, justifyContent: \"center\"}}\n onClick={(event) => {\n const [x,y] = getCurrentTargetXY(event);\n const colOffset = x + gridColumnOffset;\n const rowOffset = y + gridRowOffset;\n const [rowIndex] = rowMapping.offsetToItem(rowOffset);\n const [colIndex] = columnMapping.offsetToItem(colOffset);\n updateSelection(rowIndex,colIndex);\n }} \n onDoubleClick={(_event) => {\n setCellValue(formula);\n setEditMode(!readOnly);\n }} \n {...rest}>\n {children}\n {focusSink}\n {errorTag}\n </div>\n }\n\n const cellRender: CellRender = (rowIndex, columnIndex, style) => {\n let dataValue: CellValue = undefined;\n let value:string = \"\";\n let isPending = false;\n\n if (pendingCellValueAndFormat && pendingCellValueAndFormat.row == rowIndex && pendingCellValueAndFormat.column == columnIndex) {\n dataValue = pendingCellValueAndFormat.value\n value = formatContent(dataValue, pendingCellValueAndFormat.format);\n isPending = true;\n } else if (rowIndex < dataRowCount && columnIndex < dataColumnCount) {\n dataValue = data.getCellValue(snapshot, rowIndex, columnIndex);\n const format = data.getCellFormat(snapshot, rowIndex, columnIndex);\n value = formatContent(dataValue, format);\n }\n\n const focused = focusCell && rowIndex == focusCell[0] && columnIndex == focusCell[1];\n const classNames = join(theme?.VirtualSpreadsheet_Cell,\n ifdef(rowSelected(rowIndex), theme?.VirtualSpreadsheet_Cell__RowSelected),\n ifdef(colSelected(columnIndex), theme?.VirtualSpreadsheet_Cell__ColumnSelected),\n ifdef(isPending, theme?.VirtualSpreadsheet_Cell__UpdatePending),\n classForType(dataValue),\n ifdef(focused, theme?.VirtualSpreadsheet_Cell__Focus));\n\n return <div className={classNames} style={style}>\n { value }\n </div>\n };\n\n const columnTemplate = `${rowHeaderWidth}px 1fr`;\n const rowTemplate = `${inputBarHeight}px ${columnHeaderHeight}px 1fr`;\n\n return (\n <div className={join(props.className, theme?.VirtualSpreadsheet)} \n style={{ width, height, minWidth, minHeight, display: \"grid\", gridTemplateColumns: columnTemplate, gridTemplateRows: rowTemplate }}>\n <div className={theme?.VirtualSpreadsheet_InputBar} style={{overflow: 'hidden', display: 'flex', gridColumnStart: 1, gridColumnEnd: 3}}>\n <input className={theme?.VirtualSpreadsheet_Name}\n type={\"text\"}\n name={\"name\"}\n title={\"Name\"}\n value={name}\n size={20}\n onChange={(event) => {\n setName(event.target?.value);\n }}\n onKeyUp={onNameKeyUp}\n />\n <label className={theme?.VirtualSpreadsheet_Fx}>fx</label>\n <input className={join(theme?.VirtualSpreadsheet_Formula, ifdef(dataError, theme?.VirtualSpreadsheet_Formula__DataError))}\n style={{flexGrow: 1}}\n type={\"text\"}\n readOnly={readOnly}\n name={\"formula\"}\n title={\"Formula\"}\n value={formula}\n onChange={(event) => {\n const value = event.target?.value;\n setFormula(value);\n setEditMode(!readOnly);\n if (focusCell)\n setCellValue(value);\n validateFocusFormula(value);\n }}\n onFocus={() => {\n if (focusCell) {\n setCellValue(formula);\n setEditMode(!readOnly);\n }\n }}\n onKeyDown={onEditValueKeyDown}\n />\n </div>\n\n <div className={theme?.VirtualSpreadsheet_CornerHeader}></div>\n\n <DisplayList\n offset={gridColumnOffset}\n className={theme?.VirtualSpreadsheet_ColumnHeader}\n itemData={colRender}\n outerRender={colHeaderRender}\n height={columnHeaderHeight}\n itemCount={columnCount}\n itemOffsetMapping={columnMapping}\n layout={'horizontal'}\n width={gridWidth}>\n {HeaderItem}\n </DisplayList>\n\n <DisplayList\n offset={gridRowOffset}\n className={theme?.VirtualSpreadsheet_RowHeader}\n itemData={rowRender}\n outerRender={rowHeaderRender}\n height={gridHeight}\n itemCount={rowCount}\n itemOffsetMapping={rowMapping}\n width={rowHeaderWidth}>\n {HeaderItem}\n </DisplayList>\n\n <VirtualScroll\n className={theme?.VirtualSpreadsheet_Grid}\n ref={scrollRef}\n onScroll={onScroll}\n height={gridHeight}\n width={gridWidth}\n scrollHeight={rowOffset}\n scrollWidth={columnOffset}\n useOffsets={false}\n maxCssSize={props.maxCssSize}\n minNumPages={props.minNumPages}>\n {(_) => (\n <AutoSizer style={{ height: '100%', width: '100%' }}>\n {({height,width}) => (\n <DisplayGrid\n rowOffset={gridRowOffset}\n columnOffset={gridColumnOffset}\n height={height}\n width={width}\n itemData={cellRender}\n outerRender={outerGridRender}\n rowCount={rowCount}\n rowOffsetMapping={rowMapping}\n columnCount={columnCount}\n columnOffsetMapping={columnMapping}>\n {Cell}\n </DisplayGrid>\n )}\n </AutoSizer>\n )}\n </VirtualScroll>\n </div>\n )\n}\n"],"names":["_jsx","_jsxs"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@candidstartup/react-spreadsheet",
|
|
3
3
|
"private": false,
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.13.1",
|
|
5
5
|
"description": "Modern React Spreadsheet Frontend",
|
|
6
6
|
"author": "Tim Wiegand <tim.wiegand@thecandidstartup.org>",
|
|
7
7
|
"license": "BSD-3-Clause",
|
|
@@ -40,27 +40,29 @@
|
|
|
40
40
|
"./VirtualSpreadsheet.css": "./src/VirtualSpreadsheet.css",
|
|
41
41
|
"./VirtualSpreadsheet.module.css": "./src/VirtualSpreadsheet.module.css"
|
|
42
42
|
},
|
|
43
|
+
"peerDependencies": {
|
|
44
|
+
"react": "18 - 19"
|
|
45
|
+
},
|
|
46
|
+
"devDependencies": {
|
|
47
|
+
"react": "^18.2.0"
|
|
48
|
+
},
|
|
49
|
+
"dependencies": {
|
|
50
|
+
"numfmt": "^3.1.2",
|
|
51
|
+
"@candidstartup/infinisheet-types": "0.13.1",
|
|
52
|
+
"@candidstartup/react-virtual-scroll": "0.13.1"
|
|
53
|
+
},
|
|
43
54
|
"scripts": {
|
|
44
55
|
"dev": "vite",
|
|
45
56
|
"clean": "rimraf {dist,temp}",
|
|
46
|
-
"prebuild": "
|
|
57
|
+
"prebuild": "pnpm run clean",
|
|
47
58
|
"typecheck": "tsc -p tsconfig.json",
|
|
48
59
|
"build-tsc": "tsc -p tsconfig.build.json",
|
|
49
60
|
"build-rollup": "rollup -c ../rollup.config.mjs",
|
|
50
|
-
"build": "
|
|
61
|
+
"build": "pnpm run build-rollup",
|
|
51
62
|
"lint": "eslint . --report-unused-disable-directives --max-warnings 0",
|
|
52
63
|
"devapi": "api-extractor run --local",
|
|
53
64
|
"prodapi": "api-extractor run",
|
|
54
|
-
"devbuild": "
|
|
65
|
+
"devbuild": "pnpm run build && pnpm run lint && pnpm run devapi",
|
|
55
66
|
"test": "vitest"
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
"react": "18 - 19"
|
|
59
|
-
},
|
|
60
|
-
"dependencies": {
|
|
61
|
-
"@candidstartup/infinisheet-types": "^0.12.0",
|
|
62
|
-
"@candidstartup/react-virtual-scroll": "^0.12.0",
|
|
63
|
-
"numfmt": "^3.1.2"
|
|
64
|
-
},
|
|
65
|
-
"gitHead": "03b639807d367f0c167dc5b6653b3935412cbde8"
|
|
66
|
-
}
|
|
67
|
+
}
|
|
68
|
+
}
|