pixel-react-excel-sheet 1.0.1 → 1.1.9
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/lib/components/ExcelFile/ExcelFile/Excel/ActiveCell.d.ts +2 -2
- package/lib/components/ExcelFile/ExcelFile/Excel/ColumnIndicator.d.ts +2 -2
- package/lib/components/ExcelFile/ExcelFile/Excel/Copied.d.ts +1 -1
- package/lib/components/ExcelFile/ExcelFile/Excel/CornerIndicator.d.ts +2 -2
- package/lib/components/ExcelFile/ExcelFile/Excel/DataEditor.d.ts +2 -2
- package/lib/components/ExcelFile/ExcelFile/Excel/DataViewer.d.ts +2 -2
- package/lib/components/ExcelFile/ExcelFile/Excel/FloatingRect.d.ts +2 -2
- package/lib/components/ExcelFile/ExcelFile/Excel/HeaderRow.d.ts +1 -1
- package/lib/components/ExcelFile/ExcelFile/Excel/Row.d.ts +1 -1
- package/lib/components/ExcelFile/ExcelFile/Excel/RowIndicator.d.ts +2 -2
- package/lib/components/ExcelFile/ExcelFile/Excel/Selected.d.ts +1 -1
- package/lib/components/ExcelFile/ExcelFile/Excel/Spreadsheet.d.ts +6 -6
- package/lib/components/ExcelFile/ExcelFile/Excel/Table.d.ts +1 -1
- package/lib/components/ExcelFile/ExcelFile/Excel/actions.d.ts +49 -5
- package/lib/components/ExcelFile/ExcelFile/Excel/context.d.ts +3 -3
- package/lib/components/ExcelFile/ExcelFile/Excel/engine/engine.d.ts +5 -5
- package/lib/components/ExcelFile/ExcelFile/Excel/engine/formula.d.ts +6 -6
- package/lib/components/ExcelFile/ExcelFile/Excel/engine/index.d.ts +2 -2
- package/lib/components/ExcelFile/ExcelFile/Excel/engine/point-graph.d.ts +2 -2
- package/lib/components/ExcelFile/ExcelFile/Excel/engine/point-hash.d.ts +1 -1
- package/lib/components/ExcelFile/ExcelFile/Excel/engine/point-set.d.ts +1 -1
- package/lib/components/ExcelFile/ExcelFile/Excel/index.d.ts +11 -11
- package/lib/components/ExcelFile/ExcelFile/Excel/matrix.d.ts +1 -1
- package/lib/components/ExcelFile/ExcelFile/Excel/point-range.d.ts +1 -1
- package/lib/components/ExcelFile/ExcelFile/Excel/reducer.d.ts +5 -5
- package/lib/components/ExcelFile/ExcelFile/Excel/selection.d.ts +3 -3
- package/lib/components/ExcelFile/ExcelFile/Excel/use-dispatch.d.ts +1 -1
- package/lib/components/ExcelFile/ExcelFile/Excel/use-selector.d.ts +1 -1
- package/lib/components/ExcelFile/ExcelFile/Excel/util.d.ts +11 -12
- package/lib/components/ExcelFile/ExcelSheetBar/ExcelSheetBar.d.ts +0 -3
- package/lib/components/ExcelFile/ExcelToolBar/ExcelToolBar.d.ts +12 -0
- package/lib/components/ExcelFile/Types.d.ts +0 -8
- package/lib/components/Icon/Icon.stories.d.ts +1 -0
- package/lib/components/Icon/types.d.ts +1 -0
- package/lib/index.d.ts +1 -0
- package/lib/index.esm.js +888 -995
- package/lib/index.esm.js.map +1 -1
- package/lib/index.js +888 -995
- package/lib/index.js.map +1 -1
- package/lib/tsconfig.tsbuildinfo +1 -1
- package/package.json +2 -2
- package/src/assets/Themes/BaseTheme.scss +1 -0
- package/src/assets/Themes/DarkTheme.scss +1 -0
- package/src/components/ExcelFile/ExcelFile/Excel/ActiveCell.tsx +13 -13
- package/src/components/ExcelFile/ExcelFile/Excel/Cell.tsx +12 -12
- package/src/components/ExcelFile/ExcelFile/Excel/ColumnIndicator.tsx +40 -32
- package/src/components/ExcelFile/ExcelFile/Excel/Copied.tsx +4 -4
- package/src/components/ExcelFile/ExcelFile/Excel/CornerIndicator.tsx +10 -10
- package/src/components/ExcelFile/ExcelFile/Excel/DataEditor.tsx +5 -5
- package/src/components/ExcelFile/ExcelFile/Excel/DataViewer.tsx +10 -10
- package/src/components/ExcelFile/ExcelFile/Excel/FloatingRect.tsx +6 -6
- package/src/components/ExcelFile/ExcelFile/Excel/HeaderRow.tsx +1 -1
- package/src/components/ExcelFile/ExcelFile/Excel/Row.tsx +1 -1
- package/src/components/ExcelFile/ExcelFile/Excel/RowIndicator.tsx +34 -27
- package/src/components/ExcelFile/ExcelFile/Excel/Selected.tsx +5 -5
- package/src/components/ExcelFile/ExcelFile/Excel/Spreadsheet.scss +127 -135
- package/src/components/ExcelFile/ExcelFile/Excel/Spreadsheet.tsx +87 -73
- package/src/components/ExcelFile/ExcelFile/Excel/Table.tsx +2 -2
- package/src/components/ExcelFile/ExcelFile/Excel/actions.ts +121 -31
- package/src/components/ExcelFile/ExcelFile/Excel/areModelsEqual.ts +1 -1
- package/src/components/ExcelFile/ExcelFile/Excel/context.ts +4 -4
- package/src/components/ExcelFile/ExcelFile/Excel/engine/engine.ts +7 -7
- package/src/components/ExcelFile/ExcelFile/Excel/engine/formula.ts +11 -11
- package/src/components/ExcelFile/ExcelFile/Excel/engine/index.ts +2 -2
- package/src/components/ExcelFile/ExcelFile/Excel/engine/point-graph.ts +3 -3
- package/src/components/ExcelFile/ExcelFile/Excel/engine/point-hash.ts +2 -2
- package/src/components/ExcelFile/ExcelFile/Excel/engine/point-set.ts +2 -2
- package/src/components/ExcelFile/ExcelFile/Excel/index.ts +12 -11
- package/src/components/ExcelFile/ExcelFile/Excel/matrix.ts +18 -24
- package/src/components/ExcelFile/ExcelFile/Excel/point-range.ts +1 -1
- package/src/components/ExcelFile/ExcelFile/Excel/reducer.ts +292 -41
- package/src/components/ExcelFile/ExcelFile/Excel/selection.ts +5 -5
- package/src/components/ExcelFile/ExcelFile/Excel/typings/fast-formula-parser.d.ts +8 -8
- package/src/components/ExcelFile/ExcelFile/Excel/use-dispatch.ts +2 -2
- package/src/components/ExcelFile/ExcelFile/Excel/use-selector.ts +3 -3
- package/src/components/ExcelFile/ExcelFile/Excel/util.ts +21 -22
- package/src/components/ExcelFile/ExcelFile/ExcelFile.tsx +27 -335
- package/src/components/ExcelFile/ExcelFile.stories.tsx +10 -9
- package/src/components/ExcelFile/ExcelSheetBar/ExcelSheetBar.tsx +0 -11
- package/src/components/ExcelFile/ExcelToolBar/ExcelToolBar.tsx +145 -125
- package/src/components/ExcelFile/Types.ts +0 -11
- package/src/components/ExcelFile/index.ts +1 -1
- package/src/components/Icon/Icon.stories.tsx +27 -0
- package/src/components/Icon/Icon.tsx +5 -1
- package/src/components/Icon/Icons.scss +13 -2
- package/src/components/Icon/types.ts +1 -0
- package/src/components/ExcelFile/ChangeExcelStyles.tsx +0 -66
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
import * as Types from
|
|
2
|
-
import * as Matrix from
|
|
3
|
-
import * as Point from
|
|
4
|
-
import { PointRange } from
|
|
5
|
-
import { Selection } from
|
|
1
|
+
import * as Types from './types';
|
|
2
|
+
import * as Matrix from './matrix';
|
|
3
|
+
import * as Point from './point';
|
|
4
|
+
import { PointRange } from './point-range';
|
|
5
|
+
import { Selection } from './selection';
|
|
6
6
|
|
|
7
|
-
export { createEmpty as createEmptyMatrix } from
|
|
7
|
+
export { createEmpty as createEmptyMatrix } from './matrix';
|
|
8
8
|
|
|
9
|
-
export const PLAIN_TEXT_MIME =
|
|
10
|
-
export const FOCUS_WITHIN_SELECTOR =
|
|
9
|
+
export const PLAIN_TEXT_MIME = 'text/plain';
|
|
10
|
+
export const FOCUS_WITHIN_SELECTOR = ':focus-within';
|
|
11
11
|
|
|
12
12
|
/** Move the cursor of given input element to the input's end */
|
|
13
13
|
export function moveCursorToEnd(el: HTMLInputElement): void {
|
|
@@ -18,8 +18,7 @@ export function moveCursorToEnd(el: HTMLInputElement): void {
|
|
|
18
18
|
* Creates an array of numbers (positive and/or negative) progressing from start up to, but not including, end. A step of -1 is used if a negative start is specified without an end or step. If end is not specified, it's set to start with start then set to 0.
|
|
19
19
|
* @param end - an integer number specifying at which position to stop (not included).
|
|
20
20
|
* @param start - An integer number specifying at which position to start.
|
|
21
|
-
* @param step - An integer number specifying the
|
|
22
|
-
*/
|
|
21
|
+
* @param step - An integer number specifying the Increment */
|
|
23
22
|
export function range(end: number, start = 0, step = 1): number[] {
|
|
24
23
|
const array = [];
|
|
25
24
|
if (Math.sign(end - start) === -1) {
|
|
@@ -36,7 +35,7 @@ export function range(end: number, start = 0, step = 1): number[] {
|
|
|
36
35
|
|
|
37
36
|
/** Return whether given point is active */
|
|
38
37
|
export function isActive(
|
|
39
|
-
active: Types.StoreState[
|
|
38
|
+
active: Types.StoreState['active'],
|
|
40
39
|
point: Point.Point
|
|
41
40
|
): boolean {
|
|
42
41
|
return Boolean(active && Point.isEqual(point, active));
|
|
@@ -65,19 +64,19 @@ export function readTextFromClipboard(event: ClipboardEvent): string {
|
|
|
65
64
|
// @ts-ignore
|
|
66
65
|
if (window.clipboardData && window.clipboardData.getData) {
|
|
67
66
|
// @ts-ignore
|
|
68
|
-
return window.clipboardData.getData(
|
|
67
|
+
return window.clipboardData.getData('Text');
|
|
69
68
|
}
|
|
70
69
|
if (event.clipboardData && event.clipboardData.getData) {
|
|
71
70
|
return event.clipboardData.getData(PLAIN_TEXT_MIME);
|
|
72
71
|
}
|
|
73
|
-
return
|
|
72
|
+
return '';
|
|
74
73
|
}
|
|
75
74
|
|
|
76
75
|
/** Get the dimensions of cell at point from state */
|
|
77
76
|
export function getCellDimensions(
|
|
78
77
|
point: Point.Point,
|
|
79
|
-
rowDimensions: Types.StoreState[
|
|
80
|
-
columnDimensions: Types.StoreState[
|
|
78
|
+
rowDimensions: Types.StoreState['rowDimensions'] | undefined,
|
|
79
|
+
columnDimensions: Types.StoreState['columnDimensions'] | undefined
|
|
81
80
|
): Types.Dimensions | undefined {
|
|
82
81
|
const cellRowDimensions = rowDimensions && rowDimensions[point.row];
|
|
83
82
|
const cellColumnDimensions =
|
|
@@ -93,8 +92,8 @@ export function getCellDimensions(
|
|
|
93
92
|
|
|
94
93
|
/** Get the dimensions of a range of cells */
|
|
95
94
|
export function getRangeDimensions(
|
|
96
|
-
rowDimensions: Types.StoreState[
|
|
97
|
-
columnDimensions: Types.StoreState[
|
|
95
|
+
rowDimensions: Types.StoreState['rowDimensions'],
|
|
96
|
+
columnDimensions: Types.StoreState['columnDimensions'],
|
|
98
97
|
range: PointRange
|
|
99
98
|
): Types.Dimensions | undefined {
|
|
100
99
|
const startDimensions = getCellDimensions(
|
|
@@ -120,8 +119,8 @@ export function getRangeDimensions(
|
|
|
120
119
|
|
|
121
120
|
/** Get the dimensions of selected */
|
|
122
121
|
export function getSelectedDimensions(
|
|
123
|
-
rowDimensions: Types.StoreState[
|
|
124
|
-
columnDimensions: Types.StoreState[
|
|
122
|
+
rowDimensions: Types.StoreState['rowDimensions'],
|
|
123
|
+
columnDimensions: Types.StoreState['columnDimensions'],
|
|
125
124
|
data: Matrix.Matrix<unknown>,
|
|
126
125
|
selected: Selection
|
|
127
126
|
): Types.Dimensions | undefined {
|
|
@@ -133,7 +132,7 @@ export function getSelectedDimensions(
|
|
|
133
132
|
|
|
134
133
|
/** Get given data as CSV */
|
|
135
134
|
export function getCSV(data: Matrix.Matrix<Types.CellBase>): string {
|
|
136
|
-
const valueMatrix = Matrix.map((cell) => cell?.value ||
|
|
135
|
+
const valueMatrix = Matrix.map((cell) => cell?.value || '', data);
|
|
137
136
|
return Matrix.join(valueMatrix);
|
|
138
137
|
}
|
|
139
138
|
|
|
@@ -161,7 +160,7 @@ export function shouldHandleClipboardEvent(
|
|
|
161
160
|
root: Element | null,
|
|
162
161
|
mode: Types.Mode
|
|
163
162
|
): boolean {
|
|
164
|
-
return root !== null && mode ===
|
|
163
|
+
return root !== null && mode === 'view' && isFocusedWithin(root);
|
|
165
164
|
}
|
|
166
165
|
|
|
167
166
|
export function isFocusedWithin(element: Element): boolean {
|
|
@@ -169,5 +168,5 @@ export function isFocusedWithin(element: Element): boolean {
|
|
|
169
168
|
}
|
|
170
169
|
|
|
171
170
|
export function hasLineBreaker(value: unknown) {
|
|
172
|
-
return typeof value ===
|
|
171
|
+
return typeof value === 'string' && value.includes('\n');
|
|
173
172
|
}
|
|
@@ -1,11 +1,7 @@
|
|
|
1
1
|
import React, { useState, useRef, useEffect } from 'react';
|
|
2
|
-
// import './ExcelFile.scss';
|
|
3
|
-
import ExcelToolBar from '../ExcelToolBar/ExcelToolBar';
|
|
4
2
|
import ExcelSheetBar from '../ExcelSheetBar/ExcelSheetBar';
|
|
5
|
-
import ContextMenu from '../ContextMenu/ContextMenu';
|
|
6
3
|
import Spreadsheet, { CellBase } from './Excel/index';
|
|
7
|
-
import * as Matrix from
|
|
8
|
-
import ChangeExcelStyles from './../ChangeExcelStyles';
|
|
4
|
+
import * as Matrix from './Excel/matrix';
|
|
9
5
|
|
|
10
6
|
interface ExcelFileProps {
|
|
11
7
|
/** The Excel data containing sheets and their content */
|
|
@@ -29,8 +25,6 @@ interface ExcelFileProps {
|
|
|
29
25
|
|
|
30
26
|
const ExcelFile: React.FC<ExcelFileProps> = ({
|
|
31
27
|
excelData,
|
|
32
|
-
toolbar = 'show',
|
|
33
|
-
contextOption = [],
|
|
34
28
|
onSave = () => {},
|
|
35
29
|
}) => {
|
|
36
30
|
const [fileDetails, setFileDetails] = useState<{
|
|
@@ -39,9 +33,9 @@ const ExcelFile: React.FC<ExcelFileProps> = ({
|
|
|
39
33
|
const EmptyRow: CellBase = {
|
|
40
34
|
value: '',
|
|
41
35
|
style: {
|
|
42
|
-
color:
|
|
43
|
-
backgroundColor:
|
|
44
|
-
borderColor:
|
|
36
|
+
color: 'var(--brand-color)',
|
|
37
|
+
backgroundColor: 'var(--drawer-footer-bg)',
|
|
38
|
+
borderColor: 'var(--toggle-strip-color)',
|
|
45
39
|
},
|
|
46
40
|
};
|
|
47
41
|
const [selectedSheet, setSelectedSheet] = useState<{
|
|
@@ -51,28 +45,18 @@ const ExcelFile: React.FC<ExcelFileProps> = ({
|
|
|
51
45
|
|
|
52
46
|
const [worksheetsData, setWorksheetsData] = useState<{
|
|
53
47
|
[key: string]: Matrix.Matrix<CellBase>;
|
|
54
|
-
}>({defaultSheet:[[EmptyRow]]});
|
|
48
|
+
}>({ defaultSheet: [[EmptyRow]] });
|
|
55
49
|
|
|
50
|
+
const [selectedSheetData, setSelectedSheetData] = useState<
|
|
51
|
+
Matrix.Matrix<CellBase>
|
|
52
|
+
>([[EmptyRow]]);
|
|
56
53
|
|
|
57
|
-
const [selectedSheetData, setSelectedSheetData] = useState<Matrix.Matrix<CellBase>>([
|
|
58
|
-
[EmptyRow]
|
|
59
|
-
]);
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
const [selectedCell, setSelectedCell] = useState<
|
|
63
|
-
{ row: number; column: number }[]
|
|
64
|
-
>([]);
|
|
65
54
|
const sheetRef = useRef<HTMLDivElement | null>(null);
|
|
66
|
-
const excelDataCopy = useRef<{ [key: string]: Matrix.Matrix<CellBase> }>({
|
|
67
|
-
|
|
68
|
-
visible: false,
|
|
69
|
-
x: 0,
|
|
70
|
-
y: 0,
|
|
71
|
-
type: 'cell',
|
|
55
|
+
const excelDataCopy = useRef<{ [key: string]: Matrix.Matrix<CellBase> }>({
|
|
56
|
+
defaultSheet: [[]],
|
|
72
57
|
});
|
|
73
58
|
|
|
74
|
-
|
|
75
|
-
let checkVal = (val:any) => {
|
|
59
|
+
let checkVal = (val: any) => {
|
|
76
60
|
if (val === undefined || val === null) {
|
|
77
61
|
return null;
|
|
78
62
|
}
|
|
@@ -83,18 +67,21 @@ const ExcelFile: React.FC<ExcelFileProps> = ({
|
|
|
83
67
|
const sheetNames = payload.sheets.map((e) => e.sheetName);
|
|
84
68
|
setFileDetails({ sheetNames });
|
|
85
69
|
if (sheetNames.length > 0) {
|
|
86
|
-
setSelectedSheet({ name: sheetNames[0]?sheetNames[0]:
|
|
70
|
+
setSelectedSheet({ name: sheetNames[0] ? sheetNames[0] : '', index: 0 });
|
|
87
71
|
}
|
|
88
|
-
|
|
89
72
|
const newWorksheetsData: { [key: string]: Matrix.Matrix<CellBase> } = {};
|
|
90
73
|
payload.sheets.forEach((sheet) => {
|
|
91
74
|
const sheetName = sheet.sheetName;
|
|
92
75
|
const json = sheet.data;
|
|
93
76
|
const maxRows = Math.max(26, json.length + 2);
|
|
94
|
-
const maxCols = Math.max(
|
|
77
|
+
const maxCols = Math.max(
|
|
78
|
+
26,
|
|
79
|
+
Math.max(...json.map((row) => row.length)) + 2
|
|
80
|
+
);
|
|
95
81
|
|
|
96
|
-
let spreadsheetData: Matrix.Matrix<CellBase> = Array.from(
|
|
97
|
-
|
|
82
|
+
let spreadsheetData: Matrix.Matrix<CellBase> = Array.from(
|
|
83
|
+
{ length: maxRows },
|
|
84
|
+
() => Array.from({ length: maxCols }, () => EmptyRow)
|
|
98
85
|
);
|
|
99
86
|
json.forEach((row, rowIndex) => {
|
|
100
87
|
row.forEach((cell, colIndex) => {
|
|
@@ -105,30 +92,23 @@ const ExcelFile: React.FC<ExcelFileProps> = ({
|
|
|
105
92
|
spreadsheetData[rowIndex][colIndex] = {
|
|
106
93
|
value: checkVal(cell.value),
|
|
107
94
|
style: cell.style,
|
|
108
|
-
type:true
|
|
95
|
+
type: true,
|
|
109
96
|
};
|
|
110
97
|
}
|
|
111
98
|
});
|
|
112
99
|
});
|
|
113
|
-
|
|
100
|
+
|
|
114
101
|
newWorksheetsData[sheetName] = spreadsheetData;
|
|
115
102
|
});
|
|
116
103
|
excelDataCopy.current = newWorksheetsData;
|
|
117
104
|
setWorksheetsData(newWorksheetsData);
|
|
118
105
|
const firstSheetName = Object.keys(newWorksheetsData)[0];
|
|
119
|
-
if (firstSheetName && newWorksheetsData[firstSheetName]!==undefined) {
|
|
106
|
+
if (firstSheetName && newWorksheetsData[firstSheetName] !== undefined) {
|
|
120
107
|
setSelectedSheetData(newWorksheetsData[firstSheetName]);
|
|
121
108
|
}
|
|
122
|
-
}, [
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
const handleSaveData = () => {
|
|
126
|
-
setWorksheetsData((prevData) => {
|
|
127
|
-
let updatedData = { ...prevData };
|
|
128
|
-
updatedData[selectedSheet.name] = selectedSheetData;
|
|
129
|
-
return updatedData;
|
|
130
|
-
});
|
|
109
|
+
}, []);
|
|
131
110
|
|
|
111
|
+
const handleSaveData = () => {
|
|
132
112
|
const dataToSave = {
|
|
133
113
|
sheets: fileDetails.sheetNames.map((sheetName) => ({
|
|
134
114
|
sheetName: sheetName,
|
|
@@ -157,309 +137,21 @@ const ExcelFile: React.FC<ExcelFileProps> = ({
|
|
|
157
137
|
}, [worksheetsData]);
|
|
158
138
|
|
|
159
139
|
const handleSheetChange = (name: string, index: number) => {
|
|
160
|
-
setWorksheetsData((prevData) => {
|
|
161
|
-
let updatedData = prevData;
|
|
162
|
-
updatedData[selectedSheet.name] = selectedSheetData;
|
|
163
|
-
return updatedData;
|
|
164
|
-
});
|
|
165
|
-
setSelectedSheet({ index, name });
|
|
166
|
-
};
|
|
167
|
-
|
|
168
|
-
let addRow = () => {
|
|
169
|
-
let updateSheet: Matrix.Matrix<CellBase> = worksheetsData[selectedSheet.name] ?? [];
|
|
170
|
-
setWorksheetsData((prev) => ({
|
|
171
|
-
...prev,
|
|
172
|
-
[selectedSheet.name]: updateSheet,
|
|
173
|
-
}));
|
|
174
|
-
};
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
let deleteRow = () => {
|
|
178
|
-
|
|
179
|
-
};
|
|
180
|
-
|
|
181
|
-
let addColumn = () => {
|
|
182
|
-
let updateSheet: Matrix.Matrix<CellBase> = worksheetsData[selectedSheet.name] ?? []; // Fallback to empty array if undefined
|
|
183
|
-
if (updateSheet.length > 0) {
|
|
184
|
-
// updateSheet.forEach((row) => {
|
|
185
|
-
// row.splice(selectedValue.column, 0, EmptyRow); // Insert EmptyRow at the specified column index
|
|
186
|
-
// });
|
|
187
|
-
setWorksheetsData((prev) => ({
|
|
188
|
-
...prev,
|
|
189
|
-
[selectedSheet.name]: updateSheet,
|
|
190
|
-
}));
|
|
191
|
-
}
|
|
192
|
-
};
|
|
193
|
-
|
|
194
|
-
let deleteColumn = () => {
|
|
195
|
-
let updateSheet: Matrix.Matrix<CellBase> = worksheetsData[selectedSheet.name] ?? [];
|
|
196
|
-
|
|
197
|
-
// Ensure there is at least one row in the sheet and that the first row exists
|
|
198
|
-
if (updateSheet.length > 0 && updateSheet[0]) {
|
|
199
|
-
// const firstRow = updateSheet[0]; // Safely access the first row
|
|
200
|
-
// const length = firstRow.length; // Get the length of the first row
|
|
201
|
-
|
|
202
|
-
// Proceed only if the column index is within bounds
|
|
203
|
-
// if (selectedValue.column >= 0 && selectedValue.column < length) {
|
|
204
|
-
// // Delete the specified column from each row
|
|
205
|
-
// updateSheet.forEach((row) => row.splice(selectedValue.column, 1));
|
|
206
|
-
|
|
207
|
-
// // Update the worksheets data with the modified sheet
|
|
208
|
-
// setWorksheetsData((prev) => ({
|
|
209
|
-
// ...prev,
|
|
210
|
-
// [selectedSheet.name]: updateSheet,
|
|
211
|
-
// }));
|
|
212
|
-
// }
|
|
213
|
-
}
|
|
214
|
-
};
|
|
215
|
-
|
|
216
|
-
let addSheet = () => {
|
|
217
|
-
const generateUniqueSheetName = (
|
|
218
|
-
baseName: string,
|
|
219
|
-
existingNames: string[]
|
|
220
|
-
): string => {
|
|
221
|
-
let newName = baseName;
|
|
222
|
-
let counter = 1;
|
|
223
|
-
while (existingNames.includes(newName)) {
|
|
224
|
-
newName = `${baseName}${counter}`;
|
|
225
|
-
counter++;
|
|
226
|
-
}
|
|
227
|
-
return newName;
|
|
228
|
-
};
|
|
229
|
-
const baseName = 'NewSheet';
|
|
230
|
-
const existingSheetNames = fileDetails.sheetNames;
|
|
231
|
-
const newSheetName = generateUniqueSheetName(baseName, existingSheetNames);
|
|
232
|
-
const newSheetData = Array.from({ length: 25 }, () =>
|
|
233
|
-
Array.from({ length: 26 }, () => EmptyRow)
|
|
234
|
-
);
|
|
235
|
-
|
|
236
|
-
setFileDetails((prev) => ({
|
|
237
|
-
sheetNames: prev.sheetNames.concat(newSheetName),
|
|
238
|
-
}));
|
|
239
|
-
|
|
240
|
-
setWorksheetsData({ ...worksheetsData, [newSheetName]: newSheetData });
|
|
241
|
-
setSelectedSheet({
|
|
242
|
-
index: fileDetails.sheetNames.length,
|
|
243
|
-
name: newSheetName,
|
|
244
|
-
});
|
|
245
|
-
};
|
|
246
|
-
|
|
247
|
-
let deleteSheet = () => {
|
|
248
|
-
const { sheetNames } = fileDetails;
|
|
249
|
-
const { index, name } = selectedSheet;
|
|
250
|
-
|
|
251
|
-
if (sheetNames.length > 1) {
|
|
252
|
-
const updatedSheetNames = sheetNames.slice();
|
|
253
|
-
updatedSheetNames.splice(index, 1);
|
|
254
|
-
|
|
255
|
-
const { [name]: _, ...updatedWorksheetsData } = worksheetsData;
|
|
256
|
-
|
|
257
|
-
setFileDetails((prev) => ({
|
|
258
|
-
...prev,
|
|
259
|
-
sheetNames: updatedSheetNames,
|
|
260
|
-
}));
|
|
261
|
-
setWorksheetsData(updatedWorksheetsData);
|
|
262
|
-
|
|
263
|
-
const newIndex = Math.min(index, updatedSheetNames.length - 1);
|
|
264
|
-
|
|
265
|
-
const newSheetName = updatedSheetNames[newIndex] ?? "";
|
|
266
|
-
|
|
267
|
-
setSelectedSheet({
|
|
268
|
-
index: newIndex,
|
|
269
|
-
name: newSheetName,
|
|
270
|
-
});
|
|
271
|
-
} else {
|
|
272
|
-
alert('Cannot delete the last sheet.');
|
|
273
|
-
}
|
|
274
|
-
};
|
|
275
|
-
|
|
276
|
-
const contextAction: {
|
|
277
|
-
addRow: () => void;
|
|
278
|
-
deleteRow: () => void;
|
|
279
|
-
addColumn: () => void;
|
|
280
|
-
deleteColumn: () => void;
|
|
281
|
-
addSheet: () => void;
|
|
282
|
-
deleteSheet: () => void;
|
|
283
|
-
} = {
|
|
284
|
-
addRow,
|
|
285
|
-
deleteRow,
|
|
286
|
-
addColumn,
|
|
287
|
-
deleteColumn,
|
|
288
|
-
addSheet,
|
|
289
|
-
deleteSheet,
|
|
290
|
-
};
|
|
291
|
-
|
|
292
|
-
const formatePaint = () => {
|
|
293
|
-
|
|
294
|
-
};
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
const handleSelect = (e: any) => {
|
|
298
|
-
if (e.hasOwnProperty('range')) {
|
|
299
|
-
let rowStart = e.range.start.row;
|
|
300
|
-
let rowEnd = e.range.end.row;
|
|
301
|
-
let columnStart = e.range.start.column;
|
|
302
|
-
let columnEnd = e.range.end.column;
|
|
303
|
-
let cell: { row: number; column: number }[] = [];
|
|
304
|
-
for (let i = rowStart; i <= rowEnd; i++) {
|
|
305
|
-
for (let j = columnStart; j <= columnEnd; j++) {
|
|
306
|
-
cell.push({ row: i, column: j });
|
|
307
|
-
}
|
|
308
|
-
}
|
|
309
|
-
setContextData((prev) => ({ ...prev, type: 'cell' }));
|
|
310
|
-
setSelectedCell(cell);
|
|
311
|
-
} else {
|
|
312
|
-
if (e.hasOwnProperty('start') && e.hasOwnProperty('end')) {
|
|
313
|
-
const columnName = e.constructor.name;
|
|
314
|
-
if (columnName.includes('EntireColumnsSelection')) {
|
|
315
|
-
setContextData((prev) => ({ ...prev, type: 'column' }));
|
|
316
|
-
} else if (columnName.includes('EntireRowsSelection')) {
|
|
317
|
-
setContextData((prev) => ({ ...prev, type: 'row' }));
|
|
318
|
-
}
|
|
319
|
-
}
|
|
320
|
-
}
|
|
321
|
-
};
|
|
322
|
-
|
|
323
|
-
const contextSelect = (event: React.MouseEvent) => {
|
|
324
|
-
event.preventDefault();
|
|
325
|
-
const sheetTop = sheetRef.current?.getBoundingClientRect().top;
|
|
326
|
-
const sheetLeft = sheetRef.current?.getBoundingClientRect().left;
|
|
327
|
-
|
|
328
|
-
if (sheetLeft !== undefined && sheetTop !== undefined) {
|
|
329
|
-
const contextMenuHeight =
|
|
330
|
-
contextData.type === 'cell' ? contextOption.length * 35 + 40 : 110;
|
|
331
|
-
const adjustedY = event.pageY - sheetTop - window.scrollY;
|
|
332
|
-
const availableSpace = window.innerHeight - adjustedY;
|
|
333
|
-
const contextMenuWidth = 250;
|
|
334
|
-
const adjustedX = event.pageX - sheetLeft - window.scrollX;
|
|
335
|
-
const availableXSpace = window.innerWidth - adjustedX;
|
|
336
|
-
|
|
337
|
-
const finalY =
|
|
338
|
-
availableSpace < contextMenuHeight
|
|
339
|
-
? adjustedY - contextMenuHeight
|
|
340
|
-
: adjustedY;
|
|
341
|
-
|
|
342
|
-
const finalX =
|
|
343
|
-
availableXSpace < contextMenuWidth
|
|
344
|
-
? adjustedX - contextMenuWidth
|
|
345
|
-
: adjustedX;
|
|
346
|
-
|
|
347
|
-
const target = event.target as HTMLElement;
|
|
348
|
-
const isCell =
|
|
349
|
-
target.classList.contains('Spreadsheet__active-cell') &&
|
|
350
|
-
contextData.type === 'cell';
|
|
351
|
-
const isHeader =
|
|
352
|
-
target.classList.contains('Spreadsheet__header--selected') &&
|
|
353
|
-
(contextData.type === 'row' || contextData.type === 'column');
|
|
354
|
-
const isSheetTab =
|
|
355
|
-
target.classList.contains('tab-request') &&
|
|
356
|
-
contextData.type === 'sheet_options';
|
|
357
|
-
|
|
358
|
-
if (isCell || isHeader || isSheetTab) {
|
|
359
|
-
setContextData((prev) => ({
|
|
360
|
-
...prev,
|
|
361
|
-
visible: true,
|
|
362
|
-
x: finalX,
|
|
363
|
-
y: finalY,
|
|
364
|
-
}));
|
|
365
|
-
} else {
|
|
366
|
-
setContextData((prev) => ({
|
|
367
|
-
...prev,
|
|
368
|
-
visible: false,
|
|
369
|
-
x: finalX,
|
|
370
|
-
y: finalY,
|
|
371
|
-
}));
|
|
372
|
-
}
|
|
373
|
-
}
|
|
374
|
-
};
|
|
375
|
-
|
|
376
|
-
const sheetContext = (
|
|
377
|
-
_: React.MouseEvent<Element, MouseEvent>,
|
|
378
|
-
name: string,
|
|
379
|
-
index: number
|
|
380
|
-
) => {
|
|
381
|
-
|
|
382
140
|
setSelectedSheet({ index, name });
|
|
383
|
-
setContextData((prev) => ({
|
|
384
|
-
...prev,
|
|
385
|
-
type: 'sheet_options',
|
|
386
|
-
}));
|
|
387
141
|
};
|
|
388
142
|
|
|
389
|
-
const createStyler =
|
|
390
|
-
(selectedCell: { row: number; column: number }[]) =>
|
|
391
|
-
async (styleType: any, value: any) => {
|
|
392
|
-
ChangeExcelStyles(setWorksheetsData, {
|
|
393
|
-
sheetName: selectedSheet.name,
|
|
394
|
-
styleType,
|
|
395
|
-
value,
|
|
396
|
-
selectedCell,
|
|
397
|
-
});
|
|
398
|
-
};
|
|
399
|
-
|
|
400
|
-
const applyStyle = createStyler(selectedCell);
|
|
401
|
-
|
|
402
|
-
useEffect(() => {
|
|
403
|
-
const currentSheet = worksheetsData[selectedSheet.name] ?? [];
|
|
404
|
-
const validSheetData: CellBase[][] = currentSheet.map(row =>
|
|
405
|
-
row.map(cell => cell ? { value: cell.value, style: cell.style } : { value: "", style: EmptyRow.style })
|
|
406
|
-
);
|
|
407
|
-
|
|
408
|
-
setSelectedSheetData(validSheetData);
|
|
409
|
-
}, [worksheetsData, selectedSheet.name]);
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
useEffect(() => {
|
|
413
|
-
let timeGap = setTimeout(() => {
|
|
414
|
-
setWorksheetsData((prevData) => {
|
|
415
|
-
let updatedData = prevData;
|
|
416
|
-
updatedData[selectedSheet.name] = selectedSheetData;
|
|
417
|
-
return updatedData;
|
|
418
|
-
}); }, 1000);
|
|
419
|
-
return () => {
|
|
420
|
-
clearTimeout(timeGap);
|
|
421
|
-
};
|
|
422
|
-
}, [selectedSheetData]);
|
|
423
|
-
|
|
424
143
|
return (
|
|
425
144
|
<div className="excel-page">
|
|
426
|
-
<ExcelToolBar
|
|
427
|
-
toolbar={toolbar}
|
|
428
|
-
applyStyle={applyStyle}
|
|
429
|
-
formatePaint={formatePaint}
|
|
430
|
-
/>
|
|
431
|
-
|
|
432
145
|
{fileDetails.sheetNames.length > 0 && (
|
|
433
|
-
<div className="excel-book"
|
|
434
|
-
<div
|
|
435
|
-
|
|
436
|
-
onContextMenu={contextSelect}
|
|
437
|
-
className="excel-sheet"
|
|
438
|
-
>
|
|
439
|
-
<Spreadsheet
|
|
440
|
-
data={selectedSheetData}
|
|
441
|
-
onActivate={() => {
|
|
442
|
-
setContextData((prev) => ({ ...prev, visible: false }));
|
|
443
|
-
}}
|
|
444
|
-
onSelect={handleSelect}
|
|
445
|
-
/>
|
|
446
|
-
|
|
146
|
+
<div className="excel-book">
|
|
147
|
+
<div ref={sheetRef} className="excel-sheet">
|
|
148
|
+
<Spreadsheet data={selectedSheetData} />
|
|
447
149
|
</div>
|
|
448
150
|
|
|
449
151
|
<ExcelSheetBar
|
|
450
152
|
selectedSheet={selectedSheet}
|
|
451
153
|
fileDetails={fileDetails}
|
|
452
154
|
handleSheetChange={handleSheetChange}
|
|
453
|
-
contextMenu={sheetContext}
|
|
454
|
-
contextSelect={contextSelect}
|
|
455
|
-
addSheet={addSheet}
|
|
456
|
-
/>
|
|
457
|
-
|
|
458
|
-
<ContextMenu
|
|
459
|
-
customContext={contextOption}
|
|
460
|
-
contextAction={contextAction}
|
|
461
|
-
contextData={contextData}
|
|
462
|
-
setContextData={setContextData}
|
|
463
155
|
/>
|
|
464
156
|
</div>
|
|
465
157
|
)}
|
|
@@ -38,17 +38,18 @@ export const Default: Story = {
|
|
|
38
38
|
style: {
|
|
39
39
|
fontSize: "12px",
|
|
40
40
|
fontFamily: "Arial",
|
|
41
|
-
color: "
|
|
42
|
-
backgroundColor: "
|
|
41
|
+
color: "var(--text-bg-highlight)",
|
|
42
|
+
backgroundColor: "var(--tooltip-bg-color)",
|
|
43
43
|
},
|
|
44
44
|
},
|
|
45
45
|
{
|
|
46
|
-
value: "B1",
|
|
46
|
+
value: "SUM(A1+B1)",
|
|
47
|
+
// isFormula:true,
|
|
47
48
|
style: {
|
|
48
49
|
fontSize: "12px",
|
|
49
50
|
fontFamily: "Arial",
|
|
50
|
-
color: "
|
|
51
|
-
backgroundColor: "
|
|
51
|
+
color: "var(--text-bg-highlight)",
|
|
52
|
+
backgroundColor: "var(--brand-color)",
|
|
52
53
|
},
|
|
53
54
|
},
|
|
54
55
|
],
|
|
@@ -58,8 +59,8 @@ export const Default: Story = {
|
|
|
58
59
|
style: {
|
|
59
60
|
fontSize: "12px",
|
|
60
61
|
fontFamily: "Arial",
|
|
61
|
-
color: "
|
|
62
|
-
backgroundColor: "
|
|
62
|
+
color: "var(--drawer-footer-bg)",
|
|
63
|
+
backgroundColor: "var(--brand-color)",
|
|
63
64
|
},
|
|
64
65
|
},
|
|
65
66
|
{
|
|
@@ -67,8 +68,8 @@ export const Default: Story = {
|
|
|
67
68
|
style: {
|
|
68
69
|
fontSize: "12px",
|
|
69
70
|
fontFamily: "Arial",
|
|
70
|
-
color: "
|
|
71
|
-
backgroundColor: "
|
|
71
|
+
color: "var(--brand-color)",
|
|
72
|
+
backgroundColor: "var(--text-bg-highlight)",
|
|
72
73
|
},
|
|
73
74
|
},
|
|
74
75
|
],
|
|
@@ -9,19 +9,13 @@ interface ExcelSheetBarProps {
|
|
|
9
9
|
sheetNames: string[];
|
|
10
10
|
};
|
|
11
11
|
handleSheetChange: (name: string, index: number) => void;
|
|
12
|
-
contextMenu: (e: React.MouseEvent, name: string, index: number) => void;
|
|
13
|
-
addSheet: () => void;
|
|
14
12
|
selectedSheet: { name: string };
|
|
15
|
-
contextSelect: (e: React.MouseEvent) => void;
|
|
16
13
|
}
|
|
17
14
|
|
|
18
15
|
const ExcelSheetBar: React.FC<ExcelSheetBarProps> = ({
|
|
19
16
|
fileDetails,
|
|
20
17
|
handleSheetChange,
|
|
21
|
-
contextMenu,
|
|
22
|
-
addSheet,
|
|
23
18
|
selectedSheet,
|
|
24
|
-
contextSelect,
|
|
25
19
|
}) => {
|
|
26
20
|
const [activeTabId, setActiveTabId] = useState<string>('0');
|
|
27
21
|
|
|
@@ -34,10 +28,6 @@ const ExcelSheetBar: React.FC<ExcelSheetBarProps> = ({
|
|
|
34
28
|
name === selectedSheet.name ? 'active font-bold' : ''
|
|
35
29
|
}`}
|
|
36
30
|
onClick={() => handleSheetChange(name, index)}
|
|
37
|
-
onContextMenu={(e) => {
|
|
38
|
-
contextMenu(e, name, index);
|
|
39
|
-
contextSelect(e);
|
|
40
|
-
}}
|
|
41
31
|
>
|
|
42
32
|
{name}
|
|
43
33
|
</div>
|
|
@@ -57,7 +47,6 @@ const ExcelSheetBar: React.FC<ExcelSheetBarProps> = ({
|
|
|
57
47
|
name="plus_icon"
|
|
58
48
|
height={20}
|
|
59
49
|
width={20}
|
|
60
|
-
onClick={addSheet}
|
|
61
50
|
/>
|
|
62
51
|
</Tooltip>
|
|
63
52
|
</Col>
|